历史上的今天
返回首页

历史上的今天

今天是:2025年07月13日(星期日)

正在发生

2020年07月13日 | 51单片机的串口通信详解-原理 寄存器 编程等

2020-07-13 来源:51hei

单片机的通信一般有并行通信和串行通信。并行通讯是数据的各位同时发送或接收,并行通信控制简单,传输速度快,传输线较多。


参看下图:




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




串行通讯中有一种是异步通信,即我们通常所说的串口通信。这是我们今天要分享的内容:

异步通讯用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位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


  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


  18. {


  19.   for(j=0;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. }


推荐阅读

史海拾趣

DILABS公司的发展小趣事

面对数字化浪潮的冲击,DILABS积极拥抱变革。他们加大了对人工智能、物联网等前沿技术的研发投入,推动公司向数字化转型。同时,DILABS还积极参与行业标准的制定和推广工作,为电子行业的未来发展贡献自己的力量。展望未来,DILABS将继续秉承创新、品质、环保和数字化的理念,为全球客户提供更加优质、高效的电子产品和服务。

Agere System(LSI Logic)公司的发展小趣事

DILABS公司成立于XX世纪初,由一群热衷于电子技术的工程师创立。在公司初创时期,他们面临了资金短缺、技术瓶颈和市场竞争等多重挑战。然而,他们坚持创新,经过无数次实验,终于在芯片封装技术上取得了突破。这一突破性的技术为DILABS赢得了业界的关注,也为公司的发展奠定了坚实的基础。

客益(Guestgood)公司的发展小趣事

DILABS公司成立于XX世纪初,由一群热衷于电子技术的工程师创立。在公司初创时期,他们面临了资金短缺、技术瓶颈和市场竞争等多重挑战。然而,他们坚持创新,经过无数次实验,终于在芯片封装技术上取得了突破。这一突破性的技术为DILABS赢得了业界的关注,也为公司的发展奠定了坚实的基础。

High Energy Corp公司的发展小趣事

随着全球环保意识的提高,DILABS开始注重绿色生产。他们引入了先进的环保技术和设备,确保在生产过程中最大限度地减少废弃物和污染物的排放。同时,DILABS还积极推动电子产品的环保设计,帮助客户实现绿色采购和可持续发展。

D1 International Inc公司的发展小趣事

在快速扩张的过程中,D1 International Inc公司始终坚守品质管理的原则。公司严格把控产品的每一个环节,从原材料采购到生产流程,再到最终的产品检验,都力求做到精益求精。这种对品质的执着追求,使得D1 International Inc公司的产品在市场上赢得了良好的口碑,也为公司的长期发展提供了有力保障。

AZM [Arizona Microtek, Inc]公司的发展小趣事

AZM公司成立于电子行业的蓬勃发展时期,创始人凭借对微电子技术的深刻理解和敏锐的市场洞察力,决定投身于这一领域。创业初期,公司面临着资金短缺、技术瓶颈和市场认可度低等多重挑战。然而,创始人凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难题,成功研发出了具有竞争力的微电子产品,并逐渐在市场上获得了认可。

问答坊 | AI 解惑

开源活动之二:单芯片FM收音机DIY资料

必要资料 1、RDA5820 PDF芯片资料 The RDA5820 is a single-chip broadcast FM transceiver with fully integrated synthesizer, IF selectivity and MPX decoder. The chip uses the CMOS process, support multi-interface and require the lea ...…

查看全部问答>

捡了个开发板

在实验室里翻箱倒柜找到两块开发板 本人菜鸟不知道怎么用。一个是赛灵思的 写有XUP VIRTEX-II PRO DEVELOPMENT SYSTEM字样 可惜只有板子和电源 没有下载线也没显示模块 还有一个很全开没开包 写有PCI EXPRESS DEVELOPMENT KIT 是STRATIX   ...…

查看全部问答>

lpc1114 ucos

求助LPC1114的UCOS例程?或者提供UC/OSii与ARM处理器相关的具体函数的例程?感激………

查看全部问答>

液晶屏相关的一些问题

测试仪器用液晶屏 1,液晶屏的尺寸如何给出的?是对角线的尺寸吗? 2,对角线4~5左右的单色液晶屏,要求视场角较大的,有哪些牌子可选择?价格? 3,单片机接液晶屏时,应带有驱动程序吧? 希望了解的朋友指点。…

查看全部问答>

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889 EMAIL:SDTZ_ZZ@126.COM

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889     EMAIL:SDTZ_ZZ@126.COM…

查看全部问答>

如果导出arm中的lib.a文件中的函数list

我有arm版的lib.a文件,想看里面到底有什么函数实现,请问如何导出,就像vc下的dumpbin的工具一样的导出函数list…

查看全部问答>

【设计工具】xilinx sp605 PCIe EDK使用方法(之二:pci-e的windows 驱动)

$(\'swf_HNg\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMTkxODk3ODQ4/v.sw ...…

查看全部问答>

碉堡了!牛人自制真正的变形金刚机器人

这个我就不介绍了  直接看视频吧 激发你们的创意!!! $(\'flv_s3f\').innerHTML=(AC_FL_RunContent(\'width\', \'500\', \'height\', \'375\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'htt ...…

查看全部问答>

ADI常用集成电路功能一览表

ADI常用集成电路功能一览表   序号    型  号    产品描述    1    AD1380JD      16位 20us高性能 ...…

查看全部问答>

只为uC而生,uS成长历程5

昨晚我已经完成了 通过LED闪烁,测试uSer中的任务是否已经成功加入了定时器中断。 然而,最后我们也发现了,main函数的初始化显示出了 这个虽然很简单但已经显示出混乱的迹象。 这是个危险的苗头。 所以我们在继续开始以前,必须先理清条理。 ...…

查看全部问答>