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);
}

}