|
51 IO口模擬串口通訊C源程 #include <reg51.h> 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; } //發(fā)送一個字符 void PSendChar(unsigned char inch) { #ifdef MODE_QUICK ACC=inch;
F_TM=0; BT_SND=0; //start bit TIMER0_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 #else unsigned char ii;
ii=0;
F_TM=0; BT_SND=0; //start bit TIMER0_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);
#endif TIMER0_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; //停止timer return ACC; #else unsigned 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; //停止timer return rch;
#endif
}
|