nKDE51單片機(jī)實(shí)驗(yàn)指導(dǎo)書_第1頁
nKDE51單片機(jī)實(shí)驗(yàn)指導(dǎo)書_第2頁
nKDE51單片機(jī)實(shí)驗(yàn)指導(dǎo)書_第3頁
nKDE51單片機(jī)實(shí)驗(yàn)指導(dǎo)書_第4頁
nKDE51單片機(jī)實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩194頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

圖5-8中,U4C的輸出LCDE就是LCM的片選信號,根據(jù)單片機(jī)地址線和74HC138的連接方式,可知LCDE的有效選通地址范圍是0xD000~0xDFFF。LCM的顯示對比度由VR1進(jìn)行調(diào)節(jié),注意VR1連接在由LCM提供的VEE和GND之間,而不是VCC和GND之間。LCM的背光通過Flash高位地址輸入插座的最高位輸入(J4的最高位BLC),該位輸入低電平則開啟背光。LCM的復(fù)位信號為低有效,本實(shí)驗(yàn)通過一個(gè)阻容電路實(shí)現(xiàn)LCM的上電復(fù)位。單片機(jī)采用存儲器映像方式通過擴(kuò)展總線操作的方式對LCM進(jìn)行控制。單片機(jī)的數(shù)據(jù)總線(P0.0~P0.7)和LCM的數(shù)據(jù)總線(D0~D7)直接相連,LCM的控制信號R/、D/、和直接和單片機(jī)地址總線中的A8、A9、A10和A11相連。單片機(jī)的讀、寫控制信號結(jié)合地址線經(jīng)74HC138譯碼后輸出到LCM128×64的E,保證只有在單片機(jī)進(jìn)行外部RAM讀寫操作時(shí)才選通LCM。則根據(jù)REFT5_05_HD61202U指令代碼表\h表5-5,可得LCM128×64內(nèi)部各寄存器在單片機(jī)外部存儲器空間中的訪問地址如REFT5_06_LCM12864內(nèi)部寄存器編址表\h表5-6所示。表5-SEQ表5-\*ARABIC6LCM128×64內(nèi)部寄存器編址表A15~A12A11A10A9A8A7~A0操作地址操作功能描述R/D/必須為1101組合才能輸出有效選通信號,選通LCM1000未參與控制,0/1均可,假設(shè)全為00xD800寫LCM左半屏指令寄存器10010xD900寫LCM左半屏顯示存儲器10100xDA00讀LCM左半屏狀態(tài)寄存器10110xDB00讀LCM左半屏顯示存儲器01000xD400寫LCM右半屏指令寄存器01010xD500寫LCM右半屏顯示存儲器01100xD600讀LCM右半屏狀態(tài)寄存器01110xD700讀LCM右半屏顯示存儲器操作LCM時(shí),只要根據(jù)數(shù)據(jù)將要送到LCM內(nèi)部的位置,選擇合適的操作地址,使用外部RAM操作指令MOVX進(jìn)行數(shù)據(jù)傳送即可,相應(yīng)的時(shí)序由單片機(jī)自動產(chǎn)生。對于C51,編譯器提供了預(yù)先定義好的宏XBYTE、XWORD用于按字節(jié)或按字(雙字節(jié))操作外部存儲器??紤]到LCM總線時(shí)序的要求,程序中在進(jìn)行每次總線操作后都插入一些NOP指令,將前后的總線操作周期分隔開。C51編譯器提供了內(nèi)聯(lián)函數(shù)_nop_()專門用于插入NOP指令,該函數(shù)在頭文件intrins.h中定義。圖形點(diǎn)陣LCD多用來顯示漢字和圖形。顯示漢字時(shí)要注意漢字庫中漢字點(diǎn)陣信息的存放順序和LCM中顯示存儲器中點(diǎn)陣信息的存放順序是不同的。對于16×16點(diǎn)陣的漢字,如REFF5_12_漢字點(diǎn)陣信息的存儲方式\h圖5-12所示,每個(gè)漢字字形點(diǎn)陣數(shù)據(jù)為32字節(jié),在漢字庫中是按行(圖中所示的橫向)存儲的,而在HD61202中則是按列(圖中所示的縱向)存儲的。圖5-SEQ圖5-\*ARABIC12漢字點(diǎn)陣信息的存儲方式圖中畫出了16×16點(diǎn)陣漢字“歡”的字形排列。在漢字庫中,點(diǎn)陣數(shù)據(jù)是按行存儲,每行自左至右,分兩個(gè)字節(jié),整個(gè)漢字字形數(shù)據(jù)共16行,自上而下逐行存儲。對于LCM的顯示數(shù)據(jù),參見REFF5_10_HD61202U顯示RAM的地址結(jié)構(gòu)\h圖5-10,一個(gè)漢字的字形數(shù)據(jù)分成上下兩部分,每部分都包括8行字形數(shù)據(jù),共16列,每列構(gòu)成一個(gè)字節(jié),自左至右逐列存儲。上半部分的16字節(jié)存儲完畢后再存儲下半部分的16字節(jié),因此,漢字庫中的數(shù)據(jù)必須經(jīng)過轉(zhuǎn)換才可用于LCM的顯示。實(shí)驗(yàn)時(shí)可根據(jù)上述分析自行設(shè)計(jì)一個(gè)程序進(jìn)行轉(zhuǎn)換,也可以到網(wǎng)絡(luò)上查找、下載液晶顯示字模提取程序來轉(zhuǎn)換。實(shí)驗(yàn)過程電路連接使用40芯連接電纜連接CPU板上的J9和JX1,將系統(tǒng)總線引出到JX2、JX3;使用40芯連接電纜連接CPU板上的JX3和LCM128×64所在電路板的JX1,將系統(tǒng)總線引入到該電路板;連接CPU板上的P1端口(J2或J6)和LCM128×64所在電路板上的扇區(qū)地址輸入(J4);將CPU板上的COM1和PC機(jī)的串行口相連。程序設(shè)計(jì)根據(jù)實(shí)驗(yàn)要求,設(shè)計(jì)實(shí)驗(yàn)代碼如下:文件:LCDP.H/********************************************************//*液晶顯示模塊控制函數(shù)定義*//********************************************************/#ifndef__LCDP#define__LCDP#include<absacc.h>//定義LCD數(shù)據(jù)端口以及控制端口//CS2=A11,CS1=A10,R/W=A9,D/I=A8#defineCWADD1 XBYTE[0xD400]#defineCRADD1 XBYTE[0xD600]#defineDWADD1 XBYTE[0xD500]#defineDRADD1 XBYTE[0xD700]#defineCWADD2 XBYTE[0xD800]#defineCRADD2 XBYTE[0xDA00]#defineDWADD2 XBYTE[0xD900]#defineDRADD2 XBYTE[0xDB00]voidLCD_WaitIdle(unsignedchar);voidLCD_WriteCommand(unsignedchar,unsignedchar);voidLCD_Reset(void);voidLCD_SetXAddress(unsignedchar,unsignedchar);voidLCD_SetYAddress(unsignedchar,unsignedchar);voidLCD_WriteData(unsignedchar,unsignedchar,unsignedchar);unsignedcharLCD_ReadData(unsignedchar,unsignedchar);voidLCD_ClrScr(unsignedchar);#endif文件:LCDP.C#include<reg51.h>#include<intrins.h>#include"LCDP.h"#defineNOP _nop_();_nop_();_nop_()/*********************************************************//*讀控制器狀態(tài)函數(shù)/*參數(shù):chip0:第1片控制器,非0:第2片控制器/*返回:狀態(tài)字/*********************************************************/unsignedcharLCD_Status(unsignedcharchip){ unsignedcharc; if(chip==0) c=CRADD1; else c=CRADD2; NOP; returnc;}/*********************************************************//*控制顯示屏開關(guān)函數(shù)/*參數(shù):onoff0:關(guān),1:開,不可取其它值/*********************************************************/voidLCD_OnOff(unsignedcharonoff){ while(LCD_Status(0)&0x90); NOP; CWADD1=0x3E|(onoff&0x01); NOP; while(LCD_Status(1)&0x90); NOP; CWADD2=0x3E|(onoff&0x01); NOP;}/*********************************************************//*設(shè)置起始顯示行函數(shù)/*參數(shù):line起始顯示行,取值范圍0~63/*********************************************************/voidLCD_SetStartLine(unsignedcharline){ while(LCD_Status(0)&0x90); NOP; CWADD1=0xC0|(line&0x3F); NOP; while(LCD_Status(1)&0x90); NOP; CWADD2=0xC0|(line&0x3F); NOP;}/*********************************************************//*設(shè)置X地址(頁地址,對應(yīng)顯示屏的行,8行一組)函數(shù)/*參數(shù):chip控制器芯片號;x頁地址,取值范圍0~7/*********************************************************/voidLCD_SetXAddress(unsignedcharchip,unsignedcharx){ if(chip==0) { while(LCD_Status(0)&0x90); NOP; CWADD1=0xB8|(x&0x07); NOP; } else { while(LCD_Status(1)&0x90); NOP; CWADD2=0xB8|(x&0x07); NOP; }}/*********************************************************//*設(shè)置Y地址函數(shù)(列地址,對應(yīng)顯示屏的列)/*參數(shù):chip控制器芯片號;y列地址,取值范圍0~64/*********************************************************/voidLCD_SetYAddress(unsignedcharchip,unsignedchary){ if(chip==0) { while(LCD_Status(0)&0x90); NOP; CWADD1=0x40|(y&0x3F); NOP; } else { while(LCD_Status(1)&0x90); NOP; CWADD2=0x40|(y&0x3F); NOP; }}/*********************************************************//*向顯示屏寫數(shù)據(jù)函數(shù)/*參數(shù):c數(shù)據(jù)/*x,y對應(yīng)的行/列地址/*********************************************************/voidLCD_WriteData(unsignedcharc,unsignedcharx,unsignedchary){ if(x<64) { LCD_SetXAddress(0,y); NOP; LCD_SetYAddress(0,x); NOP; DWADD1=c; NOP; } else { LCD_SetXAddress(1,y); NOP; LCD_SetYAddress(1,x-64); NOP; DWADD2=c; NOP; }}/*********************************************************//*讀LCD顯示數(shù)據(jù)函數(shù)/*參數(shù):x,y對應(yīng)的行/列地址/*返回:讀出的數(shù)據(jù)/*********************************************************/unsignedcharLCD_ReadData(unsignedcharx,unsignedchary){ unsignedcharc; if(x<64) { LCD_SetXAddress(0,y); NOP; LCD_SetYAddress(0,x); NOP; c=DRADD1; NOP; } else { LCD_SetXAddress(1,y); NOP; LCD_SetYAddress(1,x-64); NOP; c=DRADD2; NOP; } returnc;}/*********************************************************//*顯示屏復(fù)位/*********************************************************/voidLCD_Reset(void){ LCD_OnOff(1); LCD_SetStartLine(0);}/*********************************************************//*顯示屏清屏并填充字符/*參數(shù):c填充字符的ASCII碼/*********************************************************/voidLCD_ClrScr(unsignedcharc){ unsignedcharx,y; for(y=0;y<=7;y++) { for(x=0;x<=127;x++) { LCD_WriteData(c,x,y); } }}文件:TEST.C#include<reg51.h>#include<stdio.h>#include"LCDP.h"#defineOSC 11059200#defineBAUD 9600sbitBLC =P1^7; //定義背光控制引腳unsignedcharcodeZmCode[]= //使用字模提取程序提取出的漢字字型碼{///*南C3647*/0x04,0xE4,0x24,0x24,0x64,0xA4,0x24,0x3F,0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,0x00,0xFF,0x00,0x09,0x09,0x09,0x09,0x7F,0x09,0x09,0x09,0x49,0x80,0x7F,0x00,0x00,///*郵C5142*/0x80,0x92,0xF2,0x92,0xFF,0x91,0xF1,0x90,0x80,0xFE,0x02,0x22,0x5A,0x86,0x00,0x00,0x40,0xC8,0x4B,0x48,0x7F,0x28,0x2B,0x20,0x00,0xFF,0x04,0x08,0x10,0x08,0x07,0x00,///*四C4336*/0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,0x00,0x7F,0x20,0x28,0x24,0x23,0x20,0x20,0x20,0x23,0x24,0x24,0x24,0x7F,0x00,0x00,///*系C4721*/0x00,0x02,0x22,0x22,0x32,0xAA,0xA6,0x62,0x22,0x12,0x89,0x01,0x01,0x00,0x00,0x00,0x00,0x40,0x22,0x17,0x03,0x42,0x82,0x7E,0x02,0x02,0x02,0x13,0x66,0x00,0x00,0x00,///*倪C3663*/0x80,0x40,0x20,0xF8,0x07,0x00,0xFC,0x24,0x22,0x01,0x24,0x24,0x24,0xFE,0x04,0x00,0x00,0x00,0x00,0xFF,0x00,0x80,0x43,0x31,0x0F,0x01,0x01,0x7F,0x81,0x83,0xF0,0x00,///*曉C4794*/0x00,0xFC,0x44,0x44,0xFC,0x88,0xAA,0xFA,0xAA,0x8F,0x8A,0xAA,0xFA,0xA8,0x88,0x00,0x00,0x1F,0x08,0x08,0x9F,0x80,0x42,0x32,0x0E,0x02,0x7E,0x82,0x82,0x82,0xE0,0x00,///*軍C3092*/0x08,0x06,0x12,0xD2,0x52,0x52,0x52,0xFE,0x52,0x52,0x52,0xD2,0x12,0x0A,0x06,0x00,0x10,0x10,0x10,0x17,0x15,0x15,0x15,0xFF,0x15,0x15,0x15,0x17,0x10,0x18,0x10,0x00};voidmain(void){ intline,i,j; TMOD=0x20; SCON=0x50; PCON|=0x80; TL1=256-(OSC/12/16/BAUD); TH1=256-(OSC/12/16/BAUD); TR1=1; TI=1; for(i=0;i<30000;i++); //LCM內(nèi)部復(fù)位較慢,單片機(jī)先等待一會再對其操作 printf("\r\nResetingLCD..."); LCD_Reset(); printf("\r\nClearingLCD...\r\n"); LCD_ClrScr(0x00); for(line=0;line<=3;line++) //將各字模依次送LCM顯示緩沖區(qū) { //字模數(shù)據(jù)只需送一次,到下次更改前將保持不變 for(i=0;i<=6;i++) { for(j=0;j<=15;j++) { LCD_WriteData((unsignedchar)ZmCode[i*32+j],(unsignedchar)(i*16+j),(unsignedchar)(line*2)); LCD_WriteData((unsignedchar)ZmCode[i*32+j+16],(unsignedchar)(i*16+j),(unsignedchar)(line*2+1)); } } } while(1) { BLC=1; //打開LCM背光 for(i=0;i<30000;i++); for(i=0;i<30000;i++); for(i=0;i<30000;i++); for(i=0;i<30000;i++); LCD_WriteData(0x55,120,2); BLC=0; //關(guān)閉LCM背光 for(i=0;i<30000;i++); for(i=0;i<30000;i++); for(i=0;i<30000;i++); for(i=0;i<30000;i++); LCD_WriteData(0xaa,120,2); }}驗(yàn)證結(jié)果按實(shí)驗(yàn)要求連接好電路,在Keil中建立新工程,將上述程序代碼加入工程,編譯鏈接后,將生成的HEX文件燒寫到單片機(jī)中;將PC機(jī)的串行口和單片機(jī)的串行口相連,打開超級終端并設(shè)置波特率等參數(shù);復(fù)位單片機(jī)系統(tǒng),觀察串行口輸出數(shù)據(jù)及LCM的顯示內(nèi)容,判斷程序是否已實(shí)現(xiàn)實(shí)驗(yàn)要求中提出的目標(biāo)。

基于16C550的單片機(jī)擴(kuò)展串行口實(shí)驗(yàn)──查詢方式實(shí)驗(yàn)?zāi)康恼莆諉纹瑱C(jī)擴(kuò)展總線的工作原理和操作時(shí)序;掌握16C550的基本功能模塊及控制命令;掌握單片機(jī)和16C550之間的接口電路的設(shè)計(jì)原理及工作時(shí)序;掌握單片機(jī)控制16C550進(jìn)行查詢方式通信的程序設(shè)計(jì)方法。實(shí)驗(yàn)要求單片機(jī)通過擴(kuò)展總線和16C550接口;編寫單片機(jī)控制16C550進(jìn)行查詢方式通信的程序;使用16C550擴(kuò)展的串行口和PC機(jī)通信,設(shè)計(jì)人機(jī)接口,將PC機(jī)送來的字符加1后送回(回車換行符除外)。實(shí)驗(yàn)設(shè)備硬件:PC機(jī),nKDE-51單片機(jī)實(shí)驗(yàn)教學(xué)系統(tǒng);軟件:KeilC51集成開發(fā)環(huán)境,F(xiàn)lashMagic單片機(jī)程序燒寫軟件。實(shí)驗(yàn)原理標(biāo)準(zhǔn)MCS-51內(nèi)核的單片機(jī)通常只有一個(gè)串行口。隨著嵌入式應(yīng)用越來越復(fù)雜,很多通信類項(xiàng)目都有多串口應(yīng)用的需求。雖然現(xiàn)在有一些公司推出了雙串口單片機(jī),但相對較高的價(jià)格影響了它們的普及。而且在需要使用多于兩個(gè)串行口的應(yīng)用場合,雙串口單片機(jī)也無能為力。這種情況下使用16C550進(jìn)行串行口擴(kuò)展是很好的選擇。16C550系列串行口擴(kuò)展芯片有多種規(guī)格,在一塊芯片上可提供1路(16C550)、2路(16C552)或4路(16C554)串行口的擴(kuò)展,是目前串行口擴(kuò)展芯片領(lǐng)域事實(shí)上的工業(yè)標(biāo)準(zhǔn)。很多嵌入式CPU內(nèi)部集成的串行口都兼容16C550。16C550簡介概述16C550是用于串行數(shù)據(jù)通信的通用異步收發(fā)器(UART)。它的基本功能是將CPU輸出的并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù),以及將從串行線路上接收的串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)送CPU。16C550的應(yīng)用非常廣泛,目前已成為UART器件的事實(shí)工業(yè)標(biāo)準(zhǔn)。在嵌入式領(lǐng)域,幾乎所有提供片內(nèi)串行口的微處理器其串行口的結(jié)構(gòu)和功能等均和16C550兼容。16C550帶有完整的CPU三總線接口,通過設(shè)置16C550內(nèi)部的可編程控制寄存器可選擇16C550的功能及特性,主要包括:16字節(jié)接收和發(fā)送FIFO(先入先出緩沖),自動硬件或軟件流控制等。在FIFO模式下,通過使用輸出和輸入信號可自動控制串行數(shù)據(jù)流收發(fā)的啟動和停止。自動流控制功能可大大降低對CPU的中斷次數(shù),提高系統(tǒng)效率。16C550也可通過可設(shè)置的FIFO觸發(fā)門限、和信號來實(shí)現(xiàn)DMA模式數(shù)據(jù)傳輸。16C550片內(nèi)的狀態(tài)寄存器為用戶提供線路錯(cuò)誤指示、器件的工作狀態(tài)和調(diào)制解調(diào)器接口的控制功能。使用16C550內(nèi)部的環(huán)回模式可實(shí)現(xiàn)片內(nèi)的故障診斷。16C550可設(shè)置為根據(jù)不同的條件產(chǎn)生中斷,以滿足用戶的需求。16C550具有DIP40、PLCC44和LQFP48三種封裝形式。主要特性5V和3.3V的工作電壓,工業(yè)級溫度范圍。具有16字節(jié)的收、發(fā)FIFO,接收FIFO可設(shè)4個(gè)觸發(fā)門限,有錯(cuò)誤指示功能??删幊坦ぷ髟谧詣雍妥詣觾煞N硬件數(shù)據(jù)流控制模式下,可分別由信號控制發(fā)送器或由接收FIFO中的數(shù)據(jù)和觸發(fā)門限控制信號。具有可編程的波特率發(fā)生器和獨(dú)立的接收器時(shí)鐘輸入。具有異步通信錯(cuò)誤檢測功能,包括起始位、停止位、奇偶校驗(yàn)和超時(shí)間隔錯(cuò)誤。發(fā)送、接收、線狀態(tài)和數(shù)據(jù)裝置(通常指Modem)中斷可單獨(dú)設(shè)置及控制。完全可編程的串行通信幀格式,包括:數(shù)據(jù)位可設(shè)置為5、6、7或8位; 校驗(yàn)位可設(shè)置為奇、偶或無校驗(yàn)方式;停止位可設(shè)置為1、1.5或2位;波特率可編程選擇為DC~1Mbps,目前一些公司的兼容產(chǎn)品可高達(dá)3Mbps。具有錯(cuò)誤起始位檢測功能、具有內(nèi)部故障診斷的自環(huán)功能。通過多個(gè)狀態(tài)寄存器提供了完善的狀態(tài)報(bào)告能力。具有三態(tài)控制功能的TTL輸出,用于驅(qū)動雙向數(shù)據(jù)總線和控制總線。具有線路中斷事件的產(chǎn)生和檢測能力,有完善的中斷優(yōu)先級控制。具有完整的Modem控制信號(、、、、和)。功能框圖16C550的功能框圖如所示。圖5-SEQ圖5-\*ARABIC1316C550內(nèi)部功能框圖管腳功能描述16C550各管腳的功能描述如REFT5_07_16C550管腳功能描述\h表5-7所示。由于16C550有多種封裝,因此表中未給出各管腳的編號,讀者可根據(jù)應(yīng)用中選用的封裝自行參考16C550的數(shù)據(jù)手冊確認(rèn)引腳編號。表5-SEQ表5-\*ARABIC716C550管腳功能描述管腳名稱管腳類型功能描述A2~A0I寄存器選擇。在讀和寫操作過程中,A2~A0用于選擇讀或?qū)懙腢ART內(nèi)部寄存器。詳細(xì)內(nèi)容請參考寄存器地址和關(guān)于的描述。I地址選通。當(dāng)有效(低電平),A0、A1和A2,以及CS0,CS1和CS2直接驅(qū)動內(nèi)部的選擇邏輯;當(dāng)為高時(shí),寄存器選擇和芯片選擇信號保持為它們在產(chǎn)生低到高跳變時(shí)的邏輯電平。O波特率輸出。為輸出時(shí)鐘信號,頻率是UART發(fā)送波特率的16倍。該時(shí)鐘速率由基準(zhǔn)振蕩器頻率分頻得到,分頻值根據(jù)振蕩器頻率和波特率計(jì)算而得,初始化時(shí)寫入波特率發(fā)生器的除數(shù)鎖存器中。如果將該輸出連接到RCLK上,它也可用做接收器時(shí)鐘信號。CS0,CS1,I芯片選擇。當(dāng)CS0和CS1為高而為低時(shí),UART選通。當(dāng)這三個(gè)輸入中的任何一個(gè)無效時(shí),UART保持無效(參考的描述)I清除發(fā)送。是一個(gè)調(diào)制解調(diào)器狀態(tài)信號。它的狀態(tài)可通過讀調(diào)制解調(diào)器狀態(tài)寄存器的位4()來檢測。調(diào)制解調(diào)器狀態(tài)寄存器的位0(Δ)表示自從最后一次讀調(diào)制解調(diào)器狀態(tài)寄存器后,是否已經(jīng)改變了狀態(tài)。當(dāng)電平改變且自動模式不使能時(shí),如果調(diào)制解調(diào)器狀態(tài)中斷被使能,將會產(chǎn)生中斷。該管腳的狀態(tài)不影響UART正在進(jìn)行的發(fā)送或接收操作。D7~D0I/O數(shù)據(jù)總線。具有3態(tài)輸出的8位數(shù)據(jù)線。用來實(shí)現(xiàn)UART和CPU之間的數(shù)據(jù)、控制和狀態(tài)信息的雙向傳輸。I數(shù)據(jù)載波檢測。是一個(gè)調(diào)制解調(diào)器狀態(tài)信號。它的狀態(tài)可通過讀調(diào)制解調(diào)器狀態(tài)寄存器的位7()來檢測。調(diào)制解調(diào)器狀態(tài)寄存器的位3(Δ)表示自從最后一次讀調(diào)制解調(diào)器狀態(tài)寄存器后,是否已經(jīng)改變了狀態(tài)。當(dāng)電平改變時(shí),如果調(diào)制解調(diào)器狀態(tài)中斷被使能,將會產(chǎn)生中斷。DDISO驅(qū)動器禁能。當(dāng)CPU不讀數(shù)據(jù)時(shí),DDIS有效(高電平)。當(dāng)DDIS有效時(shí),它可禁能外部收發(fā)器。I數(shù)據(jù)設(shè)備就緒。是一個(gè)調(diào)制解調(diào)器狀態(tài)信號。它的狀態(tài)可通過讀調(diào)制解調(diào)器狀態(tài)寄存器的位5()來檢測。調(diào)制解調(diào)器狀態(tài)寄存器的位1(Δ)表示自從最后一次讀調(diào)制解調(diào)器狀態(tài)寄存器后,是否已經(jīng)改變了狀態(tài)。當(dāng)電平改變時(shí),如果調(diào)制解調(diào)器狀態(tài)中斷被使能,將會產(chǎn)生中斷。O數(shù)據(jù)終端就緒。當(dāng)為有效電平(低電平)時(shí),通知調(diào)制解調(diào)器或數(shù)據(jù)設(shè)備UART已準(zhǔn)備好。通過置位調(diào)制解調(diào)器控制寄存器的位可將設(shè)置為有效電平。主機(jī)復(fù)位、環(huán)回模式操作或清零位都將使引腳處于無效(高)電平。INTRPTO中斷。當(dāng)INT為有效高電平時(shí),通知CPUUART有中斷等待處理。下列4種條件可產(chǎn)生中斷:接收器錯(cuò)誤、接收的數(shù)據(jù)可用或超時(shí)(僅用于FIFO模式)、發(fā)送器保存寄存器為空或Modem狀態(tài)中斷被使能。當(dāng)有中斷正在處理或主機(jī)復(fù)位都可使INTRPT復(fù)位(無效)。MRI主機(jī)復(fù)位。高電平有效。當(dāng)MR接高電平時(shí),將清除大部分UART寄存器,并將各輸出信號的電平設(shè)置為各自的初始狀態(tài)。,O輸出1和輸出2。可由用戶設(shè)置的輸出終端,通過置位各自在MCR中的控制位(和)被設(shè)置為有效電平(低電平)。當(dāng)主機(jī)復(fù)位、環(huán)回模式或MCR的位2()或位3()被清零時(shí),和變?yōu)闊o效電平(高電平)。RCLKI接收器時(shí)鐘。RCLK的頻率必須是UART接收波特率的16倍。續(xù)上表管腳名稱管腳類型功能描述,RD2I讀輸入。當(dāng)或RD2中任何一個(gè)有效(即為低或高電平)時(shí),若UART的片選信號也有效,CPU將從被A2~A0選定的UART的寄存器中讀出狀態(tài)信息或數(shù)據(jù)。讀操作過程中,只能有一個(gè)讀輸入有效,另一個(gè)應(yīng)被設(shè)置為無效電平(例如,當(dāng)參與CPU的讀控制時(shí),應(yīng)將RD2連接到低電平)。I振鈴指示。是一個(gè)調(diào)制解調(diào)器狀態(tài)信號。它的狀態(tài)可通過讀調(diào)制解調(diào)器狀態(tài)寄存器的位6()來檢測。調(diào)制解調(diào)器狀態(tài)寄存器的位2(TERI)表示自從最后一次讀調(diào)制解調(diào)器狀態(tài)寄存器后,已經(jīng)從低電平跳變到高電平。當(dāng)這個(gè)跳變出現(xiàn)時(shí),如果調(diào)制解調(diào)器狀態(tài)中斷被使能,將會產(chǎn)生中斷。O請求發(fā)送。當(dāng)有效時(shí),它通知調(diào)制解調(diào)器或數(shù)據(jù)設(shè)備UART已準(zhǔn)備好發(fā)送數(shù)據(jù)。管腳可通過置位Modem控制寄存器中的位設(shè)置成有效(低電平);主機(jī)復(fù)位、環(huán)回模式操作或通過清零MCR的位1(位)都可將管腳設(shè)置成無效(高電平)。該管腳的狀態(tài)變化不影響UART正在進(jìn)行的發(fā)送或接收(字節(jié))操作。O接收器就緒??捎米鹘邮掌鞯腄MA控制信號。在FIFO模式下,通過FIFO控制寄存器的位3可選擇DMA的操作方式0或1。在16C450模式下只允許選擇DMA模式0。模式0支持DMA單字節(jié)傳輸,該傳輸在CPU總線周期之間執(zhí)行。模式1支持DMA多字節(jié)傳輸,該傳輸連續(xù)執(zhí)行直到接收FIFO為空。在DMA模式0下,當(dāng)接收FIFO或接收器保存寄存器中至少有一個(gè)字符時(shí),為有效(低)電平。當(dāng)已經(jīng)有效但FIFO或保存寄存器中沒有字符時(shí),變?yōu)闊o效(高)電平。在DMA模式1下,當(dāng)FIFO中的數(shù)據(jù)已經(jīng)到達(dá)觸發(fā)門限或已超時(shí)時(shí),變?yōu)橛行Вǖ停╇娖?;?dāng)已經(jīng)有效但FIFO或保存寄存器中沒有字符時(shí),變?yōu)闊o效(高)電平。SINI串行數(shù)據(jù)輸入。SIN將所連的通信器件的串行數(shù)據(jù)輸入到UART。SOUTO串行數(shù)據(jù)輸出。SOUT將串行數(shù)據(jù)輸出到所連通信器件的管腳。主機(jī)復(fù)位后SOUT將被設(shè)置為高電平。O發(fā)送器就緒。TXRDY可用作發(fā)送器DMA控制信號。在FIFO模式下,使用FCR[3]可選擇DMA的操作方式0或1。在16C450模式下,只允許選擇DMA模式0。模式0支持DMA單字節(jié)傳輸,該傳輸在CPU總線周期之間執(zhí)行。模式1支持DMA多字節(jié)傳輸,這種方式下,傳輸連續(xù)執(zhí)行直到發(fā)送FIFO被填滿。VCCPower電源。輸入3.3V或5V供電電壓VSSPower地。信號地,WR2I寫輸入。當(dāng)或WR2中任何一個(gè)有效(即為低或高電平)時(shí),若UART的片選信號也有效,CPU將向被A2~A0選定的UART的寄存器中寫入控制字或數(shù)據(jù)。寫操作過程中,只能有一個(gè)寫輸入有效,另一個(gè)應(yīng)被設(shè)置為無效電平(例如,當(dāng)參與CPU的寫控制時(shí),應(yīng)將WR2連接到低電平)。XIN,XOUTI/O外部時(shí)鐘。XIN連接晶體或外部時(shí)鐘輸入。如果XIN連接外部時(shí)鐘輸入,XOUT應(yīng)懸空,否則XOUT連接晶體的另一個(gè)引腳。功能描述16C550提供了串行異步接收數(shù)據(jù)的同步處理、發(fā)送器和接收器之間數(shù)據(jù)的并串和串并轉(zhuǎn)換。這些都是數(shù)字?jǐn)?shù)據(jù)系統(tǒng)將串行數(shù)據(jù)流轉(zhuǎn)換成并行數(shù)據(jù)所必需的功能。串行數(shù)據(jù)以幀作為通信的基本單位,每個(gè)幀除了收發(fā)的數(shù)據(jù)外還附加了起始位、停止位以及可選的奇偶校驗(yàn)位。串行數(shù)據(jù)流的同步就是通過附加的起始位和停止位來實(shí)現(xiàn)的,而奇偶校驗(yàn)位則用來對接收數(shù)據(jù)的完整性進(jìn)行驗(yàn)證,接收器通過奇偶校驗(yàn)位來檢查數(shù)據(jù)在發(fā)送過程中可能產(chǎn)生的錯(cuò)誤。相對于早期的UART芯片16C450,16C550的功能更加強(qiáng)大,它提供了具有16字節(jié)的發(fā)送和接收FIFO緩沖存儲器,使得16C550在固定的時(shí)間間隔內(nèi)能處理更多的數(shù)據(jù),因此16C550可工作在需要高速率數(shù)據(jù)處理的串行通信環(huán)境中。另外,16C550還提供了4種可選的FIFO中斷觸發(fā)門限和自動硬件/軟件流控制,可在盡量減少中斷CPU的情況下實(shí)現(xiàn)最大的數(shù)據(jù)吞吐量,尤其適合于多通道的應(yīng)用環(huán)境。16C550功能的選擇和設(shè)置都是通過內(nèi)部寄存器的功能位完成的。CPU通過A2~A0地址線及讀、寫命令的不同組合來選擇寄存器并進(jìn)行相應(yīng)的讀寫操作。16C550的內(nèi)部寄存器編址如REFT5_08_16C550內(nèi)部寄存器編址\h表5-8所示。表5-SEQ表5-\*ARABIC816C550內(nèi)部寄存器編址A2A1A0讀操作寫操作操作條件000接收保持寄存器(RHR)發(fā)送保持寄存器(THR)LCR最高位DLAB=0時(shí)001中斷使能寄存器(IER)010中斷識別寄存器(IIR)FIFO控制寄存器(FCR)011線路控制寄存器(LCR)100Modem控制寄存器(MCR)101線路狀態(tài)寄存器(LSR)不可寫110Modem狀態(tài)寄存器(MSR)不可寫111暫存寄存器(SCR)暫存寄存器(SCR)000波特率除數(shù)寄存器低8位(DLL)波特率除數(shù)寄存器低8位(DLL)LCR最高位DLAB=1時(shí)001波特率除數(shù)寄存器高8位(DLM)波特率除數(shù)寄存器高8位(DLM)16C550各寄存器的控制功能簡介如下。發(fā)送(THR)和接收(RHR)數(shù)據(jù)保持寄存器串行發(fā)送器部分由一個(gè)8位的發(fā)送保持寄存器(THR)和發(fā)送移位寄存器(TSR)組成。這兩個(gè)寄存器在16C550內(nèi)部的地址都為0,CPU通過對該地址的讀寫操作來區(qū)分訪問的對象。當(dāng)CPU讀該地址時(shí)為訪問RHR,而寫該地址時(shí)則訪問THR。THR的狀態(tài)在線狀態(tài)寄存器(LSR)中給出。如果THR或TSR為空,寫THR時(shí)將會把數(shù)據(jù)總線(D7-D0)的數(shù)據(jù)傳送到THR。當(dāng)發(fā)送器為空或數(shù)據(jù)傳輸?shù)絋SR時(shí),LSR寄存器中的THR空標(biāo)志置位。在向THR寫入數(shù)據(jù)前一定要保證THR空標(biāo)志位處于置位狀態(tài)。串行接收器部分包含一個(gè)8位的接收數(shù)據(jù)保持寄存器(RHR)。接收數(shù)據(jù)首先存入RHR寄存器中,如果使能了接收FIFO則存入接收FIFO中。CPU通過讀RHR從16C550中讀出接收到的數(shù)據(jù)。接收部分還提供一種判斷錯(cuò)誤起始位的機(jī)制。在起始位或錯(cuò)誤起始位的下降沿,內(nèi)部的接收器計(jì)數(shù)器以16倍波特率時(shí)鐘的速率開始計(jì)數(shù),在7.5個(gè)時(shí)鐘過后,該時(shí)間點(diǎn)應(yīng)處于起始位的中間。此時(shí)對起始位再進(jìn)行一次采樣,如果起始位仍保持為0才判斷其有效。這種方法可以防止接收器錯(cuò)誤地開始接收字符。接收器狀態(tài)碼可在LSR中得到。中斷使能寄存器(IER)IER在16C550內(nèi)部的地址為1,CPU向此寄存器寫入數(shù)據(jù)可使能或禁止16C550的各種中斷。IER的結(jié)構(gòu)及各控制位的含義解釋如下。D7D6D5D4D3D2D1D00000EMSIELSIETBEIERBID0位為ERBI,接收數(shù)據(jù)就緒中斷使能位,置1時(shí)有效。此時(shí)如有串行數(shù)據(jù)接收就緒,16C550將置INTRPT為1,向CPU申請中斷。D1位為ETBEI,發(fā)送保持寄存器空中斷使能位,置1時(shí)有效。此時(shí)如果THR為空,16C550將置INTRPT為1,向CPU申請中斷。D2位為ELSI,接收線路狀態(tài)中斷使能位,置1時(shí)有效。此時(shí)如果接收線路發(fā)生任何錯(cuò)誤,16C550都將置INTRPT為1,向CPU申請中斷。D3位為EMSI,Modem狀態(tài)中斷使能位,置1時(shí)有效。此時(shí)如果Modem的狀態(tài)發(fā)生任何變化,16C550都將置INTRPT為1,向CPU申請中斷。D4~D7位為保留位,應(yīng)保持為0。FIFO控制寄存器(FCR)FCR是一個(gè)只寫寄存器,和中斷識別寄存器IIR(只讀)共用16C550內(nèi)部寄存器地址2。通過設(shè)置FIFO控制寄存器的位0可使能16字節(jié)的發(fā)送和接收數(shù)據(jù)FIFO。同時(shí)用戶還可以設(shè)置接收FIFO的中斷觸發(fā)門限,但不能設(shè)置發(fā)送觸發(fā)門限。接收FIFO包含超時(shí)檢測功能,當(dāng)連續(xù)接收的數(shù)據(jù)流中斷超過4個(gè)字符的接收時(shí)間時(shí),即使FIFO中緩沖的數(shù)據(jù)未到達(dá)中斷觸發(fā)門限,也將觸發(fā)接收就緒中斷,以保證CPU及時(shí)接收及處理數(shù)據(jù)。FCR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D0RFTHRFTLRsv.Rsv.DMATFRRFRFEND0位為FIFO使能位。該位置1將使能發(fā)送和接收FIFO。只要對FCR進(jìn)行寫入操作,F(xiàn)EN就必須置1。FEN位的變化將清空收發(fā)FIFO。D1位為接收FIFO清除位。該位置1將清除當(dāng)前接收FIFO中所有的字節(jié),并復(fù)位FIFO計(jì)數(shù)器。正在接收移位寄存器中的數(shù)據(jù)不會被清除。該位寫入1后將自動回0。D2位為發(fā)送FIFO清除位。該位置1將清除當(dāng)前發(fā)送FIFO中所有的字節(jié),并復(fù)位FIFO計(jì)數(shù)器。正在發(fā)送移位寄存器中的數(shù)據(jù)不會被清除。該位寫入1后將自動回0。D3位為DMA模式選擇位。當(dāng)使能了FIFO功能時(shí)(D0=1),該位置1將使和引腳實(shí)時(shí)反映出內(nèi)部FIFO隊(duì)列中數(shù)據(jù)緩沖的情況,以便于CPU進(jìn)行DMA處理。對于接收FIFO,DMA模式下,當(dāng)FIFO為空時(shí),將從0跳變?yōu)?;當(dāng)FIFO到達(dá)觸發(fā)門限或線路超時(shí)出現(xiàn)時(shí),將從1跳變到0。對于發(fā)送FIFO,DMA模式下,如果FIFO已滿,引腳將保持高電平;如果FIFO中至少有1個(gè)空的地址單元,將保持低電平。D4和D5位為保留位,留待以后功能擴(kuò)展使用,用戶初始化時(shí)應(yīng)將其設(shè)置為0。D6和D7位為接收FIFO中斷觸發(fā)門限設(shè)置位,通過這兩位可以選擇四種不同的接收FIFO中斷觸發(fā)門限,當(dāng)16C550從接收線路上連續(xù)接收數(shù)據(jù)時(shí),如果允許了接收FIFO,則只有當(dāng)FIFO中緩沖的字節(jié)數(shù)達(dá)到觸發(fā)門限設(shè)置的字節(jié)數(shù)時(shí),才會引發(fā)16C550的接收數(shù)據(jù)就緒中斷。D7D6共有四種組合(00、01、10和11),可選擇FIFO中斷的觸發(fā)門限為1、4、8和14字節(jié)。中斷識別寄存器(IIR)中斷識別寄存器為只讀寄存器,使用16C550內(nèi)部寄存器地址2。由于16C550有多個(gè)中斷源,CPU在響應(yīng)了16C550發(fā)出的中斷申請后,通過讀IIR來判斷引發(fā)中斷的中斷源。IIR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D0FENFEN00IID2IID1IID0PENDD0位為中斷掛起指示位,D0=0表示有待處理的中斷,D0=1表示無待處理的中斷。D1~D3位為中斷編碼位,通過不同的組合來表示引起中斷的中斷源。各中斷源有不同的優(yōu)先級及清除條件,具體內(nèi)容參見REFT5_09_16C550中斷控制功能表\h表5-9。D4、D5位為保留位,保持為0。D6、D7位為FIFO使能指示位。當(dāng)FIFO被使能時(shí)這兩位為1,否則它們保持為0。表5-SEQ表5-\*ARABIC916C550中斷控制功能表IIR內(nèi)容(低4位)中斷優(yōu)先級中斷類型中斷原因中斷源清除方法D3D2D1D0xxx1----01101(高)接收線狀態(tài)錯(cuò)誤覆蓋錯(cuò)誤、校驗(yàn)錯(cuò)誤、幀錯(cuò)誤或斷開錯(cuò)誤讀線狀態(tài)寄存器(LSR)01002接收數(shù)據(jù)就緒接收數(shù)據(jù)就緒或接收FIFO緩沖字節(jié)數(shù)到達(dá)觸發(fā)門限讀接收數(shù)據(jù)保持寄存器(RHR)11002字符超時(shí)指示RHR或接收FIFO中有至少一個(gè)字符,且在過去的4個(gè)字符時(shí)間內(nèi)無數(shù)據(jù)傳輸讀接收數(shù)據(jù)保持寄存器(RHR)00103發(fā)送保持寄存器空發(fā)送保持寄存器空,可寫入下個(gè)待發(fā)送字符讀中斷識別寄存器(IIR)或?qū)懭胂乱粋€(gè)待發(fā)字符00004(低)Modem狀態(tài)變化CTS、DSR、RI或DCD線狀態(tài)發(fā)生變化讀Modem狀態(tài)寄存器線路控制寄存器(LCR)線路控制寄存器用來指定異步通信線路的數(shù)據(jù)格式。通過寫寄存器的相應(yīng)位來選擇串行通信中每個(gè)字節(jié)的字長度、停止位個(gè)數(shù)及校驗(yàn)方式。LCR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D0DLABBCSPEPSPENSTBWLS1WLS0D0和D1位為字長度選擇位,四種編碼對應(yīng)串行通信的字長度分別為5、6、7、8位。D2位為停止位長度選擇位,為0時(shí)設(shè)置停止位長度為1位,為1時(shí)設(shè)置停止位長度為2位(當(dāng)串行通信字長度為5位時(shí),停止位為1.5位)。D3位為校驗(yàn)使能位。當(dāng)設(shè)置D3=1時(shí)允許16C550產(chǎn)生/接收校驗(yàn)位,否則16C550不進(jìn)行收發(fā)數(shù)據(jù)的校驗(yàn)。D4位為偶校驗(yàn)選擇位。當(dāng)EPS=1且PEN=1時(shí),16C550對收發(fā)的串行數(shù)據(jù)進(jìn)行偶校驗(yàn);當(dāng)EPS=0且PEN=1時(shí),16C550對收發(fā)的串行數(shù)據(jù)進(jìn)行奇校驗(yàn)。D5位為附加校驗(yàn)使能位。如果校驗(yàn)使能位(D3)為1,則D3、D4和D5三位將可選擇兩種不同的附加校驗(yàn)方式:Space方式(D3~D5均為1)和Mark方式(D3、D5為1,D4為0)。Space方式下校驗(yàn)位總為0,Mark方式下校驗(yàn)位總為1??芍付ǜ郊有r?yàn)位的功能使得16C550可以很方便地配合單片機(jī)進(jìn)行多機(jī)通信。D6位為間隔控制位。D6=1時(shí),16C550將SOUT的輸出強(qiáng)制為低,直到D6被重新設(shè)置為0。該功能通常用于強(qiáng)制使對端的串行接收器產(chǎn)生線路狀態(tài)錯(cuò)誤中斷。D7位為波特率除數(shù)鎖存器使能位。該位置1后,CPU對16C550內(nèi)部地址0和1的訪問將針對16位的波特率除數(shù)鎖存器的低字節(jié)和高字節(jié)。Modem控制寄存器(MCR)MCR控制著16C550和Modem或外圍器件的連接。MCR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D000AFELoopOUT2OUT1RTSDTRD0位為DTR控制位,控制著輸出引腳。D1位為RTS控制位,控制著輸出引腳。D2位為OUT1控制位,控制著可由用戶自由使用的輸出引腳。D3位為OUT2控制位,控制著可由用戶自由使用的輸出引腳。D0~D3任何一位被置為1時(shí),對應(yīng)的輸出引腳輸出低電平;置為0時(shí),對應(yīng)的引腳輸出高電平。D4位為環(huán)回模式使能位。D4=1時(shí)使能局部環(huán)回模式。該模式主要用于16C550的內(nèi)部診斷。具體內(nèi)容請參閱16C550數(shù)據(jù)手冊。D5位為自動流控制使能位。D5=1時(shí)使能16C550的自動流控制。具體內(nèi)容請參閱16C550數(shù)據(jù)手冊。線路狀態(tài)寄存器(LSR)線路狀態(tài)寄存器為只讀寄存器,用來指示當(dāng)前通信線路的狀態(tài)。LSR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D0RFETEMTTHREBIFEPEOEDRD0為接收數(shù)據(jù)就緒指示位,該位置1表示一個(gè)串行數(shù)據(jù)已經(jīng)接收完畢并保存至RHR或者FIFO中。CPU讀RHR或讀FIFO使FIFO中緩沖的數(shù)據(jù)個(gè)數(shù)小于FIFO中斷觸發(fā)門限時(shí),該位自動清零。D1為重疊錯(cuò)誤指示位,表示RHR中字符被讀出之前,已被下一個(gè)接收到的字符覆蓋。此標(biāo)志在CPU讀LSR后即自動清零。在FIFO模式下,只有當(dāng)FIFO全滿后,再接收到一個(gè)完整的字符才會置位該標(biāo)志,而且數(shù)據(jù)僅在接收移位寄存器中被覆蓋,不存入FIFO。D2為校驗(yàn)錯(cuò)誤指示位,PE=1表示接收數(shù)據(jù)的奇偶校驗(yàn)出錯(cuò)。當(dāng)CPU讀LSR后,PE自動清零。D3為幀錯(cuò)誤指示位,該位置位表示接收的字符沒有有效的停止位。當(dāng)CPU讀LSR后,該位自動清零。D4為斷開指示位,該位置位時(shí)表示線路上有超過一個(gè)完整字符時(shí)間的持續(xù)低電平。當(dāng)CPU讀LSR后,此位自動清零。D5為發(fā)送保持寄存器(THR)空指示位,該位置位表示THR空,可以接收CPU送來的下一個(gè)待發(fā)送數(shù)據(jù)。如果允許THRE中斷,則此時(shí)16C550會向CPU申請中斷。當(dāng)CPU向THR寫入數(shù)據(jù)或THR中數(shù)據(jù)送到發(fā)送移位寄存器(TSR)時(shí),此位自動清零。D6為發(fā)送器空指示位,該位置位表示THR和TSR均為空。當(dāng)THR或TSR任何一個(gè)中有數(shù)據(jù)的時(shí)候,此位自動清零。D7為接收FIFO錯(cuò)誤指示位,在FIFO模式下,該位置位表示在接收FIFO中至少有一個(gè)奇偶校驗(yàn)錯(cuò)、幀或斷開錯(cuò)。當(dāng)CPU讀LSR或FIFO中沒有后續(xù)錯(cuò)誤時(shí),RFE自動清零。在其它模式下,該位保持為0。Modem狀態(tài)寄存器(MSR)Modem狀態(tài)寄存器為只讀寄存器,用來指示和16C550相連的調(diào)制解調(diào)器或其它外圍器件的控制接口信號的當(dāng)前狀態(tài)。MSR的結(jié)構(gòu)及各控制位含義解釋如下。D7D6D5D4D3D2D1D0DCDRIDSRCTSdDCDTERIdDSRdCTSdCTS、dDSR和dDCD(D0、D1和D3)表示自上次CPU讀MSR后,對應(yīng)的Modem狀態(tài)線發(fā)生過變化。如果允許Modem狀態(tài)變化中斷,則將引發(fā)此中斷。D2位(TERI)置位時(shí)表示已檢測到RI脈沖的后沿,說明RI信號已有效。如果允許Modem狀態(tài)變化中斷,則將引發(fā)此中斷。D4~D7位分別對應(yīng)16C550的Modem狀態(tài)信號線當(dāng)前電平的補(bǔ)碼(即讀入為1表示對應(yīng)的信號線為低電平)。在系統(tǒng)不控制Modem的前提下,這四個(gè)Modem狀態(tài)輸入引腳可用作外部輸入,輸入狀態(tài)可通過MSR的高4bit讀入。暫存寄存器(SCR)16C550提供的一個(gè)8位內(nèi)部暫存寄存器,可讀寫,用于存放8位的用戶信息。可編程波特率發(fā)生器16C550對串行數(shù)據(jù)收發(fā)的處理都是通過16倍于波特率的時(shí)鐘完成的。該時(shí)鐘可通過對輸入16C550的晶振信號或外部時(shí)鐘分頻得到。為獲得指定的串行通信波特率,分頻系數(shù)可通過下列算式計(jì)算得出:分頻系數(shù)=XIN頻率÷(指定波特率×16)16C550內(nèi)部的分頻系數(shù)寄存器又稱為波特率除數(shù)寄存器,位寬為16位。該寄存器在操作時(shí)分為兩個(gè)8位寄存器,分別為DLL和DLM。當(dāng)CPU設(shè)置LCR的最高位為1時(shí),DLL和DLM分別占用16C550內(nèi)部寄存器地址0和地址1,CPU將計(jì)算出的分頻系數(shù)的低8位和高8位分兩次寫入這兩個(gè)地址即可選擇需要的波特率。單片機(jī)通過16C550擴(kuò)展串行口的電路設(shè)計(jì)16C550的接口引腳按功能可分為兩組,一組為與CPU總線接口的信號;另一組為與外設(shè)(或調(diào)制解調(diào)器)接口的信號。和CPU的三總線對應(yīng),16C550也提供了數(shù)據(jù)總線(D0~D7)、地址總線(片選邏輯、A0~A2)和控制總線(讀/寫選通、地址選通)等,實(shí)際使用中只要將其和對應(yīng)的單片機(jī)擴(kuò)展總線連接起來即可。如果使用到16C550的中斷,一定要注意其中斷有效電平為高電平,應(yīng)通過非門反相后再連接到單片機(jī)的外部中斷引腳。16C550擴(kuò)展電路接口如REFF5_14_單片機(jī)和16C550的接口電路\h圖5-14所示。設(shè)計(jì)單片機(jī)與16C550之間的接口電路時(shí),首先要確定分配給16C550的地址范圍,并將譯碼輸出和16C550的片選信號相連。其次要確定16C550的主時(shí)鐘頻率,這是決定最終波特率范圍以及產(chǎn)生的波特率誤差大小的關(guān)鍵參數(shù)。從REFF5_14_單片機(jī)和16C550的接口電路\h圖5-14中可以看出,當(dāng)?shù)刂房偩€滿足A15=1,A14、A13、A12=0且A11=1(注意電路中74HC138的輸入信號是A11的反相信號nA11,原始信號為1時(shí)nA11才為0),同時(shí)RDWR控制信號也為低(單片機(jī)讀或?qū)懣偩€)時(shí),16C550的譯碼輸出有效,由此可知16C550的有效地址譯碼范圍是0x8800~0x8FFF。16C550可以外接晶振作為主時(shí)鐘(詳細(xì)接法及元器件參數(shù)參見數(shù)據(jù)手冊),也可以選擇單片機(jī)的ALE信號接入16C550的XIN引腳作為其外部時(shí)鐘。此時(shí)16C550的主時(shí)鐘頻率為單片機(jī)晶振頻率的1/6。采用這種接法有一個(gè)問題需要注意,根據(jù)單片機(jī)擴(kuò)展總線的讀寫時(shí)序,在單片機(jī)讀寫外部RAM的兩個(gè)機(jī)器周期的指令執(zhí)行時(shí)間里,第二個(gè)機(jī)器周期中ALE信號是不出現(xiàn)的,這將導(dǎo)致輸入16C550的主時(shí)鐘頻率不準(zhǔn),引起波特率誤差。不過雖然這種情況下ALE信號不出現(xiàn),但由于此時(shí)單片機(jī)在訪問外部RAM,因此或線至少有一根處于有效(低電平)狀態(tài),可以用來產(chǎn)生ALE信號的替代信號,從而保證16C550主時(shí)鐘頻率的穩(wěn)定。在實(shí)驗(yàn)電路中,我們通過一片74HC00(U4)來完成上述邏輯,產(chǎn)生16C550的主時(shí)鐘信號(COMCLK)。16C550擴(kuò)展的串行接口信號包括所有的Modem控制及狀態(tài)引腳、OUT1和OUT2引腳。這些引腳在工作時(shí)的電平都是標(biāo)準(zhǔn)的TTL電平,如果需要和Modem或其它計(jì)算機(jī)系統(tǒng)通信,則需要進(jìn)行TTL電平和RS-232電平之間的變換。對于只使用串行收發(fā)和地線的簡單串口應(yīng)用,選用SP232進(jìn)行電平變換即可。如果16C550作為DTE的角色,需要完整的調(diào)制解調(diào)器接口來控制外部Modem,如所示,可選用SP3243完成電平變換,配合DB9針型插座使用。在實(shí)驗(yàn)電路中,這些引腳通過J1引出,并通過JP2選擇是否通過SP3243進(jìn)行電平變換。另外,16C550的串行數(shù)據(jù)輸入、輸出通過JP1選擇連接到RS232電平變換部分還是RS485總線通信接口部分,在進(jìn)行RS232方式的串行通信時(shí)需要講JP1的1、2撥到ON,3、4撥到OFF的位置。圖5-SEQ圖5-\*ARABIC14單片機(jī)和16C550的接口電路實(shí)驗(yàn)過程電路連接使用40芯連接電纜連接CPU板上的J9和JX1,將系統(tǒng)總線引出到JX2、JX3;使用40芯連接電纜連接CPU板上的JX2和16C550所在電路板的JX1,將系統(tǒng)總線引入到該電路板;程序設(shè)計(jì)根據(jù)實(shí)驗(yàn)要求,設(shè)計(jì)實(shí)驗(yàn)代碼如下:文件:16c550.#ifndef__16C550__#define__16C550__#include<absacc.h>//定義端口基地址,這些地址可根據(jù)具體電路連接情況改變#defineCOM0BASE 0x8800//定義擴(kuò)展串口寄存器#defineCom0THR XBYTE[COM0BASE+0x00] //發(fā)送數(shù)據(jù)寄存器(寫)#defineCom0RHR XBYTE[COM0BASE+0x00] //接收數(shù)據(jù)寄存器(讀)#defineCom0IER XBYTE[COM0BASE+0x01] //中斷使能寄存器(寫)#defineCom0IIR XBYTE[COM0BASE+0x02] //中斷識別寄存器(讀)#defineCom0FCR XBYTE[COM0BASE+0x02] //FIFO控制寄存器(寫)#defineCom0LCR XBYTE[COM0BASE+0x03] //線控制寄存器(寫)#defineCom0MCR XBYTE[COM0BASE+0x04] //調(diào)制解調(diào)器控制寄存器(寫)#defineCom0LSR XBYTE[COM0BASE+0x05] //線路狀態(tài)寄存器(讀)#defineCom0MSR XBYTE[COM0BASE+0x06] //調(diào)制解調(diào)器狀態(tài)寄存器(讀)#defineCom0SCR XBYTE[COM0BASE+0x07] //暫存寄存器#defineCom0DLL XBYTE[COM0BASE+0x00] //除數(shù)鎖存器低位#defineCom0DLM XBYTE[COM0BASE+0x01] //除數(shù)鎖存器高位#endif文件:test550.c#include<reg51.h>#include<stdio.h>#include<string.h>#include"16C550.h"#defineOSC 22118400#defineBAUD 9600voidmain(void){ unsignedcharc; inti; for(i=0;i<1000;i++); //復(fù)位后稍作延時(shí)再初始化 Com0LCR=0x80; //初始化波特率為9600bps,先設(shè)置DLAB=1 Com0DLL=((unsignedint)((OSC/6)/16/BAUD))%256; Com0DLM=((unsignedint)((OSC/6)/16/BAUD))/256; Com0FCR=0x00; //禁止FIFO Com0LCR=0x03; //N81模式 Com0MCR=0x0b; Com0IER=0x00; //禁止所有中斷 while(1) { while((Com0LSR&0x01)==0); //讀線路狀態(tài)寄存器,如果沒有數(shù)據(jù)可接收則等待 c=Com0RHR; //接收數(shù)據(jù) if((c!=0x0d)&&(c!=0x0a))c++;//不是回車換行的字符加1 while((Com0LSR&0x20)==0); //如果發(fā)送緩沖區(qū)不空則等待 Com0THR=c; //發(fā)送數(shù)據(jù) } }驗(yàn)證結(jié)果按實(shí)驗(yàn)要求連接好電路,在Keil中建立新工程,將test550.c加入工程,編譯鏈接后,將生成的HEX文件燒寫到單片機(jī)中;使用9針-9針的串行電纜將PC機(jī)的串行口和16C550擴(kuò)展的串行口相連,打開超級終端并設(shè)置波特率等參數(shù);在超級終端上輸入字符,觀察單片機(jī)控制16C550接收及返回的字符是否為輸入字符加1的要求。

基于16C550的單片機(jī)擴(kuò)展串行口實(shí)驗(yàn)──中斷方式實(shí)驗(yàn)?zāi)康恼莆諉纹瑱C(jī)擴(kuò)展總線的工作原理和操作時(shí)序;掌握單片機(jī)外部中斷的原理及中斷服務(wù)程序設(shè)計(jì)方法;掌握16C550的基本功能模塊及控制命令;掌握單片機(jī)和16C550之間的接口電路的設(shè)計(jì)原理及工作時(shí)序;掌握環(huán)形緩沖區(qū)的工作原理及程序設(shè)計(jì)方法;掌握單片機(jī)控制16C550進(jìn)行中斷方式通信的程序設(shè)計(jì)方法。實(shí)驗(yàn)要求單片機(jī)通過擴(kuò)展總線和16C550接口;16C550的中斷輸出經(jīng)反相后連接到單片機(jī)的INT0引腳;使用環(huán)形緩沖區(qū),編寫單片機(jī)控制16C550進(jìn)行中斷方式通信的程序;使用16C550擴(kuò)展的串行口和PC機(jī)通信,設(shè)計(jì)人機(jī)接口,將PC機(jī)送來的字符加1后送回(回車換行符除外)。實(shí)驗(yàn)設(shè)備硬件:PC機(jī),nKDE-51單片機(jī)實(shí)驗(yàn)教學(xué)系統(tǒng);軟件:KeilC51集成開發(fā)環(huán)境,F(xiàn)lashMagic單片機(jī)程序燒寫軟件。實(shí)驗(yàn)原理相對于CPU的處理速度,串行口數(shù)據(jù)傳輸?shù)乃俾适潜容^低的。例如對于最常用的串行通信波特率9600bps而言,假設(shè)串行幀結(jié)構(gòu)為N81模式,即一幀包含10bit,則該串行口每秒鐘可收發(fā)960字節(jié)的數(shù)據(jù),平均每個(gè)字節(jié)耗時(shí)約1.04ms。如果與其通信的單片機(jī)系統(tǒng)晶振頻率為12MHz的話,這段時(shí)間大約相當(dāng)于單片機(jī)的1040個(gè)機(jī)器周期。當(dāng)采用如上個(gè)實(shí)驗(yàn)中設(shè)計(jì)的查詢方式串行通信控制流程時(shí),CPU在判斷對方的數(shù)據(jù)是否到達(dá)時(shí)就必須不斷讀取16C550的LSR,直到判斷到數(shù)據(jù)接收有效,因此接收一個(gè)字節(jié)至少要消耗掉1040個(gè)機(jī)器周期不能處理其它事件,這顯然不是一種高效率的處理方式。這個(gè)問題可以通過設(shè)置16C550工作在中斷方式來解決。當(dāng)16C550設(shè)置成工作在中斷方式時(shí),接收到一個(gè)字節(jié)的數(shù)據(jù)或發(fā)送緩沖區(qū)空時(shí)都會向CPU申請中斷,這樣就可以在中斷服務(wù)程序中進(jìn)行數(shù)據(jù)處理,在沒有中斷發(fā)生的時(shí)候,CPU可執(zhí)行其它任務(wù)。16C550的中斷源有很多種,在實(shí)際程序設(shè)計(jì)中,根據(jù)具體情況,通過中斷服務(wù)程序可選擇處理某一個(gè)或全部中斷事件。只處理串行口接收數(shù)據(jù)中斷由于串行通信時(shí)發(fā)送數(shù)據(jù)是在程序的控制下主動進(jìn)行的,程序只要在發(fā)送數(shù)據(jù)前查詢發(fā)送緩沖器是否空閑,確保前一個(gè)串行幀發(fā)送完畢前不發(fā)送下一幀即可,因此串行數(shù)據(jù)的發(fā)送可以不使用中斷。而串行數(shù)據(jù)的接收則是隨機(jī)的,數(shù)據(jù)何時(shí)就緒完全取決于對方,故應(yīng)該采用中斷方式進(jìn)行接收。這樣CPU在平時(shí)可以有充分的時(shí)間去執(zhí)行主要的任務(wù),一旦串行口接收完一個(gè)字符,就可通過中斷及時(shí)響應(yīng),系統(tǒng)的處理效率較高。通過中斷服務(wù)程序接收的數(shù)據(jù)一般都是先存入一個(gè)內(nèi)部的緩沖區(qū),留待主程序進(jìn)行后續(xù)處理,以減少中斷服務(wù)程序的執(zhí)行時(shí)間,提高中斷的響應(yīng)速度。具體處理流程如REFF5_15_串行口中斷方式通信流程\h圖5-15(a)所示。處理串行口接收數(shù)據(jù)和發(fā)送數(shù)據(jù)中斷為了進(jìn)一步提高串行口數(shù)據(jù)收發(fā)的效率,串行口發(fā)送數(shù)據(jù)也可以采用中斷驅(qū)動的方式。程序只要將待發(fā)送的數(shù)據(jù)送入存儲器中的發(fā)送緩沖區(qū),并控制16C550將第一個(gè)待發(fā)數(shù)據(jù)發(fā)出即可。后續(xù)的數(shù)據(jù)將在發(fā)送緩沖器空閑中斷的調(diào)度下依次發(fā)出。串行口數(shù)據(jù)中斷方式的接收處理過程和前述的一致。具體處理流程如REFF5_15_串行口中斷方式通信流程\h圖5-15(b)所示。在這種方式中,數(shù)據(jù)的收發(fā)都是通過緩沖區(qū)進(jìn)行的,接收到的數(shù)據(jù)放入接收緩沖區(qū),準(zhǔn)備發(fā)送的數(shù)據(jù)送入發(fā)送緩沖區(qū)。主程序不斷循環(huán),查詢發(fā)送緩沖區(qū)中是否有數(shù)據(jù)要發(fā)送。程序中設(shè)置了一個(gè)用于指示數(shù)據(jù)發(fā)送過程的變量InSend,在發(fā)送第一個(gè)數(shù)據(jù)時(shí)將InSend置1,表示程序現(xiàn)在已處于發(fā)送狀態(tài),后續(xù)字節(jié)的發(fā)送則由前一個(gè)字節(jié)發(fā)完后引起的中斷完成,直到最后一個(gè)字節(jié)發(fā)完,程序查詢無后續(xù)字節(jié)可發(fā)時(shí),再將InSend復(fù)位為0。采取這種處理方式時(shí),主程序只有在InSend為0的條件下才查詢發(fā)送緩沖區(qū)是否有數(shù)據(jù)待發(fā)送,避免了查詢方式發(fā)送時(shí)程序循環(huán)等待發(fā)送完成的時(shí)間消耗,進(jìn)一步提高了程序的處理效率。圖5-SEQ圖5-\*ARABIC15串行口中斷方式通信流程數(shù)據(jù)的緩沖中斷方式的數(shù)據(jù)收發(fā)程序采取軟件功能分層處理的設(shè)計(jì)思路,中斷服務(wù)程序只負(fù)責(zé)每個(gè)具體數(shù)據(jù)字節(jié)的收發(fā),主程序則負(fù)責(zé)收發(fā)數(shù)據(jù)的邏輯處理。主程序和中斷服務(wù)程序之間通過緩沖區(qū)進(jìn)行通信,即主程序要發(fā)送的數(shù)據(jù)不是直接送到發(fā)送器,而是先送入發(fā)送緩沖區(qū),再由中斷服務(wù)程序讀出后送發(fā)送器;同樣,中斷服務(wù)程序在讀取接收器中的數(shù)據(jù)后也不馬上處理,而是先送入接收緩沖區(qū),留待主程序讀出后處理。采用功能分層的方式處理,可簡化各層軟件的處理邏輯,提高處理效率。緩沖區(qū)通常是由一個(gè)內(nèi)存中的數(shù)組構(gòu)成。為了達(dá)到緩沖深度和資源占用的平衡,通信緩沖區(qū)一般都選用環(huán)形緩沖區(qū)。環(huán)形緩沖區(qū)實(shí)際上是一個(gè)線性的存儲區(qū),通過讀寫指針作為索引進(jìn)行數(shù)據(jù)的讀出和寫入,每次讀寫后都要更新讀寫指針,當(dāng)讀寫指針到達(dá)緩沖區(qū)邊緣后將其清零(稱為Rewind,回卷),使其重新指向緩沖區(qū)的開始。所以這里所說的“環(huán)形”并不是通常意義上的“首尾相連”的環(huán)形,而是通過指針的回卷操作在功能上實(shí)現(xiàn)的。根據(jù)讀寫指針指向緩沖區(qū)位置及其之間的互相關(guān)系,環(huán)形緩沖區(qū)有多種狀態(tài),如所示。緩沖區(qū)空系統(tǒng)初始化環(huán)形緩沖區(qū)時(shí),將讀指針(RPtr)和寫指針(WPtr)同時(shí)指向線性存儲區(qū)的起始位置。此時(shí)WPtr和RPtr相等,表示緩沖區(qū)中無數(shù)據(jù)。如REFF5_16_環(huán)形緩沖區(qū)的各種狀態(tài)\h圖5-16(a)所示。數(shù)據(jù)寫入緩沖區(qū)當(dāng)需要向緩沖區(qū)中寫入數(shù)據(jù)時(shí),數(shù)據(jù)首先寫入寫指針WPtr所指的位置,然后WPtr加1,指向下一個(gè)存儲位置,即寫指針始終指向下一個(gè)空閑的存儲空間。此過程如REFF5_16_環(huán)形緩沖區(qū)的各種狀態(tài)\h圖5-16(b)所示,圖中陰影部分表示存入緩沖區(qū)的有效數(shù)據(jù)。WPtr加1后還需要判斷是否已大于緩沖區(qū)的大小,如果大于,則將WPtr置0,實(shí)現(xiàn)寫指針的回卷。回卷前后緩沖區(qū)及寫指針的狀態(tài)如REFF5_16_環(huán)形緩沖區(qū)的各種狀態(tài)\h圖5-16(c)、(d)所示。圖5-SEQ圖5-\*ARABIC16環(huán)形緩沖區(qū)的各種狀態(tài)從緩沖區(qū)讀取數(shù)據(jù)當(dāng)環(huán)形緩沖區(qū)的讀寫指針不相等時(shí),就說明緩沖區(qū)中已經(jīng)有數(shù)據(jù)存儲。緩沖區(qū)中存儲數(shù)據(jù)的字節(jié)數(shù)可通過WPtr和RPtr的差值表示,即:環(huán)形緩沖區(qū)中存儲的字節(jié)數(shù)=WPtr-RPtr由于讀寫指針都會進(jìn)行回卷操作,會有WPtr小于RPtr的情況,此時(shí)WPtr-RPtr為負(fù)數(shù),必須再加上緩沖區(qū)大小才能正確表示出環(huán)形緩沖區(qū)中的有效字節(jié)數(shù)。只有判斷出環(huán)形緩沖區(qū)內(nèi)有數(shù)據(jù)才可以進(jìn)行讀操作。讀數(shù)據(jù)時(shí)首先讀出RPtr所指向位置的數(shù)據(jù),然后RPtr加1,指向下一個(gè)可讀數(shù)據(jù)。此時(shí)同樣要判斷加1后的RPtr是否已大于緩沖區(qū)的大小,如果大于,則將RPtr置0,實(shí)現(xiàn)讀指針的回卷。緩沖區(qū)滿從理論上說,當(dāng)大小為n的緩沖區(qū)中存儲了n個(gè)字節(jié)的數(shù)據(jù)時(shí),即達(dá)到緩沖區(qū)滿的狀態(tài)。此時(shí)WPtr應(yīng)該等于RPtr。而在環(huán)形緩沖區(qū)中,由于規(guī)定了當(dāng)WPtr和RPtr相等時(shí)表示緩沖區(qū)空,因此為了區(qū)分這兩種狀態(tài),特規(guī)定當(dāng)緩沖區(qū)中存儲了n-1個(gè)數(shù)據(jù)時(shí),即為緩沖區(qū)滿狀態(tài)。此時(shí)WPtr和RPtr指向相鄰的位置。在程序設(shè)計(jì)過程中,不管是主程序還是中斷服務(wù)程序,讀寫環(huán)形緩沖區(qū)中的數(shù)據(jù)前都應(yīng)首先計(jì)算緩沖區(qū)中存儲的字節(jié)數(shù),并根據(jù)計(jì)算結(jié)果決定該進(jìn)行何種操作。例如當(dāng)計(jì)算出存儲的字節(jié)數(shù)為0(即RPtr等于WPtr)時(shí),表示緩沖區(qū)空,不能讀數(shù)據(jù);而當(dāng)計(jì)算出存儲字節(jié)數(shù)為n-1時(shí),表示緩沖區(qū)滿,不能再向其中寫數(shù)據(jù)。根據(jù)前述的分析,計(jì)算緩沖區(qū)中存儲的字節(jié)數(shù)的操作分為多步,如果緩沖區(qū)大于256字節(jié),指針變量必須采用整型數(shù),對于8位的單片機(jī)而言需將其分為高低字節(jié),花費(fèi)更多的指令,占用較長的時(shí)間進(jìn)行處理。此時(shí)不可避免地會出現(xiàn)這樣的情況,主程序根據(jù)讀寫指針的值計(jì)算緩沖區(qū)存儲字節(jié)數(shù)的過程被串行口中斷打斷,而串行口中斷服務(wù)程序讀寫緩沖區(qū)數(shù)據(jù)時(shí),又更改了緩沖區(qū)的讀寫指針。當(dāng)中斷服務(wù)程序執(zhí)行完畢返回主程序后,主程序計(jì)算出的緩沖區(qū)存儲字節(jié)數(shù)就有可能出錯(cuò)。為了避免這種情況的發(fā)生,當(dāng)進(jìn)行緩沖區(qū)存儲字節(jié)數(shù)計(jì)算時(shí),要暫時(shí)禁止串行口中斷,確保存儲字節(jié)數(shù)計(jì)算的正確。由于單片機(jī)計(jì)算緩沖區(qū)存儲字節(jié)數(shù)的過程最多只需要十幾個(gè)機(jī)器周期,假設(shè)單片機(jī)采用22.1184MHz的晶振,則計(jì)算緩沖區(qū)存儲區(qū)存儲字節(jié)數(shù)的操作不超過20μs。而在此晶振頻率下單片機(jī)串行口可支持的最快速度為115200bps,收發(fā)一個(gè)字節(jié)需要約87μs,約為計(jì)算存儲字節(jié)數(shù)時(shí)間的4倍,因此在計(jì)算緩沖區(qū)存儲字節(jié)數(shù)時(shí)暫時(shí)禁止串行口中斷不會影響串行口數(shù)據(jù)的收發(fā)。實(shí)驗(yàn)過程電路連接使用40芯連接電纜連接CPU板上的J9和JX1,將系統(tǒng)總線引出到JX2、JX3;使用40芯連接電纜連接CPU板上的JX2和16C550所在電路板的JX1,將系統(tǒng)總線引入到該電路板;使用跳線帽短接16C550所在電路板上JP6的1、2號引腳(COM_INT0),將反相后的16C550中斷輸出連接到單片機(jī)的INT0引腳。程序設(shè)計(jì)根據(jù)實(shí)驗(yàn)要求,設(shè)計(jì)實(shí)驗(yàn)代碼如下:文件:16c550.h#ifndef__16C550__#define__16C550__#include<absacc.h>//定義端口基地址,這些地址可根據(jù)具體電路連接情況改變#defineCOM0BASE 0x8800//定義擴(kuò)展串口寄存器#defineCom0THR XBYTE[COM0BASE+0x00] //發(fā)送數(shù)據(jù)寄存器(寫)#defineCom0RHR XBYTE[COM0BASE+0x00] //接收數(shù)據(jù)寄存器(讀)#defineCom0IER XBYTE[COM0BASE+0x01] //中斷使能寄存器(寫)#defineCom0IIR XBYTE[COM0BASE+0x02] //中斷識別寄存器(讀)#defineCom0FCR XBYTE[COM0BASE+0x02] //FIFO控制寄存器(寫)#defineCom0LCR XBYTE[COM0BASE+0x03] //線控制寄存器(寫)#defineCom0MCR XBYTE[COM0BASE+0x04] //調(diào)制解調(diào)器控制寄存器(寫)#defineCom0LSR XBYTE[COM0BASE+0x05] //線路狀態(tài)寄存器(讀)#defineCom0MSR XBYTE[COM0BASE+0x06] //調(diào)制解調(diào)器狀態(tài)寄存器(讀)#defineCom0SCR XBYTE[COM0BASE+0x07] //暫存寄存器#defineCom0DLL XBYTE[COM0BASE+0x00] //除數(shù)鎖存器低位#defineCom0DLM XBYTE[COM0BASE+0x01] //除數(shù)鎖存器高位voidInit16C550(unsignedlong);#endif文件:test550.c#include<reg51.h>#include"16c550.h"#defineOSC 22118400#defineBAUD 9600#defineBUFSIZE 64unsignedcharxdataRecBuf[BUFSIZE];intRRPtr,RWPtr;bitInSend;/*******************************************************************************函數(shù): Init16C550功能: 初始化16C550,波特率、數(shù)據(jù)位、中斷等參數(shù)均自己定義參數(shù): 無作者: 倪曉軍2003-12-260:002003-12-260:01*******************************************************************************/voidInit16C550(unsignedlongBaud){ Com0LCR=0x80; //設(shè)置波特率為9600bps,首先設(shè)置DLAB=1 Com0DLL=((unsignedint)(OSC/6/16/Baud))%256; Com0DLM=((unsignedint)(OSC/6/16/Baud))/256; Com0FCR=0x00; //禁止FIFO Com0LCR=0x03; //N81模式 Com0MCR=0x0b; Com0IER=0x03; //允許DR+THRE中斷}/*******************************************************************************函數(shù): Int0ISR功能: Int0中斷服務(wù)程序,負(fù)責(zé)16C550數(shù)據(jù)的中斷收發(fā)。接收的數(shù)據(jù)放入環(huán)型隊(duì)列參數(shù): 無作者: 倪曉軍2003-10-1916:15*******************************************************************************/voidInt0ISR(void)interrupt0{ unsignedcharc,tmpc; c=Com0IIR; while((c&0x01)==0) { switch(c&0x0f) { case0x04:

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論