




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、在用單片機開發(fā)各種嵌入式應(yīng)用系統(tǒng)時,異步串行通信是經(jīng)常要用到的一種通信模式,很多應(yīng)用中還要求實現(xiàn)多路異步串行通信。大家 平時熟悉的各種廠家的單片機,絕大部分片上只提供一個硬件UART模塊,利用它可以方便實現(xiàn)一路串行通訊。PIC系列單片機也不例 外,在其豐富的產(chǎn)品家族成員中,除高端系列(PIC17/18 ) 些型號片上帶有兩路硬件UART模塊外,其它大部分型號片上只有一路 UART,一些低端廉價的 PIC單片機甚至還不帶硬件UART。為了提高系統(tǒng)的性能價格比,就要求設(shè)計工程師用軟件增加實現(xiàn)一路或多 路異步串行通信。很多工程師對用軟件實現(xiàn)的UART在可靠性和效率方面持懷疑態(tài)度,其實關(guān)鍵問題是看軟件
2、采用何種方式來實現(xiàn)可靠 的UART功能。 在討論具體實現(xiàn)方式前,我們先來簡單回顧一下異步串行通信的格式定義。發(fā)送一個完整的字節(jié)信息,必須有起始位”若干數(shù)據(jù) 位”奇偶校驗位”和停止位”;必須定義每位信息的時間寬度一一每秒發(fā)送的信息位個數(shù),即為波特率”。單片機系統(tǒng)中常用的波特率從 30019 200 b/s。當(dāng)波特率為1200b/s時,每個信息位的時間寬度為1/1200 - 833 g ;無數(shù)據(jù)通信時,數(shù)據(jù)線空閑狀態(tài)應(yīng)該是高電平,起 始位”為低電平,數(shù)據(jù)位低位先發(fā)且后跟奇偶校驗位(若有),停止位”為高電平,如圖1所示。 栓驗i 竝鋸/ 程序中設(shè)定配置信息 /= /定義軟件 UART 發(fā)送接收引腳
3、/= #defineRX_PIN RB0 /串行接收腳 #defineTX_PIN RB1 /串行發(fā)送腳 /= /定義軟件 UART 狀態(tài)機控制字 /= #define RS_IDLE #define RS_DATA_BIT #define RS_STOP_BIT #define RS_STOP_END 0 / 空閑 1 / 數(shù)據(jù)位 2 / 停止位 3 / 停止位結(jié)束 /= /定義軟件 UART 采樣頻率 /= #define OSC_FREQ 4000 /單片機工作頻率(單位: KHz ) #define BAUDRATE 1200 / 通訊波特率 #define TMR0PRE 2 /TM
4、R0 預(yù)分頻比 1:2 /256 #define TMR0CONST 117 OSC_FREQ*1000/TMR0PRE/4/(BAUDRA TE*3) /= /定義函數(shù)類型 void UART_Out(void); void UART_In(void); / /定義位變量 bit rsTxBusy; / 串行發(fā)送忙標(biāo)志 /定義串行發(fā)送的數(shù)據(jù)結(jié)構(gòu) struct unsigned char state; / 發(fā)送狀態(tài)機控制單元 unsigned char sliceCount; / 波特率控制 unsigned char shiftBuff; / 字節(jié)數(shù)據(jù)發(fā)送移位寄存器 unsigned cha
5、r shiftCount; / 字節(jié)數(shù)據(jù)發(fā)送移位計數(shù)器 rsTx; /定義串行接收的數(shù)據(jù)結(jié)構(gòu) struct unsigned char state; / 接收狀態(tài)機控制單元 unsigned char sliceCount; / 波特率(采樣點)控制 unsigned char shiftBuff; / 字節(jié)數(shù)據(jù)接收移位寄存器 unsigned char shiftCount; / 字節(jié)數(shù)據(jù)接收移位計數(shù)器 unsigned char dataBuff8; / 接收數(shù)據(jù) FIFO 緩沖隊列 unsigned char putPtr, getPtr;/FIFO 隊列存放讀取指針 rsRx; /用于
6、串行發(fā)送的變量定義 unsigned char outBuff10; / 發(fā)送隊列 unsigned char outPtr, /發(fā)送隊列指針 outTotal, /發(fā)送的字節(jié)總數(shù) chkSum; /發(fā)送的校驗碼 /= /主程序 /= void main(void) PORTA = 0; PORTB = 0; TRISB = 0b01; / 輸入輸出定義 OPTION = 0b10000000; /TMR0 選擇內(nèi)部指令周期計數(shù) /TMR0 預(yù)分頻 1:2 rsRx.state = RS_IDLE; / 初始化接收狀態(tài) rsTxBusy = 0; / 發(fā)送空閑 INTCON = 0b00100
7、000; /T0IE 使能 GIE = 1; / 打開中斷 while(1) / 程序主循環(huán) asm(clrwdt); / 清看門狗 UART_In();/接收串行數(shù)據(jù) UART_Out(); /發(fā)送串行數(shù)據(jù) /= /查詢在接收 FIFO 隊列中是否有新數(shù)據(jù)到 /然后解讀數(shù)據(jù) /= void UART_In(void) unsigned char data1; if (rsRx.putPtr=rsRx.getPtr) return; / 如果讀取和存放的指針相同,則隊列為空 data1 = rsRx.dataBuffrsRx.getPtr; / 讀取 1 個數(shù)據(jù)字節(jié) rsRx.getPtr+;
8、 / 調(diào)整讀取指針到下一位置 rsRx.getPtr /考慮環(huán)形隊列回繞 /此處為數(shù)據(jù)解讀分析,略 /= /軟件 UART 發(fā)送數(shù)據(jù) /數(shù)據(jù)在 outBuff 中 ,outTotal 為總字節(jié)數(shù) /= void UART_Out(void) if (rsTxBusy=1) return;/正處于移位發(fā)送忙 /可以發(fā)送新數(shù)據(jù) if (outTotal) /如果有字節(jié)要發(fā)送 rsTx.shiftBuff = outBuffoutPtr+; / 取字節(jié)到發(fā)送移位寄存器 rsTxBusy = 1;/ 置發(fā)送忙標(biāo)志,啟動發(fā)送 outTotal-;/字節(jié)計數(shù)器減 1 /= /中斷服務(wù)程序 /= void
9、interrupt isr(void) / 利用 TMR0 定時中斷實現(xiàn)全雙工軟件 UART if (T0IE /清 TMR0 中斷標(biāo)志 / 實現(xiàn)串行接收 RX 狀態(tài)機控制 switch (rsRx.state) /判當(dāng)前接收狀態(tài) case RS_IDLE: /當(dāng)前狀態(tài)為 空閑, 唯一要做的就是判 起始位 出現(xiàn) if (RX_PIN=0) / 如果接收到低電平 rsRx.sliceCount = 4; / 準備 4Ts 時間間隔 rsRx.shiftCount = 8; / 總共接收 8 位數(shù)據(jù)位 /改變此數(shù)值可以實現(xiàn)任意位數(shù)的數(shù)據(jù)接收 rsRx.state = RS_DA TA_BIT; /
10、 切換到數(shù)據(jù)位接收狀態(tài) break; case RS_DATA_BIT: /當(dāng)前狀態(tài)為 數(shù)據(jù)接收 if (-rsRx.sliceCount=0) /等采樣時間到 rsRx.shiftBuff = 1; /接收移位寄存器右移 1 位 if (RX_PIN) rsRx.shiftBuff|=0 x80; / 保存最新收到的數(shù)據(jù)位 rsRx.sliceCount = 3; /下次采樣間隔為 3 Ts if (-rsRx.shiftCount=0) / 已經(jīng)收到 8 位數(shù)據(jù)位? / 保存數(shù)據(jù)字節(jié)到 FIFO 緩沖隊列 rsRx.dataBuffrsRx.putPtr = rsRx.shiftBuff;
11、 /隊列存放指針調(diào)整,最多 8 個字節(jié)緩沖 rsRx.putPtr = (rsRx.putPtr+1) /轉(zhuǎn)去下個狀態(tài),判停止位 rsRx.state = RS_STOP_BIT; break; case RS_STOP_BIT: /當(dāng)前狀態(tài)為停止位判別(此程序沒有判別) if (-rsRx.sliceCount=0) / 等采樣時間到 /此處可以判 RX_PIN 是否為 1 rsRx.state = RS_IDLE; / 復(fù)位接收過程 break; default: /異常處理 rsRx.state = RS_IDLE; / 復(fù)位接收過程 / 實現(xiàn)串行發(fā)送 TX 狀態(tài)機控制 switch (
12、rsTx.state) /判當(dāng)前發(fā)送狀態(tài) case RS_IDLE: /發(fā)送起始位 if (rsTxBusy) /如果發(fā)送啟動 TX_PIN = 0; /發(fā)出起始位低電平 rsTx.sliceCount = 3; / 持續(xù)時間 3 Ts rsTx.shiftCount = 8; / 數(shù)據(jù)位數(shù)為 8 位 rsTx.state = RS_DA TA_BIT; / 轉(zhuǎn)去下一狀態(tài) else TX_PIN = 1; /如果沒有數(shù)據(jù)發(fā)送則保證數(shù)據(jù)線為空閑 break; case RS_DATA_BIT: / 發(fā)送 8 位數(shù)據(jù)位 if (-rsTx.sliceCount=0) / 碼元寬度定時到 if (r
13、sTx.shiftBuff / 發(fā)送 1 else TX_PIN = 0; / 發(fā)送 0 rsTx.shiftBuff = 1; / 準備下次數(shù)據(jù)位發(fā)送 rsTx.sliceCount = 3; / 數(shù)據(jù)位寬度為 3 Ts if (-rsTx.shiftCount=0) /8 位數(shù)據(jù)位發(fā)送結(jié)束,轉(zhuǎn)去發(fā)送停止位 rsTx.state = RS_STOP_BIT; break; case RS_STOP_BIT: /發(fā)送 1 位停止位 if (-rsTx.sliceCount=0) / 等數(shù)據(jù)位發(fā)送結(jié)束 TX_PIN = 1; /發(fā)送停止位高電平 rsTx.sliceCount = 9; / 持續(xù)寬度 9 Ts /額外考慮字節(jié)連續(xù)發(fā)送的時間間隔 rsTx.state = RS_STOP_END; / 轉(zhuǎn)停止位寬度延時 break; case RS_STOP_E
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度租賃房屋保險費繳納及責(zé)任劃分協(xié)議
- 二零二五年度餐飲合伙人協(xié)議書:咖啡廳合作經(jīng)營合同
- 二零二五年度海洋資源開發(fā)投標(biāo)代理服務(wù)合同
- 2025年度科幻題材電視劇導(dǎo)演聘請與特效研發(fā)合同
- 魚塘合同轉(zhuǎn)讓協(xié)議書(2025)水產(chǎn)養(yǎng)殖權(quán)及品牌推廣協(xié)議
- 2025年度藥店藥品市場調(diào)研與分析股份協(xié)議
- 2025至2030年中國答錄電話數(shù)據(jù)監(jiān)測研究報告
- 二零二五年度護理專業(yè)人才聘用護工協(xié)議
- 2025年國網(wǎng)國際發(fā)展有限公司招聘16人(第一批)筆試參考題庫附帶答案詳解
- 二零二五年度汽車修理廠租賃合同及汽車維修配件供應(yīng)服務(wù)協(xié)議
- 2025年企業(yè)法務(wù)顧問聘用協(xié)議范本
- 教育部人文社科 申請書
- 無菌手術(shù)臺鋪置的細節(jié)管理
- 《康復(fù)評定技術(shù)》課件-第五章 運動控制
- 議論文8(試題+審題+范文+點評+素材)-2025年高考語文寫作復(fù)習(xí)
- 【理特咨詢】2024生成式人工智能GenAI在生物醫(yī)藥大健康行業(yè)應(yīng)用進展報告
- 2025新人教版英語七年級下單詞默寫表(小學(xué)部分)
- 2025年春新外研版(三起)英語三年級下冊課件 Unit6第1課時Startup
- 2025江蘇蘇州高新區(qū)獅山商務(wù)創(chuàng)新區(qū)下屬國企業(yè)招聘9人高頻重點提升(共500題)附帶答案詳解
- 《蒙牛集團實施財務(wù)共享過程中存在的問題及優(yōu)化建議探析》8800字(論文)
- 平拋運動的經(jīng)典例題
評論
0/150
提交評論