|
占用26個(gè)指令周期 } while(--temp) //在指定的 時(shí)間內(nèi)搜尋結(jié)束位。 { Delay2cp(1); if(RXD)break; //收到結(jié)束位便退出 } return Output; }
//延時(shí)程序* void Delay2cp(unsigned char i) { while(--i); //剛好兩個(gè) 指令周期。 }
此種方法在接收上存在一定的難度,主要是采樣定位存在需較準(zhǔn)確,另外還必須知道 每條語(yǔ)句的指令周期數(shù)。此法可能模擬若干個(gè)串口,實(shí)際中采用它的人也很多,但如果你用Keil C,本人不建議使用此種方法,上述程序在P89C52、AT89C52、W78E52三種單片機(jī)上實(shí)驗(yàn)通過。
方法二:計(jì)數(shù)法
51的計(jì)數(shù)器在每指令周期加1,直到溢出,同時(shí)硬件置溢出標(biāo)志位。這樣我們就可以 通過預(yù)置初值的方法讓機(jī)器每96個(gè)指令周期產(chǎn)生一次溢出,程序不斷的查詢溢出標(biāo)志來決定是否 發(fā)送或接收下一位。 //計(jì)數(shù)器初始化 void S2INI(void) { TMOD =0x02; //計(jì)數(shù)器0,方式2 TH0=0xA0; //預(yù)值為256-96=140,十六進(jìn)制A0 TL0=TH0; TR0=1; //開始計(jì)數(shù) TF0=0; }
void WByte(uchar input) { //發(fā)送啟始位 uchar i=8; TR0=1; TXD=(bit)0; WaitTF0(); //發(fā)送8位數(shù)據(jù)位 while(i--) { TXD=(bit)(input&0x01); //先傳低位 WaitTF0(); input=input>>1; } //發(fā)送校驗(yàn)位(無) //發(fā)送結(jié)束位 TXD=(bit)1; WaitTF0(); TR0=0; } //查詢計(jì)數(shù)器溢出標(biāo)志位 void WaitTF0( void ) { while(!TF0); TF0=0; } 接收的程序,可以參考下一種方法,不再寫出。這種辦法個(gè)人感覺不錯(cuò),接收和發(fā)送 都很準(zhǔn)確,另外不需要計(jì)算每條語(yǔ)句的指令周期數(shù)。
方法三:中斷法
中斷的方法和計(jì)數(shù)器的方法差不多,只是當(dāng)計(jì)算器溢出時(shí)便產(chǎn)生一次中斷,用戶可以 在中斷程序中置標(biāo)志,程序不斷的查詢?cè)摌?biāo)志來決定是否發(fā)送或接收下一位,當(dāng)然程序中需對(duì)中
|