版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
任務(wù)一認(rèn)識單片機(jī)C語言一、C語言特點(diǎn)目前單片機(jī)C語言已非常流行,絕大部分單片機(jī)應(yīng)用系統(tǒng)可直接用C語言來編寫,與匯編語言相比,用C語言開發(fā)單片機(jī)具有如下特點(diǎn):1、開發(fā)速度優(yōu)于匯編語言;2、軟件的可讀性和可維護(hù)性顯著改善;3、提供了庫函數(shù)包含許多標(biāo)準(zhǔn)子程序,具有較強(qiáng)的數(shù)據(jù)處理能力;4、關(guān)鍵字及控制轉(zhuǎn)移方式更接近人的思維方式;5、方便進(jìn)行多人聯(lián)合開發(fā),進(jìn)行模塊化軟件設(shè)計(jì);6、C語言本身并不依賴于機(jī)器硬件系統(tǒng),移植方便;7、適合運(yùn)行嵌入式實(shí)時操作系統(tǒng)。二、C51的數(shù)據(jù)類型
我們用變量去描述一個現(xiàn)實(shí)中的數(shù)據(jù)時,應(yīng)根據(jù)需要選擇變量類型。對于C51來講,不管采用哪一種數(shù)據(jù)類型,雖然源程序看起來是一樣的,但最終形成目標(biāo)代碼的長度和運(yùn)行速度相差非常大。三、C51的數(shù)據(jù)存儲類型與8051存儲器結(jié)構(gòu)
MCS-51系列單片機(jī)將程序存儲器(ROM)和數(shù)據(jù)存儲器(RAM)分開,并有各自的尋址機(jī)構(gòu)和尋址方式。8051單片機(jī)在物理上有四個存儲空間:
片內(nèi)程序存儲器空間:0000H-0FFFH片外程序存儲器空間:1000H-FFFFH(/EA=1)0000H-FFFFH(/EA=0)
片內(nèi)數(shù)據(jù)存儲器空間:00H-1FH:通用工作寄存器區(qū)20H-2FH:位尋址空間30H-7FH:用戶RAM區(qū)80H-FFH:特殊功能寄存器區(qū)/間接尋址區(qū)片外數(shù)據(jù)存儲器空間:0000H-FFFFHC51中變量定義的格式:
數(shù)據(jù)類型[存儲類型]變量名1[,變量名2]…[,變量名n];例:chardatatemp;bitbdataflags;ucharbdataspeed;ucharidatalen;ucharcodeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
如果變量定義時省去存儲類型說明,編譯時會自動選擇默認(rèn)的存儲類型,而默認(rèn)的存儲類型由存儲模式確定。在C51中有SMALL、COMPACT、LARGE三種存儲模式,在KEIL環(huán)境中,可以通過目標(biāo)工具選項(xiàng)設(shè)置選擇所需的存儲模式。
四、定義8051特殊功能寄存器及I/O口1、定義8051特殊功能寄存器(1)、對特殊功能寄存器的訪問sfrSFR名=SFR地址;例:sfrTMOD=0x89;(2)、對于SFR的16位數(shù)據(jù)的訪問
sfr1616位SFR名=低8位SFR地址;例:sfr16DPTR=0x82;(3)、SFR中的某位進(jìn)行訪問
sbitSFR位名=SFR名^i;例:sbitTR0=TCON^4;
sbitSFR位名=SFR地址^i;
例:sbitTR0=0x88^4;
sbitSFR位名=位地址;例:sbitTR0=0x8C;(4)、可位尋址對象的定義可位尋址對象指既可以字節(jié)尋址,又可位尋址的對象,位于片內(nèi)RAM的20H~2FH中。一般先定義變量的數(shù)據(jù)類型,數(shù)據(jù)類型可以是字符型、整型、長整型等,其存儲器類型必須定義為bdata,然后使用sbit定義該變量中可單獨(dú)尋址訪問的位。例:charbdatastate;sbitstate_7=state^7;main(){state=5;state_7=1;}2、定義8051并行接口(1)、片內(nèi)并行口的定義8051單片機(jī)帶有4個8位并行口,即SFR中的P0、P1、P2、P3口,對它的定義在reg51.h已存在,可直接對其引用。
例:P2=0xFE;Key=P1;
如果要單獨(dú)對某位進(jìn)行操作,可在程序的開頭加上位寄存器定義。例如:sbitP1_0=P1^0;
在隨后的程序中即可對這些位進(jìn)行訪問。例如:while(P1_0==1);(2)、定義片外并行口對于MCS-51單片機(jī)外擴(kuò)展的I/O口,例8255、8155等,則根據(jù)其硬件譯碼地址,將其視為片外數(shù)據(jù)存儲器的一個單元,使用#define語句定義格式:#defineI/O口名稱XBYTE[I/O口地址]
其中,XBYTE表示絕對存儲器訪問的宏,在文件absacc.h中定義,方括號中[]中是存儲器的絕對地址。在使用這種格式定義之前,應(yīng)加上語句:
#include<absacc.h>例如:在系統(tǒng)中擴(kuò)充的USB接口芯片,其命令口地址為0xBDF1,數(shù)據(jù)口地址為0xBDF0,可以這樣定義:#include<absacc.h>#defineCMDPORTXBYTE[0xBDF1]#defineDATPORTXBYTE[0xBDF0]五、認(rèn)識C51的內(nèi)部函數(shù)及常用的宏
C51運(yùn)行庫提供了100多個預(yù)定義函數(shù)和宏,用戶可以在自己的C程序中使用這些函數(shù)和宏。
1、內(nèi)部函數(shù)
c51編譯器支持許多內(nèi)部庫函數(shù),內(nèi)部函數(shù)產(chǎn)生的在線嵌入代碼與調(diào)用函數(shù)產(chǎn)生的代碼相比,執(zhí)行速度快,效率高。常用的內(nèi)部函數(shù)如下:
_crol_(v,n):將無符號字符變量v循環(huán)左移n位._cror_(v,n):將無符號字符變量v循環(huán)右移n位._irol_(v,n):將無符號整型變量v循環(huán)左移n位._iror_(v,n):將無符號整型變量v循環(huán)右移n位._nop_():延時一個機(jī)器周期,相當(dāng)于NOP指令。2、絕對存儲器訪問宏
C51標(biāo)準(zhǔn)庫包含了可以訪問顯式存儲地址的宏,可以像使用數(shù)組一樣使用這些宏:1、CBYTE允許用戶訪問程序存儲器中指定地址單元。例:id=CBYTE[0X200];2、XBYTE允許用戶訪問外部數(shù)據(jù)存儲器中指定地址單元。例:XBYTE[0X100]=d;3、DBYTE允許用戶訪問片內(nèi)數(shù)據(jù)存儲器中指定地址單元。
以上宏在ABSACC.H文件中定義,為了使用這些宏,必須在程序開始時加上:#include<absacc.h>任務(wù)二、P0~P3口應(yīng)用舉例1、硬件電路
[案例1]設(shè)計(jì)一電路,監(jiān)視開關(guān)S0-S3的狀態(tài),當(dāng)某開關(guān)閉合時,對應(yīng)的發(fā)光二極管點(diǎn)亮,如開關(guān)斷開時,發(fā)光二極管熄滅。P0口作為輸出口P1口作為輸入口for(i=0;i<200;i++)state_7=1;K14按下,修改當(dāng)前速度等級為此需進(jìn)行去抖動處理。二、MCS-51單片機(jī)的中斷系統(tǒng)
(一)中斷源動態(tài)顯示方式是應(yīng)用最為廣泛的一種顯示方式,其接口電路是把所有數(shù)碼管的8個字段a~g、dp的同名端并聯(lián)在一起,由一個8位的字段輸出口控制;{while(S1==0)delay(100);當(dāng)CPU正在執(zhí)行某段程序時,外部發(fā)生了某一事件請求CPU迅速去處理,于是CPU暫時中斷當(dāng)前程序的執(zhí)行,轉(zhuǎn)去處理發(fā)生的事件,處理完成后,再回到原來被中斷的地方,繼續(xù)執(zhí)行被中斷的程序,這一過程稱為中斷。usingm:定義中斷函數(shù)使用的工作寄存器組,m的取值范圍為0-3,可以默認(rèn)。voiddisp(void)延時由speed指定的時間從表面上看,主程序和中斷服務(wù)程序似乎沒有關(guān)系,當(dāng)按下PLUSE鍵時,將產(chǎn)生中斷請求,由于中斷號為0,當(dāng)前中斷又是開放的,CPU自動會找到屬性為“interrupt0”的函數(shù)運(yùn)行,即進(jìn)入外部中斷0的服務(wù)程序,將變量dir(設(shè)進(jìn)入中斷前取值為0)取反,當(dāng)CPU回到主程序再次檢測dir時,其值已變?yōu)?,D1-D8因此開始左移。1、定義8051特殊功能寄存器for(m=0;m<200;m++)2、設(shè)計(jì)思想
將開關(guān)S0-S3接在P1.0-P1.3引腳,當(dāng)某個開關(guān)Si接通時,對應(yīng)的引腳P1.i為低電平,如果我們向P0.i引腳輸出低電平,發(fā)光二極管Di就能被點(diǎn)亮;當(dāng)開關(guān)Ki斷開時,由于P1口內(nèi)部具有上拉電阻,對應(yīng)引腳P1.i為高電平,如果我們向P0.i引腳輸出高電平,發(fā)光二極管Di熄滅。因此我們只要讀取P1口低四位的狀態(tài)并傳送給P0口即可。
3、程序清單#include<reg51.h>sbitP10=P1^0;…………sbitP03=P0^3;voidmain(void){P1=P1|0x0f;while(1){P00=P10;P01=P11; P02=P12;P03=P13;}}定義所用的I/O口引腳將P1口置1,作輸入口使用
[案例2]如圖所示,由P0口控制發(fā)光二極管D1-D8,首先點(diǎn)亮D1,延時0.5秒后,熄滅D1點(diǎn)亮D2,到D8點(diǎn)亮并熄滅后,再點(diǎn)亮D1,這樣不斷循環(huán)。2、程序清單#include<reg51.h>#include<intrins.h>#defineucharunsignedcharvoiddelay(ucharn){…………}voidmain(void){ucharled=0xfe;while(1){P0=led;delay(100);led=_crol_(led,1);}}延時程序,n:入口參數(shù),單位:2毫秒左右。首先點(diǎn)亮LED1。將led左循環(huán)移位一次。延時。led送P0口。[案例3]如圖所示,用P1.0輸出1KHz和500Hz的音頻信號驅(qū)動揚(yáng)聲器,作為報警信號,要求1KHz的信號響100ms,500Hz的信號響200ms,兩種信號交替產(chǎn)生,P1.1接一個控制開關(guān),當(dāng)開關(guān)合上時產(chǎn)生報警,當(dāng)開關(guān)斷開時停止報警。1、設(shè)計(jì)思想500Hz的信號周期為2ms,信號電平為每1ms變反一次;1KHz的信號周期為1ms,信號電平為500us取反一次。
因此只要編寫一個延時程序,當(dāng)入口參數(shù)n=1時,延時時間為500us,n=2時,延時時間為1000us。每次調(diào)用延時函數(shù)后就對P1.0求反,即可產(chǎn)生頻率為1KHz或500Hz的方波。以上過程連續(xù)循環(huán)200次,就能使1KHz的聲音持續(xù)100ms,500Hz的聲音持續(xù)200ms。
2、程序清單sbitS1=P1^1;sbitSPK=P1^0;voidmain(void){ucharm,n;S1=1;while(1){while(S1==0)for(n=1;n<=2;n++)for(m=0;m<200;m++){delay(n);SPK=~SPK;}}}S1控制是否產(chǎn)生報警聲用來產(chǎn)生方波只有S1接通時,才產(chǎn)生報警n=1:1KHz;n=2:500Hz循環(huán)200次,延時500us或1ms
,P1.0求反,產(chǎn)生方波,[案例4]設(shè)計(jì)一個流水燈控制器,發(fā)光管的變化方式、變化速度各有四檔,可用按鈕K13、K14進(jìn)行選擇。1、設(shè)計(jì)思想如圖所示,開關(guān)K13、K14分別接到P2.4、P2.5引腳,當(dāng)有鍵被按下時,對應(yīng)引腳為低電平,按鍵釋放時,又恢復(fù)為高電平,因此通過檢測該引腳電平的高低就能判別當(dāng)前是否有鍵被按下。根據(jù)要求,我們可以設(shè)計(jì)如表2-4所示四種方式的控制字。變量mode用來選擇當(dāng)前的工作方式,其值在0-3之間,受按鈕K13控制;變量i用來記錄當(dāng)前的輸出位置,其值在0-7之間,每次輸出后自動指向下一位置。為了控制發(fā)光管移動速度,我們定義一個表示速度等級的變量speed,取值范圍在0-3之間,受按鈕K14控制。2、程序清單voidmain(void){uchari=0;ucharmode=0; ucharspeed=0; while(1){for(i=0;i<8;i++) {P0=tab[mode][i]; if(K13==0) {mode=mode++; mode=mode&0x03;}elseif(K14==0) {speed=speed++; speed=speed&0x03; }delay(50+speed*50);}}}通電后的默認(rèn)方式為0、默認(rèn)速度等級0每種方式有8個控制字從當(dāng)前模式中取控制字輸出
K13按下,修改當(dāng)前工作模式K14按下,修改當(dāng)前速度等級延時由speed指定的時間任務(wù)五認(rèn)識MCS-51單片機(jī)的中斷系統(tǒng)
一、中斷的概念當(dāng)CPU正在執(zhí)行某段程序時,外部發(fā)生了某一事件請求CPU迅速去處理,于是CPU暫時中斷當(dāng)前程序的執(zhí)行,轉(zhuǎn)去處理發(fā)生的事件,處理完成后,再回到原來被中斷的地方,繼續(xù)執(zhí)行被中斷的程序,這一過程稱為中斷。在中斷系統(tǒng)中,把引起中斷的設(shè)備或事件稱為中斷源;由中斷源向CPU發(fā)出的中斷請求稱為中斷請求信號;
CPU接收中斷請求而暫?,F(xiàn)行程序的執(zhí)行,轉(zhuǎn)去為服務(wù)對象服務(wù)稱為中斷響應(yīng);為服務(wù)對象服務(wù)的程序稱為中斷服務(wù)程序;
現(xiàn)行程序暫停時的PC值稱為斷點(diǎn);
從中斷服務(wù)程序返回到斷點(diǎn)處稱為中斷返回;當(dāng)有多個中斷源同時向CPU申請中斷時,CPU優(yōu)先響應(yīng)最緊急的中斷請求,處理完畢再響應(yīng)優(yōu)先級別較低的中斷請求,這種預(yù)先安排的響應(yīng)次序稱為中斷優(yōu)先級。1、使CPU的工作效率大為提高
CPU和外部設(shè)備通過中斷方式交換信息,可以避免不必要的等待和查詢,CPU可啟動多個外設(shè)與它并行工作,對各個外設(shè)實(shí)行統(tǒng)一管理,分時服務(wù),從而大大提高了CPU的工作效率。計(jì)算機(jī)采用中斷技術(shù)后的優(yōu)點(diǎn)2、增強(qiáng)了實(shí)時控制及應(yīng)急處理能力在實(shí)時控制系統(tǒng)中,被控制對象的參數(shù)變化必須及時采集、處理,并轉(zhuǎn)化為相應(yīng)的控制動作,對系統(tǒng)進(jìn)行調(diào)節(jié);數(shù)據(jù)的越限、系統(tǒng)的故障信息也必須被計(jì)算機(jī)及時發(fā)現(xiàn),以便報警。有了中斷功能后,系統(tǒng)的失常和故障都可通過中斷立刻通知CPU,使它能夠迅速采集實(shí)時數(shù)據(jù)和故障信息,并對系統(tǒng)做出應(yīng)急處理。二、MCS-51單片機(jī)的中斷系統(tǒng)
(一)中斷源
MCS-51系列單片機(jī)中,基本型8XX51有5個中斷源,增強(qiáng)型8XX52有6個中斷源,它們在程序存儲器中各有固定的中斷服務(wù)程序入口地址(又稱中斷向量地址),當(dāng)CPU響應(yīng)中斷時,硬件自動形成各自的入口地址,由此進(jìn)入中斷服務(wù)程序,從而實(shí)現(xiàn)正確的轉(zhuǎn)移。(二)中斷控制寄存器1、中斷的允許和禁止——中斷控制寄存器IE8XX51/52的每個中斷源對應(yīng)于IE寄存器的一位,如果允許該中斷源中斷,則該位置1,禁止該中斷源中斷,則該位清0。另外還有一位CPU是否響應(yīng)中斷的總控位。ES:串行口中斷允許位,ES=1,允許;ES=0,禁止。ET0/ET1/ET2:定時器中斷允許位,為1,允許;為0,禁止。EX0/EX1:外部中斷允許位,為1,允許;為0,禁止。EA:中斷總控開關(guān)。EA=1,CPU開中斷;EA=0,CPU關(guān)中斷。2、中斷請求標(biāo)志及外部中斷方式選擇寄存器TCONTF1、TF0、IE1、IE0分別為中斷源T1、T0、/INT1、/INT0的中斷請求標(biāo)志,如果中斷源有中斷請求,相應(yīng)的中斷標(biāo)志置1;沒有中斷請求,相應(yīng)標(biāo)志位為0。IT0、IT1分別為外部中斷/INT0、/INT1的中斷觸發(fā)方式選擇,如果選擇下降沿觸發(fā)IT應(yīng)設(shè)置為1;如果選擇低電平觸發(fā),IT應(yīng)設(shè)置為0。TR1、TR0為定時器T1、T0工作的啟動和停止位,與中斷無關(guān),請參閱項(xiàng)目三。3、中斷優(yōu)先級管理寄存器IP
8XX51/52中斷源優(yōu)先級由IP寄存器管理,一個中斷源對應(yīng)一位,如果對應(yīng)位置1,該中斷源為高優(yōu)先級;如果對應(yīng)位為0,則為低優(yōu)先級。
當(dāng)某一時刻有多個中斷源提出中斷請求時,CPU首先響應(yīng)高優(yōu)先級的請求;一個低優(yōu)先級的中斷可能被高優(yōu)先級的中斷所中斷,但不能被另一個低優(yōu)先級的中斷所中斷。一個高優(yōu)先級的中斷不能被其他中斷所中斷。
當(dāng)某幾個中斷源在IP寄存器中的相應(yīng)位同為1或同為0時,CPU的查詢順序?yàn)椋?INT0→定時器T0→/INT1→定時器T1→串行口→定時器T2(三)中斷的響應(yīng)過程單片機(jī)在每個機(jī)器周期順序采樣每個中斷源,在下一個機(jī)器周期按優(yōu)先級順序檢測中斷標(biāo)志,如果發(fā)現(xiàn)某個中斷標(biāo)志為1,將在接下來的機(jī)器周期按優(yōu)先級進(jìn)行處理。中斷系統(tǒng)通過硬件自動將當(dāng)前的PC值壓入堆棧,以保護(hù)斷點(diǎn),再將相應(yīng)的中斷服務(wù)程序的入口地址裝入PC,使CPU轉(zhuǎn)到中斷服務(wù)程序的入口處開始執(zhí)行程序。中斷服務(wù)程序從向量地址開始,一直到返回指令RETI為止,RETI指令一方面告訴中斷系統(tǒng)該中斷服務(wù)程序已執(zhí)行完畢,另一方面把壓入堆棧的斷點(diǎn)地址從堆棧中彈出,裝入程序計(jì)數(shù)器PC,使程序返回到被中斷的程序的斷點(diǎn)處繼續(xù)執(zhí)行。(四)中斷程序的設(shè)計(jì)用戶對中斷的控制和管理,實(shí)際是圍繞寄存器IE、TCON、IP、SCON進(jìn)行的,這幾個寄存器在單片機(jī)復(fù)位時是清零的,因此必須根據(jù)需要對這幾個寄存器的相關(guān)位進(jìn)行設(shè)置。編寫中斷服務(wù)程序時應(yīng)注意:(1)開中斷總控開關(guān)EA,置位中斷源的中斷允許位;(2)根據(jù)外部中斷請求信號/INT0、/INT1的特性選擇中斷觸發(fā)方式,是低電平觸發(fā)還是下降沿觸發(fā);(3)如果有多個中斷源中斷,應(yīng)設(shè)置中斷優(yōu)先級,預(yù)置IP。
使用C51可以編寫出高效的中斷服務(wù)程序,中斷服務(wù)程序定義為函數(shù),函數(shù)的定義如下:
void函數(shù)名(void)interruptn[usingm]
其中,interruptn表示將函數(shù)聲明為中斷服務(wù)函數(shù),n為中斷號,通常取以下值:
0:外中斷01:定時/計(jì)數(shù)器T0中斷2:外中斷3:定時/計(jì)數(shù)器T1中斷4:串行口發(fā)送與接收中斷5:定時/計(jì)數(shù)器T2中斷
usingm:定義中斷函數(shù)使用的工作寄存器組,m的取值范圍為0-3,可以默認(rèn)。它對目標(biāo)代碼的影響是:函數(shù)的入口處將切換到m指定的寄存器組,函數(shù)退出時,原寄存器組恢復(fù),選不同的工作寄存器組,可方便實(shí)現(xiàn)寄存器組的現(xiàn)場保護(hù)。
[案例1]如圖所示,P0口控制發(fā)光二極管D1~D8每隔一段時間左移或右移一位,當(dāng)單脈沖按鈕PLUSE按下時,單脈沖電路將產(chǎn)生一個負(fù)脈沖作為中斷請求信號,控制發(fā)光二極管的移動方向。
voidmain(void){ucharled;EX0=1;IT0=1;EA=1;led=0xfe;while(1){P0=led;delay(250);if(dir)led=_crol_(led,1);elseled=_cror_(led,1);}}
voidchdir(void)interrupt0{dir=~dir;}允許外部中斷0中斷負(fù)跳變觸發(fā)CPU開中斷如果dir標(biāo)志為1,左移否則右移外部中斷0服務(wù)程序
每次中斷,將方向標(biāo)志求反
從表面上看,主程序和中斷服務(wù)程序似乎沒有關(guān)系,當(dāng)按下PLUSE鍵時,將產(chǎn)生中斷請求,由于中斷號為0,當(dāng)前中斷又是開放的,CPU自動會找到屬性為“interrupt0”的函數(shù)運(yùn)行,即進(jìn)入外部中斷0的服務(wù)程序,將變量dir(設(shè)進(jìn)入中斷前取值為0)取反,當(dāng)CPU回到主程序再次檢測dir時,其值已變?yōu)?,D1-D8因此開始左移。任務(wù)六設(shè)計(jì)動態(tài)LED顯示器一、認(rèn)識LED顯示器在單片機(jī)應(yīng)用系統(tǒng)中,常用的顯示器主要有LED數(shù)碼管顯示器及LCD液晶顯示器。LED顯示器由于亮度高、價格低、壽命長、對電流、電壓要求低,與單片機(jī)的連接方便等優(yōu)點(diǎn),得到了非常廣泛的應(yīng)用。
LED顯示器由7個條形發(fā)光二極管及一個小圓點(diǎn)發(fā)光二極管組成,每個發(fā)光二極管又稱為字段,根據(jù)各字段的亮暗組合成相應(yīng)的字符。
根據(jù)內(nèi)部的連接方式可分成共陽極型和共陰極型。
共陰極LED數(shù)碼管的陰極連在一起接地,當(dāng)某個發(fā)光二極管的陽極為高電平時,對應(yīng)字段被點(diǎn)亮。
共陽極LED數(shù)碼管的陽極連在一起,接正電壓,當(dāng)某個發(fā)光二極管的陰極為低電平時,該二極管所表示的字段被點(diǎn)亮。
數(shù)碼管不同的亮暗組合就能形成不同的字形,這種組合稱之為字形碼,共陽極和共陰極的字形碼是不同的,對應(yīng)的字形碼如表2-7所示。
二、動態(tài)顯示方式動態(tài)顯示方式是應(yīng)用最為廣泛的一種顯示方式,其接口電路是把所有數(shù)碼管的8個字段a~g、dp的同名端并聯(lián)在一起,由一個8位的字段輸出口控制;而每一個數(shù)碼管的公共極(位選線)各自獨(dú)立地受位選口控制,實(shí)現(xiàn)各位的分時點(diǎn)亮。[案例2]在4位動態(tài)LED顯示器上顯示“1234”
想要在顯示屏上顯示1234,可先通過P0口送出“4”的字形碼0x99,并向P2.3~P2.0引腳送出1110B,使三極管Q1導(dǎo)通,從而在最右側(cè)的共陽數(shù)碼管LED1上顯示“4”,然后向P0口送出“3”的字形碼0xb0,并向P2.3~P2.0引腳送出1101B,將數(shù)字“3”顯示在LED2上,依次類推,“2”、“1”可分別顯示在LED3、LED4上。
由此可知,每次只有一個數(shù)碼管被點(diǎn)亮,但由于人眼有視覺暫留現(xiàn)象,只要以較快的速度令4個數(shù)碼管依次輪流點(diǎn)亮,看起來會覺得4個數(shù)碼管同時被點(diǎn)亮了,這種顯示方法稱為動態(tài)掃描顯示法。ucharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c};uchardbuf[4]={4,3,2,1};voiddisp(void){ucharn,bsel;bsel=0xfe; for(n=0;n<4;n++){P2=bsel;P0=segtab[dbuf[n]]; bsel=_crol_(bsel,1);delay(); P0=0xff; }}字符0~F的字形碼表顯示緩存,存放要顯示的字符首先點(diǎn)亮最低位bsel送位選口
根據(jù)顯示緩沖單元的數(shù)據(jù)查出字形碼準(zhǔn)備顯示下一位延時1ms熄滅數(shù)碼管任務(wù)七電子計(jì)數(shù)器的設(shè)計(jì)
設(shè)計(jì)一個計(jì)數(shù)器,其計(jì)數(shù)范圍為-999~+999,通電后4位LED顯示000,如果K13鍵按下,計(jì)數(shù)器加1,K14鍵按下,計(jì)數(shù)器減1。
上圖中的按鍵為機(jī)械彈性開關(guān),由于機(jī)械觸點(diǎn)的彈性及電壓突跳等原因,在觸點(diǎn)閉合或斷開的瞬間,會出現(xiàn)電壓抖動,如下圖所示。
為了保證按鍵識別的正確、可靠,在電壓信號抖動的情況下不能認(rèn)為按鍵已閉合。為此需進(jìn)行去抖動處理。去抖動有硬件與軟件兩種方法。
硬件去抖動就是加去抖動電路,從根本上避免抖動的產(chǎn)生;軟件去抖動則采用時間延遲以躲過抖動階段,等信號穩(wěn)定后再進(jìn)行檢測。為了簡化設(shè)計(jì)、降低成本,單片機(jī)應(yīng)用系統(tǒng)一般采用軟件方法。程序一旦檢測到按鍵輸入端口為低電平,隨即延時10ms-20ms左右,避開抖動階段,再檢測輸入端口是否仍然為低電平,如果為高,則認(rèn)為無鍵被按下,否則說明有鍵按下,進(jìn)一步判斷是哪一個鍵被按下,并作相應(yīng)的處理。電子計(jì)數(shù)器的流程圖
voidmain(void){uchari;intcount=0; unsignedintt; while(1){disp();if((P2&0x30)!=0x30){for(i=0;i<10;i++)disp();if((P2&0x30)!=0x30) {if(K13==0) {count++; if(count>999)count=-999; } else {count--; if(count<-999)count=999; }
計(jì)數(shù)器的初始值為0顯示計(jì)數(shù)器的當(dāng)前值如果有鍵有銨下
延時去抖動
抖動延時后,按鈕依然按著
是加1鍵K13計(jì)數(shù)變量加1否則,是減1鍵K14計(jì)數(shù)變量減1if(count>=0) {dbuf[3]=0x10; t=count;}else {dbuf[3]=0x11; t=-count;}dbuf[2]=t/100;dbuf[1]=(t%100)/10;dbuf[0]=t%10;while((P2&0x30)!=0x30)disp();}}}}如果計(jì)數(shù)值大于等于0最高位"+"號不顯示最高位顯示"-"求出計(jì)數(shù)值的絕對值
將計(jì)數(shù)值
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024軌道車輛座椅動態(tài)舒適性試驗(yàn)技術(shù)規(guī)范
- 培訓(xùn)課件 -OD組織發(fā)展全景圖之組織激活
- 大理2024年04版小學(xué)4年級下冊英語第二單元測驗(yàn)卷
- 農(nóng)場成本核算-記賬實(shí)操
- 北京市順義區(qū)2023-2024學(xué)年八年級下學(xué)期期末英語試題
- 第三單元名著導(dǎo)讀《儒林外史》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語文九年級下冊
- 2023年乙二醇辛醇糠醇資金需求報告
- 三維數(shù)字內(nèi)容制作-三維動畫制作流程規(guī)范
- 1.2.2 反比例函數(shù)的性質(zhì) 同步練習(xí)
- 有關(guān)讀書短篇演講稿(3篇)
- 房地產(chǎn)公司設(shè)計(jì)類技術(shù)筆試(2018-2023年)真題摘選含答案
- 誤吸急救處理護(hù)理課件
- 《土地資源》一師一優(yōu)課2(第1課時)
- iml工藝設(shè)計(jì)要求
- 新概念英語第2冊課文(完整版)
- 感受小說中的群眾角色-九年級上冊《智取生辰綱》《范進(jìn)中舉》《劉姥姥進(jìn)大觀園》群文閱讀教學(xué)設(shè)計(jì)-
- 大學(xué)美育教程(高職)全套教學(xué)課件
- 高端保潔家政技能培訓(xùn)方案
- 高質(zhì)量的心肺復(fù)蘇
- 《中考試卷分析》課件
- 餐飲服務(wù)人員職業(yè)道德培訓(xùn)
評論
0/150
提交評論