基于串口通信的單片機(jī)仿真和C語(yǔ)言開發(fā)
2. 選擇波特率發(fā)生器
選擇定時(shí)器1或定時(shí)器2 做為其波特率發(fā)生器。
3. 設(shè)置定時(shí)器工作方式
當(dāng)選擇定時(shí)器1 做為波特率發(fā)生器時(shí),需設(shè)置其方式寄存器TMOD 為計(jì)數(shù)方式并選擇相應(yīng)的工作方式(一般選擇方式2 以避免重裝定時(shí)器初值);當(dāng)選擇定時(shí)器2 做為波特率發(fā)生器時(shí),需將T2CON 設(shè)置為波特率發(fā)生器工作方式。
4. 設(shè)置波特率參數(shù)
影響波特率的參數(shù)有二,一是特殊寄存器PCON 的SMOD 位,另一個(gè)是相應(yīng)定時(shí)器初值。
5. 允許串行中斷
因在程序中我們一般采有中斷接收方式,故應(yīng)設(shè)EA=1、ES=1.
6. 允許接收數(shù)據(jù)
設(shè)置 SCON 中的REN 為1.表示允許串行口接收數(shù)據(jù)。
7. 允許定時(shí)/計(jì)數(shù)器工作
此時(shí)開啟定時(shí)/計(jì)數(shù)器,使其產(chǎn)生波特率8. 編寫串行中斷服務(wù)程序。
當(dāng)有數(shù)據(jù)到達(dá)串口時(shí),系統(tǒng)將自動(dòng)執(zhí)行所編寫的中斷服務(wù)程序。
9. 收/發(fā)相應(yīng)數(shù)據(jù)
注意的是發(fā)送操作完成需將T1清零,接收工作完成后需將R1清零。
5.2 程序設(shè)計(jì)
5.2.1 主程序設(shè)計(jì)
主程序主要完成硬件初始化、子程序調(diào)用等功能。
1. 初始化。
首先調(diào)用 LCD 初始化程序,在LCD 上顯示數(shù)據(jù)RECEIVE:和TEMP is: *C.
然后調(diào)用中斷及串口初始化子程序程序,把串口接收數(shù)據(jù)單元RECDATA 清零。設(shè)置寄存器SCON 的SM0、SM1 位定義串口工作方式,選擇波特率發(fā)生器為定時(shí)器T1;設(shè)定定時(shí)器T1 工作方式為方式2;設(shè)置波特率參數(shù)為9600bps;允許串行中斷及總中斷;允許串口接收數(shù)據(jù),定義REN=1;啟動(dòng)定時(shí)/計(jì)數(shù)器T1 工作,定義TR1=1.
2. 串口收發(fā)數(shù)據(jù)。
判斷串口成功接收數(shù)據(jù)標(biāo)志位flag_uart 是否為0,若flag_uart 為0,表明串口未接收到數(shù)據(jù),則繼續(xù)等待串口接收數(shù)據(jù);若flag_uart 為1,表明串口成功接收或發(fā)送數(shù)據(jù),進(jìn)入串口中斷服務(wù)子程序,單片機(jī)接收數(shù)據(jù),并將串口成功接收數(shù)據(jù)標(biāo)志位flag_uart 清零,調(diào)用LCD 顯示接收數(shù)據(jù)子程序,在LCD 上顯示單片機(jī)從串口接收到的數(shù)據(jù),同時(shí)回傳溫度值給PC機(jī)顯示。主程序設(shè)計(jì)流程圖如圖5.1 所示。
圖 5.1 主程序流程圖
5.2.2 串口中斷服務(wù)子程序
判斷串口發(fā)送標(biāo)志位TI 是否為1,若TI 為1,則把數(shù)據(jù)從單片機(jī)發(fā)給PC 機(jī),并把TI清零,中斷子程序返回;若TI為0,表明RI=0,則把串口接收標(biāo)志位RI清零,把串口接收緩沖器SBUF 中的數(shù)據(jù)寫入串口接收數(shù)據(jù)單元RECDATA,再把該數(shù)據(jù)送到串口發(fā)送緩沖器SBUF 中,傳給PC 機(jī),置串口成功接收數(shù)據(jù)標(biāo)志位RECOKBIT 為1,表明串口成功接收發(fā)送數(shù)據(jù),最后中斷子程序返回。串口收發(fā)數(shù)據(jù)中斷服務(wù)子程序設(shè)計(jì)流程圖如圖5.2 所示。
圖5.2 串口中斷服務(wù)子程序
評(píng)論