UART串口通讯的根本使用
常用的通讯从传输偏向上可以分为单工通讯、半双工通讯、全双工通讯三类。
单工通讯就是指只许可一偏向别的一方传送信息,而另一方不克不及回传信息。比方电视遥控器、收音机播送等,多是单工通讯技巧。
半双工通讯是指数据可以在单方之间互相传达,然则统一时辰只能个中一方发给别的一方,比方我们的对讲机就是典型的半双工。
全双工通讯就发送数据的同时也可以接纳数据,两者同步停止,就好像我们的德律风一样,我们措辞的同时也可以听到对方的声响。
成都创新互联成立与2013年,先为嘉荫等服务建站,嘉荫等地企业,进行企业商务咨询服务。为嘉荫企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
UART 模块引见
IO 口模仿串口通讯,让人人理解了串口通讯的实质,然则我们的单片机程序却需求一直的检测扫描单片机 IO 口收到的数据,少量占用了单片机的运转工夫。这时分就会有聪慧人想了,其实我们并不是很关怀通讯的进程,我们只需求一个通讯的后果,最终失掉接纳到的数据就行了。如许我们可以在单片机外部做一个硬件模块,让它主动接纳数据,接纳完了,告诉我们一下就可以了,我们的 51 单片机外部就存在如许一个 UART 模块,要准确运用它,当然还得先把对应的特别功用存放器设置装备摆设好。
51 单片机的 UART 串口的构造由串行口掌握存放器 SCON、发送和接纳电路三局部组成,先来理解一下串口掌握存放器 SCON。如表 11-1 表 11-2 所示。
表 11-1 SCON——串行掌握存放器的位分派(地址 0x98、可位寻址)
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
复位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
表 11-2 SCON——串行掌握存放器的位描绘
位 | 符号 | 描绘 |
---|---|---|
7 | SM0 | 这两位配合决议了串口通讯的形式 0~形式 3 共 4 种形式。我们最常用的 就是形式 1,也就是 SM0=0,SM1=1,下边我们重点就讲形式 1,其它模 式从略。 |
6 | SM1 | |
5 | SM2 | 多机通讯掌握位(少少用),形式 1 直接清零。 |
4 | REN | 使能串行接纳。由软件置位使能接纳,软件清零则制止接纳。 |
3 | TB8 | 形式 2 和 3 中要发送的第 9 位数据(很罕用)。 |
2 | RB8 | 形式 2 和 3 中接纳到的第 9 位数据(很罕用),形式 1 用来接纳中止位。 |
1 | TI | 发送中缀标记位,当发送电路发送到中止位的两头地位时,TI 由硬件置 1, 必需经过软件清零。 |
0 | RI | 接纳中缀标记位,当接纳电路接纳到中止位的两头地位时,RI 由硬件置 1, 必需经过软件清零。 |
前边学了那么多存放器的设置装备摆设,置信 SCON 这个中央,关于大多半同窗来说曾经不是难点了,应当能看懂而且可以本人设置装备摆设了。关于串口的四种形式,形式 1 是最常用的,就是我们前边提到的 1 位肇端位,8 位数据位和 1 位中止位。下面我们就具体引见形式 1 的任务细节和运用办法,至于其它 3 种形式与此也是大同小异,真正碰到需求运用的时分人人再去查阅相干材料就行了。
在我们运用 IO 口模仿串口通讯的时分,串口的波特率是运用准时器 T0 的中缀表现出来的。在硬件串口模块中,有一个专门的波特率发作器用来掌握发送和接纳数据的速度。关于STC89C52 单片机来讲,这个波特率发作器只能由准时器 T1 或准时器 T2 发生,而不克不及由准时器 T0 发生,这和我们模仿的通讯是完整分歧的概念。
假如用准时器 2,需求设置装备摆设额定的存放器,默许是运用准时器 1 的,我们本章内容次要就运用准时器 T1 作为波特率发作器来解说,方法 1 下的波特率发作器必需运用准时器 T1 的形式 2,也就是主动重装载形式,准时器的重载值盘算公式为:
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
和波特率有关的还有一个存放器,是一个电源治理存放器 PCON,他的最高位可以把波特率进步一倍,也就是假如写 PCON |= 0x80 今后,盘算公式就成了:
TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
公式中数字的寄义这里说明一下,256 是 8 位准时器的溢出值,也就是 TL1 的溢出值,晶振值在我们的开辟板上就是 11059200,12 是说 1 个机械周期等于 12 个时钟周期,值得存眷的是这个 16,我们来重点阐明。在 IO 口模仿串口通讯接纳数据的时分,采集的是这一位数据的两头地位,而实践上串口模块比我们模仿的要复杂和准确一些。他采用的方法是把一位旌旗灯号采集 16 次,个中第 7、8、9 次掏出来,这三次中个中两次假如是高电平,那么就认定这一位数据是 1,假如两次是低电平,那么就认定这一位是 0,如许一旦遭到不测搅扰读错一次数据,也仍然可以包管最终数据的准确性。
理解了串口采集形式,在这里要给人人留一个考虑题。“晶振值/12/2/16/波特率”这个中央盘算的时分,呈现不克不及除尽,或许呈现小数怎样办,许可呈现多大的偏向?把这局部了解了,也就了解了我们的晶振为何运用 11.0592M 了。
串口通讯的发送和接纳电路在物理上有 2 个名字相反的 SBUF 存放器,它们的地址也多是 0x99,然则一个用来做发送缓冲,一个用来做接纳缓冲。意思就是说,有 2 个房间,两个房间的门商标是一样的,个中一个只出人不进人,别的一个只进人不出人,如许的话,我们就可以完成 UART 的全双工通讯,互相之间不会发生搅扰。然则在逻辑上呢,我们每次只操作 SBUF,单片时机主动依据对它履行的是“读”照样“写”操作来选择是接纳 SBUF 照样发送 SBUF,后边经过程序,我们就会彻底理解这个成绩。
UART 串口程序
普通状况下,我们编写串口通讯程序的根本步调如下所示:
设置装备摆设串口为形式 1。
设置装备摆设准时器 T1 为形式 2,即主动重装形式。
依据波特率盘算 TH1 和 TL1 的初值,假如有需求可以运用 PCON 停止波特率加倍。
翻开准时器掌握存放器 TR1,让准时器跑起来。
这里还要特殊留意一下,就是在运用 T1 做波特率发作器的时分,万万不要再使能 T1 的中缀了。
我们先来看一下由 IO 口模仿串口通讯直接改为运用硬件 UART 模块时的程序代码,看看程序是不是复杂了许多,由于大局部的任务硬件模块都替我们做了。程序功用和 IO 口模仿的是完整一样的。
#includevoid ConfigUART(unsigned int baud); void main(){ ConfigUART(9600); //设置装备摆设波特率为 9600 while (1){ while (!RI); //等候接纳完成 RI = 0; //清零接纳中缀标记位 SBUF = SBUF + 1; //接纳到的数据+1 后,发送归去 while (!TI); //等候发送完成 TI = 0; //清零发送中缀标记位 } } /* 串口设置装备摆设函数,baud-通讯波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //设置装备摆设串口为形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //设置装备摆设 T1 为形式 2 TH1 = 256 - (11059200/12/32)/baud; //盘算 T1 重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; //制止 T1 中缀 TR1 = 1; //启动 T1 }
当然了,这个程序照样用在主轮回里等候接纳中缀标记位和发送中缀标记位的办法来编写的,而实践工程开辟中,当然就不克不及这么干了,我们也只是为了用直不雅的比照来通知同窗们硬件模块可以大大简化程序代码,那么实践运用串口的时分就用到串口中缀了,来看一下用中缀完成的程序。请留意一点,由于接纳和发送触发的是统一个串口中缀,所以在串口中缀函数中就必需先判别是哪一种中缀,然后再作出响应的处置。
#includevoid ConfigUART(unsigned int baud); void main(){ EA = 1; //使能总中缀 ConfigUART(9600); //设置装备摆设波特率为 9600 while (1); } /* 串口设置装备摆设函数,baud-通讯波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //设置装备摆设串口为形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //设置装备摆设 T1 为形式 2 TH1 = 256 - (11059200/12/32)/baud; //盘算 T1 重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; //制止 T1 中缀 ES = 1; //使能串口中缀 TR1 = 1; //启动 T1 } /* UART 中缀效劳函数 */ void InterruptUART() interrupt 4{ if (RI){ //接纳到字节 RI = 0; //手动清零接纳中缀标记位 SBUF = SBUF + 1; //接纳的数据+1 后发还,右边是发送 SBUF,左边是接纳 SBUF } if (TI){ //字节发送终了 TI = 0; //手动清零发送中缀标记位 } }
文章题目:UART串口通讯的根本使用
链接URL:http://myzitong.com/article/ggoodo.html