STC51单片机串口设置波特率分析对比与ISP程序烧录设置
STC51单片机串口设置波特率分析对比与ISP程序烧录设置
- 如果程序代码中串口波特率使用了倍频参数,在烧录的时候也一定要在ISP烧录软件上选上
使能6T(双倍速)模式,不然程序烧录进去后,速度不能实现倍频的效果。

以12M的晶振分析一下倍频
- 采用4800波特率,倍频后的误差计数结果。

- 采用9600波特率,不倍频后的误差计数结果。

总结: 如果是采用12M晶振的话,采用倍频,可以明显降低误差,这里的误差直接会影响的是数据收发的准确率。

串口发送数据代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8;
u8 Buf[]="床前明月光\r\n"; void delay(u16 n) { while (n--); } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函数名 :UsartInit() \* 函数功能 :设置串口 \* 输入 : 无 \* 输出 : 无 一般选择定时器的工作方式2,而是最大计数为256且自动重载定时器初值的方式) 使用这种方式是因为它能自动重载定时器初值,不用在中断服务程序中人工重设,可以减少误差。 如果采用12M的晶振采用4800加倍频,比起直接使用9600的波特率相比,可以降低误差。 12M晶振的4800波特率初值是0xF3 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ /\*波特率为9600\*/ void UART\_init(void) { SCON = 0x50; //串口方式1 TMOD = 0x20; // 定时器使用方式2自动重载 // TH1 = 0xFD; //9600波特率对应的预设数,定时器方式2下,TH1=TL1 // TL1 = 0xFD; PCON=0X80; //波特率加倍, TH1=0XF4; //计数器初始值设置,注意波特率是4800的,误差值为0.16% TL1=0XF4; // TR1 = 1;//开启定时器,开始产生波特率 } /\*发送一个字符\*/ void UART\_send\_byte(u8 dat) { SBUF = dat; //把数据放到SBUF中 while (TI == 0);//未发送完毕就等待 TI = 0; //发送完毕后,要把TI重新置0 } /\*发送一个字符串\*/ void UART\_send\_string(u8 \*buf) { while (\*buf != '\0') { UART\_send\_byte(\*buf++); } } main() { UART\_init(); while (1) { UART\_send\_string(Buf); delay(20000); } }
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!