51單片機(jī)模擬串口的三種方法
/***********************************************************
方法三:中斷法
分 析:中斷的方法和計數(shù)器的方法差不多,只是當(dāng)計算器溢出時便產(chǎn)生一次中斷,用戶可以在中斷程序中置標(biāo)志,程序不斷的查詢該標(biāo)志來決定是否發(fā)送或接收下一位,當(dāng)然程序中需對中斷進(jìn)行初始化,同時編寫中斷程序。本程序使用Timer0中斷。中斷法也是我推薦的方法,和計數(shù)法大同小異。發(fā)送程序參考計數(shù)法,相信是件很容易的事。另外還需注明的是本文所說的串口就是通常的三線制異步通信串口(UART),只用
RXD、TXD、GND。
***********************************************************/
#define TM0_FLAG P1_2 //設(shè)傳輸標(biāo)志位
//計數(shù)器及中斷初始化
void S2INI(void)
{
TMOD |=0x02; //計數(shù)器0,方式2
TH0=0xA0; //預(yù)值為256-96=140,十六進(jìn)制A0
TL0=TH0;
TR0=0; //在發(fā)送或接收才開始使用
TF0=0;
ET0=1; //允許定時器0中斷
EA=1; //中斷允許總開關(guān)
}
//接收一個字符
uchar RByte()
{
uchar Output=0;
uchar i=8;
TR0=1; //啟動Timer0
TL0=TH0;
WaitTF0(); //等過起始位
//接收8位數(shù)據(jù)位
while(i--)
{
Output >>=1;
if(RXD) Output |=0x80; //先收低位
WaitTF0(); //位間延時
}
while(!TM0_FLAG) if(RXD) break;
TR0=0; //停止Timer0
return Output;
}
//中斷1處理程序
void IntTimer0() interrupt 1
{
TM0_FLAG=1; //設(shè)置標(biāo)志位。
}
//查詢傳輸標(biāo)志位
void WaitTF0( void )
{
while(!TM0_FLAG) ;
TM0_FLAG=0; //清標(biāo)志位
}
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評論