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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章單片機的開關檢測、鍵盤輸入

與顯示的接口設計

1

復習單片機的并行I/O口有幾個?特點?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ù)復用口作通用I/O口用圖4-1P0口某一位的位電路結構2023/10/152.P1口與P0口不同,P1口內部有上拉電阻。(1)P1口作通用I/O口使用(準三態(tài)雙向口)圖4-2P1口某一位的位電路結構2023/10/153.P2口P2口為準三態(tài)雙向口,負載能力為4個TTL門電路。當單片機系統(tǒng)擴展存儲器時,P2輸出高8位地址;系統(tǒng)沒有擴展存儲器時,P2口可作通用I/O口使用。圖4-3P2口某一位的位電路結構2023/10/154.P3口圖4-4P3口某一位的位電路結構第5章單片機的開關檢測、鍵盤輸入與顯示的接口設計

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

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

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

單片機控制的流水燈

【例5-1】

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

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

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

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

while(1)后有分號,是使程序停留在這指令上;“while(1){……;}”:反復循環(huán)執(zhí)行大括號內程序段,本例用法,即控制流水燈反復循環(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中的內容循環(huán)左移;第2個參數(shù)為左移位數(shù),即左移1位。編程中一定要把含有移位函數(shù)的頭文件intrins.h包含在內,例如第2行“#include<intrins.h>”。在【例5-1】基礎上,編寫控制發(fā)光二極管反復循環(huán)點亮的流水燈?!纠?-2】電路見圖5-2,制作由上至下再由下至上反復循環(huán)點亮顯示的流水燈,3種方法實現(xiàn)。思路:循環(huán)點亮

反復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口送出點亮數(shù)據(jù)

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

} }}(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ù)為左移點亮數(shù)據(jù),后8個為右移點亮數(shù)據(jù)*/(2)移位運算符實現(xiàn)使用移位運算符“>>”、“<<”,把送P1口顯示控制數(shù)據(jù)進行移位,從而實現(xiàn)發(fā)光二極管依次點亮。參考程序:#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程序說明:

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

(3)用循環(huán)左、右移位函數(shù)實現(xiàn)使用C51提供的庫函數(shù),即循環(huán)左移n位函數(shù)和循環(huán)右移n位函數(shù),控制發(fā)光二極管點亮。參考程序:#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中的點亮數(shù)據(jù)送P1口,控制點亮顯示

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開關狀態(tài)檢測讀入I/O端口電平,即可檢測開關處于閉合狀態(tài)還是打開狀態(tài)。5.2.1開關檢測案例1

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

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

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

開關、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內容右移4位,P1口高4位移至低4位

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

delay( );}}

24圖5-4

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

如圖5-4,P1.0和P1.1引腳接有兩只開關S0和S1,兩引腳上的高低電平共4種組合,4種組合分別點亮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位開關狀態(tài)

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

case1:P2=0x02;break;//P1.1、P1.0=01,點亮P2.1腳LED

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

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

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

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

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

控制數(shù)碼管循環(huán)顯示單個數(shù)字的電路【例5-5】利用單片機控制一個8段LED數(shù)碼管先循環(huán)顯示單個偶數(shù):0、2、4、6、8,再顯示單個奇數(shù):1、3、5、7、9,如此反復循環(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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論