第5章 與顯示器、開關(guān)、鍵盤接口設(shè)計_第1頁
第5章 與顯示器、開關(guān)、鍵盤接口設(shè)計_第2頁
第5章 與顯示器、開關(guān)、鍵盤接口設(shè)計_第3頁
第5章 與顯示器、開關(guān)、鍵盤接口設(shè)計_第4頁
第5章 與顯示器、開關(guān)、鍵盤接口設(shè)計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章單片機(jī)的開關(guān)檢測、鍵盤輸入

與顯示的接口設(shè)計

1

復(fù)習(xí)單片機(jī)的并行I/O口有幾個?特點(diǎn)?4個雙向的8位并行I/O端口:P0~P3,表特殊功能寄存器P0、P1、P2和P3就是這4個端口的輸出鎖存器。4個端口除按字節(jié)輸入/輸出外,還可按位尋址,以便位控功能的實現(xiàn)。2023/10/151.P0口P0口既可作地址/數(shù)據(jù)總線使用,也可作通用I/O口使用。注意:作地址/數(shù)據(jù)復(fù)用口作通用I/O口用圖4-1P0口某一位的位電路結(jié)構(gòu)2023/10/152.P1口與P0口不同,P1口內(nèi)部有上拉電阻。(1)P1口作通用I/O口使用(準(zhǔn)三態(tài)雙向口)圖4-2P1口某一位的位電路結(jié)構(gòu)2023/10/153.P2口P2口為準(zhǔn)三態(tài)雙向口,負(fù)載能力為4個TTL門電路。當(dāng)單片機(jī)系統(tǒng)擴(kuò)展存儲器時,P2輸出高8位地址;系統(tǒng)沒有擴(kuò)展存儲器時,P2口可作通用I/O口使用。圖4-3P2口某一位的位電路結(jié)構(gòu)2023/10/154.P3口圖4-4P3口某一位的位電路結(jié)構(gòu)第5章單片機(jī)的開關(guān)檢測、鍵盤輸入與顯示的接口設(shè)計

單片機(jī)控制LED顯示(掌握)開關(guān)狀態(tài)檢測(掌握)LED數(shù)碼管顯示LED數(shù)碼管的結(jié)構(gòu);(了解)LED數(shù)碼管的工作原理;(了解)LED數(shù)碼管字型編碼;(掌握)LED數(shù)碼管的靜態(tài)顯示;(掌握)LED數(shù)碼管動態(tài)顯示。(掌握)單片機(jī)系統(tǒng)基本功能:顯示開關(guān)檢測鍵盤輸入本次課主要介紹單片機(jī)與顯示器件、開關(guān)的接口設(shè)計與軟件編程85.1單片機(jī)控制發(fā)光二極管顯示發(fā)光二極管常用來指示系統(tǒng)工作狀態(tài),制作節(jié)日彩燈、廣告牌匾等。大部分發(fā)光二極管工作電流1~5mA之間,其內(nèi)阻為20~100Ω。電流越大,亮度也越高。為保證發(fā)光二極管正常工作,同時減少功耗,限流電阻選擇十分重要,若供電電壓為+5V,則限流電阻可選1~3kΩ。圖5-1

發(fā)光二極管與單片機(jī)并行口的連接5.1.1單片機(jī)與發(fā)光二極管的連接第2章已介紹,P0口作通用I/O用,由于漏極開路,需外接上拉電阻。而P1~P3口內(nèi)部有30kΩ左右上拉電阻。P1~P3口如何與LED發(fā)光二極管驅(qū)動連接?單片機(jī)并行端口P1~P3直接驅(qū)動發(fā)光二極管,電路見圖5-1。與P1、P2、P3口相比,P0口每位可驅(qū)動8個LSTTL輸入,而P1~P3口每一位驅(qū)動能力,只有P0口一半。當(dāng)P0口某位為高電平時,可提供400μA的拉電流;當(dāng)P0口某位為低電平(0.45V)時,可提供3.2mA的灌電流,而P1~P3口內(nèi)有30kΩ左右上拉電阻,如高電平輸出,則從P1、P2和P3口輸出的拉電流Id僅幾百μA,驅(qū)動能力較弱,亮度較差,見圖5-1(a)。如端口引腳為低電平,能使灌電流Id從單片機(jī)外部流入內(nèi)部,則將大大增加流過的灌電流值,見圖5-1(b)。AT89S51任一端口要想獲得較大的驅(qū)動能力,要用低電平輸出。如一定要高電平驅(qū)動,可在單片機(jī)與發(fā)光二極管間加驅(qū)動電路,如74LS04、74LS244等。5.1.2I/O端口的編程舉例

對I/O端口編程控制時,要對I/O端口特殊功能寄存器聲明,在C51的編譯器中,這項聲明包含在頭文件reg51.h中,編程時,可通過預(yù)處理命令#include<reg51.h>,把這個頭文件包含進(jìn)去。下面通過案例介紹如何編程對發(fā)光二極管輸出控制。12圖5-2

單片機(jī)控制的流水燈

【例5-1】

制作流水燈,原理電路見圖5-2,8個發(fā)光二極管LED0~LED7經(jīng)限流電阻分別接至P1口的P1.0~P1.7引腳上,陽極共同接高電平。編寫程序來控制發(fā)光二極管由上至下的反復(fù)循環(huán)流水點(diǎn)亮,每次點(diǎn)亮一個發(fā)光二極管。思路:循環(huán)點(diǎn)亮?

參考程序:#include<reg51.h>#include<intrins.h> //包含移位函數(shù)_crol_()的頭文件#defineucharunsignedchar #defineuintunsignedint voiddelay(uinti) //延時函數(shù){ uchart; while(i--)

{ for(t=0;t<120;t++); }}voidmain() //主程序{

P1=0xfe; //向P1口送出點(diǎn)亮數(shù)據(jù)

while(1) { delay(500); //500為延時參數(shù),可根據(jù)實際需要調(diào)整

P1=_crol_(P1,1);//函數(shù)_crol_(P1,1)把P1中的數(shù)據(jù)循環(huán)左移1位

}}程序說明:(1)while(1)兩種用法:“while(1);”:

while(1)后有分號,是使程序停留在這指令上;“while(1){……;}”:反復(fù)循環(huán)執(zhí)行大括號內(nèi)程序段,本例用法,即控制流水燈反復(fù)循環(huán)顯示。

(2)C51函數(shù)庫中的循環(huán)移位函數(shù):循環(huán)移位函數(shù)包括:

循環(huán)左移函數(shù)“_crol_”

循環(huán)右移函數(shù)“_cror_”。本例用循環(huán)左移“_crol_(P1,1)”,函數(shù)。括號第1個參數(shù)為循環(huán)左移對象,即對P1中的內(nèi)容循環(huán)左移;第2個參數(shù)為左移位數(shù),即左移1位。編程中一定要把含有移位函數(shù)的頭文件intrins.h包含在內(nèi),例如第2行“#include<intrins.h>”。在【例5-1】基礎(chǔ)上,編寫控制發(fā)光二極管反復(fù)循環(huán)點(diǎn)亮的流水燈?!纠?-2】電路見圖5-2,制作由上至下再由下至上反復(fù)循環(huán)點(diǎn)亮顯示的流水燈,3種方法實現(xiàn)。思路:循環(huán)點(diǎn)亮

反復(fù)voiddelay(){ uchari,j; for(i=0;i<255;i++) for(j=0;j<255;j++);}voidmain() //主函數(shù){ uchari; while(1) { for(i=0;i<16;i++) {

P1=tab[i]; //向P1口送出點(diǎn)亮數(shù)據(jù)

delay(); //延時,即點(diǎn)亮一段時間

} }}(1)數(shù)組的字節(jié)操作實現(xiàn)建立1個字符型數(shù)組,將控制8個LED顯示的8位數(shù)據(jù)作為數(shù)組元素,依次送P1口。參考程序:#include<reg51.h>#defineucharunsignedchar uchartab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; /*前8個數(shù)據(jù)為左移點(diǎn)亮數(shù)據(jù),后8個為右移點(diǎn)亮數(shù)據(jù)*/(2)移位運(yùn)算符實現(xiàn)使用移位運(yùn)算符“>>”、“<<”,把送P1口顯示控制數(shù)據(jù)進(jìn)行移位,從而實現(xiàn)發(fā)光二極管依次點(diǎn)亮。參考程序:#include<reg51.h>#defineucharunsignedchar voiddelay(){ uchari,j; for(i=0;i<255;i++) for(j=0;j<255;j++);}voidmain() //主函數(shù){ uchari,temp; while(1){ temp=0x01; //左移初值賦給temp for(i=0;i<8;i++) {

P1=~temp; //temp中的數(shù)據(jù)取反后送P1口

delay(); //延時

temp=temp<<1; //temp中數(shù)據(jù)左移一位

} temp=0x80; //賦右移初值給temp for(i=0;i<8;i++) {

P1=~temp; //temp中的數(shù)據(jù)取反后送P1口

delay(); //延時

temp=temp>>1; //temp中數(shù)據(jù)右移一位

} }}18程序說明:

注意使用移位運(yùn)算符“>>”、“<<”與使用循環(huán)左移函數(shù)“_crol_”和循環(huán)右移函數(shù)“_cror_”區(qū)別。左移移位運(yùn)算“<<”是將高位丟棄,低位補(bǔ)0;右移移位運(yùn)算、“>>”是將低位丟棄,高位補(bǔ)0。而循環(huán)左移函數(shù)“_crol_”是將移出的高位再補(bǔ)到低位,即循環(huán)移位;同理循環(huán)右移函數(shù)“_cror_”是將移出的低位再補(bǔ)到高位

(3)用循環(huán)左、右移位函數(shù)實現(xiàn)使用C51提供的庫函數(shù),即循環(huán)左移n位函數(shù)和循環(huán)右移n位函數(shù),控制發(fā)光二極管點(diǎn)亮。參考程序:#include<reg51.h>#include<intrins.h> //包含循環(huán)左、右移位函數(shù)的頭文件#defineucharunsignedchar voiddelay(){ uchari,j; for(i=0;i<255;i++) for(j=0;j<255;j++);}

voidmain() //主函數(shù){ uchari,temp; while(1) {

temp=0xfe; //初值為11111110 for(i=0;i<7;i++) { P1=temp; //temp中的點(diǎn)亮數(shù)據(jù)送P1口,控制點(diǎn)亮顯示

delay(); //延時

temp=_crol_(temp,1); //

temp數(shù)據(jù)循環(huán)左移1位

}for(i=0;i<7;i++) { P1=temp; //temp中的數(shù)據(jù)送P1口輸出

delay(); //延時

temp=_cror_(temp,1); //temp中數(shù)據(jù)循環(huán)右移1位

}}}5.2開關(guān)狀態(tài)檢測讀入I/O端口電平,即可檢測開關(guān)處于閉合狀態(tài)還是打開狀態(tài)。5.2.1開關(guān)檢測案例1

用I/O端口來進(jìn)行開關(guān)狀態(tài)檢測,開關(guān)一端接到I/O端口引腳上,并通過上拉電阻接+5V上,開關(guān)另一端接地,當(dāng)開關(guān)打開時,I/O引腳為高電平,當(dāng)開關(guān)閉合時,I/O引腳為低電平。21開關(guān)檢測怎么實現(xiàn)??【例5-3】

如圖5-3,單片機(jī)的P1.4~P1.7接4個開關(guān)S0~S3,P1.0~P1.3接4個發(fā)光二極管LED0~LED3。

編程:將P1.4~P1.7上的4個開關(guān)狀態(tài)反映在P1.0~P1.3引腳控制的4個發(fā)光二極管上,開關(guān)閉合,對應(yīng)發(fā)光二極管點(diǎn)亮。例如P1.4引腳上開關(guān)S0狀態(tài),由P1.0腳上LED0顯示,P1.6引腳上開關(guān)S2狀態(tài),由P1.2腳的LED2顯示。圖5-3

開關(guān)、LED發(fā)光二極管與P1口的連接思路:讀入

輸出參考程序如下:#include<reg51.h>#defineucharunsignedcharvoiddelay() //延時函數(shù){ uchari,j; for(i=0;i<255;i++) for(j=0;j<255;j++);}voidmain() //主函數(shù){while(1){ unsignedchartemp; //定義臨時變量temp P1=0xff;//P1口低4位置1,作為輸入;高4位置1,發(fā)光二極管熄滅

temp=P1&0xf0; //讀P1口并屏蔽低4位,送入temp中

temp=temp>>4;//temp內(nèi)容右移4位,P1口高4位移至低4位

P1=temp; //temp中的數(shù)據(jù)送P1口輸出

delay( );}}

24圖5-4

開關(guān)檢測指示器2接口電路與仿真5.2.2開關(guān)檢測案例2【例5-4】

如圖5-4,P1.0和P1.1引腳接有兩只開關(guān)S0和S1,兩引腳上的高低電平共4種組合,4種組合分別點(diǎn)亮P2.0~P2.3引腳控制的4只LED,即S0、S1均閉合,LED0亮,其余滅;S1閉合、S0打開,LED1亮,其余滅;S0閉合、S1打開,LED2亮,其余滅;S0、S1均打開,LED3亮,其余滅。編程實現(xiàn)此功能。參考程序:思路:狀態(tài)檢測狀態(tài)判斷輸出

狀態(tài)編碼?#include<reg51.h> //包含頭文件reg51.hvoidmain() //主函數(shù)main(){ charstate; do {

P1=0xff; //P1口為輸入

state=P1; //讀入P1口的狀態(tài),送入state

state=state&0x03; //屏蔽P1口的高6位

switch(state) //判P1口低2位開關(guān)狀態(tài)

{ case0:P2=0x01;break;//P1.1、P1.0=00,點(diǎn)亮P2.0腳LED

case1:P2=0x02;break;//P1.1、P1.0=01,點(diǎn)亮P2.1腳LED

case2:P2=0x04;break;//P1.1、P1.0=10,點(diǎn)亮P2.2腳LED

case3:P2=0x08;break;//P1.1、P1.0=11,點(diǎn)亮P2.3腳LED

} }while(1);}關(guān)注:程序段中用到循環(huán)結(jié)構(gòu)控制語句do-while以及switch-case語句。5.3單片機(jī)控制LED數(shù)碼管的顯示5.3.1LED數(shù)碼管顯示原理

圖5-58段LED數(shù)碼管結(jié)構(gòu)及外形LED數(shù)碼管:“8”字型,7段(不包括小數(shù)點(diǎn))或8段(包括小數(shù)點(diǎn)),每段對應(yīng)一個發(fā)光二極管,共陽極和共陰極兩種為使LED數(shù)碼管顯示不同字符,要把某些段點(diǎn)亮,就要為數(shù)碼管各段提供一字節(jié)的二進(jìn)制碼,即字型碼(也稱段碼)。習(xí)慣上以“a”段對應(yīng)字型碼字節(jié)的最低位。各字符段碼見表5-1。28為什么0是3FH??29如要在數(shù)碼管顯示某字符,只需將該字符字型碼加到各段上即可。例:某存儲單元中的數(shù)為“02H”,想在共陽極數(shù)碼管上顯示“2”需要把加到數(shù)碼管各段?!?”的字型碼“A4H”加到數(shù)碼管各段。同時數(shù)碼管的公共端接+5V,此時在數(shù)碼管上顯示字符“2”。數(shù)碼管顯示字符小結(jié):將欲顯示字符的字型碼作成一個表(數(shù)組),根據(jù)顯示字符從表中查找到相應(yīng)字型碼,然后把該字型碼輸出數(shù)碼管各個段上,同時數(shù)碼管的公共端接+5V,此時在數(shù)碼管上顯示相應(yīng)字符。

如何實現(xiàn)??圖5-6

控制數(shù)碼管循環(huán)顯示單個數(shù)字的電路【例5-5】利用單片機(jī)控制一個8段LED數(shù)碼管先循環(huán)顯示單個偶數(shù):0、2、4、6、8,再顯示單個奇數(shù):1、3、5、7、9,如此反復(fù)循環(huán)顯示。

思路:字符段碼表依次送出?#include"reg51.h"#include"intrins.h"#defineucharunsignedchar#defineuintunsignedint#defineoutP0ucharcodeseg[]={0xc0,0xa4,0x99,0x82,0x80,0xf9,0xb0,0x92,0xf8,0x90,0x01};//共陽極段碼表

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論