这篇文章主要介绍了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 *****************************************/ #include <REG52.H> char 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串口”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/231663.html