51单片机GPIO口模拟串口通信
本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。
本文引用地址:https://www.eepw.com.cn/article/201611/318356.htm以11.0592MHz的晶振为例,通过定时计数器0产生中断信号来模拟串口电平,下面附上具体源代码。
[cpp]view plaincopy
- /*
- Fuction:使用51单片机GPIO口模拟串口通信,通过定时计数器0来产生中断信号
- SoftwareDesigner:Jason
- */
- #include
- sbitP1_0=P1^0;
- sbitP1_1=P1^1;
- #defineRXDP1_0
- #defineTXDP1_1
- unsignedcharflag;
- voidinit();
- voidsend_byte(unsignedchar);
- unsignedcharrec_byte();
- voidwait_int();
- //将从PC机串口接收到的数据原封不动回传给PC机
- voidmain()
- {
- unsignedchartemp;
- init();
- while(1)
- {
- if(RI==1)
- {
- RI=0;
- temp=rec_byte();
- send_byte(temp);
- while(!TI);
- TI=0;
- }
- }
- }
- //端口及中断初始化
- voidinit()
- {
- TMOD=0x02;//定时器0,方式2
- TH0=0xfd;//波特率9600
- TL0=TH0;
- TR0=0;//在发送或接收时打开
- ET0=1;//允许定时器0中断
- EA=1;//允许所有中断
- }
- //通过串口发送一个字节数据
- voidsend_byte(unsignedchardat)
- {
- unsignedchari=8;
- TR0=1;//开启T0中断
- TXD=0;//发送起始位0
- wait_int();
- while(i--)//发送8位数据
- {
- TXD=(bit)(dat&0x01);
- wait_int();
- dat=dat>>1;
- }
- TXD=1;//发送停止位1
- wait_int();
- TR0=0;//关闭T0中断
- }
- //通过串口接收一个字节数据
- unsignedcharrec_byte()
- {
- unsignedchardat=0;
- unsignedchari=8;
- TR0=1;//开启T0中断
- wait_int();//等过起始位电平
- while(i--)//接收8位数据
- {
- dat=dat<<1;
- if(RXD)
- dat|=0x80;
- wait_int();
- }
- wait_int();//等过停止位电平
- TR0=0;//关闭T0中断
- returndat;
- }
- //等待中断到来
- voidwait_int()
- {
- while(!flag);
- flag=0;
- }
- //中断服务程序
- voidtimer0()interrupt1
- {
- flag=1;
- }
评论