UART串口通信
UART,全称Universal Asynchronous Receiver/Transmitter,即通用异步收发器。
串口通信是单片机中最常用的一种技术,通常用于单片机和计算机之间以及单片机和单片机之间的通信。
并行通信:数据各个位同时传送,可实现以字节为单位来通信。缺点:通信线占用资源多,成本高。
串行通信:一次只传输一个字节的数据。
STC89C52有两个专门的UART通信引脚,P3.0(RXD)和P3.1(TXD),由它们组成的通信接口叫串行接口,简称串口。
下图体现了两个单片机相互收发信息的过程:
图中两单片机的GND互连,因为单片机之间的通信,要保证电源基准一致。
GND——单片机系统电源的参考地。
TXD——串行发送引脚。
RXD——串行接收引脚。
学习UART通信,要认识波特率。
波特率是发送二进制数据位的速率,习惯上用baud表示。发送一位二进制数据的持续时间=1/baud。
(UART串口的波特率常用值是300、600、1200、4800、9600、14400、19200、28800、38400、57600、115200等。)
在通信前,两个单片机需要明确约定好通信波特率。只有保持波特率一致,才能保证收发双方实现正常通信。
UART通信原则:低位先发,高位后发。
UART通信规定:当没有通信信号发生时,通信线路应保持高电平。发送数据之前,要先发一位0,标志数据起始位,数据发送完毕,要发送一位1,标志数据截止位。
下图位串口数据发送示意图:
改图表现了信号随着时间变化的对应关系,实际上是一个时域示意图。
比如:在单片机发送引脚上,左边的是先发送的,右边的是后发生的。数据位的切换时间即为1/波特率。
掌握时域的概念,有助于理解不同通信的时序图
为了更好的理解UART串口通信的原理,下面给出了一段IO口模拟UART串口通信的程序。
IO口模拟UART串行通信程序是一个简单的演示程序。使用烧录工具中的串口调试助手下发一个数据,待数据加1后,将自动返回。
串口调试助手的实质是利用计算机上的UART通信接口,发送数据给单片机或接收来自单片机的数据并显示在调试助手的界面上。(单片机通过USB与计算机相连,计算机中有USB转UART的芯片)
#include sbit PIN_RXD = P3^0; //定义接收引脚 sbit PIN_TXD = P3^1; //定义发送引脚 bit RxdOrTxd = 0; //标志当前状态(发送或接收) bit RxdEnd = 0; //标志接收结束位 bit TxdEnd = 0; //标志发送结束位 unsigned char RxdBuf = 0; //接收缓冲器 unsigned char TxdBuf = 0; //发送缓冲器 void ConfigUART(unsigned int baud); //配置波特率 void StartTXD(unsigned char dat); //开始发送数据 void StartRXD(); //开始接收数据 void main() { EA = 1; //中断使能总开关 ConfigUART(9600); //配置波特率位9600 while(1) { while(PIN_RXD); //等待接收引脚出现低电平,即起始位 StartRXD(); //启动接收 while(!RxdEnd); //等待接收完成 StartTXD(RxdBuf+1); //将接收到的数据+1后,发送回去 while(!TxdEnd); //等待发送完成 } } void ConfigUART(unsigned int baud) { TMOD &= 0XF0; //清零T0的控制位 TMOD = 0X02; //设置T0为模式2 TH0 = 256 - (11059200/12)/baud; //计算T0重载值 } void StartTXD(unsigned char dat) { TxdBuf = dat; //保存待发送数据到发送缓存器 TL0 = TH0; //T0计数初值为重载值 ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 PIN_TXD = 0; //发送起始位 TxdEnd = 0; //清零发送结束标志 RxdOrTxd = 1; //设置当前状态为发送 } void StartRXD() { TL0 = 256 - ((256-TH0)>>1); //启动时,将T0定时为1/2个波特率周期 ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 RxdEnd = 0; //清零接收结束标志H7YHB RxdOrTxd = 0; //设置当前状态为接收 } void InterruptTimer0() interrupt 1 { static unsigned char cnt = 0; //位接收或发送计数 if(RxdOrTxd) { if(cnt <= 8) { PIN_TXD = TxdBuf & 0X01; TxdBuf >>= 1; } else if(cnt == 9) { PIN_TXD = 1; } else { cnt = 0; //复位bit计数器 TR0 = 0; //关闭T0 TxdEnd = 1; //标志发送结束 } } else { if(cnt == 0) //处理起始位 { if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接收数据位 { RxdBuf = 0; cnt++; } else //起始位不为0,中止接收 { TR0 = 0; //关闭T0 } } else if(cnt <= 8) { RxdBuf >>= 1; //低位在前,所以将之前接收的位向有移 if(PIN_RXD) //接收脚为1时,缓冲器最高位置1 { RxdBuf |= 0X80; } cnt++; } else //停止位处理 { cnt = 0; //复位bit计数器 TR0 = 0; //关闭T0 if(PIN_RXD) //若停止位为1,证明数据有效 { RxdEnd = 1; //标志接收结束 } } } } 可以观察到,接收函数启动时,定时为半个波特率周期。这是UART通信的一个小技巧。回头看看串口数据示意图,如果在数据位电平变化时读取数据,可能会因为时序误差或信号不稳定导致读错数据。需要找到非信号变动的位置读取电平数据。于是有了这个约定:选择信号中间位置读取电平状态,从而保证正确读出数据。
上一篇:如何驱动51单片机串口(uart通信)
下一篇:51单片机串口通讯uart笔记
推荐阅读
史海拾趣
随着电子行业的快速发展,技术更新换代的速度越来越快。APX Technologies面临着来自同行的激烈竞争和不断变化的市场需求。为了应对这些挑战,公司不断调整战略方向,加大研发投入,优化产品结构。在稳中求进的过程中,APX Technologies逐渐巩固了自己的市场地位。
面对日益激烈的国际竞争,Eastron Corp决定走全球化发展的道路。公司先后在亚洲、欧洲和北美等地设立了研发中心和生产基地,通过本地化生产和研发,快速响应市场需求。同时,Eastron还积极寻求与国际知名企业的合作,共同开发新技术和产品,提升了公司的国际竞争力。
绿索超容深知品质是企业生存的根本。因此,公司从原材料采购到生产制造,再到成品检验,都实施了严格的质量控制措施。此外,公司还通过了ISO9001体系认证,进一步提升了其产品质量管理水平。这些努力不仅保证了绿索超容产品的优良品质,也为其赢得了客户的信任和好评。
随着网络安全问题的全球化趋势日益明显,Defender Security公司开始积极拓展国际市场。他们与多家国际知名的网络安全企业建立了合作关系,共同应对全球网络安全挑战。通过技术交流和合作研发,Defender Security不断提升自己的国际竞争力,逐渐成为了全球网络安全领域的重要力量。
经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。
经过几年的技术积累和市场探索,智烽维在2013年成功完成了叠片型超级电容器的研发。这一产品的推出,不仅极大地丰富了公司的产品线,也进一步提升了智烽维在超级电容器领域的技术实力。叠片型超级电容器以其高性能、高可靠性和长寿命等特点,受到了市场的广泛关注和好评。
单工无线呼叫系统分发射和接收两大部分。发射部分采用锁相环式频率合成器技术, MC145152和MC12022芯片组成锁相环,将载波频率精确锁定在35MHz,输出载波的稳定度达到4×10-5,准确度达到3×10-5,由变容二极管V149和集成压控振荡器芯片MC1648实现 ...… 查看全部问答∨ |
|
天馈系统不匹配对移动通信的影响及解决方法 天馈系统是移动通信系统的重要组成部分,其性能优劣对整体移动通信质量的影响至关重要。根据移动网运行质量统计结果分析,造成移动通信质量指标下降的主要原因来自天馈系统(约占一半以上),而在天 ...… 查看全部问答∨ |
|
SST的flash,main函数中定义了一个字符数组:char txt[]="This is a example";然后用此语句 Program(0,txt); 调用下面的函数。 uint8 Program(uint16 Addr, char *Data) { volatile uint16 *ip ...… 查看全部问答∨ |
VS2005如何开发wince5.0的程序,如何测试,如何运行ce5.0模拟器 首先我要说我初次接触嵌入式开发。 再vs2003下面开发智能“只能设备应用程序”,vs2003本身就有windos ce net模拟器,可以非常轻松的运行模拟器,但是为什么vs2005下的就没有这个模拟器呢? 我的操作系统是windows server 2003从微软网站下载windo ...… 查看全部问答∨ |
//小菜出品---严禁抄袭,转载请注明出处 #include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar idata x,y;uchar code disp_code[] ={ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x ...… 查看全部问答∨ |
我最近收到了Stellaris Cortex-M3评估板,试验了一下里面的例子。现在想自己做一个项目,但是没有库函数,有哪位能提供一下Stellaris Cortex-M3评估板的库函数参考一下.谢谢了~~ [ 本帖最后由 linuxshx 于 2010-9-7 09:04 编辑 ]… 查看全部问答∨ |
若串口DMA接收的字节数据个数配置成8,并开数据全部完成DMA中断;而发送一端发送7个数据之后就不再发送数据了。那我如何能知道串口已接收到了7个数据??… 查看全部问答∨ |