?? 模擬uart設計.txt
字號:
3.1、數據定義
定義模擬串口程序所必須的一些資源,如I/O引腳、波特率、數據緩沖區等。
#define Fosc 22118400 //晶振頻率
#define Baud 38400 //波特率
#define BaudT (Fosc/Baud/3/12)
#define BufLong 16 //FIFO長度
sbit RxD1=P1^7; //模擬接收RxD
sbit TxD1=P1^6; //模擬發送TxD
bit Brxd1,Srxd1;//RxD檢測電平
BYTE Rbuf1[BufLong];//FIFO接收區
BYTE Rptr1,Rnum1;
BYTE Tbuf1[BufLong];//FIFO發送區
BYTE Tptr1,Tnum1;
BYTE TimCnt1A,TimCnt1B;
BYTE Mtbuf1,Mrbuf1,TxdCnt1,RxdCnt1;
3.2、數據接收子程序
數據接收過程中,依次存儲RxD的邏輯位形成字節數據,當數據接收完畢且停止位為1時,表示接收到了有效數據,就將結果存儲到接收FIFO隊列中去。
void Recv()
{
if(RxdCnt1>0) //存數據位8個
{
Mrbuf1>>=1;
if(RxD1==1) Mrbuf1=Mrbuf1|0x80;
}
RxdCnt1--;
if(RxdCnt1==0&& RxD1==1) //數據接收完畢
{
Rbuf1[Rptr1]=Mrbuf1; //存儲到FIFO隊列
if(++Rptr1>BufLong-1) Rptr1=0;
if(++Rnum1>BufLong) Rnum1=BufLong;
}
}
3.3、數據發送子程序
該程序過程中,當數據發送狀態結束時,檢測發送FIFO隊列是否為空,若非空則取出發送數據,然后啟動發送狀態;當處于發送狀態時,則按照狀態機的狀態進行起始位、數據位和停止位的發送。
void Send()
{
if(TxdCnt1!=0) //字節發送狀態機
{
if(TxdCnt1==11) TxD1=0;//發起始位0
else if(TxdCnt1>2) //發數據位
{ Mtbuf1>>=1; TxD1=CY;}
else TxD1=1; //發終止位1
TxdCnt1--;
}
else if(Tnum1>0) //檢測FIFO隊列
{
Tnum1--;
Mtbuf1=Tbuf1[Tptr1]; //讀取FIFO數據
if(++Tptr1>=BufLong) Tptr1=0;
TxdCnt1=11; //啟動發送狀態機
}
}
3.4、中斷程序
中斷定時時間為波特率定時的1/3,即以3倍的波特率對RxD進行采樣,實現起始位的判別,當起始位到達時啟動接收過程狀態機。將該定時進行3分頻再調用數據的發送和接收過程,進行準確波特率下的串口通信。
void Uart() interrupt 1 using 1
{
if(RxdCnt1==0 ) //接收起始識別
{
if(RxD1==0 && Brxd1==0 && Srxd1==1) { RxdCnt1=8; TimCnt1B=0;}
}
Srxd1=Brxd1; Brxd1=RxD1;
if(++TimCnt1B>=3 && RxdCnt1!=0) { TimCnt1B=0; Recv();}//數據接收
if(++TimCnt1A>=3) { TimCnt1A=0; Send();} //數據發送
}
3.5、串口初始化
打開定時器的中斷,將定時器的設置為自裝載模式,依照波特率設置定時中斷的定時間隔,啟動定時器,并進行UART各變量的初始化。
void IniUart()
{
IE="0x82"; TMOD="0x22";
TH0=-BaudT; TL0=-BaudT; TR0=1;
Rptr1=0;Rnum1=0;Tptr1=0;Tnum1=0;
}
4、結束語
本文提出的模擬串口設計方法,其獨特之處在于:僅僅使用任意2個普通I/O引腳和1個定時中斷實現了全雙工串口,對硬件的占用較少,具有多可串口擴展能力;在串口接收的起始位判別時采用了連續3次采樣的判別方法,該方法實現簡單、準確率高;用定時中斷實現了串口數據的發送和接收,并實現了FIFO隊列,使串口發送和接收工作效率高。
作者在實際應用中已利用該方法在STC12C1052上實現了5個串口的擴展,用于醫療監護儀多個模塊數據接收,效果令人滿意。隨著單片機處理速度的提高,該方法可以替代串口擴展芯片,大大降低系統的硬件成本,由于采樣C語言開發,所以可以很方便地移植到AVR、PIC、C8051等高速單片機。
參考文獻
[1] 陳曦等.基于51系列單片機的通用的實現[J].微計算機信息,2001,(5):79-80
[2] 景鑫.51單片機的串行口擴展方法[J]. 微計算機信息,2005,(13):63-64+155
[3] 徐愛鈞,彭秀華.單片機高級語言C51 Windows環境編程與應用[J].北京,電子工業出版社,2001
[4] STC12C2052AD系列單片機中文指南.http//www.mcu-memory.com,2005
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -