單片機(jī)模擬串口實(shí)驗(yàn)
傳統(tǒng)的8051系列單片機(jī)一般都配備一個(gè)串口,而STC89C52RC增強(qiáng)型單片機(jī)也不例外,只有一個(gè)串口可供使用,這樣就出問(wèn)題了,假如當(dāng)前單片機(jī)系統(tǒng)要求二個(gè)串口或多個(gè)串口進(jìn)行同時(shí)通信,8051系列單片機(jī)只有一個(gè)串口可供通信就顯得十分尷尬,但是在實(shí)際的應(yīng)用中,有兩種方法可以選擇。
方法1:使用能夠支持多串口通信的單片機(jī),不過(guò)通過(guò)更換其他單片機(jī)來(lái)代替8051系列單片機(jī),這樣就會(huì)直接導(dǎo)致成本的增加,優(yōu)點(diǎn)就是編程簡(jiǎn)單,而且通信穩(wěn)定可靠。
方法2:在IO資源比較充足的情況下,可以通過(guò)IO來(lái)模擬串口的通信,雖然這樣會(huì)增加編程的難度,模擬串口的波特率會(huì)比真正的串口通信低一個(gè)層次,但是唯一優(yōu)點(diǎn)就是成本上得到控制,而且通過(guò)不同的IO組合可以實(shí)現(xiàn)更加之多的模擬串口,在實(shí)際應(yīng)用中往往會(huì)采用模擬串口的方法來(lái)實(shí)現(xiàn)多串口通信。
普遍使用串口通信的數(shù)據(jù)流都是1位起始位、8位數(shù)據(jù)位、1位停止位的格式的,如表1。
表1
起始位
8位數(shù)據(jù)位
停止位
0
Bit0
Bit1
Bit2
Bit3
Bit4
Bit5
Bit6
Bit7
1
要注意的是,起始位作為識(shí)別是否有數(shù)據(jù)到來(lái),停止位標(biāo)志數(shù)據(jù)已經(jīng)發(fā)送完畢。起始位固定值為0,停止位固定值為1,那么為什么起始位要是0,停止位要是1呢?這個(gè)很好理解,假設(shè)停止位固定值為1,為了更加易識(shí)別數(shù)據(jù)的到來(lái),電平的跳變最為簡(jiǎn)單也最容易識(shí)別,那么當(dāng)有數(shù)據(jù)來(lái)的時(shí)候,只要在規(guī)定的時(shí)間內(nèi)檢測(cè)到發(fā)送過(guò)來(lái)的第一位的電平是否0值,就可以確定是否有數(shù)據(jù)到來(lái);另外停止位為1的作用就是當(dāng)沒(méi)有收發(fā)數(shù)據(jù)之后引腳置為高電平起到抗干擾的作用。
在平時(shí)使用紅外無(wú)線(xiàn)收發(fā)數(shù)據(jù)時(shí),一般都采用模擬串口來(lái)實(shí)現(xiàn)的,但是有個(gè)問(wèn)題要注意,波特率越高,傳輸距離越近;波特率越低,傳輸距離越遠(yuǎn)。對(duì)于這些通過(guò)模擬串口進(jìn)行數(shù)據(jù)傳輸,波特率適宜為1200b/s來(lái)進(jìn)行數(shù)據(jù)傳輸。
例子:在使用單片機(jī)的串口接收數(shù)據(jù)實(shí)驗(yàn)當(dāng)中,使用串口調(diào)試助手發(fā)送16字節(jié)數(shù)據(jù),單片機(jī)采用模擬串口的方法將接收到的數(shù)據(jù)返發(fā)到PC機(jī)。
模擬串口實(shí)驗(yàn)代碼:
1#include"stc.h"23#defineRXDP3_0//宏定義:接收數(shù)據(jù)的引腳4#defineTXDP3_1//宏定義:發(fā)送數(shù)據(jù)的引腳5#defineRECEIVE_MAX_BYTES16//宏定義:最大接收字節(jié)數(shù)67#defineTIMER_ENABLE(){TL0=TH0;TR0=1;fTimeouts=0;}//使能T/C8#defineTIMER_DISABLE(){TR0=0;fTimeouts=0;}//禁止T/C9#defineTIMER_WAIT(){while(!fTimeouts);fTimeouts=0;}//等待T/C超時(shí)101112unsignedcharfTimeouts=0;//T/C超時(shí)溢出標(biāo)志位13unsignedcharRecvBuf[16];//接收數(shù)據(jù)緩沖區(qū)14unsignedcharRecvCount=0;//接收數(shù)據(jù)計(jì)數(shù)器151617/****************************************18*函數(shù)名稱(chēng):SendByte19*輸入:byte要發(fā)送的字節(jié)20*輸出:無(wú)21*功能:串口發(fā)送單個(gè)字節(jié)22******************************************/23voidSendByte(unsignedcharb)24{25unsignedchari=8;2627TXD=0;2829TIMER_ENABLE();30TIMER_WAIT();313233while(i--)34{35if(b&1)TXD=1;36elseTXD=0;3738TIMER_WAIT();3940b>>=1;4142}434445TXD=1;4647TIMER_WAIT();48TIMER_DISABLE();49}50/****************************************51*函數(shù)名稱(chēng):RecvByte52*輸入:無(wú)53*輸出:單個(gè)字節(jié)54*功能:串口接收單個(gè)字節(jié)55******************************************/56unsignedcharRecvByte(void)57{58unsignedchari;59unsignedcharb=0;6061TIMER_ENABLE();62TIMER_WAIT();6364for(i=0;i<8;i++)65{66if(RXD)b|=(1<=RECEIVE_MAX_BYTES)137{138RecvCount=0;139140for(i=0;i