当前位置:文档之家› 52单片机定时器2作为串行口波特率发生器使用(C语言程序)

52单片机定时器2作为串行口波特率发生器使用(C语言程序)

本文是关于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-)], 指RCAP2H作为高8位、RCAP2L作为低8位构成的16位无符号整数。

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 }

相关主题
文本预览
相关文档 最新文档