跟着单片机的运用日益频繁,用其作前置机进行并重和通讯也常见于各种运用,一般是运用前置机并重各种终端数据后进行处理、存储,再自动或被迫上报给管理站。这种状况下下,并重会需求一个串口,上报又需求另一个串口,这就要求单片机具有双串口的功用,但咱们知道一般的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;
- }