版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章串行異步收發(fā)器原理及應(yīng)用RS-232標(biāo)準(zhǔn)概述STC單片機(jī)串口模塊概述串口1寄存器及工作模式串口2寄存器及工作模式串口3寄存器及工作模式串口4寄存器及工作模式紅外通信設(shè)計(jì)實(shí)現(xiàn)本章主要內(nèi)容基于通用串行異步收發(fā)器的異步串行通信(簡(jiǎn)稱RS-232),是計(jì)算機(jī)通信中最經(jīng)典的一個(gè)通信方式。RS-232是美國(guó)電子工業(yè)聯(lián)盟(ElectronicIIndustriesAssociation,EIA)制定的串行數(shù)據(jù)通信的接口標(biāo)準(zhǔn),原始編號(hào)全稱是EIA-RS-232(簡(jiǎn)稱232,RS232)。它被廣泛用于計(jì)算機(jī)串行接口外設(shè)連接。RS-232標(biāo)準(zhǔn)概述在RS-232標(biāo)準(zhǔn)中,有下面顯著的特點(diǎn):字符是按一個(gè)比特接著另一個(gè)比特的方式,使用一根信號(hào)線進(jìn)行傳輸。這就是我們通常所說的串行方式傳輸數(shù)據(jù).這種傳輸方式的優(yōu)點(diǎn)是傳輸線少,連線簡(jiǎn)單,傳送距離可以較遠(yuǎn)。對(duì)于信源(發(fā)送方)來說,需將并行的原始數(shù)據(jù),進(jìn)行封裝,然后轉(zhuǎn)換成一位一位的串行比特流數(shù)據(jù)進(jìn)行發(fā)送;對(duì)于信宿(目的方)來說,當(dāng)接收到串行比特流數(shù)據(jù)后,對(duì)接收到的數(shù)據(jù)進(jìn)行解析,從數(shù)據(jù)中找到原始數(shù)據(jù)的比特流,將其轉(zhuǎn)換成并行數(shù)據(jù)RS-232標(biāo)準(zhǔn)概述
--RS-232傳輸特點(diǎn)RS-232標(biāo)準(zhǔn)概述
--RS-232傳輸特點(diǎn)信宿本地時(shí)鐘信源本地時(shí)鐘原始字節(jié)數(shù)據(jù)封裝后的字節(jié)數(shù)據(jù)去掉封裝后的比特流數(shù)據(jù)恢復(fù)后的字節(jié)數(shù)據(jù)串行電纜在從信源(發(fā)送方)發(fā)送數(shù)據(jù)給信宿(目的方)的時(shí)候,并不需要傳輸時(shí)鐘信號(hào)(異步傳輸?shù)闹匾卣鳎?。?dāng)信宿接收到串行數(shù)據(jù)的時(shí)候,會(huì)使用信宿本地的時(shí)鐘對(duì)接收到的數(shù)據(jù)進(jìn)行采樣和解碼,然后將數(shù)據(jù)恢復(fù)出來。通過RS-232在傳送數(shù)據(jù)時(shí),并不需要額外使用一個(gè)信號(hào)來傳送同步信息(異步傳輸?shù)闹匾卣鳎?。通過在數(shù)據(jù)前部和尾部加上識(shí)別標(biāo)志,就能正確的將數(shù)據(jù)順利傳送到對(duì)方。注:在計(jì)算機(jī)中,將實(shí)現(xiàn)RS-232通信功能的專用芯片,典型的8251芯片,稱為通用異步接收發(fā)送器(UniversalAsynchronousReceiverTransmitter,UART)。RS-232標(biāo)準(zhǔn)概述
--RS-232傳輸特點(diǎn)在RS-232中,使用的編碼格式是異步起停數(shù)據(jù)格式RS-232標(biāo)準(zhǔn)概述
--RS-232數(shù)據(jù)傳輸格式在該數(shù)據(jù)格式中:一個(gè)邏輯0標(biāo)識(shí)的起始位,該位標(biāo)識(shí)新的一幀數(shù)據(jù)。在起始位后面緊跟7或者8個(gè)比特?cái)?shù)據(jù)數(shù)據(jù)比特的開始位對(duì)應(yīng)于原始字節(jié)數(shù)據(jù)的最低位,數(shù)據(jù)比特的結(jié)束位對(duì)應(yīng)于原始字節(jié)數(shù)據(jù)的最高位。數(shù)據(jù)比特后面跟隨可選的奇偶校驗(yàn)比特。可以在發(fā)送數(shù)據(jù)的時(shí)候進(jìn)行設(shè)置。最后是以邏輯1標(biāo)識(shí)的1~2個(gè)停止比特位。RS-232標(biāo)準(zhǔn)概述
--RS-232數(shù)據(jù)傳輸格式在一個(gè)異步起停數(shù)據(jù)格式中,發(fā)送一個(gè)8位的字符數(shù)據(jù)至少需要10個(gè)比特位。在協(xié)議中,每一個(gè)比特位持續(xù)的時(shí)間和發(fā)送時(shí)鐘有關(guān)。一個(gè)時(shí)鐘周期發(fā)送一個(gè)比特位。將這個(gè)時(shí)鐘稱為波特率時(shí)鐘,用波特率表示,即:每秒中發(fā)送比特位的個(gè)數(shù)。注:在采用RS-232通信協(xié)議的信源和信宿,必須采用相同的數(shù)據(jù)格式,以及波特率時(shí)鐘。RS-232標(biāo)準(zhǔn)概述
--RS-232數(shù)據(jù)傳輸格式RS-232標(biāo)準(zhǔn)分別定義了邏輯1和邏輯0的電壓范圍。邏輯1的電壓范圍為-15~-3V;邏輯0的電壓范圍為+3~+15V。注:在RS-232中,接近零的電平是無效的。這與傳統(tǒng)數(shù)字邏輯中,對(duì)邏輯1和邏輯0的定義是不同的。需要進(jìn)行電氣標(biāo)準(zhǔn)的轉(zhuǎn)換,將TTL/CMOS電平轉(zhuǎn)換為RS-232電平,以及將RS-232電平轉(zhuǎn)換為TTL/CMOS電平。RS-232標(biāo)準(zhǔn)概述
--RS-232電氣標(biāo)準(zhǔn)美信公司的MAX232芯片,可以實(shí)現(xiàn)TTL/CMOS電平與RS-232電平之間的相互轉(zhuǎn)換。RS-232標(biāo)準(zhǔn)概述
--RS-232電氣標(biāo)準(zhǔn)目前常用
USB-UARTCH340PL2303打開STC-ISP軟件,單擊串口助手標(biāo)簽。在該標(biāo)簽窗口下,可以設(shè)置串口參數(shù)。在該界面中,需要設(shè)置以下:波特率奇偶校驗(yàn)停止位RS-232標(biāo)準(zhǔn)概述
--RS-232參數(shù)設(shè)置波特率是指每秒鐘從一設(shè)備發(fā)到另一設(shè)備的比特位的個(gè)數(shù),單位為bps(bitspersecond,bit/s)。典型地,可選擇的波特率有300、1200、2400、9600、19200、115200等。注:一般通信兩端設(shè)備都要設(shè)為相同的波特率,有些設(shè)備也可以設(shè)置為自動(dòng)檢測(cè)波特率。RS-232參數(shù)設(shè)置
--波特率RS-232參數(shù)設(shè)置
--奇偶校驗(yàn)奇偶校驗(yàn)用來驗(yàn)證接收數(shù)據(jù)的正確性。一般不使用奇偶校驗(yàn)。若使用,那么既可以選擇設(shè)置為奇校驗(yàn)或選擇設(shè)置為偶校驗(yàn)。在偶校驗(yàn)中,要求所有發(fā)送數(shù)據(jù)的比特(包括校驗(yàn)位在內(nèi))1的個(gè)數(shù)是偶數(shù)。根據(jù)這個(gè)校驗(yàn)標(biāo)準(zhǔn),在校驗(yàn)位置1或者置0;在奇校驗(yàn)中,要求所有發(fā)送數(shù)據(jù)的比特(包括校驗(yàn)位在內(nèi))1的個(gè)數(shù)是奇數(shù)。根據(jù)這個(gè)校驗(yàn)標(biāo)準(zhǔn),在校驗(yàn)位置1或者置0;停止位是在每個(gè)字節(jié)傳輸之后發(fā)送的,它用來幫助接受信號(hào)方硬件重同步。比如:在傳輸8位原始數(shù)據(jù)11001010時(shí),數(shù)據(jù)的前后就需加入起始位(邏輯低)以及停止位(邏輯高)。注:起始位固定為一個(gè)比特,而停止位則可以是1、1.5或者2個(gè)比特位。這由使用RS-232的信源與信宿共同確定,并且通過軟件進(jìn)行設(shè)置。RS-232參數(shù)設(shè)置
--停止位當(dāng)需要發(fā)送握手信號(hào)或數(shù)據(jù)完整性檢測(cè)時(shí)需要定制其他設(shè)置,這就是流量控制。公用的組合有RTS/CTS,DTR/DSR或者XON/XOFF。這種方式稱為硬件流量控制。注:通常為了簡(jiǎn)化連接和控制,不使用硬件流量控制方式。
RS-232參數(shù)設(shè)置
--流量控制RS-232指定了20個(gè)不同的信號(hào)連接,由25個(gè)D-sub(微型D類)管腳構(gòu)成的DB-25連接器。DB-25和DB-9型的連接器在大部分設(shè)備上是雌型(母頭,即插孔),但并不一定都是這樣,有些設(shè)備上就是雄型(公頭,即插針)。RS-232標(biāo)準(zhǔn)概述
--RS-232連接器RS-232串口連接器-母頭和公頭引腳順序RS-232串口連接器-母頭RS-232標(biāo)準(zhǔn)概述
--RS-232連接器DB-9連接器信號(hào)定義引腳名字序號(hào)功能公共接地5地線發(fā)送數(shù)據(jù)(/TXD)3發(fā)送數(shù)據(jù)接受數(shù)據(jù)(/RXD)2接收數(shù)據(jù)數(shù)據(jù)終端準(zhǔn)備(DTR)4終端設(shè)備通知調(diào)制解調(diào)器可以進(jìn)行數(shù)據(jù)傳輸數(shù)據(jù)準(zhǔn)備好(DSR)6調(diào)制解調(diào)器通知終端設(shè)備準(zhǔn)備就緒請(qǐng)求發(fā)送(RTS)7終端設(shè)備要求調(diào)制解調(diào)器將數(shù)據(jù)提交清除發(fā)送(CTS)8調(diào)制解調(diào)器通知終端設(shè)備可以傳數(shù)據(jù)過來數(shù)據(jù)載波檢測(cè)(CD)1調(diào)制解調(diào)器通知終端設(shè)備偵聽到載波信號(hào)振鈴指示(RI)9調(diào)制解調(diào)器通知終端設(shè)備有電話進(jìn)來第11章串行異步收發(fā)器原理及應(yīng)用每個(gè)串行口的數(shù)據(jù)緩沖區(qū)由兩個(gè)獨(dú)立的接收緩沖區(qū)和發(fā)送緩沖區(qū)構(gòu)成。這兩個(gè)緩沖區(qū)可以同時(shí)收發(fā)數(shù)據(jù);用戶只能向發(fā)送緩沖區(qū)寫入數(shù)據(jù);而從接收緩沖區(qū)讀取數(shù)據(jù);兩個(gè)緩沖區(qū)共用一個(gè)地址。串口1的兩個(gè)緩沖區(qū)SBUF在SFR內(nèi)的地址為0x99;串口2的兩個(gè)緩沖區(qū)S2BUF在SFR內(nèi)的地址為0x9B;串口3的兩個(gè)緩沖區(qū)S3BUF在SFR內(nèi)的地址為0xAD;串口4的兩個(gè)緩沖區(qū)S4BUF在SFR內(nèi)的地址為0x85。STC單片機(jī)串口模塊概述
--串口模塊結(jié)構(gòu)一個(gè)移位寄存器;一個(gè)串行控制寄存器;一個(gè)波特率發(fā)生器。注:對(duì)于串口1來說有四種工作方式,其中兩種工作方式的波特率可變,另外兩種是固定的;串口2/串口3/串口4都只有兩種工作模式,這兩種方式的波特率都是可變的。STC單片機(jī)串口模塊概述
--串口模塊結(jié)構(gòu)STC15W4K32S4系列單片機(jī)串口1對(duì)應(yīng)的引腳是TxD和RxD。串口1可以在3組引腳之間進(jìn)行切換。通過設(shè)置AUXR1(P_SW1)寄存器中的S1_S1比特位和S1_S0比特位可以將串口1從[RxD/P3.0,TxD/P3.1]切換到[RxD_2/P3.6,TxD_2/P3.7]還可以切換到[RxD_3/P1.6/XTAL2,TxD_3/P1.7/XTAL1]。STC單片機(jī)串口引腳
--串口1可用的引腳STC單片機(jī)串口引腳
--串口2可用的引腳STC15W4K32S4系列單片機(jī)串口2對(duì)應(yīng)的引腳是TxD2和RxD2。串口2可以在2組引腳之間進(jìn)行切換。通過設(shè)置P_SW2寄存器中的S2_S比特位,可以將串口2從[RxD2/P1.0,TxD2/P1.1]切換到[RxD2_2/P4.6,TxD2_2/P4.7]STC15W4K32S4系列單片機(jī)串口3對(duì)應(yīng)的引腳是TxD3和RxD3。串口3可以在2組引腳之間進(jìn)行切換。通過設(shè)置P_SW2寄存器中的S3_S比特位可以將串口3從[RxD3/P0.0,TxD3/P0.1]切換到[RxD3_2/P5.0,TxD3_2/P5.1]STC單片機(jī)串口引腳
--串口3可用的引腳STC單片機(jī)串口引腳
--串口4可用的引腳STC15W4K32S4系列單片機(jī)串口4對(duì)應(yīng)的引腳是TxD4和RxD4。串口4可以在2組引腳之間進(jìn)行切換。通過設(shè)置P_SW2寄存器中的S4_S比特位,可以將串口4從[RxD4/P0.2,TxD4/P0.3]切換到[RxD4_2/P5.2,TxD4_2/P5.3]SM0/FE當(dāng)PCON寄存器中SMOD0比特位為1時(shí),該位用于檢測(cè)偵錯(cuò)誤。當(dāng)檢測(cè)到一個(gè)無效的停止位時(shí),通過UART接收器將該位置1。注:該位由軟件清零。當(dāng)PCON寄存器中SMOD0比特位為0時(shí),該位和SM1位一起指定串口1的通信方式。串口1寄存器組
--串口1控制寄存器SCON名字地址復(fù)位值B7B6B5B4B3B2B1B0SCON0x9800000000SM0/FESM1SM2RENTB8RB8TIRISM1該位和SM0位一起確定串口1的通信方式。串口1寄存器組
--串口1控制寄存器SCONSM1和SM0各位的含義SM0SM1工作模式功能說明波特率00模式0同步移位串行方式:移位寄存器當(dāng)UART_M0x6=0時(shí),波特率為SYSclk/12當(dāng)UART_M0x6=1時(shí),波特率為SYSclk/201模式18位UART,波特率可變當(dāng)串口1用定時(shí)器1作為其波特率發(fā)生器且定時(shí)器工作于模式0或串行口用定時(shí)器2作為其波特率發(fā)生器時(shí),波特率=(定時(shí)器1的溢出率或者定時(shí)器T2的溢出率)/4當(dāng)串口1用定時(shí)器1作為其波特率發(fā)生器且定時(shí)器1工作于模式2(8位自動(dòng)重加載模式)時(shí),波特率=(2SMOD/32)×(定時(shí)器1的溢出率)10模式29位UART波特率=(2SMOD/64)×SYSclk系統(tǒng)工作時(shí)鐘頻率11模式39位UART,波特率可變當(dāng)串口1用定時(shí)器1作為其波特率發(fā)生器且定時(shí)器工作于模式0或串行口用定時(shí)器2作為其波特率發(fā)生器時(shí),波特率=(定時(shí)器1的溢出率或者定時(shí)器T2的溢出率)/4當(dāng)串口1用定時(shí)器1作為其波特率發(fā)生器且定時(shí)器1工作于模式2時(shí),波特率=(2SMOD/32)×(定時(shí)器1的溢出率)SM2允許方式2或者方式3多機(jī)通信控制位。在方式2或者方式3時(shí),如果SM2位為1,則接收機(jī)處于地址幀選狀態(tài)。此時(shí)可以利用接收到的第9位(即RB8)來篩選地址幀:當(dāng)RB8=1時(shí),說明該幀為地址幀,地址信息可以進(jìn)入SBUF,并使得RI置1,進(jìn)而在中斷服務(wù)程序中再進(jìn)行地址號(hào)比較;當(dāng)RB8=0時(shí),說明該幀不是地址幀,應(yīng)丟掉并保持RI=0。注:在方式2或者方式3中,如果SM2位為0且REN位為1,接收機(jī)處于禁止篩選地址幀狀態(tài)。不論收到的RB8是否為1,均可使接收到的信息進(jìn)入SBUF,并使得RI置1,此時(shí)RB8通常為校驗(yàn)位。串口1寄存器組
--串口1控制寄存器SCONREN允許/禁止串行接收控制位。當(dāng)該位為1時(shí),允許串行接收狀態(tài),可以啟動(dòng)串行接收器RxD,開始接收信息;當(dāng)該位為0時(shí),禁止串行接收狀態(tài),禁止串行接收器RxD。TB8當(dāng)選擇方式2或者方式3時(shí),該位為要發(fā)送的第9位數(shù)據(jù),按需要由軟件置1或者清0。例如:可用作數(shù)據(jù)的校驗(yàn)位或者多機(jī)通信中表示地址幀/數(shù)據(jù)幀的標(biāo)志位。RB8當(dāng)選擇方式2或者方式3時(shí),該位為接收到的第9位數(shù)據(jù),作為奇偶校驗(yàn)位或者地址幀/數(shù)據(jù)幀的標(biāo)志位。串口1寄存器組
--串口1控制寄存器SCONTI發(fā)送中斷請(qǐng)求標(biāo)志位。在方式0時(shí),當(dāng)串行發(fā)送數(shù)據(jù)第8位結(jié)束時(shí),由硬件自動(dòng)將該位置1,向CPU發(fā)出中斷請(qǐng)求。當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。在其它方式中,則在停止位開始發(fā)送時(shí)由硬件置1,向CPU發(fā)出中斷請(qǐng)求。同樣的,當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。RI接收中斷請(qǐng)求標(biāo)志位。在方式0時(shí),當(dāng)串行接收數(shù)據(jù)第8位結(jié)束時(shí),由硬件自動(dòng)將該位置1,向CPU發(fā)出中斷請(qǐng)求。當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。在其它方式中,則在接收到停止位的中間時(shí)刻由內(nèi)部硬件置1,向CPU發(fā)出中斷請(qǐng)求。同樣的,當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。串口1寄存器組
--串口1控制寄存器SCON串口1寄存器組
--電源控制寄存器PCON名字地址復(fù)位值B7B6B5B4B3B2B1B0PCON0x8700110000SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD波特率選擇位。當(dāng)該位為1時(shí),則使串行通信方式1、2和3的波特率加倍;當(dāng)該位為0時(shí),則使各工作方式的波特率不加倍。SMOD0幀錯(cuò)誤檢測(cè)有效控制位。當(dāng)該位為1時(shí),SCON寄存器中的SM0/FE比特位用于FE(幀錯(cuò)誤檢測(cè))功能;當(dāng)該位為0時(shí),SCON寄存器中的SM0/FE比特用于SM0功能,該位和SM1比特位一起用來確定串口的工作方式。STC15系列單片機(jī)的串口1緩沖寄存器SBUF地址為0x99。在該地址實(shí)際是兩個(gè)緩沖寄存器。一個(gè)緩沖寄存器用于保存要發(fā)送的數(shù)據(jù);另一個(gè)緩沖寄存器用于讀取已經(jīng)接收到的數(shù)據(jù)。在串口的串行通道內(nèi),設(shè)置數(shù)據(jù)寄存器。在該串口所有工作模式中,在寫入信號(hào)SBUF的控制下,把數(shù)據(jù)加載到相同的9位移位寄存器中,前面8位為數(shù)據(jù)字節(jié),最低位為移位寄存器的輸出位。根據(jù)所設(shè)置的工作模式,自動(dòng)將1或者TB8的值加載到移位寄存器的第9位,并進(jìn)行發(fā)送。串口1寄存器組
--串口1數(shù)據(jù)緩沖寄存器在串口的接收寄存器是一個(gè)輸入移位寄存器。當(dāng)設(shè)置為方式0時(shí),它的字長(zhǎng)為8位;當(dāng)設(shè)置為其它工作模式時(shí),它的字長(zhǎng)為9位。當(dāng)接收完一幀數(shù)據(jù)后,將移位寄存器中的串行字節(jié)數(shù)據(jù)加載到數(shù)據(jù)緩沖寄存器SBUF中,將其第9位加載到SCON寄存器的RB8位。如果由于SM2使得已經(jīng)接收到的數(shù)據(jù)無效時(shí),RB8和SBUF中的內(nèi)容不變。由于在串行通道內(nèi)設(shè)置了輸入移位寄存器和SBUF緩沖寄存器,從而在接收完一幀串行數(shù)據(jù)將其從移位寄存器加載到并行SBUF緩沖寄存器后,可以立即開始接收下一幀數(shù)據(jù)。串口1寄存器組
--串口1數(shù)據(jù)緩沖寄存器T1x12定時(shí)器1速度控制位。當(dāng)該位為0時(shí),定時(shí)器1是傳統(tǒng)8051的速度,12分頻;當(dāng)該位為1時(shí),定時(shí)器1的速度是傳統(tǒng)8051的12倍,不分頻。UART_M0x6串口模式0的通信速率設(shè)置位。當(dāng)該位為0時(shí),串口1模式0的速度是傳統(tǒng)8051單片機(jī)串口的速度,12分頻;當(dāng)該位為1時(shí),串口1模式0的速度是傳統(tǒng)8051單片機(jī)速度的6倍2分頻。串口1寄存器組
--輔助寄存器AUXR名字地址復(fù)位值B7B6B5B4B3B2B1B0AUXR0x8E00000000T0x12T1x12UART_M0x6T2RT2_C/TT2x12EXTRAMS1ST2串口1寄存器組
--輔助寄存器AUXRS1ST2串口1選擇定時(shí)器2作波特率發(fā)生器的控制位。當(dāng)該位為0時(shí),選擇定時(shí)器1作為串口1的波特率發(fā)生器;當(dāng)該位為1時(shí),選擇定時(shí)器2作為串口1的波特率發(fā)生器。在STC單片機(jī)中,設(shè)置了從機(jī)地址屏蔽寄存器SADEN和從機(jī)地址寄存器SADDR。SADEN寄存器為從機(jī)地址掩模寄存器該寄存器位于特殊功能寄存器地址為0xB9的位置。當(dāng)復(fù)位后,該寄存器的值為“00000000”;SADDR寄存器為從機(jī)地址寄存器該寄存器位于特殊功能寄存器地址為0xA9的位置。當(dāng)復(fù)位后,該寄存器的值為“00000000”。串口1寄存器組
--從機(jī)地址控制寄存器ES串口1中斷允許位。當(dāng)該位為1時(shí),允許串口中斷;當(dāng)該位為0時(shí),禁止串口中斷。串口1寄存器組
--中斷允許寄存器IE名字地址復(fù)位值B7B6B5B4B3B2B1B0IE0xA800000000EAELVDEADCESET1EX1ET0EX0
PS串口1中斷優(yōu)先級(jí)控制位。當(dāng)該位為0時(shí),串口1中斷為最低優(yōu)先級(jí)中斷(優(yōu)先級(jí)為0);當(dāng)該位為1時(shí),串口1中斷為最高優(yōu)先級(jí)中斷(優(yōu)先級(jí)1)。串口1寄存器組
--中斷優(yōu)先級(jí)控制寄存器IP名字地址復(fù)位值B7B6B5B4B3B2B1B0IP0xB800000000PPCAPLVDPADCPSPT1PX1PT0PX0串口1中繼廣播方式設(shè)置是在CLK_DIV寄存器中實(shí)現(xiàn)Tx_Rx串口1中繼廣播方式設(shè)置位。當(dāng)該位為0時(shí),串口1為正常工作模式;當(dāng)該位為1時(shí),串口1為中繼廣播方式,將RxD端口輸入的電平狀態(tài)實(shí)時(shí)輸出到TxD外部引腳上,TxD引腳可以對(duì)RxD引腳的輸入信號(hào)進(jìn)行實(shí)時(shí)整形放大輸出,TxD引腳對(duì)外輸出實(shí)時(shí)反映RxD端口輸入的電平狀態(tài)。串口1寄存器組
--串口1中繼廣播方式設(shè)置名字地址復(fù)位值B7B6B5B4B3B2B1B0CLK_DIV0x9700000000MCKO_S1MCKO_S0ADRJTx_RxMCLKO_2CLKS2CLKS1CLKS0串口1有四種工作模式,可以通過設(shè)置SCON寄存器的SM0和SM1的位進(jìn)行選擇。模式1、模式2和模式3為異步通信方式,每個(gè)發(fā)送和接收的字符都帶有1個(gè)起始位、1個(gè)停止位。在模式0中,串口1作為1個(gè)簡(jiǎn)單的移位寄存器。串口1寄存器及工作模式
--串口1工作模式串口1寄存器及工作模式
--串口1工作模式(8位波特率可變)內(nèi)部總線內(nèi)部總線讀加載移位采樣定時(shí)器2溢出定時(shí)器1溢出寫到SBUFTx控制Rx控制串口中斷位檢測(cè)當(dāng)串口1發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)從單片機(jī)的串行發(fā)送引腳TxD發(fā)送出去。當(dāng)主機(jī)執(zhí)行一條寫SBUF的指令時(shí),就啟動(dòng)串口1的數(shù)據(jù)發(fā)送過程,寫SBUF信號(hào)將1加載到發(fā)送移位寄存器的第9位,并通知Tx控制單元開始發(fā)送。通過16分頻計(jì)數(shù)器,同步發(fā)送串行比特流。串口1工作模式(8位波特率可變)
--串口1發(fā)送過程當(dāng)軟件將接收允許標(biāo)志位REN置1后,接收器就用選定的波特率的16分頻的速率采樣串行接收引腳RxD。當(dāng)檢測(cè)到RxD端口從1到0的負(fù)跳變后,就啟動(dòng)接收器準(zhǔn)備接收數(shù)據(jù)。同時(shí),復(fù)位16分頻計(jì)數(shù)器,將值0x1FF加載到移位寄存器中。復(fù)位16分頻計(jì)數(shù)器使得它與輸入位時(shí)間同步。分頻計(jì)數(shù)器的16個(gè)狀態(tài)時(shí)將每位接收的時(shí)間平均為16等份。在每位時(shí)間的第7、8和9狀態(tài)由檢測(cè)器對(duì)RxD端口進(jìn)行采樣,所接收的值是這次采樣值經(jīng)過“三中取二”的值,即:三次采樣中,至少有兩次相同的值,用來抵銷干擾信號(hào),提高接收數(shù)據(jù)的可靠性。在起始位,如果接收到的值不為0,則起始位無效,復(fù)位接收電路,并重新檢測(cè)1到0的跳變。如果接收到的起始位有效,則將它輸入移位寄存器,并接收本幀的其余信息。串口1工作模式(8位波特率可變)
--串口1接收過程串口1工作模式(8位波特率可變)
--串口1接收過程接收的數(shù)據(jù)從接收移位寄存器的右邊移入,將已裝入的0x1FF向左邊移出。當(dāng)起始位0移動(dòng)到移位寄存器的最左邊時(shí),使RX控制器做最后一次移位,完成一幀的接收。若同時(shí)滿足以下兩個(gè)條件時(shí):RI=0;SM2=0或接收到的停止位為1。則接收到的數(shù)據(jù)有效,實(shí)現(xiàn)加載到SBUF,停止位進(jìn)入RB8,置位RI,向CPU發(fā)出中斷請(qǐng)求信號(hào)。如果這兩個(gè)條件不能同時(shí)滿足,則將接收到的數(shù)據(jù)丟棄,無論條件是否滿足,接收機(jī)又重新檢測(cè)RxD端口上的1到0的跳變,繼續(xù)接收下一幀數(shù)據(jù)。注:如果接收有效,則在響應(yīng)中斷后,必須由軟件將標(biāo)志RI清零。串口1工作模式(8位波特率可變)
--串口1接收過程第11章串行異步收發(fā)器原理及應(yīng)用在該設(shè)計(jì)中,將在STC提供的學(xué)習(xí)板上,使用串口1,定時(shí)器1的模式0實(shí)現(xiàn)STC學(xué)習(xí)板和主機(jī)電腦的串口通信。STC通過串口1向主機(jī)發(fā)送菜單界面。在主機(jī)上,按1鍵,用于控制STC學(xué)習(xí)板上的標(biāo)記為L(zhǎng)ED10的LED燈;按2鍵,用于控制STC學(xué)習(xí)板上標(biāo)記為L(zhǎng)ED9的LED燈;按其他鍵顯示退出程序的信息。串口1通信實(shí)例1在該設(shè)計(jì)中,使用STC學(xué)習(xí)板上的串口1。CH340G芯片用于將IAP15W4K58S4單片機(jī)的串口信號(hào)TxD和RxD轉(zhuǎn)換成USB信號(hào),方便與電腦USB接口的連接。串口1通信實(shí)例1串口發(fā)送信號(hào)TxD信號(hào)連接到STC單片機(jī)的P3.1引腳,該引腳將從STC單片機(jī)發(fā)送數(shù)據(jù)給主機(jī);串口接收信號(hào)RxD信號(hào)連接到STC單片機(jī)的P3.0引腳,該引腳將接收來自主機(jī)的數(shù)據(jù)。在該電路設(shè)計(jì)中,LED2和LED3上拉,并且連接到RxD和TxD信號(hào)線用于指示STC單片機(jī)串口和主機(jī)之間發(fā)送和接收數(shù)據(jù)的情況。在P3.0引腳上加入IN5817二極管,以及在P3.1引腳串入電阻的作用是為了防止USB器件給芯片供電。串口1通信實(shí)例1串口1通信實(shí)例1【例】主機(jī)通過串口控制STC板上LED燈C語言描述的例子。#include"reg51.h"#defineFOSC18432000L//聲明當(dāng)前單片機(jī)主時(shí)鐘頻率#defineBAUD115200//聲明波特率常數(shù)115200sfrAUXR=0x8E;//聲明AUXR寄存器的地址0x8EsfrTH2=0xD6;//聲明TH2寄存器的地址0xD6sfrTL2=0xD7;//聲明TL2寄存器的地址0xD7bitbusy=0;//聲明比特位busyxdatacharmenu[]={"\r\n------mainmenu----------"http://聲明字符型數(shù)組menu "\r\ninput1:ControlLED10"串口1通信實(shí)例1
"\r\ninput2:ControlLED9" "\r\nother:ExitProgram" "\r\n------endmenu-----------------"};voidSendData(unsignedchardat)//聲明SendData子函數(shù),參數(shù)dat{while(busy); //判斷是否忙,忙等待SBUF=dat; //將dat寫入SBUF發(fā)送緩沖器busy=1;} //將busy標(biāo)志置1voidSendString(char*s)//聲明SendString子函數(shù),參數(shù)s{while(*s!=‘\0’)//判斷字符是否結(jié)束,如果沒結(jié)束SendData(*s++);} //調(diào)用SendData子函數(shù)發(fā)送數(shù)據(jù)串口1通信實(shí)例1voiduart1()interrupt4//聲明串口1中斷服務(wù)程序uart1{ if(RI)//如果接收標(biāo)志RI為1,有接收數(shù)據(jù) RI=0;//將RI標(biāo)志清零 if(TI)//如果發(fā)送標(biāo)志TI為1,已發(fā)送數(shù)據(jù) TI=0;//將TI標(biāo)志清零 busy=0;//busy清零,表示已經(jīng)發(fā)送完數(shù)據(jù)}voidmain(){ unsignedcharc;//定義無符號(hào)字符型變量c串口1通信實(shí)例1
P46=0; //P4.6端口置0,燈亮P47=0; //P4.7端口置1,燈亮SCON=0x50; //串口1方式1,允許接收AUXR=0x14;//允許定時(shí)器2,不分頻AUXR|=0x01;//選擇定時(shí)器2作為波特率發(fā)生器TL2=(65536-((FOSC/4)/BAUD));//初值低8位賦值給TL2寄存器TH2=(65536-((FOSC/4)/BAUD))>>8;//初值高8位賦值給TH2寄存器ES=1; //允許串口中斷EA=1; //CPU允許響應(yīng)中斷請(qǐng)求SendString(&menu); //在串口中斷上打印menu的內(nèi)容串口1通信實(shí)例1P46=0; //P4.6端口置0,燈亮while(1){ //無限循環(huán)if(RI==1) //如果接收到上位機(jī)發(fā)送的數(shù)據(jù){
c=SBUF; //從SBUF緩沖區(qū)讀數(shù)據(jù)到變量cif(c==0x31) //判斷如果接收的數(shù)據(jù)是字符‘1’P46=!P46; //P4.6取反elseif(c==0x32) //判斷如果接收的數(shù)據(jù)是字符‘2’P47=!P47; //P4.7取反else //其它任何輸入{SendString(“\r\nExitProgram”);//串口上打印ExitProgram信息}}}}串口1通信實(shí)例1下面說明該代碼的設(shè)計(jì)原理和驗(yàn)證方法,步驟包括:使用T2定時(shí)器,根據(jù)前面給出的IRC的時(shí)鐘頻率為18.432MHz,波特率為115200,由于,T2的溢出率和波特率存在下面的關(guān)系,即:
串口1的波特率=SYSclk/(65535-[RL_TH2,RL_TL2]/4因此,[RL_TH2,RL_TL2]=65536-SYSclk/(串口1波特率×4)注:RL_TH2是T2H的自動(dòng)重加載寄存器,RL_TL2是T2L的自動(dòng)重加載寄存器。打開STC-ISP軟件,在該界面內(nèi),選擇硬件選項(xiàng)。將“輸入用戶程序運(yùn)行時(shí)的IRC頻率設(shè)置為18.432MHz。單擊下載/編程按鈕,按前面的方法下載設(shè)計(jì)到STC單片機(jī)。串口1通信實(shí)例1在STC-ISP軟件右側(cè)串口中,選擇串口助手標(biāo)簽。在該標(biāo)簽串口界面下,按下面設(shè)置參數(shù):串口:COM3(讀者根據(jù)自己電腦識(shí)別出來的COM端口號(hào)進(jìn)行設(shè)置)波特率:115200。校驗(yàn)位:無校驗(yàn)。停止位:1位。串口1通信實(shí)例1單擊打開串口按鈕。在STC學(xué)習(xí)板上,找到并按一下SW19按鍵,重新運(yùn)行程序??梢钥吹皆谏厦娴慕邮沾翱谥?,顯示出菜單信息。在發(fā)送窗口中輸入1。單擊發(fā)送數(shù)據(jù)按鈕。觀察LED10的變化。在發(fā)送串口中輸入2。單擊發(fā)送數(shù)據(jù)按鈕。觀察LED9的變化。在發(fā)送串口中輸入其它字符。單擊發(fā)送數(shù)據(jù)按鈕??吹皆诮邮沾翱谥?,顯示“ExitProgram”提示信息。第11章串行異步收發(fā)器原理及應(yīng)用矩陣按鍵結(jié)構(gòu)及檢測(cè)原理在STC學(xué)習(xí)板上提供了16個(gè)按鍵,這16個(gè)按鍵按4×4形式排列,即:4行和4列形式。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理由圖可以判斷出在實(shí)際中P0.0~P0.3應(yīng)該為輸出,或者邏輯高電平、或者邏輯低電平;而P0.7~0.4為輸入,也就是讀取P0.7~P0.4引腳的狀態(tài)。首先如何判斷有按鍵被按下,方法是將P0.0~P0.3引腳拉低,也就是驅(qū)動(dòng)P0.0~P0.3為低。如果16個(gè)按鍵中,沒有按下按鍵,則P0.4、P0.5、P0.6或者P0.7仍然處于上拉狀態(tài),即:邏輯高/邏輯1,此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1111,分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。只要有一個(gè)按鍵按下,P0.4、P0.5、P0.6或者P0.7就有引腳被拉低,也就是讀P0.4、P0.5、P0.6、P0.7引腳,它們組合的值一定不等于1111。因此,就可以判斷是否有按鍵被按下。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理驅(qū)動(dòng)P0.3引腳為低/邏輯0,驅(qū)動(dòng)P0.2、P0.1和P0.0引腳為邏輯1,即它們值的組合為0111,十六進(jìn)制數(shù)7。當(dāng)按下標(biāo)號(hào)為0、1、2、4、5、6、8、9、A、C、D、E的按鍵時(shí),P0.4~P0.7引腳的狀態(tài)不會(huì)發(fā)生任何的變化。如果按下3號(hào)按鍵,則P0.4引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1110,十六進(jìn)制數(shù)E分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下7號(hào)按鍵,則P0.5引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1101,十六進(jìn)制數(shù)D分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理如果按下11(B)號(hào)按鍵,則P0.6引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1011,十六進(jìn)制數(shù)B分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下15(F)號(hào)按鍵,則P0.7引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是0111,十六進(jìn)制數(shù)7分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理驅(qū)動(dòng)P0.2引腳為低/邏輯0,驅(qū)動(dòng)P0.3、P0.1和P0.0引腳為1,即它們值的組合為1011,十六進(jìn)制數(shù)B。當(dāng)按下標(biāo)號(hào)為0、1、3、4、5、7、8、9、B、C、D、F的按鍵時(shí),P0.4~P0.7引腳的狀態(tài)不會(huì)發(fā)生任何的變化。如果按下2號(hào)按鍵,則P0.4引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1110,十六進(jìn)制數(shù)E分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下6號(hào)按鍵,則P0.5引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1101,十六進(jìn)制數(shù)D分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理如果按下10(A)號(hào)按鍵,則P0.6引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1011,十六進(jìn)制數(shù)B分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下14(E)號(hào)按鍵,則P0.7引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是0111,十六進(jìn)制數(shù)7分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理驅(qū)動(dòng)P0.1引腳為低/邏輯0,驅(qū)動(dòng)P0.3、P0.2和P0.0引腳為1,即它們值的組合為1101,十六進(jìn)制數(shù)D。當(dāng)按下標(biāo)號(hào)為0、2、3、4、6、7、8、A、B、C、E、F的按鍵時(shí),P0.4~P0.7引腳的狀態(tài)不會(huì)發(fā)生任何的變化。如果按下1號(hào)按鍵,則P0.4引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1110,十六進(jìn)制數(shù)E分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下5號(hào)按鍵,則P0.5引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1101,十六進(jìn)制數(shù)D分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理如果按下9號(hào)按鍵,則P0.6引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1011,十六進(jìn)制數(shù)B分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下13(D)號(hào)按鍵,則P0.7引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是0111,十六進(jìn)制數(shù)7分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理驅(qū)動(dòng)P0.0引腳為低/邏輯0,驅(qū)動(dòng)P0.3、P0.2和P0.1引腳為1,即它們值的組合為1110,十六進(jìn)制數(shù)E。當(dāng)按下標(biāo)號(hào)為1、2、3、5、6、7、9、A、B、D、E、F的按鍵時(shí),P0.4~P0.7引腳的狀態(tài)不會(huì)發(fā)生任何的變化。如果按下0號(hào)按鍵,則P0.4引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1110,十六進(jìn)制數(shù)E分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下4號(hào)按鍵,則P0.5引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1101,十六進(jìn)制數(shù)“D”分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理如果按下8號(hào)按鍵,則P0.6引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是1011,十六進(jìn)制數(shù)B分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。如果按下12(C)號(hào)按鍵,則P0.7引腳被拉低,即:變化到邏輯狀態(tài)0。而其他引腳狀態(tài)仍然為邏輯高。此時(shí)如果讀取這四個(gè)端口,讀取的值應(yīng)該是0111,十六進(jìn)制數(shù)7分別對(duì)應(yīng)于P0.7、P0.6、P0.5、P0.4引腳。串口1通信實(shí)例2
---矩陣按鍵結(jié)構(gòu)及檢測(cè)原理所謂的掃描就是讓P0.0、P0.1、P0.2和P0.3的驅(qū)動(dòng)值快速的在0111、1011、1101、1110之間進(jìn)行變化這樣就能在按下按鍵的時(shí)候,知道按下那個(gè)按鍵。開始驅(qū)動(dòng)P0.0~P0.3為低,即:0000有按下按鍵?否是有相應(yīng)按鍵?驅(qū)動(dòng)P0.0~P0.3為1110否是有相應(yīng)按鍵?驅(qū)動(dòng)P0.0~P0.3為1101是否有相應(yīng)按鍵?驅(qū)動(dòng)P0.0~P0.3為1011是否給出按鍵信息驅(qū)動(dòng)P0.0~P0.3為0111結(jié)束給出按鍵信息給出按鍵信息給出按鍵信息串口1通信實(shí)例2
---串口1參數(shù)設(shè)置串口1參數(shù)設(shè)置在該設(shè)計(jì)中串口1工作在模式1下,使用定時(shí)器1模式0(16位自動(dòng)重加載)作為串口1的波特率發(fā)生器。串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析【例】STC學(xué)習(xí)板上按鍵通過串口顯示在主機(jī)上C語言描述的例子。#include"reg51.h"#defineFOSC18432000L//聲明當(dāng)前單片機(jī)主時(shí)鐘頻率#defineBAUD115200//聲明波特率常數(shù)115200sfrAUXR=0x8E;//聲明AUXR寄存器的地址
bitbusy=0;//聲明bit型變量xdatacharmenu[]={"\r\n--DisplayPressbuttonsinformation--\r\n"};//聲明字符數(shù)組menu串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析voidIO_KeyDelay(void)//聲明IO_KeyDelay子函數(shù),延遲{ unsignedchari; i=60; while(--i) ;}voidSendData(unsignedchardat)//聲明SendData子函數(shù){ while(busy);//判斷是否發(fā)送完,沒有則等待 SBUF=dat;//否則,將數(shù)據(jù)dat寫入SBUF寄存器 busy=1;//將busy置1}串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析voidSendString(char*s)//聲明SendString子函數(shù){ while(*s!='\0')//判斷是否是字符串的結(jié)尾 SendData(*s++); //如果沒有結(jié)束,調(diào)用SendData發(fā)送數(shù)據(jù)}
voiduart1()interrupt4//聲明uart串口1中斷服務(wù)程序{ if(RI)//通過RI標(biāo)志,判斷是否接收到數(shù)據(jù) RI=0;//如果RI為1,則軟件清零RI if(TI)//通過TI標(biāo)志,判斷是否發(fā)送完數(shù)據(jù) TI=0;//如果TI為1,則軟件清零TI busy=0;//將busy標(biāo)志清零}串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析voidmain(){
unsignedcharc1_new,c1_old=0,c1;//聲明字符型變量SCON=0x50;//串口1模式1,使能串行接收
AUXR=0x40;//定時(shí)器1不分頻,作為串口1波特率時(shí)鐘TL1=(65536-((FOSC/4)/BAUD));//定時(shí)器1初值計(jì)數(shù)器低8位TH1=(65536-((FOSC/4)/BAUD))>>8;//定時(shí)器1初值計(jì)數(shù)器高8位TR1=1;//使能定時(shí)器1工作ES=1;//允許串口1中斷EA=1;//CPU允許響應(yīng)中斷請(qǐng)求串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
SendString(&menu);//在串口調(diào)試界面中打印字符串信息while(1)
{//無限循環(huán) P0=0xF0;//將P0.0~P0.3拉低,在讀P0.4~P0.7前,發(fā)‘F’ IO_KeyDelay();//延遲讀c1_new=P0&0xF0;//得到矩陣按鍵的信息串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析if(c1_new!=c1_old)//如果新按鍵和舊按鍵狀態(tài)不一樣,則繼續(xù){c1_old=c1_new;//把新按鍵的狀態(tài)變量保存作為舊的按鍵if(c1_new!=0xF0)//如果有按鍵按下,繼續(xù){P0=0xFE;//將P0[3-0]置“1110”,在讀P0.4~P0.7前,發(fā)‘F’IO_KeyDelay();//延遲讀c1_new=P0; //獲取P0端口的值switch(c1_new) {串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
case0xee:c1=0;break;//如果值為0xee,則表示按下0號(hào)按鍵case0xde:c1=4;break;//如果值為0xde,則表示按下4號(hào)按鍵case0xbe:c1=8;break;//如果值為0xbe,則表示按下8號(hào)按鍵case0x7e:c1=12;break;//如果值為0x7e,則表示按下12號(hào)按鍵 default:; } P0=0xFD;//將P0[3-0]置“1101”,在讀P0.4~P0.7前,發(fā)‘F’ IO_KeyDelay();//延遲讀 c1_new=P0; //獲取P0端口的值 switch(c1_new) {串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
switch(c1_new) {case0xed:c1=1;break;//如果值為0xed,則表示按下1號(hào)按鍵 case0xdd:c1=5;break;//如果值為0xdd,則表示按下5號(hào)按鍵 case0xbd:c1=9;break;//如果值為0xbd,則表示按下9號(hào)按鍵 case0x7d:c1=13;break;//如果值為0x7d,則表示按下13號(hào)按鍵 default:; } P0=0xFB;//將P0[3-0]置“1011”,在讀P0.4~P0.7前,發(fā)‘F’ IO_KeyDelay();//延遲讀 c1_new=P0; //獲取P0端口的值串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
switch(c1_new) {case0xeb:c1=2;break;//如果值為0xeb,則表示按下2號(hào)按鍵
case0xdb:c1=6;break;//如果值為0xdb,則表示按下6號(hào)按鍵
case0xbb:c1=10;break;//如果值為0xbb,則表示按下10號(hào)按鍵
case0x7b:c1=14;break;//如果值為0x7b,則表示按下14號(hào)按鍵
default:; } P0=0xF7;//將P0[3-0]置“0111”,在讀P0.4~P0.7前,發(fā)‘F’ IO_KeyDelay();//延遲讀 c1_new=P0; //獲取P0端口的值串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
switch(c1_new) {case0xe7:c1=3;break;//如果值為0xe7,則表示按下3號(hào)按鍵
case0xd7:c1=7;break;//如果值為0xd7,則表示按下7號(hào)按鍵
case0xb7:c1=11;break;//如果值為0xb7,則表示按下11號(hào)按鍵
case0x77:c1=15;break;//如果值為0x77,則表示按下15號(hào)按鍵
default:; } SendString("\r\npress#");//發(fā)送字符串信息串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
if(c1<10)//如果按鍵變量小于10,即:0~9 SendData(c1+0x30);//轉(zhuǎn)換為對(duì)應(yīng)的ASCII,調(diào)用SendData發(fā)送 elseif(c1==10)//如果按鍵值為10 SendString(“10”);//調(diào)用SendString函數(shù),發(fā)送字符串“10” elseif(c1==11)//如果按鍵值為11 SendString(“11”);//調(diào)用SendString函數(shù),發(fā)送字符串“11” elseif(c1==12)//如果按鍵值為12 SendString(“12”);//調(diào)用SendString函數(shù),發(fā)送字符串“12” elseif(c1==13)//如果按鍵值為13 SendString(“13”);//調(diào)用SendString函數(shù),發(fā)送字符串“13” elseif(c1==14)//如果按鍵值為14串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析
SendString(“14”);//調(diào)用SendString函數(shù),發(fā)送字符串“14” elseif(c1==15)//如果按鍵值為15 SendString(“15”);//調(diào)用SendString函數(shù),發(fā)送字符串“15” SendString("button\r\n");//調(diào)用SendString函數(shù),發(fā)送字符串}}}}串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析下面說明該代碼的設(shè)計(jì)原理和驗(yàn)證方法,步驟包括:使用T1定時(shí)器,根據(jù)前面給出的IRC的時(shí)鐘頻率為18.432MHz,波特率為115200,由于,T1的溢出率和波特率存在下面的關(guān)系,即:
串口1的波特率=SYSclk/(65535-[RL_TH1,RL_TL1]/4因此,[RL_TH1,RL_TL1]=65536-SYSclk/(串口1波特率×4)打開STC-ISP軟件,在該界面內(nèi),選擇硬件選項(xiàng)。將“輸入用戶程序運(yùn)行時(shí)的IRC頻率設(shè)置為18.432MHz。單擊下載/編程按鈕,按前面的方法下載設(shè)計(jì)到STC單片機(jī)。串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析在STC-ISP軟件右側(cè)串口中,選擇串口助手標(biāo)簽。在該標(biāo)簽串口界面下,按下面設(shè)置參數(shù):串口:COM3(讀者根據(jù)自己電腦識(shí)別出來的COM端口號(hào)進(jìn)行設(shè)置)波特率:115200。校驗(yàn)位:無校驗(yàn)。停止位:1位。單擊打開串口按鈕。在STC學(xué)習(xí)板上,找到并按一下SW19按鍵,重新運(yùn)行程序??梢钥吹皆谏厦娴慕邮沾翱谥?,顯示出提示信息“—DisplayPressbuttonsinformation—。串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析在STC學(xué)習(xí)板上右下角的位置,找到矩陣按鍵。STC學(xué)習(xí)板上矩陣按鍵的位置串口1通信實(shí)例2
--設(shè)計(jì)代碼和分析每次按下一個(gè)矩陣鍵盤中的一個(gè)按鍵,可以看到串口調(diào)試助手上顯示按鍵信息。第11章串行異步收發(fā)器原理及應(yīng)用S2SM0該位確定串口2工作模式。當(dāng)該位為0時(shí),為8位UART,可變波特率模式;當(dāng)該位為1時(shí),為9位UART,可變波特率模式。S2SM2允許方式1多機(jī)通信控制位。如果S2SM2位為1且S2REN位為1時(shí),則接收機(jī)處于地址幀選狀態(tài)。此時(shí)可以利用接收到的第9位(即S2RB8)來篩選地址幀:串口2寄存器及工作模式
--串口2控制寄存器S2CON名字地址復(fù)位值B7B6B5B4B3B2B1B0S2CON0x9A01000000S2SM01S2SM2S2RENS2TB8S2RB8S2TIS2RI串口2寄存器及工作模式
--串口2控制寄存器S2CON當(dāng)S2RB8=1時(shí),說明該幀為地址幀,地址信息可以進(jìn)入S2BUF,并使得S2RI置1,進(jìn)而在中斷服務(wù)程序中再進(jìn)行地址號(hào)比較;當(dāng)S2RB8=0時(shí),說明該幀不是地址幀,應(yīng)丟掉并保持S2RI=0。注:(1)在方式1中,如果S2SM2位為0且S2REN位為1,接收機(jī)處于禁止篩選地址幀狀態(tài)。不論收到的S2RB8是否為1,均可使接收到的信息進(jìn)入S2BUF,并使得S2RI=1,此時(shí)S2RB8通常為校驗(yàn)位。(2)方式0為非多機(jī)通信方式。在這種模式下,將S2SM2設(shè)置為0。S2REN允許/禁止串口2接收控制位。當(dāng)該位為1時(shí),允許串行接收狀態(tài),可以啟動(dòng)串行接收器RxD2,開始接收信息;當(dāng)該位為0時(shí),禁止串行接收狀態(tài),禁止串行接收器RxD2。串口2寄存器及工作模式
--串口2控制寄存器S2CONS2TB8當(dāng)選擇方式1時(shí),該位為要發(fā)送的第9位數(shù)據(jù),按需要由軟件置1或者清0。例如:可用作數(shù)據(jù)的校驗(yàn)位或者多機(jī)通信中表示地址幀/數(shù)據(jù)幀的標(biāo)志位。S2RB8當(dāng)選擇方式1時(shí),該位為接收到的第9位數(shù)據(jù),作為奇偶校驗(yàn)位或者地址幀/數(shù)據(jù)幀的標(biāo)志位。串口2寄存器及工作模式
--串口2控制寄存器S2CONS2TI發(fā)送中斷請(qǐng)求標(biāo)志位。在停止位開始發(fā)送時(shí)由S2TI置1,向CPU發(fā)出中斷請(qǐng)求。注:當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。S2RI接收中斷請(qǐng)求標(biāo)志位。在接收到停止位的中間時(shí)刻由S2RI置1,向CPU發(fā)出中斷請(qǐng)求。注:當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。串口2寄存器及工作模式
--串口數(shù)據(jù)緩沖寄存器STC15系列單片機(jī)的串口2緩沖寄存器S2BUF地址為0x9B,在該地址實(shí)際是兩個(gè)緩沖寄存器。一個(gè)緩沖寄存器用于保存要發(fā)送的數(shù)據(jù);另一個(gè)緩沖寄存器用于讀取已經(jīng)接收到的數(shù)據(jù)。在串口的串行通道內(nèi),設(shè)置數(shù)據(jù)寄存器。在該串口所有工作模式中,在寫入信號(hào)S2BUF的控制下,把數(shù)據(jù)加載到相同的9位移位寄存器中,前面8位為數(shù)據(jù)字節(jié),最低位為移位寄存器的輸出位。根據(jù)所設(shè)置的工作模式,自動(dòng)將1或者S2TB8的值加載到移位寄存器的第9位,并進(jìn)行發(fā)送。串口2寄存器及工作模式
--串口數(shù)據(jù)緩沖寄存器在串口的接收寄存器是一個(gè)輸入移位寄存器。在方式0和方式1時(shí),字長(zhǎng)均為9位。當(dāng)接收完一幀數(shù)據(jù)后,將移位寄存器中的串行字節(jié)數(shù)據(jù)加載到數(shù)據(jù)緩沖寄存器S2BUF中,將其第9位加載到S2CON寄存器的S2RB8位。如果由于S2SM2使得已經(jīng)接收到的數(shù)據(jù)無效時(shí),S2RB8和S2BUF中的內(nèi)容不變。由于在串行通道內(nèi)設(shè)置了輸入移位寄存器和S2BUF緩沖寄存器,從而在接收完一幀串行數(shù)據(jù)將其從移位寄存器加載到并行S2BUF緩沖寄存器后,可以立即開始接收下一幀數(shù)據(jù)。ES2串口2中斷允許位。當(dāng)該位為1時(shí),允許串口2中斷;當(dāng)該位為0時(shí),禁止串口2中斷。串口2寄存器及工作模式
--中斷允許寄存器2(IE2)名字地址復(fù)位值B7B6B5B4B3B2B1B0IE20xAFX0000000--ET4ET3ES4ES3ET2ESPIES2PS2串口2中斷優(yōu)先級(jí)控制位。當(dāng)該位為0時(shí),串口2中斷為最低優(yōu)先級(jí)中斷(優(yōu)先級(jí)為0);當(dāng)該位為1時(shí),串口2中斷為最高優(yōu)先級(jí)中斷(優(yōu)先級(jí)1)。串口2寄存器及工作模式
--中斷優(yōu)先級(jí)控制寄存器2(IP2)名字地址復(fù)位值B7B6B5B4B3B2B1B0IP20xB5xxx00000------PX4PPWMFDPPWMPSPIPS2S4_S串口4引腳位置選擇控制位。當(dāng)該位為0時(shí),串口4的引腳位置在P0.2/RxD4和P0.3/TxD4;當(dāng)該位為1時(shí),串口4的引腳位置在P5.2/RxD4_2和P5.3/TxD4_2。串口2寄存器及工作模式
--引腳位置控制寄存器P_SW2名字地址復(fù)位值B7B6B5B4B3B2B1B0P_SW20xBAxxxxx000----------S4_SS3_SS2_S串口2寄存器及工作模式
--引腳位置控制寄存器P_SW2S3_S串口3引腳位置選擇控制位。當(dāng)該位為0時(shí),串口3的引腳位置在P0.0/RxD3和P0.1/TxD3;當(dāng)該位為1時(shí),串口3的引腳位置在P5.0/RxD3_2和P5.1/TxD3_2。S2_S串口2引腳位置選擇控制位。當(dāng)該位為0時(shí),串口2的引腳位置在P1.0/RxD2和P1.1/TxD2;當(dāng)該位為1時(shí),串口2的引腳位置在P4.6/RxD2_2和P4.7/TxD2_2。模式0為8位可變波特率UART工作方式。在該模式下,10位數(shù)據(jù)通過RxD2/P1.0(Rx_D2/P4.6)接收,通過TxD2/P1.1(Tx_D2/P4.7)發(fā)送。一幀數(shù)據(jù)包含:一個(gè)起始位、8個(gè)數(shù)據(jù)位和一個(gè)停止位。接收數(shù)據(jù)時(shí),停止位進(jìn)入S2CON寄存器的S2RB8位。波特率由定時(shí)器2的溢出率確定。串口2工作模式
--串口2工作模式0模式1為9位可變波特率UART工作方式。在該模式下,11位數(shù)據(jù)通過RxD2/P1.0(Rx_D2/P4.6)接收,通過TxD2/P1.1(Tx_D2/P4.7)發(fā)送。一幀數(shù)據(jù)包含:一個(gè)起始位、8個(gè)數(shù)據(jù)位、一個(gè)可編程的第9位和一個(gè)停止位。發(fā)送時(shí),第9位數(shù)據(jù)來自寄存器S2CON的S2TB8位。當(dāng)接收數(shù)據(jù)時(shí),第9位進(jìn)入S2CON寄存器的S2RB8位。波特率由定時(shí)器2的溢出率確定。串口2工作模式
--串口2工作模式1串口3寄存器及工作模式
--串口3控制寄存器S3CONS3SM0該位確定串口3工作模式。當(dāng)該位為0時(shí),為8位UART,可變波特率模式;當(dāng)該位為1時(shí),為9位UART,可變波特率模式。S3ST3串口3選擇定時(shí)器3作為波特率發(fā)生器控制位。當(dāng)該位為0時(shí),串口3選擇定時(shí)器2作為其波特率發(fā)生器;當(dāng)該位為1時(shí),串口3選擇定時(shí)器3作為其波特率發(fā)生器。名字地址復(fù)位值B7B6B5B4B3B2B1B0S3CON0xAC0000000S3SM0S3ST3S3SM2S3RENS3TB8S3RB8S3TIS3RI串口3寄存器及工作模式
--串口3控制寄存器S3CONS3SM2
允許方式1多機(jī)通信控制位。如果S3SM2位為1且S3REN位為1時(shí),則接收機(jī)處于地址幀選狀態(tài)。此時(shí)可以利用接收到的第9位(即S3RB8)來篩選地址幀:當(dāng)S3RB8為1時(shí),說明該幀為地址幀,地址信息可以進(jìn)入S3BUF,并使得S3RI置1,進(jìn)而在中斷服務(wù)程序中再進(jìn)行地址號(hào)比較;當(dāng)S3RB8為0時(shí),說明該幀不是地址幀,應(yīng)丟掉并保持S3RI為0。注:(1)在方式1中,如果S3SM2位為0且S3REN位為1,接收機(jī)處于禁止篩選地址幀狀態(tài)。不論收到的S3RB8是否為1,均可使接收到的信息進(jìn)入S3BUF,并使得S3RI=1,此時(shí)S3RB8通常為校驗(yàn)位。(2)方式0為非多機(jī)通信方式。在這種模式下,將S3SM2設(shè)置為0。串口3寄存器及工作模式
--串口3控制寄存器S3CONS3REN允許/禁止串口3接收控制位。當(dāng)該位為1時(shí),允許串行接收狀態(tài),可以啟動(dòng)串行接收器RxD3,開始接收信息;當(dāng)該位為0時(shí),禁止串行接收狀態(tài),禁止串行接收器RxD3。S3TB8當(dāng)選擇方式1時(shí),該位為要發(fā)送的第9位數(shù)據(jù),按需要由軟件置1或者清0。例如:可用作數(shù)據(jù)的校驗(yàn)位或者多機(jī)通信中表示地址幀/數(shù)據(jù)幀的標(biāo)志位。S3RB8當(dāng)選擇方式1時(shí),該位為接收到的第9位數(shù)據(jù),作為奇偶校驗(yàn)位或者地址幀/數(shù)據(jù)幀的標(biāo)志位。串口3寄存器及工作模式
--串口3控制寄存器S3CONS3TI發(fā)送中斷請(qǐng)求標(biāo)志位。在停止位開始發(fā)送時(shí)由S3TI置1,向CPU發(fā)出中斷請(qǐng)求。注:當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。S3RI接收中斷請(qǐng)求標(biāo)志位。在接收到停止位的中間時(shí)刻由S3RI置1,向CPU發(fā)出中斷請(qǐng)求。注:當(dāng)CPU響應(yīng)中斷后,必須由軟件將該位清0。串口3寄存器及工作模式
--串口數(shù)據(jù)緩沖寄存器STC15系列單片機(jī)的串口3緩沖寄存器S3BUF地址為0xAD,在該地址實(shí)際是兩個(gè)緩沖寄存器。一個(gè)緩沖寄存器用于保存要發(fā)送的數(shù)據(jù);另一個(gè)緩沖寄存器用于讀取已經(jīng)接收到的數(shù)據(jù)。在串口的串行通道內(nèi),設(shè)置數(shù)據(jù)寄存器。在該串口所有工作模式中,在寫入信號(hào)S3BUF的控制下,把數(shù)據(jù)加載到相同的9位移位寄存器中,前面8位為數(shù)據(jù)字節(jié),最低位為移位寄存器的輸出位。根據(jù)所設(shè)置的工作模式,自動(dòng)將1或者S3TB8的值加載到移位寄存器的第9位,并進(jìn)行發(fā)送。串口3寄存器及工作模式
--串口數(shù)據(jù)緩沖寄存器在串口的接收寄存器是一個(gè)輸入移位寄存器。在方式0和方式1時(shí),字長(zhǎng)均為9位。當(dāng)接收完一幀數(shù)據(jù)后,將移位寄存器中的串行字節(jié)數(shù)據(jù)加載到數(shù)據(jù)緩沖寄存器S3BUF中,將其第9位加載到S3CON寄存器的S3RB8位。如果由于S3SM2使得已經(jīng)接收到的數(shù)據(jù)無效時(shí),S3RB8和S3BUF中的內(nèi)容不變。由于在串行通道內(nèi)設(shè)置了輸入移位寄存器和S3BUF緩沖寄存器,從而在接收完一幀串行數(shù)據(jù)將其從移位寄存器加載到并行S3BUF緩沖寄存器后,可以立即開始接收下一幀數(shù)據(jù)。ES3串口3中斷允許位。當(dāng)該位為1時(shí),允許串口3中斷;當(dāng)該位為0時(shí),禁止串口3中斷。串口3寄存器及工作模式
--中斷允許寄存器2(IE2)名字地址復(fù)位值B7B6B5B4B3B2B1B0IE20xAFX0000000--
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 君山區(qū)2025年部分事業(yè)單位公開選調(diào)工作人員備考題庫(第二批)含答案詳解
- 2026年洮北區(qū)面向上半年應(yīng)征入伍高校畢業(yè)生公開招聘事業(yè)單位工作人員備考題庫及答案詳解參考
- 2026年陸軍工程大學(xué)社會(huì)招聘?jìng)淇碱}庫及答案詳解一套
- 宜賓數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展集團(tuán)有限公司及其子公司2025年第三批員工公開招聘的備考題庫及一套完整答案詳解
- 2026年阿勒泰地區(qū)吉木乃縣應(yīng)急管理局面向社會(huì)公開招聘政府專職消防員6人備考題庫及一套完整答案詳解
- 2026年越秀區(qū)兒童福利會(huì)招聘工作人員備考題庫參考答案詳解
- 2026年黃石市園博文化旅游經(jīng)營(yíng)管理有限公司招聘?jìng)淇碱}庫及1套參考答案詳解
- 企業(yè)招投標(biāo)規(guī)范制度
- 養(yǎng)老院入住老人財(cái)產(chǎn)管理制度
- 中信證券股份有限公司分支機(jī)構(gòu)2026年校園招聘?jìng)淇碱}庫及參考答案詳解1套
- 二零二五年度打印機(jī)耗材供應(yīng)與定期檢測(cè)服務(wù)協(xié)議
- 廣東省深圳市2025年中考真題數(shù)學(xué)試題及答案
- 2025年綜合評(píng)標(biāo)專家培訓(xùn)
- 背債人貸款中介合同協(xié)議
- 浙江省寧波市2024-2025學(xué)年高三上學(xué)期期末模擬檢測(cè)語文試題(原卷版+解析版)
- 生態(tài)修復(fù)技術(shù)集成-深度研究
- 中小企業(yè)專利質(zhì)量控制指引編制說明
- 旅游行業(yè)安全風(fēng)險(xiǎn)管控與隱患排查方案
- DL-T5418-2009火電廠煙氣脫硫吸收塔施工及驗(yàn)收規(guī)程
- 高考數(shù)學(xué)專題:導(dǎo)數(shù)大題專練(含答案)
- 腘窩囊腫的關(guān)節(jié)鏡治療培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論