当前位置:文档之家› 51单片机串口教程

51单片机串口教程

51单片机串口教程
51单片机串口教程

https://www.doczj.com/doc/6a15251727.html,/thread-2765635-1-1.html

51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。

当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。无论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。

在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。

看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。

接收数据时,基本上都是使用“中断方式”,这是正确合理的。

即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数,收到了新数据。

发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来等待发送完毕。

这时,处理不好的话,就可能带来问题。

看了一些网友编写的程序,发现有如下几条容易出错:

1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。

这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。

这种处理方法,就会遗漏收到的数据。

2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。

但是,却在中断函数中,将TI 清零!

这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。

3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。

对此,做而论道发表自己常用的方法:

接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。

发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。这样一来,收、发两者基本一致,编写程序也很规范、易懂。

更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。

实例:

求一个PC与单片机串口通信的程序,要求如下:

1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。

2、如果接收到1,则将P10置高电平,接收到0,P10置低电平。(用来控制一个LED)

单片机是STC89C52RC/晶振11.0592/波特率要求是9600或4800。谢谢!

问题补充:可能会将【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样返回。

[cpp]view plaincopyprint?

1.最佳答案:

2.下列程序,已经调试成功。

3.#include

4.sbit LED = P1^0;

5.unsigned char UART_buff;

6.bit New_rec = 0, Send_ed = 1, Money = 0;

7.//----------------------------------------------

8.void main (void)

9.{

10. SCON = 0x50; //串口方式1, 8-n-1, 允许接收.

11. TMOD = 0x20; //T1方式2

12. TH1 = 0xFD; [url=]//9600bps@11.0592MHz[/url]

13. TL1 = 0xFD;

14. TR1 = 1;

15. ES = 1; //开中断.

16. EA = 1;

17. while(Money == 0); //等着交费,呵呵,等着接收$.

18. while(1) {

19. if ((New_rec == 1) && (Send_ed == 1)) { //如果收到新数据及发送完

20. SBUF = UART_buff; //那就发送.

21. New_rec = 0;

22. Send_ed = 0;

23. } }

24.}

25.//----------------------------------------------

26.void ser_int (void) interrupt 4

27.{

28. if(RI == 1) { //如果收到.

29. RI = 0; //清除标志.

30. New_rec = 1;

31. UART_buff = SBUF; //接收.

32. if(UART_buff == '1') LED = 1;

33. if(UART_buff == '0') LED = 0;

34. if(UART_buff == '$') Money = 1;

35. }

36. else { //如果送毕.

37. TI = 0; //清除标志.

38. Send_ed = 1;

39. }

40.}

41.//----------------------------------------------

https://www.doczj.com/doc/6a15251727.html,/BLOG_ARTICLE_3007162.HTM

串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。一般都是基于一定串口通信协议的多字节通信。在422或者485通信中,还可能是一个主机(一般是计算机)带多个从机(相应的有单片机的板卡)。这就要求我们的单片机能够在连续接收到的串口数据序列中识别出符合自己板卡对应的通信协议,来进行控制操作,不符合则不进行任何操作。简而言之就是,单片机要在一串数据中找到符合一定规律的几个字节的数据。

先来说下怎样定串口协议吧。这个协议指的不是串口底层的协议,而是前面提到的数据帧协议。一般都是有帧头(2~3个字节吧),数据(长度根据需要),结束位(1位,有时候设计成校验字节,最简单的校验也就是前面所有数据求和)。

比如0xaa 0x55 +(数据部分省略)+校验和(除了aa 55 之外数据的和),如果要是多板卡的话有时候还要在帧头后面加一个板选字节(相当于3字节帧头了)。

第一次写串口接收程序的时候,我首先想到的就是定义一个全局变量(实际上最好是定义局部静态变量),初始值设置为0,然后每进一次中断+1,然后加到串口通信协议的长度的时候再清零。然后判断帧头、校验。写完了之后我自己都觉得不对,一旦数据错开了一位,后面就永远都接收不到数了。无奈看了一下前辈们的代码,跟我的思路差不多,只不过那个计数值跟接收到的数据时同时判断的,而且每次中断都要判断,一旦不对计数的那个变量就清零。

废话少说,直接上一段代码让大家看看就明白了。(通信协议姑且按照简单的aa 55 一个字节数据一个字节校验,代码是基于51单片机的)。接收成功则在中断程序中把串口接收成功标志位置1。

[cpp]view plaincopyprint?

1.然后串口中断部分

2.void ser()interrupt 4

3.{

4.static unsigned char count;//串口接收计数的变量

5. RI=0;//手动清某个寄存器,大家都懂的

6. receive[count]=SBUF;

7. if(count==0&&receive[count]==0xaa)//同时判断count跟收到的数据

8. {

9. count=1;

10. }

11. else if(count==1&&receive[count]==0x55)

12. {

13. count=2;

14. }

15. else if(count==2)

16. {

17. count++;

18. }

19. else if(count==3&&receive[count]== receive [2])//判断校验和,数据多的话是

求//和,或者其他的校验方法,也可能是固定的帧尾

20. {

21. count=0;

22. uart_flag =1;//串口接收成功标志,为1时在主程序中回复,然后清零

23. ES=0; //关中断,回复完了再ES=1;

24. }

25. else

26. {

27. count=0;//判断不满足条件就将计数值清零

28. }

29.}

第一次做的串口大概就按照这个方法写完了(我后来看过其他的代码,有人用switch语句写的,逻辑跟这个也差不多,不过我还是感觉用if else来写清晰一些),

不过在测试的时候发现了bug,如果数据帧发送一半,然后突然停止,再来重新发,就会丢失一帧的数据。比如先接受到aa 55,然后断了,再进来aa 55 01 01,就不受控制了。后来我也想到一个bug,如果在多设备通信中,属于其他设备的的帧数据最后一位是aa(或者最后两位为aa 55 ,或者最后3位为aa 55 板选),下一次通信的数据就接收不到了。

当时对于数据突然中断的bug,没有想到很好的解决办法,不过这种情况几率极小,所以一直用这个方法写也没有问题。多设备通信最后一位恰好是aa的几率也很小,出问题的可能也很小。当时项目里面的控制数据跟校验恰好不可能出现aa,于是我把

if(count==0&&receive[count]==0xaa)改成了if(receive[count]==0xaa)其他都没变,解决了,没有bug了。

后来我又写了几次单片机程序,才想到了一些解决问题的方法——不过改天再接着写吧,太累了,明天还要上班呢。

在后来的项目中,真的遇到了数据位跟校验位都可能出现aa的情况。我考虑到每次数据都是连续发送的(至少我们用labwindows做的上位机程序是这样的),成功接收到了一帧数据是要有一定时间回复的,也就是说如果接收到一半,但是很长时间没接收到数据,把计数值count清零就ok啦。涉及时间的问题自然要用定时器来实现啦。

这次的通信协议如下,串口波特率19200,2个帧头aa 55 ,一个板选,6字节数据,一个校验字节(除帧头外其他数据的和)。

[cpp]view plaincopyprint?

1.全局变量定义

2.unsigned char boardAddr;//板选地址,通过检测几个io引脚,具体怎么得到的就不写

了,很简单的

3.unsigned char g_DatRev [10]={0};//接收缓存

4.bit retFlag=0;//为1代表串口接收到了一帧数据

5.

6.

7.串口初始化函数,晶振22.1184

8.

9.void init_uart()

10.{

11. SCON = 0x50; //串口方式1允许接收

12. TMOD = 0x21; //定时器1,方式2,8位自动重载,同时配置

定时器0,工作方式1

13. PCON = 0x80; // 波特率加倍

14. TH1 = 0xfa;

15. TL1 = 0xfa; //写入串口定时器初值

16. TH0=(65536-2000)/256; //写入定时器0初值,串口传输一个字节时间为

(1/19200)*10,计算得0.52ms

17. TL0=(65536-2000)%256; //定时器0定时大约1ms多

18. EA=1;

19. ET0=1; //波特率:19200 22.1184M 初值:250(0xfa)

20. IE |= 0x90;

21. TR1 = 1;

22.}

23.

24.串口中断函数

25.

26.void UART_INT(void) interrupt 4

27.{

28. static unsigned char count;//串口接收计数的变量

29.

30. RI = 0;

31. g_DatRev[count] = SBUF;

32. if(g_DatRev[count]==0xaa&&count==0) //帧头

33. {

34. count=1;

35. }

36. else if(count==1&&g_DatRev[count]==0x55)

37. {

38. count=2;

39. }

40.

41. else if (count==2&&g_DatRev[2] == boardAddr)

42. {

43. CK = g_DatRev[count];

44. count=3;

45.

46. }

47.

48. else if(count>=3&&count<9)

49. {

50.

51. CK += g_DatRev[count];

52. count ++;

53. }

54.

55. else if(count == 9&&CK==g_DatRev[9])

56. {

57. ES = 0;

58. retFlag = 1;

59. count=0;

60. }

61. else

62. {

63. count=0;

64. }

65. resettimer();

66.

67.}

68.

69.//判断count不为0的话就启动定时器

70.void resettimer()

71.{

72. TR0=0;

73. TH0=(65536-2000)/256;

74. TL0=(65536-2000)%256;

75. if(count!=0)

76. {

77. TR0=1;

78. }

79.}

80.

81.定时器中断函数

82.void T0_time()interrupt 1

83.{

84. TR0=0;

85. TH0=(65536-2000)/256;

86. TL0=(65536-2000)%256;

87. count=0;

88.

89.}

这种方法的确是本人自己想出来的,别人可能也这样做过,但我这个绝对不是抄袭或者模仿来的。这样写的确可以避免前面提到过的bug,不过代价是多用了一个定时器的资源,而且中断函数里的内容更多了,占用了更多的时间。

要是能把第一种方法改进一下就好了,主要是那个校验不能为aa的那个bug,因为毕竟传输到一半突然断了的可能性是非常小的。后来我想第一个判断

if(count==0&&receive[count]==0xaa)好像有点太严格了,考虑到第二字节的帧头,跟板选地址不可能为aa,于是把这个改写为if(count>=0&&count<=2&& receive[count]==0xaa),这样就把bug出现的几率降到了非常小,也只是在前一帧结尾数据恰好为aa 55 板选的时候才出现,几率是多少大家自己算一下吧,呵呵。这样我自己觉得,昨天写的那种方法改进到这个程度,应该算可以啦,反正我是很满意了。

实际上我还想过其他的方法,比如缓存的数组采用移位寄存的方式。拿前面的4个字节的协议为例。

[cpp]view plaincopyprint?

1.void ser()interrupt 4

2.{

3. unsigned char i;

4. RI=0;

5.

6. for(i=0;i<3;i++)

7. {

8. receive[i]=receive[i+1];

9. }

10. receive[3]=SBUF;

11. if(reveive[0]==0xaa&&receive[1]==0x55&&receive[2]==receive[3])

12. {

13. ret_flag=1;

14. ES = 0;

15. }

16.

17.}

这段代码看上去可是简单明了,这样判断可是不错啊,同时判断帧头跟校验不会产生前面提到的bug。说实话当时我刚想出这种方法并写出来的时候,马上就被我给否了。那个for 循环可真是很占时间的啊,延时函数都是这样写的。每次都循环一下,这延时太长,通信速度太快的话就不能接收到下一字节数据了。最要命的是这个时间的长度是随着通信协议帧的字节数增加而增加的,如果一次要接收几十个字节,肯定就玩完了。这种方法我一次都没用过。

不过我居然又想出来了这种方法的改良措施,是前两天刚想出来的,呵呵,还没有实践过呢。

下面代码的协议就按第二段程序(定时器清零的那个协议,一共10字节)

全局变量

[cpp]view plaincopyprint?

1.bit ret_flag;

2.unsigned char receive[256]={0};

3.unsigned char boardaddress;

4.

5.中断函数

6.

7.void ser()interrupt 4

8.{

9.

10.

11. static unsigned char i=0;

12. static unsigned char total=0;

13. RI=0;

14. receive[i]=SBUF;

15. total=total-receive[i-7]+receive[i-1];

16.

17. if(receive[i-9]==0xaa&&receive[i-8]==0x55

18. &&receive[i-7]==boardaddress&&receive[i]==total

19. )

20. {

21. ret_flag=1;

22. ES = 0;

23. }

24. i++;

25.

26.}

之所以要定义256个长度的数组,就是为了能够让数组“首尾相接”。因为0 -1 = 255 ,255+1 = 0。而且我在计算校验的时候也改进了算法,不会因为数据长度的增加而增加计算校验值的时间。这种方法也是我不久前才想出来的,所以还没有经过实际的验证。上面的代码可能会有逻辑上的错误,如果真有错误,有网友看出来的话,请在下面留言告诉我。这个方法也是我原创的哦,别人也肯能会想到,不过我这个绝对不是抄袭别人的。

上面的代码最大的缺点就是变量定义的太多了,太占ram资源了,编译的时候可能会出现错误,毕竟51单片机才128字节的ram(有的资源也很丰富的,比如c8051系列的),这一下子就是256字节的变量。不过对于资源多一些的单片机,这样写还是可以的。要是能有4bit在一起的数据类型就好了,呵呵,verilog代码里面是可以的,C语言里貌似不行啊。

要想能在例如51单片机上运行,只能按照下面的折中方式了,也就是把i相关的量都与一个0x0f

[cpp]view plaincopyprint?

1.全局变量

2.

3.bit ret_flag;

4.unsigned char receive[16]={0};// 可以考虑在定义时加上idata,毕竟还可能是32

5.//或者64长度的数组呢unsigned char idata receive[16]={0};

6.

7.unsigned char boardaddress;

8.

9.中断函数

10.

11.void ser()interrupt 4

12.{

13.

14.

15. static unsigned char i=0;

16. static unsigned char total=0;

17. RI=0;

18. receive[i&0x0f]=SBUF;

19. total=total-receive[(i-7)&0x0f]+receive[(i-1)&0x0f];

20.

21. if(receive[(i-9)&0x0f]==0xaa&&receive[(i-8)&0x0f]==0x55

22. &&receive[(i-7)&0x0f]==boardaddress&&receive[i&0x0f]==total

23. )

24. {

25. ret_flag=1;

26. ES = 0;

27. }

28. i++;

29.

30.}

51单片机与PC串口通讯

目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

51单片机串口 (1)

一.基础 ●SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI 激活的功能)。通过控制SM2,可以实现多机通信。 在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。 ●REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。 ●TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。 ●RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

波特率的计算 在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。 串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率= fosc/12 方式2的波特率=(2SMOD /64)·fosc 方式1的波特率=(2SMOD /32)·(T1溢出率) 方式3的波特率=(2SMOD /32)·(T1溢出率) 当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。 T1 溢出率= fosc /{12×[256 -(TH1)]} 根据上面的等式计算出TH1 写串口程序的步骤 1.串行口工作之前,应对其进行初始化,主要是设置产生波特率的定 时器1、串行口控制和中断控制。具体步骤如下: ?确定T1的工作方式(编程TMOD寄存器)(方式2 0x20); ?计算T1的初值,装载TH1、TL1;(有波特率计算) ?启动T1(编程TCON中的TR1位); ?确定串行口控制(编程SCON寄存器);{SM0,SM1,REN} 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

MCS-51单片机串行接口

第七章MCS-51单片机串行接口 第一节串行通信的基本概念 (一)学习要求 1.掌握串行通信的基本概念。 2. 掌握异步通信和同步通信的区别。 (二)内容提要 一:基本概念及分类 串行通信是将数据的各位一位一位地依次传送。适合于计算机之间、计算机与外部设备之间的远距离通信。 串行通信从传输方式分为: 单工方式、半双工方式、全双工方式。 从接收方式来说,串行通信有两种方式: 异步通信方式、同步通信方式。 二:串行口的功能 MCS-51单片机中的异步通信串行接口能方便地与其他计算机或传送信息的外围设备(如串行打印机、CPU终端等)实现双机、多机通信。 串行口有4种工作方式,见表7-1。方式0并不用于通信,而是通过外接移位寄存器芯片实现扩展并行I/O接口的功能。该方式又称为移位寄存器方式。方式1、方式2、方式3都是异步通信方式。方式1是8位异步通信接口。一帧信息由10位组成,其格式见图7-2a。方式1用于双机串行通信。方式2、方式3都是9位异步通信接口、一帧信息中包括9位数据,1位起始位,1位停止位,其格式见图7-2b。方式2、方式3的区别在于波特率不同,方式2、方式3主要用于多机通信,也可用于双机通信。 表7-1 (三)习题与思考题 1、什么是并行通信?什么是串行通信?各有何优缺点? 答:并行通信指数据的各位同时传输的通信方式,串行通信是指各位数据逐位顺序传输的通信方式。 2、什么是异步通信?什么是同步通信?各有何优缺点? 3、什么是波特率?某异步串行通信接口每分钟传送1800个字符,每个字符由11位组成,请计算出传送波特率。 第二节MCS-51串行接口的组成 (一)学习要求

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

51单片机与蓝牙串口通信程序

#include #include #include #include "LCD1602.h" #include "matrix_key.h" #define uint unsigned int #define uchar unsigned char #define Nop() _nop_() sbit P10 = P1^0; /*定义独立对地按键端口*/ sbit P11 = P1^1; /*定义独立对地按键端口*/ sbit P12 = P1^2; /*定义独立对地按键端口*/ sbit P13 = P1^3; /*定义独立对地按键端口*/ //shift键 bit shift_flag; bit call_flag ; bit CallIn_flag=0; bit reci_flag; bit reci_flag1; sbit sled_en_port = P3^6; /*定义数码管数据锁存器控制端口*/ sbit led_en_port = P2^5; /*定义发光二极管数据锁存器控制端口*/ sbit ds1302_en_port = P2^2; /*定义时钟的选片脚*/ uchar CallIn_Num[15];//={"00000000000"}; uchar CallOut_Num[15]={" "}; uchar m=0; //拨号指针 uchar temp='?'; uchar code clr[16]={" "}; uchar code lcd_table[16] = {"Ky: Cm: Re: "}; //uchar send_buff[15]; uchar reci_buff[15]={" "}; uchar z; //接收缓冲区指针 uchar time;//定时器中断次数 uchar code mun_to_char[]={"0123456789ABCDEF"}; /*1MS为单位的延时程序*/ void init(); void send(uchar cc); void send_f(uchar ccc); void interrupt_pro(); void key_pro(); void call_out();

51单片机与串口通信代码

51单片机与串口通信代码 2011年04月22日 17:18 本站整理作者:佚名用户评论(0) 关键字:串口通信(35) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude #i nclude #i nclude #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式 TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break;

51单片机和计算机之间实现串口通信的电路图

51单片机和计算机之间实现串口通信的电路图 串口通讯参考程序如下: 来源:深入浅出AVR单片机 #include unsigned char UART_RX; //定义串口接收数据变量 unsigned char RX_flag; //定义穿行接收标记 /**************************************************************************************** ***** 函数名:UART串口初始化函数 调用:UART_init(); 参数:无 返回值:无 结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备注:振荡晶体为12MHz,PC串口端设置[ 4800,8,无,1,无] /**************************************************************************************** ******/ void UART_init (void){ EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置 TL1 = 0xF3; //定时器初值低8位设置 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) TR1 = 1; //定时器启动 } /**************************************************************************************** ******/ /**************************************************************************************** ***** 函数名:UART串口接收中断处理函数 调用:[SBUF收到数据后中断处理] 参数:无 返回值:无 结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收

51单片机串口通信的原理与应用流程解析

51单片机串口通信的原理与应用流程解析 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

51单片机串口通信讲解

51系列单片机串口通信实例教程 单片机的串口通信看起来是很复杂的,主要是因为他用到了更多的寄存器,与前面的知识相比他更具综合能力,写起来考虑的问题自然也变多了.而前面学习过的定时器与中断将是单片机通信的基础. 单片机的中断系统中第4个中断就是串口中断,要进行串口通信首先就要打开CPU总中断EA,还要打开串口通信中断ES,这是串口通信的前堤,而串口通信也跟计时器一样有很多的模式,因此我们还要设置SCON寄存器来指定采用哪一种方式进行通信,而在通信的过程中,我们还要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了.我在实验过程中用到的是1号定时器来设定的波特率,用到了计时器方式2,也就是8位自动重装,这样可以简化编程,她的实现思想就是将常数放入TH,而TL中则是初始化参数,当溢出时,单片机会自动将TH中的常数装入TL中. 再来说说波特率,我们为什么要设定波特率,因为单片机会以16倍波特率的速度进行采样,而在实验中我们用的是10位异步收发方式,因此要将SM0置0,SM1置1.而其中的10位

有8位数据位,第一位和最后一位是发送数据的起始与结束.采用高的皮特率就不会出错啦.而波特率是有一个公式的: 方式0的波特率 = fosc/12 方式2的波特率 =(2SMOD/64)· fosc 方式1的波特率 =(2SMOD/32)·(T1溢出率) 方式3的波特率 =(2SMOD/32)·(T1溢出率) T1 溢出率= fosc /{12×[256 -(TH1)]} 根据公式我们很容易就算出当晶振为110592HZ时,要达到9600的波特率,我们只需要将TL1置FDH即可,如下图: 除此之外,你还要将SCON中的REN位置1,不然的话,单片机是不会接收数据的. 还有不要忘了选择定时器的工作方式,设置TMOD为0x20既是工作方式2,8位自动重装定时器. 这样一来,初始批工作算是差不多了.而串口通信分为中断方式,和查询方式,如果你想用查询方式你也不用设置IE寄存器了. 在串口通信中,还有一个很重要的寄存器SBUF,其实也不是一个,是两个,只是它们共用同一个地址,再热气表达式的不同,单片机会自动选择使用哪一个SBUF. 下面是我写的一个例子程序,产生的效果是:向单片机发送任一个0~255之间的数,将会被显示到数码管上.并且单片机还会自动把刚才传过去的数又发送回来 ,实验过程中用到了几个工具如下:

51单片机与上位机串口通信程序设计

51单片机与上位机串口通信程序设计 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include< reg51.h> #include< stdio.h> #include< string.h> #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收 PCON=0x00; ES=1;

TMOD=0x21; //定时器工作于方式2,自动装载方式TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; } }

51单片机的串行接口

51单片机的串行接口 串行接口的一般概念 单片机与外界进行信息交换称之为通讯。 8051单片机的通讯方式有两种: 并行通讯:数据的各位同时发送或接收。 串行通讯:数据一位一位顺序发送或接收。参看下图: 串行通讯的方式 异步通讯:它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下: 在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。 在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义。原则上字符格式可以由通讯的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。 波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。 同步通讯:在同步通讯中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用了时间;所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。 通讯方向:在串行通讯中,把通讯接口只能发送或接收的单向传送方法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。 2.8051单片机的串行接口结构 8051串行接口是一个可编程的全双工串行通讯接口。它可用作异步通讯方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通讯协议进行全双工的8051多机系统也可以通过同步方式,使用TTL或CMOS 移位寄存器来扩充I/O口。 8051单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。 串行口的控制与状态寄存器 串行口控制寄存器SCON 它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表:

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