本文是关于52单片机定时器计数器2做为串行口波特率发生器使用的例子,类似于定时器1作为波特率发生器工作在模式1下,但是不同的是:定时器2作为波特率发生器是16位自动重装的,位数比定时器1作为波特率发生器要高(定时器1作为串口波特率发生器是8位自动重装的),所以可以支持更高的传输速度,性能也比定时器1要好,老鲁推荐使用。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。AT89C52及其以上、AT89S52及其以上、STC89C52及其以上测试正常运行。
view sourceprint?01 /*
02 程序功能:52系列单片机定时器计数器2作为串行口波特率发生器使用
03 程序设计:燕山大学 鲁信琼
04
05 晶振选择:24MHz, 如果晶振不匹配,请修改延时函数参数;P2^6口接数码管段选控制位; P2^7口接数码管位选控制位;
06
07 本实验注意事项:
08 1. 定时器2作为波特率发生器是16位自动重装,而定时器1作为波特率发生器是8位自动重装,定时器2使用RCAP2H去重装TH2,用RCAP2L去重装TL2;定时器1是使用TH2去重装TL2。
09 2. 定时器2作为波特率发生器,工作在模式1和模式3,波特率=振荡期频率/[32×(0xFFFF-
10
11 承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作
12
13 EMail: xqlu(at)https://www.doczj.com/doc/0c11080243.html, QQ: 9790335
14 */
15 #include
16 #define uchar unsigned char
17 #define uint unsigned int
18 sbit DULA=P2^6;
19 sbit WELA=P2^7;
20 uchar str[]="Yanshan university!";
21
22 uchar i;
23
24 //24MHz晶振下延时x毫秒函数
25 void delay_ms(uint xms)
26 {
27 uint x,y;
28 for(x=xms; x>0; x--)
29 for(y=248; y>0; y--);
30 }
31
32 // 主函数初始化,24MHz晶振 28800bps波特率,有误差,建议大家使用11.0592MHz或者22.1184MHz
33 // 使用11.0592MHz时使用9600bps无误差; 22.1184MHz使用19200、14400、28800bps无误差,参数请大家按照上面的公式自己算。
34 void main_init()
35 {
36 DULA=0;
37 WELA=0;
38 delay_ms(1);
39
40 SCON=0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI
41 RCAP2H=(65536-26)/256;
42 RCAP2L=(65536-26)%256;
43 TH2=RCAP2H;
44 TL2=RCAP2L;
45 T2CON=0x34; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2
46 delay_ms(1);
47 }
48
49 void main()
50 {
51 main_init();
52
53 i=0;
54 while(str[i]!='\0')
55 {
56 TI=0;
57 SBUF=str[i];
58 while(!TI);
59 TI=0;
60 i++;
61 }
62 while(1);
63 }