51单片机GPIO口模拟串口通信
时间:11-19
来源:互联网
点击:
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。
本文所说的模拟串口, 就是利用51的两个输入输出引脚P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。
以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;
- }
51单片机GPIO口模拟串口通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)