主控:STC8G1K08(SOP16)
主频11.0592M
串口波特率:9600
| TxD | P11 |
| RxD | P10 |
采用定时器2(16位自动重载)做波特率发生器,定时器时钟为1T,8位数据,1停止位,无校验
上电后循环发送。
// STC8G1K08 串口2测试代码 // 功能: 使用P1.0(RXD2), P1.1(TXD2)进行串口通信 // 配置: 11.0592MHz, 9600bps, 8位数据, 1停止位, 无校验 // 测试: 上电后循环发送"UART2 Test OK!\r\n" #include "STC8G.h" #include <string.h> #include <stdio.h> // 系统配置 #define MAIN_Fosc 11059200UL // 主频 11.0592MHz #define UART2_BAUD_RATE 9600UL // 波特率 9600 // 串口2发送完成标志 bit UART2_Busy = 0; // 串口2中断服务函数 void UART2_Isr(void) interrupt 8 { // 发送完成中断 if (S2CON & 0x02) { S2CON &= ~0x02; // 清除发送中断标志 UART2_Busy = 0; // 清除忙标志 } // 接收完成中断 if (S2CON & 0x01) { S2CON &= ~0x01; // 清除接收中断标志 UART2_Busy = 1; // 设置忙标志 S2BUF = S2BUF; // 将接收到的数据发回 } } // 串口2初始化函数 // 功能: 使用P3.6(RXD2), P3.7(TXD2) // 波特率: 9600 @ 11.0592MHz void UART2_Init(void) { // ===== 1. 配置IO口模式 ===== // P1.1 (TXD2) 配置为推挽输出 P1M1 &= ~0x02; // 清零P1.1的M1位 P1M0 |= 0x02; // 设置P1.1为推挽输出 // P1.0 (RXD2) 配置为高阻输入 P1M1 |= 0x01; P1M0 &= ~0x01; // ===== 2. 配置串口和定时器 ===== S2CON = 0x50; T2L = 0xE0; T2H = 0xFE; AUXR |= 0x14; UART2_Busy = 0; IE2 |= 0x01; EA = 1; } // 串口2发送单字节 void UART2_SendByte(unsigned char dat) { while (UART2_Busy); // 等待发送完成 UART2_Busy = 1; // 设置忙标志 S2BUF = dat; // 启动发送 } // 串口2发送字符串 void UART2_SendString(char *str) { while (*str) { UART2_SendByte(*str++); } } // 毫秒延时函数 (简单软件延时,主频11.0592MHz) void Delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 1100; j++); // 粗略延时1ms } // 主函数 void main(void) { unsigned char test_count = 0; char send_buf[32]; // 初始化串口2 UART2_Init(); // 发送启动信息 UART2_SendString("STC8G1K08 UART2 Test Started!\r\n"); UART2_SendString("P1.0(RXD2), P1.1(TXD2), 9600bps, 11.0592MHz\r\n"); while (1) { // 周期性发送测试数据 Delay_ms(1000); // 延时1秒 // 格式化测试信息 sprintf(send_buf, "Test Count: %d, Time: %d ms\r\n", test_count++, 1000 * test_count); UART2_SendString(send_buf); UART2_SendString("UART2 Test OK!\r\n"); UART2_SendString("--------------------------------\r\n"); } }