历史上的今天
今天是: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
下面我们看个例程:
#include
//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
{
for(j=0;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
}
}
}
}
史海拾趣
|
必要资料 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 ...… 查看全部问答> |
|
测试仪器用液晶屏 1,液晶屏的尺寸如何给出的?是对角线的尺寸吗? 2,对角线4~5左右的单色液晶屏,要求视场角较大的,有哪些牌子可选择?价格? 3,单片机接液晶屏时,应带有驱动程序吧? 希望了解的朋友指点。… 查看全部问答> |
|
有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889 EMAIL:SDTZ_ZZ@126.COM 有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889 EMAIL:SDTZ_ZZ@126.COM… 查看全部问答> |
|
【设计工具】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 ...… 查看全部问答> |
|
昨晚我已经完成了 通过LED闪烁,测试uSer中的任务是否已经成功加入了定时器中断。 然而,最后我们也发现了,main函数的初始化显示出了 这个虽然很简单但已经显示出混乱的迹象。 这是个危险的苗头。 所以我们在继续开始以前,必须先理清条理。 ...… 查看全部问答> |




