十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍了MCU如何自定义引脚做UART串口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
成都创新互联公司坚实的技术研发基础赢得了行业内的良好口碑,公司成立十载来,为近千家企业提供过网站建设、软件开发、搜索引擎优化技术、互联网大数据整合营销服务,多年的技术服务成功经验、众多的客户使我们能懂得更多,做得更好。"让您的网站跑起来"是我们一直追求的目标!
当(单片机)芯片自带的UART端口不够用时,我们可以考虑利用其它引脚作为UART.
串口RS232的数据协议有两种,我们以PC与8位/32位单片机间比较常用的异步模式为例子讲解.
单片机的TXD引脚先发一个低电平0给对方,然后发送5–8个位作为数据,最后发送1个位奇偶校验和1个位高电平1作为停止位.
以下例子为波特率9600bps,1个开始位,8个数据位,1个停止位 [10位数据,无奇偶校验位:9600-8-N-1]
波特率:每秒钟发送的字节位,如果baudrate=9600,也就是说,每发送1位耗时1000/9600=104uSec
/************************************** 利用51芯片定时器中断模拟串口信息发送 优点:可以自定义串口引脚,可以实现多个串口 格式: 9600-8-N-1 功能:模拟串口Send *****************************************/ #includechar g_nSendInx=0; char g_nBuff=0; char g_nFlag=0; #define MY_TXD P1_0 //模拟TXD引脚 void Timer0Init(void)//104微秒@11.0592MHz { //1000ms/9600=104.166us //使用这种方案,由于精确性问题,长时间传输会偶然出现几个误码 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x02; //设置定时器模式 TL0 = 0xA0; //设置定时初值 TH0 = 0xA0; //设置定时重载值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; EA=1; } /****************************** 自定义串口发送单字符 ******************************/ void MyUart_Send(char ch){ g_nFlag=0; g_nBuff=ch; TR0=1; while(g_nFlag==0); } /****************************** 自定义串口发送字符串 ******************************/ void MyUart_String(char* str){ int i=0; while(*(str+i)){ i++; g_nFlag=0; g_nBuff=*(str+i); TR0=1; while(g_nFlag==0); } } /* 定时器0中断服务 */ void Timer0_ISP() interrupt 1{ g_nSendInx++;//发送模拟第几位 if(g_nSendInx==1) { MY_TXD=0;//起始位拉低 }else if(g_nSendInx==10) //格式: 9600-8-N-1,完整10个字节 { MY_TXD=1;//停止位拉高 TR0=0; g_nSendInx=0; g_nFlag=1;///发送完成标志位 }else{ MY_TXD=g_nBuff&0x01;////sbuffer_data g_nBuff>>=1; } } /********************************** 用Timer0定时中断模拟串口信号 **********************************/ void main (void) { Timer0Init();///定时器初始化,周期为 1000ms/9600=104us MyUart_String("===Welcome,My Uart===\r\n "); MyUart_Send(0x61); MyUart_Send(0x62); MyUart_Send(0x63); while (1); }
感谢你能够认真阅读完这篇文章,希望小编分享的“MCU如何自定义引脚做UART串口”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!