51單片機GPIO口模擬串口通信
本文所說的模擬串口, 就是利用51的兩個輸入輸出引腳P1.0和P1.1,置1或0分別代表高低電平,也就是串口通信中所說的位,如起始位用低電平,則將其置0,停止位為高電平,則將其置1,各種數(shù)據(jù)位和校驗位則根據(jù)情況置1或置0。
本文引用地址:http://m.butianyuan.cn/article/201611/318356.htm以11.0592MHz的晶振為例,通過定時計數(shù)器0產(chǎn)生中斷信號來模擬串口電平,下面附上具體源代碼。
[cpp]view plaincopy
- /*
- Fuction:使用51單片機GPIO口模擬串口通信,通過定時計數(shù)器0來產(chǎn)生中斷信號
- 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機串口接收到的數(shù)據(jù)原封不動回傳給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;//在發(fā)送或接收時打開
- ET0=1;//允許定時器0中斷
- EA=1;//允許所有中斷
- }
- //通過串口發(fā)送一個字節(jié)數(shù)據(jù)
- voidsend_byte(unsignedchardat)
- {
- unsignedchari=8;
- TR0=1;//開啟T0中斷
- TXD=0;//發(fā)送起始位0
- wait_int();
- while(i--)//發(fā)送8位數(shù)據(jù)
- {
- TXD=(bit)(dat&0x01);
- wait_int();
- dat=dat>>1;
- }
- TXD=1;//發(fā)送停止位1
- wait_int();
- TR0=0;//關(guān)閉T0中斷
- }
- //通過串口接收一個字節(jié)數(shù)據(jù)
- unsignedcharrec_byte()
- {
- unsignedchardat=0;
- unsignedchari=8;
- TR0=1;//開啟T0中斷
- wait_int();//等過起始位電平
- while(i--)//接收8位數(shù)據(jù)
- {
- dat=dat<<1;
- if(RXD)
- dat|=0x80;
- wait_int();
- }
- wait_int();//等過停止位電平
- TR0=0;//關(guān)閉T0中斷
- returndat;
- }
- //等待中斷到來
- voidwait_int()
- {
- while(!flag);
- flag=0;
- }
- //中斷服務(wù)程序
- voidtimer0()interrupt1
- {
- flag=1;
- }
評論