找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13620|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机的串口通信详解-原理 寄存器 编程等

  [复制链接]
跳转到指定楼层
楼主
ID:101489 发表于 2016-1-5 02:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机的通信一般有并行通信和串行通信。并行通讯是数据的各位同时发送或接收,并行通信控制简单,传输速度快,传输线较多。
参看下图:



串行通讯传输线少,可利用电话网,但传送控制复杂。数据一位一位顺序发送或接收。



串行通讯中有一种是异步通信,即我们通常所说的串口通信。这是我们今天要分享的内容:
异步通讯用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。


一、在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特率。
1、字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义,即我们所说的通信协议。
2、波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。


二、通讯方向。
1、在串行通讯中,把通讯接口只能发送或接收的单向传送方法叫单工传送。
2、把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。

接下来我们分享下单片机串口的结构和寄存器相关的知识。
  51单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。





  TH1和TL1是装计数初值的计数器,用于产生波特率。TI是发送标志位,RI是接收标志位,具体作用我们会在下面的分享中接触到。
  下面我们看看单片机串口相关的寄存器:

一、工作方式寄存器SCON
位  D7   D6   D5   D4   D3   D2   D1   D0
功能 SM0  SM1  SM2  REN  TB8  RB8  TI   RI


其中fosc为晶振频率

SM2:多机通讯控制位。在方式0时,SM2一定要等于0。在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接收。
TB8:是要发送数据的第9位。
RB8:接收到的数据的第9位。
TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清0。
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。RI也必须用软件清0。


波特率的概念:
   波特率的定义:串行口每秒钟发送的位数称为波特率。比如说2400的波特率就是每秒钟发送2400个位数。串行口的波特率是用定时器T1作为波特率发生器的,这是定时器自动设置在工作方式2(可自动重装初值)。



接下来我们分享下怎样通过编程实现串口通信,串口的操作步骤:

一、先设置波特率:

   设置定时器T1为工作方式2(设置TMOD寄存器)

   给计数器赋初值(工作方式2会自动重装)


二、设置串口工作方式:

   设置SCON

   如果使用中断方式,那么打开相应的中断和总中断。


三、打开定时器T1,开始产生波特率。


四、设置TRx



下面我们看个例程:

  1. #include <reg52.h>

  2. //FOSC=11.0592MHz,12T模式,SMOD=0


  3. #define 1200bps 0xe8     

  4. //1200波特率计数初值宏定义

  5. #define 2400bps 0xf4     

  6. //2400波特率计数初值宏定义

  7. #define 4800bps 0xfa     

  8. //4800波特率计数初值宏定义

  9. #define 9600bps 0xfd     

  10. //9600波特率计数初值宏定义



  11. unsigned char zifu='a';               

  12. //待显示字符。



  13. sbit SWITCH_S7 = P3^4;               



  14. void delay(int In,int Out)

  15. {

  16. int i,j;

  17. for(i=0;i<In;i++)

  18. {

  19.   for(j=0;j<Out;j++)

  20.   {;}

  21. }


  22. void serial_port_initial(char TH,char TL)  

  23. //串口初始化函数

  24. {

  25. SCON = SCON | 0x50;   

  26. //8位可变波特率,无奇偶校验位

  27. TMOD = TMOD | 0x20;   

  28. //设置定时器1为8位自动重装记数器                                             

  29. PCON = PCON | 0x00;

  30. TH1  = TH;   

  31. //设置定时器1自动重装数                  

  32. TL1  = TL;        

  33. //设置定时器1自动重装数

  34. ES   = 1;  

  35. //允许串口中断                                EA   = 1;  

  36. //开总中断                                    TR1  = 1;              

  37. //开定时器1                       

  38. }



  39. void send_UART(unsigned char i)         

  40. //发送一节函数

  41. {

  42. ES = 0;  

  43. //关串口中断

  44. TI = 0;  

  45. //清零串口发送完成中断请求标志

  46. SBUF = i;  

  47. //发送数据

  48. while(TI==0);                    

  49. //等特数据传送  

  50. TI = 0;      

  51. //清除数据传送标志

  52. ES = 1;

  53. }



  54. void main()

  55. {

  56. serial_port_initial(1200bps,1200bps);



  57. while(1)

  58. {

  59.   if(SWITCH_S7 == 0)   

  60.    //判断按键是否按下

  61.   {

  62.    delay(5,200);

  63.    if(SWITCH_S7 == 0)

  64.     //消抖

  65.    {

  66.     while(SWITCH_S7 == 0);                  

  67.      //等待按键松开

  68.     send_UART(zifu);              

  69.      //发送字符a

  70.    }

  71.   }

  72. }

  73. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:134288 发表于 2016-8-2 17:27 | 只看该作者
我直接把你程序复制过去 好多错误。。。。。。。。
回复

使用道具 举报

板凳
ID:134288 发表于 2016-8-2 17:28 | 只看该作者
为什么我把你的程序直接复制进去 好多错误
回复

使用道具 举报

地板
ID:134288 发表于 2016-8-2 17:30 | 只看该作者
为什么我把你的程序直接复制进去 好多错误。。
回复

使用道具 举报

5#
ID:164118 发表于 2017-2-10 12:19 | 只看该作者
因为书写格式的有问题,你自己敲进去应该会好点儿 吧,我猜
回复

使用道具 举报

6#
ID:474982 发表于 2019-2-18 22:55 | 只看该作者
这是用的STC单片机吗?
回复

使用道具 举报

7#
ID:85480 发表于 2019-7-29 16:36 | 只看该作者
正在学习单片机通讯,谢过,先自己试验试验。
回复

使用道具 举报

8#
ID:686387 发表于 2020-4-19 23:12 | 只看该作者
学习了,终于搞懂了,不过还得再消化一下,谢谢分享
回复

使用道具 举报

9#
ID:704585 发表于 2020-8-27 10:13 | 只看该作者
感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表