#include sbit BT_SND =P1^0;sbit BT_REC =P1^1;/********************************************** IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 **********************************************/ #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1;#define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0;sbit ACC1= ACC^1;sbit ACC2= ACC^2;sbit ACC3= ACC^3;sbit ACC4= ACC^4;sbit ACC5= ACC^5;sbit ACC6= ACC^6;sbit ACC7= ACC^7; void IntTimer0() interrupt 1{F_TM=1;}//发送一个字符void PSendChar(unsigned char inch){#ifdef MODE_QUICKACC=inch; F_TM=0;BT_SND=0; //start bitTIMER0_ENABLE; //启动while(!F_TM); BT_SND=ACC0; //先送出低位F_TM=0;while(!F_TM); BT_SND=ACC1;F_TM=0;while(!F_TM); BT_SND=ACC2;F_TM=0;while(!F_TM); BT_SND=ACC3;F_TM=0;while(!F_TM); BT_SND=ACC4;F_TM=0;while(!F_TM); BT_SND=ACC5;F_TM=0;while(!F_TM); BT_SND=ACC6;F_TM=0;while(!F_TM); BT_SND=ACC7;F_TM=0;while(!F_TM); BT_SND=1;F_TM=0;while(!F_TM); TIMER0_DISABLE; //停止timer#elseunsigned char ii; ii=0; F_TM=0;BT_SND=0; //start bitTIMER0_ENABLE; //启动while(!F_TM); while(ii<8){if(inch&1){BT_SND=1;}else{BT_SND=0;}F_TM=0;while(!F_TM);ii++;inch>>=1;}BT_SND=1;F_TM=0;while(!F_TM); #endifTIMER0_DISABLE; //停止timer}//接收一个字符unsigned char PGetChar(){#ifdef MODE_QUICK TIMER0_ENABLE;F_TM=0;while(!F_TM); //等过起始位ACC0=BT_REC; TL0=TH0; F_TM=0;while(!F_TM);ACC1=BT_REC; F_TM=0;while(!F_TM);ACC2=BT_REC; F_TM=0;while(!F_TM);ACC3=BT_REC; F_TM=0;while(!F_TM);ACC4=BT_REC; F_TM=0;while(!F_TM);ACC5=BT_REC; F_TM=0;while(!F_TM);ACC6=BT_REC; F_TM=0;while(!F_TM);ACC7=BT_REC; F_TM=0; while(!F_TM){if(BT_REC){break;}}TIMER0_DISABLE; //停止timerreturn ACC;#elseunsigned char rch,ii;TIMER0_ENABLE;F_TM=0;ii=0;rch=0;while(!F_TM); //等过起始位 while(ii<8){rch>>=1;if(BT_REC){rch|=0x80;}ii++;F_TM=0;while(!F_TM); }F_TM=0;while(!F_TM){if(BT_REC){break;} }TIMER0_DISABLE; //停止timerreturn rch; #endif }//检查是不是有起始位bit StartBitOn(){return (BT_REC==0); }void main(){unsigned char gch; TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */PCON=00; TR0=0; //在发送或接收才开始使用TF0=0;TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer是//104.167*11.0592/12= 96TL0=TH0;ET0=1;EA=1; PSendChar(0x55);PSendChar(0xaa);PSendChar(0x00);PSendChar(0xff); while(1){if(StartBitOn()){gch=PGetChar();PSendChar(gch);}} }