温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

单片机IO口模仿UART串口通讯

发布时间:2020-06-01 21:53:15 来源:网络 阅读:1147 作者:yuw2018 栏目:网络安全

为了让人人充沛了解 UART 串口通讯的道理,我们先把 P3.0 和 P3.1 当做 IO 口来停止模仿实践串口通讯的进程,道理搞懂后,我们再运用存放器设置装备摆设完成串口通讯进程。
关于 UART 串口波特率,常用的值是 300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200 等速度。IO 口模仿 UART 串行通讯程序是一个复杂的演示程序,我们运用串口调试助手下发一个数据,数据加 1 后,再主动前往。
串口调试助手,这里我们直接运用 STC-ISP 软件自带的串口调试助手,先把串口调试助手的运用给人人说一下,如图 11-6 所示。第一步要选择串口助手菜单,第二步选择十六进制显示,第三步选择十六进制发送,第四步选择 COM 口,这个 COM 口要和本人电脑装备治理器里的谁人 COM 口分歧,波特率按我们程序设定好的选择,我们程序中让一个数据位继续工夫是 1/9600 秒,那这个中央选择波特率就是选 9600,校验位选 N,数据位 8,中止位 1。

单片机IO口模仿UART串口通讯
图 11-6   串口调试助手表示图


串口调试助手的本质就是应用电脑上的 UART 通讯接口,发送数据给我们的单片机,也可以把我们的单片机发送的数据接纳到这个调试助手界面上。
由于首次接触通讯方面的技巧,所以我把前面的 IO 模仿串口通讯程序停止一下说明,人人可以边看我的说明边看程序,把底层道理先彻底弄懂。
变量界说局部就不必说了,直接看 main 主函数。起首是对通讯的波特率的设定,在这里我们设置装备摆设的波特率是 9600,那么串口调试助手也得是 9600。设置装备摆设波特率的时分,我们用的是准时器 T0 的形式 2。形式 2 中,不再是 TH0 代表高 8 位,TL0 代表低 8 位了,而只要TL0 在停止计数,当 TL0 溢出后,不只仅会让 TF0 变 1,并且还会将 TH0 中的内容从新主动装到 TL0 中。如许有一个益处,就是我们可以把想要的准时器初值提早存在 TH0 中,当 TL0溢出后,TH0 主动把初值就从新送入 TL0 了,全主动的,不需求程序中再给 TL0 从新赋值了,设置装备摆设方法很复杂,人人可以本人看下程序而且盘算一下初值。
波特率设置好今后,翻开中缀,然后等候接纳串口调试助手下发的数据。接纳数据的时分,起首要停止低电平检测 while (PIN_RXD),若没有低电平则阐明没无数据,一旦检测到低电平,就进入启动接纳函数 StartRXD()。接纳函数最开端启动半个波特率周期,初学能够这里不是很明确。人人回头看一下我们的图 11-2 里边的串口数据表示图,假如在数据位电平变更的时分去读取,由于时序上的误差以及旌旗灯号波动性的成绩很轻易读错数据,所以我们愿望在旌旗灯号最波动的时分去读数据。除了旌旗灯号变更的谁人沿的地位外,其它地位都很波动,那么我们如今就商定在旌旗灯号两头地位去读取电平形态,如许可以包管我们读的必定是准确的。
一旦读到了肇端旌旗灯号,我们就把以后形态设定成接纳形态,而且翻开准时器中缀,第一次是半个周期进入中缀后,对肇端位停止二次判别一下,确认一下肇端位是低电平,而不是一个搅扰旌旗灯号。今后每经由 1/9600 秒进入一次中缀,而且把这个引脚的形态读到 RxdBuf 里边。等候接纳终了之后,我们再把这个 RxdBuf 加 1,再经过 TXD 引脚发送出去,异样需求先发一位肇端位,然后发 8 个数据位,再发完毕位,发送终了后,程序运转到 while (PIN_RXD),等候第二轮旌旗灯号接纳的开端。

纯文本复制
			#include <reg52.h> 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); while (1){ //设置装备摆设波特率为 9600 while (PIN_RXD); //等候接纳引脚呈现低电平,即肇端位 StartRXD(); //启动接纳 while (!RxdEnd); //等候接纳完成 StartTXD(RxdBuf+1); //接纳到的数据+1 后,发送归去 while (!TxdEnd); //等候发送完成 } } /* 串口设置装备摆设函数,baud-通讯波特率 */ void ConfigUART(unsigned int baud){ TMOD &= 0xF0; //清零 T0 的掌握位 TMOD |= 0x02; //设置装备摆设 T0 为形式 2 TH0 = 256 - (11059200/12)/baud; //盘算 T0 重载值 } /* 启动串行接纳 */ void StartRXD(){ TL0 = 256 - ((256-TH0)>>1); //接纳启动时的 T0 准时为半个波特率周期 ET0 = 1; //使能 T0 中缀 TR0 = 1; //启动 T0 RxdEnd = 0; //清零接纳完毕标记 RxdOrTxd = 0; //设置以后形态为接纳 } /* 启动串行发送,dat-待发送字节数据 */ void StartTXD(unsigned char dat){ TxdBuf = dat; //待发送数据保管到发送缓冲器 TL0 = TH0; //T0 计数初值为重载值 ET0 = 1; //使能 T0 中缀 TR0 = 1; //启动 T0 PIN_TXD = 0; //发送肇端位 TxdEnd = 0; //清零发送完毕标记 RxdOrTxd = 1; //设置以后形态为发送 } /* T0 中缀效劳函数,处置串行发送和接纳 */ void InterruptTimer0() interrupt 1{ static unsigned char cnt = 0; //位接纳或发送计数 if (RxdOrTxd){ //串行发送处置 cnt++; if (cnt <= 8){ //低位在先顺次发送 8bit 数据位 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){ //处置 8 位数据位 RxdBuf >>= 1; //低位在先,所以将之前接纳的位向右移 //接纳脚为 1 时,缓冲器最高地位 1, //而为 0 时不处置即仍坚持移位后的 0 if (PIN_RXD){ RxdBuf |= 0x80; } cnt++; }else{ //中止位处置 cnt = 0; //复位 bit 计数器 TR0 = 0; //封闭 T0 if (PIN_RXD){ //中止位为 1 时,方能以为数据无效 RxdEnd = 1; //置接纳完毕标记 } } } }


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI