单片机模拟串口实验
扫描二维码
随时随地手机看文章
传统的8051系列单片机一般都配备一个串口,而STC89C52RC增强型单片机也不例外,只有一个串口可供使用,这样就出问题了,假如当前单片机系统要求二个串口或多个串口进行同时通信,8051系列单片机只有一个串口可供通信就显得十分尴尬,但是在实际的应用中,有两种方法可以选择。
方法1:使用能够支持多串口通信的单片机,不过通过更换其他单片机来代替8051系列单片机,这样就会直接导致成本的增加,优点就是编程简单,而且通信稳定可靠。
方法2:在IO资源比较充足的情况下,可以通过IO来模拟串口的通信,虽然这样会增加编程的难度,模拟串口的波特率会比真正的串口通信低一个层次,但是唯一优点就是成本上得到控制,而且通过不同的IO组合可以实现更加之多的模拟串口,在实际应用中往往会采用模拟串口的方法来实现多串口通信。
普遍使用串口通信的数据流都是1位起始位、8位数据位、1位停止位的格式的,如表1。
表1
起始位
8位数据位
停止位
0
Bit0
Bit1
Bit2
Bit3
Bit4
Bit5
Bit6
Bit7
1
要注意的是,起始位作为识别是否有数据到来,停止位标志数据已经发送完毕。起始位固定值为0,停止位固定值为1,那么为什么起始位要是0,停止位要是1呢?这个很好理解,假设停止位固定值为1,为了更加易识别数据的到来,电平的跳变最为简单也最容易识别,那么当有数据来的时候,只要在规定的时间内检测到发送过来的第一位的电平是否0值,就可以确定是否有数据到来;另外停止位为1的作用就是当没有收发数据之后引脚置为高电平起到抗干扰的作用。
在平时使用红外无线收发数据时,一般都采用模拟串口来实现的,但是有个问题要注意,波特率越高,传输距离越近;波特率越低,传输距离越远。对于这些通过模拟串口进行数据传输,波特率适宜为1200b/s来进行数据传输。
例子:在使用单片机的串口接收数据实验当中,使用串口调试助手发送16字节数据,单片机采用模拟串口的方法将接收到的数据返发到PC机。
模拟串口实验代码:
1#include"stc.h"23#defineRXDP3_0//宏定义:接收数据的引脚4#defineTXDP3_1//宏定义:发送数据的引脚5#defineRECEIVE_MAX_BYTES16//宏定义:最大接收字节数67#defineTIMER_ENABLE(){TL0=TH0;TR0=1;fTimeouts=0;}//使能T/C8#defineTIMER_DISABLE(){TR0=0;fTimeouts=0;}//禁止T/C9#defineTIMER_WAIT(){while(!fTimeouts);fTimeouts=0;}//等待T/C超时101112unsignedcharfTimeouts=0;//T/C超时溢出标志位13unsignedcharRecvBuf[16];//接收数据缓冲区14unsignedcharRecvCount=0;//接收数据计数器151617/****************************************18*函数名称:SendByte19*输入:byte要发送的字节20*输出:无21*功能:串口发送单个字节22******************************************/23voidSendByte(unsignedcharb)24{25unsignedchari=8;2627TXD=0;2829TIMER_ENABLE();30TIMER_WAIT();313233while(i--)34{35if(b&1)TXD=1;36elseTXD=0;3738TIMER_WAIT();3940b>>=1;4142}434445TXD=1;4647TIMER_WAIT();48TIMER_DISABLE();49}50/****************************************51*函数名称:RecvByte52*输入:无53*输出:单个字节54*功能:串口接收单个字节55******************************************/56unsignedcharRecvByte(void)57{58unsignedchari;59unsignedcharb=0;6061TIMER_ENABLE();62TIMER_WAIT();6364for(i=0;i<8;i++)65{66if(RXD)b|=(1<=RECEIVE_MAX_BYTES)137{138RecvCount=0;139140for(i=0;i