找回密码
 注册
关于网站域名变更的通知
查看: 135|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-30 10:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机的通信一般有并行通信和串行通信。并行通讯是数据的各位同时发送或接收,并行通信控制简单,传输速度快,传输线较多。" L1 A% B7 ?7 ~: A' n: x
参看下图:

" f/ q2 K* y4 J2 \/ q

, p5 T7 s; X# O) V1 t  F/ [6 c. x
串行通讯传输线少,可利用电话网,但传送控制复杂。数据一位一位顺序发送或接收。
/ [& N  J$ O2 E  [( F2 J7 p' t
8 D! U2 A4 [" _
串行通讯中有一种是异步通信,即我们通常所说的串口通信。这是我们今天要分享的内容:
异步通讯用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。
: N) [7 w" Q& ^& U, v' L; [
一、在异步通讯中,CPU与外设之间必须有两项规定,即字符格式和波特率。
1、字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义,即我们所说的通信协议。
2、波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。

/ Y8 U8 f+ }- X3 W2 K% l; l5 O! C3 }' y7 g$ o
二、通讯方向。
1、在串行通讯中,把通讯接口只能发送或接收的单向传送方法叫单工传送。
2、把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。
2 i! P% v$ s  a
接下来我们分享下单片机串口的结构和寄存器相关的知识。9 q: x! `) {: l" ?" I; W7 L
  51单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。$ K9 z6 Z" |1 x, J: l; d7 B* h
0 M+ Q% Y4 _+ j" k% o. A
7 u* X: c7 n8 f  Q/ p
; Q) g: w" d0 q/ f2 G5 d; {5 q7 q

( S' l% {% P8 x# W6 Y' S9 b' v# E- P: Z" E2 c$ Y# }9 \
  TH1和TL1是装计数初值的计数器,用于产生波特率。TI是发送标志位,RI是接收标志位,具体作用我们会在下面的分享中接触到。
  下面我们看看单片机串口相关的寄存器:
7 x6 o* ~/ f, M9 Y
一、工作方式寄存器SCON
位  D7   D6   D5   D4   D3   D2   D1   D0
功能 SM0  SM1  SM2  REN  TB8  RB8  TI   RI

, h# F2 Y& ~% U# N' P

) F4 i3 d0 A( J5 y( ~其中fosc为晶振频率

2 f2 m3 P, [1 C% ]2 ^
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。

/ d, @4 T7 p3 F6 i$ i5 R3 h

$ M- |/ d) e- T! Q, {9 W- m7 z0 @
波特率的概念:
   波特率的定义:串行口每秒钟发送的位数称为波特率。比如说2400的波特率就是每秒钟发送2400个位数。串行口的波特率是用定时器T1作为波特率发生器的,这是定时器自动设置在工作方式2(可自动重装初值)。

: w2 H) v7 C& g1 B" r+ }# z/ l
# U: N; v4 @1 H( Y7 Q* w; V& p2 U3 e+ t- S! x* ~% Z' e2 W
接下来我们分享下怎样通过编程实现串口通信,串口的操作步骤:) I& o' C0 N$ N8 A, t( R/ j
8 Z) ~5 _& ]5 `
一、先设置波特率:
0 t2 Q8 y0 Y$ D
9 F( r) j2 {- w. q5 E   设置定时器T1为工作方式2(设置TMOD寄存器); b0 P1 T0 a  ]! p/ z+ _; a& G
" m! O8 ?+ A- N4 n  ^* V
   给计数器赋初值(工作方式2会自动重装)
3 X6 p( h& ?7 b8 M% ?' C二、设置串口工作方式:8 R- C8 u! K; {, ~+ ]

# D  c2 E8 c0 D2 n7 Y2 S   设置SCON
- P9 ~/ [" Q/ A. [8 b3 N0 l
: V( s: a! p+ f% L! o   如果使用中断方式,那么打开相应的中断和总中断。$ D0 \) X2 v2 i% y1 @1 y( u% q% K
三、打开定时器T1,开始产生波特率。: a* g: P8 g, }5 c9 k
四、设置TRx
: H* l" o' y2 l" ]- W- @
) H" s  D  ?- p+ `. s下面我们看个例程:
% P' R6 Y& ^# o( W) C4 R! M
  • #include <reg52.h>
  • //FOSC=11.0592MHz,12T模式,SMOD=0
  • #define 1200bps 0xe8
  • //1200波特率计数初值宏定义
  • #define 2400bps 0xf4
  • //2400波特率计数初值宏定义
  • #define 4800bps 0xfa
  • //4800波特率计数初值宏定义
  • #define 9600bps 0xfd
  • //9600波特率计数初值宏定义
  • unsigned char zifu='a';
  • //待显示字符。
  • sbit SWITCH_S7 = P3^4;
  • void delay(int In,int Out)
  • {
  • int i,j;
  • for(i=0;i<In;i++)
  • {
  •   for(j=0;j<Out;j++)
  •   {;}
  • }
  • void serial_port_initial(char TH,char TL)
  • //串口初始化函数
  • {
  • SCON = SCON | 0x50;
  • //8位可变波特率,无奇偶校验位
  • TMOD = TMOD | 0x20;
  • //设置定时器1为8位自动重装记数器
  • PCON = PCON | 0x00;
  • TH1  = TH;
  • //设置定时器1自动重装数
  • TL1  = TL;
  • //设置定时器1自动重装数
  • ES   = 1;
  • //允许串口中断                                EA   = 1;
  • //开总中断                                    TR1  = 1;
  • //开定时器1
  • }
  • void send_UART(unsigned char i)
  • //发送一节函数
  • {
  • ES = 0;
  • //关串口中断
  • TI = 0;
  • //清零串口发送完成中断请求标志
  • SBUF = i;
  • //发送数据
  • while(TI==0);
  • //等特数据传送
  • TI = 0;
  • //清除数据传送标志
  • ES = 1;
  • }
  • void main()
  • {
  • serial_port_initial(1200bps,1200bps);
  • while(1)
  • {
  •   if(SWITCH_S7 == 0)
  •    //判断按键是否按下
  •   {
  •    delay(5,200);
  •    if(SWITCH_S7 == 0)
  •     //消抖
  •    {
  •     while(SWITCH_S7 == 0);
  •      //等待按键松开
  •     send_UART(zifu);
  •      //发送字符a
  •    }
  •   }
  • }
  • }4 @0 X8 T! m) ?2 m: q& G

, s  @3 m8 @  x5 q- r2 k5 S% I
5 r9 P' e2 l& t
/ U! a2 i7 T: K& l

该用户从未签到

2#
发表于 2022-5-30 13:10 | 只看该作者
O(∩_∩)O哈哈~厉害厉害。

该用户从未签到

3#
发表于 2022-5-30 15:28 | 只看该作者
O(∩_∩)O哈哈~厉害厉害。
$ ^; g8 l! K6 ]* d) v, G( G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-12 09:37 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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