單片機(jī)原理及應(yīng)用第4章
第4章 C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,51匯編語言能直接操作單片機(jī)的系統(tǒng)硬件,指令執(zhí)行速度快。但其程序可讀性差,且編寫、移植困難。,51單片機(jī)操作數(shù)的簡記符,實驗2匯編源代碼,第4章單片機(jī)的C51語言,C51是為51系列單片機(jī)設(shè)計的一種C語言,其特點:,C51語言已成為51系列單片機(jī)程序開發(fā)的主流軟件方法。,結(jié)構(gòu)化語言,代碼緊湊效率可與匯編語言媲美 接近真實語言,程序可讀性強(qiáng)易于調(diào)試、維護(hù) 庫函數(shù)豐富,編程工作量小產(chǎn)品開發(fā)周期短 機(jī)器級控制能力,功能很強(qiáng)適合于嵌入式系統(tǒng)開發(fā) 與匯編指令無關(guān),易于掌握在單片機(jī)基礎(chǔ)上上手快,第4章單片機(jī)的C51語言,C51與標(biāo)準(zhǔn)C語言對比 相同之處:語法規(guī)則、程序結(jié)構(gòu)、編程方法,舉例:LED閃爍控制功能,;匯編程序 LOOP: CLR P1.0 ACALL DEL50 SETB P1.0 SJMP LOOP DEL50: MOV R7,#200 DEL1: MOV R6,#125 DJNZ R6,$ DJNZ R7,DEL1 RET END,第4章單片機(jī)的C51語言,預(yù)處理命令-,函數(shù)說明-,全局變量定義-,主函數(shù)-,自定義函數(shù)-,局部變量定義-,函數(shù)體,函數(shù)體-,/C51程序,第4章單片機(jī)的C51語言,C51與標(biāo)準(zhǔn)C語言對比 不同之處: 數(shù)據(jù)結(jié)構(gòu)(第4章)、中斷處理(第5章)、端口擴(kuò) 展(第8章) 教學(xué)思路: 學(xué)習(xí)C51的數(shù)據(jù)結(jié)構(gòu)知識(理論部分) 學(xué)習(xí)C51軟件開發(fā)方法(Keil C軟件用法) 學(xué)習(xí)I/O口典型應(yīng)用編程(入門與進(jìn)階兩個層次),第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,1. C51的變量,在C語言編程中,數(shù)值可以發(fā)生改變的量稱為變量。,變量名與存儲單元地址相對應(yīng),變量值與存儲單元的內(nèi)容相對應(yīng)。,例如,在51單片機(jī)多存儲空間中如何確定變量與地址的關(guān)系?,第4章單片機(jī)的C51語言,【存儲種類】數(shù)據(jù)類型【存儲類型】 變量名,(標(biāo)準(zhǔn)C),(標(biāo)準(zhǔn)C),* 括號項可以缺?。ǖ栌腥笔≈担?C51變量定義的四要素:,(C51特有),(標(biāo)準(zhǔn)C+C51),第4章單片機(jī)的C51語言,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,存儲種類用于說明變量的作用范圍: 1、auto(自動型)變量的作用范圍在定義它的函數(shù)體或語句塊內(nèi)。執(zhí)行結(jié)束后,變量所占內(nèi)存即被釋放。 2、extern(外部型) 在一個源文件中被定義為外部型的變量,在其它源文件中需要通過extern說明方可使用。 3、static(靜態(tài)型) 利用static可使變量定義所在的函數(shù)或語句塊執(zhí)行結(jié)束后,其分配的內(nèi)存單元繼續(xù)保留。 4、register(寄存器型) 目前已不推薦使用。,缺省存儲種類為auto (自動)型變量,第4章單片機(jī)的C51語言,數(shù)據(jù)類型用于表示數(shù)據(jù)存放格式,* 有符號數(shù)類型可以忽略signed標(biāo)識符,標(biāo)準(zhǔn)C語言的數(shù)據(jù)類型,【存儲種類】數(shù)據(jù)類型 【存儲類型】變量名,除上述常規(guī)格式外,51單片機(jī)還有三種新的存儲格式:,第4章單片機(jī)的C51語言,bit型存儲格式,sfr型存儲格式,sfr bit型存儲格式,bit、sfr或sfr16、sbit,C51擴(kuò)充的3種數(shù)據(jù)類型:,bit 型,關(guān)鍵詞bit用于定義一個位變量,語法規(guī)則:,bit bit_name = 0或1;,例如:bit door = 0 ; /定義一個叫door的位變量且初值為0,與標(biāo)準(zhǔn)C的數(shù)據(jù)類型聲明的語法規(guī)則是一致的,如: int int_name = 常數(shù);,第4章單片機(jī)的C51語言,sfr或sfr16型,關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,語法規(guī)則: sfr sfr_name = 字節(jié)地址常數(shù); sfr16 sfr_name = 字節(jié)地址常數(shù);,第4章單片機(jī)的C51語言,例如, sfr P0 = 0 x80; /定義P0口地址80H sfr PCON = 0 x87; /定義PCON地址87H sfr16 DPTR=0 x82; /定義DPTR的低地址82H,注意:C語言中十六進(jìn)制整數(shù)是數(shù)值前加0 x或0X前綴,sbit型,絕對位地址,相對位地址,字節(jié)地址,位地址表達(dá)形式:絕對位地址、相對位地址,第4章單片機(jī)的C51語言,關(guān)鍵詞sbit用于定義SFR位地址變量,1)將SFR的絕對位地址定義為位變量名 sbit bit_name = 位地址常數(shù); 例如, sbit CY = 0 xD7;,3)將SFR的相對位位置定義位變量名 sbit bit_name = sfr_name 位位置; 例如, sbit CY = PSW7;,2)將SFR的相對位地址定義為位變量名 sbit bit_name = sfr字節(jié)地址 位位置; 例如, sbit CY = 0 xD07;,可用三種定義形式:,sbit型,第4章單片機(jī)的C51語言,C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit變量。,用一條預(yù)處理命令#include 把這個頭文件包含到C51程序中,無需重新定義即可直接使用它們的名稱。,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,編程舉例:,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,存儲類型體現(xiàn)了變量的存放區(qū)域。51系列單片機(jī)共有6個存儲類型(分布在3個邏輯存儲空間中)。,第4章單片機(jī)的C51語言,不同存儲類型的特點,編譯模式,第4章單片機(jī)的C51語言,三種編譯模式分別對應(yīng)于三種缺省存儲類型:,約定:若無特殊聲明,一般均為“SMALL編譯模式”,變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度隨編譯系統(tǒng)而定。,變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量。 強(qiáng)調(diào):頭文件中定義的變量都是大寫的,若程序采取小寫變量則需要重新定義。,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,第4章單片機(jī)的C51語言,C51擴(kuò)展的若干關(guān)鍵字一覽表,變量名不得使用標(biāo)準(zhǔn)C語言和C51語言的關(guān)鍵字。,第4章單片機(jī)的C51語言,unsigned char data system_status = 0;,/定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。,數(shù)據(jù)結(jié)構(gòu)定義舉例,變量名為system_status,位于片內(nèi)RAM區(qū),無符號字符型,自動型,初值為零,第4章單片機(jī)的C51語言,unsigned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0 x89ab;,static char m, n;,/定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū),/定義unit_id2為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0 x1234和0 x89ab。,/定義m和n為2個位于data區(qū)中的有符號字符型靜態(tài)變量。,第4章單片機(jī)的C51語言,2. C51的指針,C語言指針的一般定義形式為: 數(shù)據(jù)類型 *指針變量名 = 這表示p1是一個指向int型變量的指針變量,此時p1的值為int型變量a的地址,而a和p1兩個變量都位于C編譯器默認(rèn)的內(nèi)存區(qū)中。,第4章單片機(jī)的C51語言,對于C51,除了數(shù)據(jù)類型外,指針定義中還應(yīng)能說明: 1)指針變量自身位于哪個存儲區(qū)中? 2)被指向變量位于哪個存儲區(qū)中?,C51指針的一般定義形式: 數(shù)據(jù)類型 存儲類型1 * 存儲類型2 變量名 = char *ptr = ,解:ptr是一個指向char型變量的指針,它本身位于SMALL編譯模式默認(rèn)的data存儲區(qū)里,此時它指向位于xdata存儲區(qū)里的char型變量a的地址。,數(shù)據(jù)類型 存儲類型1 * 存儲類型2 變量名 = char *ptr = ,解:以char *ptr形式定義的指針變量,既可指向位于xdata存儲區(qū)的char型變量a的地址,也可指向位于idata存儲區(qū)的char型變量b的地址(由賦值操作關(guān)系決定)。,前兩句與例1相同 char xdata a = A; char *ptr = ,第4章單片機(jī)的C51語言,例3:試解釋以下指針定義的含義 char xdata a = A; char xdata *ptr = 【解】ptr是位于data存儲區(qū)且固定指向xdata存儲區(qū)的char型變量的指針變量,此時ptr的值為變量a的地址(不能像例2那樣再將idata存儲區(qū)的char型變量b的地址賦予ptr)。,第4章單片機(jī)的C51語言,例4:試解釋以下指針定義的含義 char xdata a = A; char xdata *idata ptr = 【解】ptr是固定指向xdata存儲區(qū)的char型變量的指針變量, 它自身存放在idata存儲區(qū)中,此時ptr指向位于xdata存儲區(qū)中的char型變量a的地址。,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,C51語言編程可勝任單片機(jī)的基本測量與控制任務(wù)。 對于某些特殊的I/O 接口處理、中斷處理、強(qiáng)調(diào)程序執(zhí)行速度等場合,仍希望采用匯編程序。 C51 編譯器提供了與匯編語言程序的接口規(guī)則,可方便地實現(xiàn)C51 與匯編語言程序的相互調(diào)用。 本節(jié)僅討論在C51中調(diào)用匯編函數(shù)和在C51中嵌入?yún)R編代碼兩種方法。,概要,第4章單片機(jī)的C51語言,1. 在C51中調(diào)用匯編程序,1)程序的尋址,main.c中調(diào)用的max函數(shù),如何與匯編文件中的相應(yīng)代碼對應(yīng)起來;,2)參數(shù)傳遞,main.c中傳遞給max()函數(shù)的參數(shù)a和b,存放在何處可使匯編程序能夠獲取到它們的值;,3)返回值傳遞,匯編語言計算得到的結(jié)果,存放在何處可使C語言程序能夠獲取到。,C51程序中調(diào)用匯編語言,需要解決三個問題:,第4章單片機(jī)的C51語言,舉例:在兩個數(shù)據(jù)中選出較大的數(shù)據(jù),并賦值給變量c。其中,要求選數(shù)任務(wù)采用匯編子程序完成。,1)程序的尋址問題,第4章單片機(jī)的C51語言,通過在匯編文件中定義同名的“函數(shù)”來實現(xiàn)。,第4章單片機(jī)的C51語言,2)參數(shù)傳遞問題,第4章單片機(jī)的C51語言,3)返回值傳遞問題,2. C51中嵌入?yún)R編代碼,程序中需要用到一些簡短的匯編指令時,可以通過語句 “# pragma”嵌入?yún)R編代碼的辦法實現(xiàn)。,第4章單片機(jī)的C51語言,#include void main(void) unsigned char i=0; /定義變量i #pragma asm/嵌入?yún)R編代碼 MOV R0,#0AH LOOP:INC A/累加器循環(huán)加1 DJNZ R0,LOOP #pragma endasm i=+ACC;/輸出累加結(jié)果 ,說明: 匯編代碼必須放在兩條預(yù)處理命令#pragma asm和#pragma endasm之間,預(yù)處理命令必須用小寫字母,匯編代碼則大小寫不限。 本實例可實現(xiàn)用匯編語句進(jìn)行累加器A循環(huán)加1和將累加結(jié)果傳遞給C51變量的功能。,實例:,第4章單片機(jī)的C51語言,嵌入?yún)R編代碼時需要對編譯器Keil進(jìn)行一定設(shè)置,具體方法可結(jié)合教材P67和下圖完成(說明略)。,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,1. Keil的編譯環(huán)境 Vision3,Keil是德國Keil Software公司的51單片機(jī)開發(fā)軟件包,包括C編譯器、匯編編譯器、連接器、庫管理及仿真調(diào)試器,通過一個windows下的uVisoin3集成開發(fā)環(huán)境組合起來。,第4章單片機(jī)的C51語言,在uVisoin3可以通過建立工程文件,將多個不同源程序文件組合起來(包括.ASM和.C文件),而Proteus中只能有1個.ASM源程序。,第4章單片機(jī)的C51語言,Vision3的軟件界面包括4大組成部分,即菜單工具欄,工程管理窗口,文件窗口和輸出窗口。,第4章單片機(jī)的C51語言,Vision3中共有11個下拉菜單。工具欄的位置和數(shù)量可以通過設(shè)置選定和移動。,第4章單片機(jī)的C51語言,工程管理窗口用于管理工程文件目錄,它由5個子窗口組成:文件窗口,寄存器窗口,幫助窗口,函數(shù)窗口,模版窗口。,工程管理窗口:,第4章單片機(jī)的C51語言,輸出窗口: 輸出窗口用于編譯過程中的信息交互作用,由3個子窗口組成:編譯窗口,命令窗口,搜尋窗口。,第4章單片機(jī)的C51語言,信息窗口: 觀察窗口(Watch 按壓按鍵后為低電平。,實例1 獨立按鍵識別,【要求】采用獨立按鍵方式實現(xiàn)下述功能:開機(jī)時LED全熄,然后根據(jù)按鍵動作使相應(yīng)燈亮,并將亮燈狀態(tài)保持到按壓其它鍵時為止。,第4章單片機(jī)的C51語言,獨立按鍵每個按鍵都彼此獨立地各占有一位I/O口線。特點是電路簡單,但占用I/O口線較多。,第4章單片機(jī)的C51語言,為使按鍵抬起后LED能保持先前的點亮狀態(tài),需要在按鍵未壓下期間禁止向P2輸出P0狀態(tài)值。,【分析】,參考程序如下:,第4章單片機(jī)的C51語言,void main( ) char key = 0; /定義按鍵變量 while(1) key = P0 /有按鍵動作時,P0狀態(tài)值送P2 ,第4章單片機(jī)的C51語言,編程界面和運(yùn)行界面分別如下圖,第4章單片機(jī)的C51語言,實例1運(yùn)行效果,實例2 鍵控流水燈,第4章單片機(jī)的C51語言,【要求】 K1為“啟動鍵”,首次按壓K1可產(chǎn)生“自下向上” 的流水燈運(yùn)動; K2 為“停止鍵”,按壓K2可終止流水燈的運(yùn)動; K3和K4為“方向鍵”,分別產(chǎn)生 “自上向下”和 “自下向上” 運(yùn)動。,第4章單片機(jī)的C51語言,思路分析:設(shè)立狀態(tài)標(biāo)志變量根據(jù)鍵值修改標(biāo)志值根據(jù)標(biāo)志值控制燈的亮滅,總體關(guān)系流程圖,第4章單片機(jī)的C51語言,按鍵狀態(tài)值: 無按鍵 xxxx 1111B 按壓K1xxxx 1110B 按壓K2xxxx 1101B 按壓K3xxxx 1011B 按壓K4xxxx 0111B,按鍵動作判斷(P0 ,for (i=0; i=3; i+) P2 = led i; /移動,for (i=3; i=0; i- ) P2 = led i; /移動,查 表 方法,第4章單片機(jī)的C51語言,else,第4章單片機(jī)的C51語言,實例2原理圖與程序界面圖,實例2程序運(yùn)行效果,第4章單片機(jī)的C51語言,實例3 混合編程,將實例2中C51的delay函數(shù)改用匯編語言實現(xiàn),并完成系統(tǒng)的混合編程。,程序說明,分別編寫匯編語言(delay.asm)與C51語言(實例3.c)兩個程序文件,并將其添加到Keil的同一項目中。,第4章單片機(jī)的C51語言,C51部分與實例2基本相同,#include reg51.h unsigned char led=0 xfe,0 xfd,0 xfb,0 xf7;/LED燈的花樣數(shù)據(jù) void delay(unsigned char time); void main() bit dir=0,run=0;/標(biāo)志位定義及初始化 char i; while(1) switch (P0 /若run=0,燈全滅 ,第4章單片機(jī)的C51語言,delay.asm,與實例3.c文件中函數(shù)delay同名的子程序,匯編子程序的頭部格式,;延時處理函數(shù)(匯編語言) PUBLIC _DELAY DE SEGMENT CODE RSEG DE _DELAY:MOV R0,#225 DEL2: DJNZ R0,DEL2 DJNZ R7,_DELAY RET END,第4章單片機(jī)的C51語言,實例3的全部程序及運(yùn)行效果,第4章單片機(jī)的C51語言,4.5.1.2 LED數(shù)碼管原理與編程,LED顯示元件人機(jī)交互輸出設(shè)備,其作用是指示中間運(yùn)行結(jié)果與運(yùn)行狀態(tài)。,第4章單片機(jī)的C51語言,引腳配置,七段式LED數(shù)碼管,(Proteus:7-Segment Display),公共端接“0”,公共端接“1”,字符的顯示碼或字模與數(shù)碼管的類型有關(guān),第4章單片機(jī)的C51語言,共陰極型部分字符的顯示碼(字模)為:,七段LED數(shù)碼管的標(biāo)準(zhǔn)顯示字符為09,AF,顯示字符,顯示碼(共陰),其它字符:,0011 1000B = 0 x38,“L”字符的顯示碼,“H”字符的顯示碼,0111 0110B = 0 x76,第4章單片機(jī)的C51語言,實例4 LED數(shù)碼管顯示,在P0口連接一個共陰極數(shù)碼管,使之循環(huán)顯示09數(shù)字,間隔為500循環(huán)步。,分析: 將顯示碼循環(huán)輸出到P0口即可實現(xiàn)循環(huán)顯示。但由于數(shù)字09的顯示段碼沒有規(guī)律可循,需要采取查表方式進(jìn)行操作:,第4章單片機(jī)的C51語言,將顯示碼按序存放在一個數(shù)組中, 順序號與代表的顯示字符相對應(yīng)(如,char led_mod =x1,x2,.,xn); 通過查表語句(如,P0=led_modei)輸出顯示碼。,第4章單片機(jī)的C51語言,參考程序,第4章單片機(jī)的C51語言,實例4仿真運(yùn)行效果,第4章單片機(jī)的C51語言,實例5 (實驗1 ),根據(jù)如下共陰極型數(shù)碼管電路,編程實現(xiàn)計數(shù)顯示功能,即以十進(jìn)制形式顯示擊鍵次數(shù),次數(shù)大于99后重新由0開始。,個位LED接P2口,十位LED接P0口,按鈕接P3.7,抬起時為1電平,按壓時為0電平。,第4章單片機(jī)的C51語言,編程分析:,兩個新問題: 問題1:如何將計數(shù)值拆解成個位和十位兩個數(shù)? 問題2 :如何避免按鍵壓下時被連續(xù)計數(shù)?,第4章單片機(jī)的C51語言,初始化: P2 = P0 = table0;,取模運(yùn)算(%10)個位 整除10運(yùn)算(/10)十位,P2 = tablecount%10;,P0 = tablecount/10;,拆解計數(shù)值方法,第4章單片機(jī)的C51語言,避免連續(xù)計數(shù),方案1:更新后處理連擊,方案2:更新前處理連擊,第4章單片機(jī)的C51語言,參考程序,程序運(yùn)行效果,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程 4.5.1 I/O端口的簡單應(yīng)用 4.5.2 I/O端口的進(jìn)階實踐,第4章單片機(jī)的C51語言,4.5.2.1 數(shù)碼管動態(tài)顯示原理與編程,兩種顯示接口:靜態(tài)顯示接口和動態(tài)顯示接口,靜態(tài)顯示接口:一個數(shù)碼管的引腳獨立占據(jù)一根I/O口線。 優(yōu)點:被顯示數(shù)據(jù)只要送入并行口后就不再需要CPU干預(yù),因而顯示效果穩(wěn)定。 缺點:占用資源較多,第4章單片機(jī)的C51語言,所有數(shù)碼管的輸入端(段碼線)對應(yīng)并聯(lián)在一個IO口上,而每位數(shù)碼管的公共端(位碼線)分別由一位IO線控制; 由IO口輸出的顯示碼可被所有數(shù)碼管收到,但只有滿足位碼線電平要求的數(shù)碼管可被驅(qū)動。,動態(tài)顯示接口,第4章單片機(jī)的C51語言,動態(tài)顯示編程原理: 快速(如10ms)切換段碼值和位碼值,使每一時刻只有一只數(shù)碼管被驅(qū)動。利用視力暫留特性,可獲得連續(xù)顯示效果。 優(yōu)點:占用IO口資源較少(節(jié)省空間) 缺點:需要CPU不斷進(jìn)行干預(yù)(占用機(jī)時),第4章單片機(jī)的C51語言,實例6,根據(jù)下圖共陰極型數(shù)碼管動態(tài)顯示電路,編程實現(xiàn)顯示字符“L2”的功能。,第4章單片機(jī)的C51語言,分析: Proteus中的雙聯(lián)LED數(shù)碼管相當(dāng)于兩個并聯(lián)的數(shù)碼管。,7SEG-MPX2-CC-BLUE,Blue,2 Digit,7-segment Cathode Display,第4章單片機(jī)的C51語言,P2 “0 x38”, P3.1“1”,P3.0 “0”,P2 “0 x5b”, P3.1“0”,P3.0 “1”,P2led_mode0, P3 0000 0010B =2 P2led_mode1, P3 0000 0001B =1,led_mode =0 x38,0 x5b,程序主要部分,第4章單片機(jī)的C51語言,#include char led_mod = 0 x38,0 x5B; void delay(unsigned int time); void main() char led_point = 0; while (1) P3 = 2 - led_point; P2= led_modled_point; led_point = 1 - led_point; delay(30); ,完整程序,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,運(yùn)行效果圖,第4章單片機(jī)的C51語言,4.5.2.2 行列式鍵盤原理與編程,獨立式鍵盤的電路簡單,易于編程,但占用的I/O口線較多,當(dāng)需要較多按鍵時可能產(chǎn)生IO口資源緊張問題。,獨立式鍵盤電路,第4章單片機(jī)的C51語言,行列式鍵盤將I/O口分為行線和列線,按鍵跨接在行線和列線上,列線通過上拉電阻接正電源。,44行列式鍵盤,行列式鍵盤的特點:占用I/O口線少,但軟件過程復(fù)雜。,第4章單片機(jī)的C51語言, 鍵盤列掃描,各行電平同時置1,各列電平輪流清0。,掃描碼:key_scan = 0 xef, 0 xdf, 0 xbf, 0 x7f; 寫P2: P2=key_scani;,行列式鍵盤編程原理(以P2口接44鍵盤為例),第一次 1110 1111B 第二次 1101 1111B 第三次 1011 1111B 第四次 0111 1111B,= 0 xef = 0 xdf = 0 xbf = 0 x7f,掃描輸出碼,第4章單片機(jī)的C51語言,如果 (P2 ,第4章單片機(jī)的C51語言, 查找閉合鍵鍵號,for (j = 0 ; j 16 ;j+) if (P2= key_buf j) return j; ,鍵值數(shù)組 key_buf = 0 xee, 0 xde, 0 xbe, 0 x7e, 0 xed, 0 xdd, 0 xbd, 0 x7d, 0 xeb, 0 xdb, 0 xbb, 0 x7b, 0 xe7, 0 xd7, 0 xb7, 0 x77;,鍵號按照一定規(guī)則給按鍵分配的編號,閉合鍵鍵號: 閉合鍵值與鍵值數(shù)組相等時的查詢號,第4章單片機(jī)的C51語言,實例7,功能要求:開機(jī)黑屏按下任意按鍵后,數(shù)碼管上顯示該鍵的鍵號(0F)若沒有新鍵按下,維持前次按鍵結(jié)果。,行列式鍵盤+共陰極數(shù)碼管,第4章單片機(jī)的C51語言,主程序流程圖,void main(void) char key = 0; P0 = 0 x00; /開機(jī)黑屏 while(1) key = getKey(); /獲得閉合鍵號 if (key != -1) P0 = led_modkey;/顯示閉合鍵號 ,第4章單片機(jī)的C51語言,獲取鍵號流程圖,第4章單片機(jī)的C51語言,實例7完整程序,第4章單片機(jī)的C51語言,程序運(yùn)行效果,第4章單片機(jī)的C51語言,按鍵在閉合和斷開瞬間會因彈簧開關(guān)的變形產(chǎn)生電壓波動,軟件消抖法: 延時10ms后再次掃描按鍵狀態(tài)。若仍判為“閉合”說明確有鍵壓下;若為“非閉合”說明是誤動作。,按鍵抖動波形,鍵盤消抖原理:,本章小結(jié),C51變量定義必須考慮單片機(jī)的多空間存儲結(jié)構(gòu)。其一般定義格式為:【存儲種類】數(shù)據(jù)類型【存儲類型】變量名。 在Keil下進(jìn)行C51編程的基本步驟是:建立工程輸入源程序添加源程序【工程設(shè)置】編譯源程序【動態(tài)調(diào)試 】 運(yùn)行。 單片機(jī)I/O口基本編程應(yīng)用包括按鍵(或開關(guān))狀態(tài)檢測、發(fā)光二極管輸出控制、數(shù)碼管動態(tài)顯示以及行列式鍵盤掃描編程等內(nèi)容。,第4章單片機(jī)的C51語言,
收藏
- 資源描述:
-
第4章 C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,51匯編語言能直接操作單片機(jī)的系統(tǒng)硬件,指令執(zhí)行速度快。但其程序可讀性差,且編寫、移植困難。,51單片機(jī)操作數(shù)的簡記符,實驗2匯編源代碼,第4章單片機(jī)的C51語言,C51是為51系列單片機(jī)設(shè)計的一種C語言,其特點:,C51語言已成為51系列單片機(jī)程序開發(fā)的主流軟件方法。,結(jié)構(gòu)化語言,代碼緊湊效率可與匯編語言媲美 接近真實語言,程序可讀性強(qiáng)易于調(diào)試、維護(hù) 庫函數(shù)豐富,編程工作量小產(chǎn)品開發(fā)周期短 機(jī)器級控制能力,功能很強(qiáng)適合于嵌入式系統(tǒng)開發(fā) 與匯編指令無關(guān),易于掌握在單片機(jī)基礎(chǔ)上上手快,第4章單片機(jī)的C51語言,C51與標(biāo)準(zhǔn)C語言對比 相同之處:語法規(guī)則、程序結(jié)構(gòu)、編程方法,舉例:LED閃爍控制功能,;匯編程序 LOOP: CLR P1.0 ACALL DEL50 SETB P1.0 SJMP LOOP DEL50: MOV R7,#200 DEL1: MOV R6,#125 DJNZ R6,$ DJNZ R7,DEL1 RET END,第4章單片機(jī)的C51語言,預(yù)處理命令-,函數(shù)說明-,全局變量定義-,主函數(shù)-,自定義函數(shù)-,局部變量定義-,函數(shù)體,函數(shù)體-,/C51程序,第4章單片機(jī)的C51語言,C51與標(biāo)準(zhǔn)C語言對比 不同之處: 數(shù)據(jù)結(jié)構(gòu)(第4章)、中斷處理(第5章)、端口擴(kuò) 展(第8章) 教學(xué)思路: 學(xué)習(xí)C51的數(shù)據(jù)結(jié)構(gòu)知識(理論部分) 學(xué)習(xí)C51軟件開發(fā)方法(Keil C軟件用法) 學(xué)習(xí)I/O口典型應(yīng)用編程(入門與進(jìn)階兩個層次),第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,1. C51的變量,在C語言編程中,數(shù)值可以發(fā)生改變的量稱為變量。,變量名與存儲單元地址相對應(yīng),變量值與存儲單元的內(nèi)容相對應(yīng)。,例如,在51單片機(jī)多存儲空間中如何確定變量與地址的關(guān)系?,第4章單片機(jī)的C51語言,【存儲種類】數(shù)據(jù)類型【存儲類型】 變量名,(標(biāo)準(zhǔn)C),(標(biāo)準(zhǔn)C),* 括號項可以缺?。ǖ栌腥笔≈担?C51變量定義的四要素:,(C51特有),(標(biāo)準(zhǔn)C+C51),第4章單片機(jī)的C51語言,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,存儲種類用于說明變量的作用范圍: 1、auto(自動型)變量的作用范圍在定義它的函數(shù)體或語句塊內(nèi)。執(zhí)行結(jié)束后,變量所占內(nèi)存即被釋放。 2、extern(外部型) 在一個源文件中被定義為外部型的變量,在其它源文件中需要通過extern說明方可使用。 3、static(靜態(tài)型) 利用static可使變量定義所在的函數(shù)或語句塊執(zhí)行結(jié)束后,其分配的內(nèi)存單元繼續(xù)保留。 4、register(寄存器型) 目前已不推薦使用。,缺省存儲種類為auto (自動)型變量,第4章單片機(jī)的C51語言,數(shù)據(jù)類型用于表示數(shù)據(jù)存放格式,* 有符號數(shù)類型可以忽略signed標(biāo)識符,標(biāo)準(zhǔn)C語言的數(shù)據(jù)類型,【存儲種類】數(shù)據(jù)類型 【存儲類型】變量名,除上述常規(guī)格式外,51單片機(jī)還有三種新的存儲格式:,第4章單片機(jī)的C51語言,bit型存儲格式,sfr型存儲格式,sfr bit型存儲格式,bit、sfr或sfr16、sbit,C51擴(kuò)充的3種數(shù)據(jù)類型:,bit 型,關(guān)鍵詞bit用于定義一個位變量,語法規(guī)則:,bit bit_name = 0或1;,例如:bit door = 0 ; /定義一個叫door的位變量且初值為0,與標(biāo)準(zhǔn)C的數(shù)據(jù)類型聲明的語法規(guī)則是一致的,如: int int_name = 常數(shù);,第4章單片機(jī)的C51語言,sfr或sfr16型,關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,語法規(guī)則: sfr sfr_name = 字節(jié)地址常數(shù); sfr16 sfr_name = 字節(jié)地址常數(shù);,第4章單片機(jī)的C51語言,例如, sfr P0 = 0 x80; /定義P0口地址80H sfr PCON = 0 x87; /定義PCON地址87H sfr16 DPTR=0 x82; /定義DPTR的低地址82H,注意:C語言中十六進(jìn)制整數(shù)是數(shù)值前加0 x或0X前綴,sbit型,絕對位地址,相對位地址,字節(jié)地址,位地址表達(dá)形式:絕對位地址、相對位地址,第4章單片機(jī)的C51語言,關(guān)鍵詞sbit用于定義SFR位地址變量,1)將SFR的絕對位地址定義為位變量名 sbit bit_name = 位地址常數(shù); 例如, sbit CY = 0 xD7;,3)將SFR的相對位位置定義位變量名 sbit bit_name = sfr_name 位位置; 例如, sbit CY = PSW7;,2)將SFR的相對位地址定義為位變量名 sbit bit_name = sfr字節(jié)地址 位位置; 例如, sbit CY = 0 xD07;,可用三種定義形式:,sbit型,第4章單片機(jī)的C51語言,C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit變量。,用一條預(yù)處理命令#include 把這個頭文件包含到C51程序中,無需重新定義即可直接使用它們的名稱。,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,編程舉例:,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,存儲類型體現(xiàn)了變量的存放區(qū)域。51系列單片機(jī)共有6個存儲類型(分布在3個邏輯存儲空間中)。,第4章單片機(jī)的C51語言,不同存儲類型的特點,編譯模式,第4章單片機(jī)的C51語言,三種編譯模式分別對應(yīng)于三種缺省存儲類型:,約定:若無特殊聲明,一般均為“SMALL編譯模式”,變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度隨編譯系統(tǒng)而定。,變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量。 強(qiáng)調(diào):頭文件中定義的變量都是大寫的,若程序采取小寫變量則需要重新定義。,【存儲種類】數(shù)據(jù)類型【存儲類型】變量名,第4章單片機(jī)的C51語言,C51擴(kuò)展的若干關(guān)鍵字一覽表,變量名不得使用標(biāo)準(zhǔn)C語言和C51語言的關(guān)鍵字。,第4章單片機(jī)的C51語言,unsigned char data system_status = 0;,/定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。,數(shù)據(jù)結(jié)構(gòu)定義舉例,變量名為system_status,位于片內(nèi)RAM區(qū),無符號字符型,自動型,初值為零,第4章單片機(jī)的C51語言,unsigned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0 x89ab;,static char m, n;,/定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū),/定義unit_id2為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0 x1234和0 x89ab。,/定義m和n為2個位于data區(qū)中的有符號字符型靜態(tài)變量。,第4章單片機(jī)的C51語言,2. C51的指針,C語言指針的一般定義形式為: 數(shù)據(jù)類型 *指針變量名 = 這表示p1是一個指向int型變量的指針變量,此時p1的值為int型變量a的地址,而a和p1兩個變量都位于C編譯器默認(rèn)的內(nèi)存區(qū)中。,第4章單片機(jī)的C51語言,對于C51,除了數(shù)據(jù)類型外,指針定義中還應(yīng)能說明: 1)指針變量自身位于哪個存儲區(qū)中? 2)被指向變量位于哪個存儲區(qū)中?,C51指針的一般定義形式: 數(shù)據(jù)類型 存儲類型1 * 存儲類型2 變量名 = char *ptr = ,解:ptr是一個指向char型變量的指針,它本身位于SMALL編譯模式默認(rèn)的data存儲區(qū)里,此時它指向位于xdata存儲區(qū)里的char型變量a的地址。,數(shù)據(jù)類型 存儲類型1 * 存儲類型2 變量名 = char *ptr = ,解:以char *ptr形式定義的指針變量,既可指向位于xdata存儲區(qū)的char型變量a的地址,也可指向位于idata存儲區(qū)的char型變量b的地址(由賦值操作關(guān)系決定)。,前兩句與例1相同 char xdata a = A; char *ptr = ,第4章單片機(jī)的C51語言,例3:試解釋以下指針定義的含義 char xdata a = A; char xdata *ptr = 【解】ptr是位于data存儲區(qū)且固定指向xdata存儲區(qū)的char型變量的指針變量,此時ptr的值為變量a的地址(不能像例2那樣再將idata存儲區(qū)的char型變量b的地址賦予ptr)。,第4章單片機(jī)的C51語言,例4:試解釋以下指針定義的含義 char xdata a = A; char xdata *idata ptr = 【解】ptr是固定指向xdata存儲區(qū)的char型變量的指針變量, 它自身存放在idata存儲區(qū)中,此時ptr指向位于xdata存儲區(qū)中的char型變量a的地址。,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,C51語言編程可勝任單片機(jī)的基本測量與控制任務(wù)。 對于某些特殊的I/O 接口處理、中斷處理、強(qiáng)調(diào)程序執(zhí)行速度等場合,仍希望采用匯編程序。 C51 編譯器提供了與匯編語言程序的接口規(guī)則,可方便地實現(xiàn)C51 與匯編語言程序的相互調(diào)用。 本節(jié)僅討論在C51中調(diào)用匯編函數(shù)和在C51中嵌入?yún)R編代碼兩種方法。,概要,第4章單片機(jī)的C51語言,1. 在C51中調(diào)用匯編程序,1)程序的尋址,main.c中調(diào)用的max函數(shù),如何與匯編文件中的相應(yīng)代碼對應(yīng)起來;,2)參數(shù)傳遞,main.c中傳遞給max()函數(shù)的參數(shù)a和b,存放在何處可使匯編程序能夠獲取到它們的值;,3)返回值傳遞,匯編語言計算得到的結(jié)果,存放在何處可使C語言程序能夠獲取到。,C51程序中調(diào)用匯編語言,需要解決三個問題:,第4章單片機(jī)的C51語言,舉例:在兩個數(shù)據(jù)中選出較大的數(shù)據(jù),并賦值給變量c。其中,要求選數(shù)任務(wù)采用匯編子程序完成。,1)程序的尋址問題,第4章單片機(jī)的C51語言,通過在匯編文件中定義同名的“函數(shù)”來實現(xiàn)。,第4章單片機(jī)的C51語言,2)參數(shù)傳遞問題,第4章單片機(jī)的C51語言,3)返回值傳遞問題,2. C51中嵌入?yún)R編代碼,程序中需要用到一些簡短的匯編指令時,可以通過語句 “# pragma”嵌入?yún)R編代碼的辦法實現(xiàn)。,第4章單片機(jī)的C51語言,#include void main(void) unsigned char i=0; /定義變量i #pragma asm/嵌入?yún)R編代碼 MOV R0,#0AH LOOP:INC A/累加器循環(huán)加1 DJNZ R0,LOOP #pragma endasm i=+ACC;/輸出累加結(jié)果 ,說明: 匯編代碼必須放在兩條預(yù)處理命令#pragma asm和#pragma endasm之間,預(yù)處理命令必須用小寫字母,匯編代碼則大小寫不限。 本實例可實現(xiàn)用匯編語句進(jìn)行累加器A循環(huán)加1和將累加結(jié)果傳遞給C51變量的功能。,實例:,第4章單片機(jī)的C51語言,嵌入?yún)R編代碼時需要對編譯器Keil進(jìn)行一定設(shè)置,具體方法可結(jié)合教材P67和下圖完成(說明略)。,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程,第4章單片機(jī)的C51語言,1. Keil的編譯環(huán)境 Vision3,Keil是德國Keil Software公司的51單片機(jī)開發(fā)軟件包,包括C編譯器、匯編編譯器、連接器、庫管理及仿真調(diào)試器,通過一個windows下的uVisoin3集成開發(fā)環(huán)境組合起來。,第4章單片機(jī)的C51語言,在uVisoin3可以通過建立工程文件,將多個不同源程序文件組合起來(包括.ASM和.C文件),而Proteus中只能有1個.ASM源程序。,第4章單片機(jī)的C51語言,Vision3的軟件界面包括4大組成部分,即菜單工具欄,工程管理窗口,文件窗口和輸出窗口。,第4章單片機(jī)的C51語言,Vision3中共有11個下拉菜單。工具欄的位置和數(shù)量可以通過設(shè)置選定和移動。,第4章單片機(jī)的C51語言,工程管理窗口用于管理工程文件目錄,它由5個子窗口組成:文件窗口,寄存器窗口,幫助窗口,函數(shù)窗口,模版窗口。,工程管理窗口:,第4章單片機(jī)的C51語言,輸出窗口: 輸出窗口用于編譯過程中的信息交互作用,由3個子窗口組成:編譯窗口,命令窗口,搜尋窗口。,第4章單片機(jī)的C51語言,信息窗口: 觀察窗口(Watch 按壓按鍵后為低電平。,實例1 獨立按鍵識別,【要求】采用獨立按鍵方式實現(xiàn)下述功能:開機(jī)時LED全熄,然后根據(jù)按鍵動作使相應(yīng)燈亮,并將亮燈狀態(tài)保持到按壓其它鍵時為止。,第4章單片機(jī)的C51語言,獨立按鍵每個按鍵都彼此獨立地各占有一位I/O口線。特點是電路簡單,但占用I/O口線較多。,第4章單片機(jī)的C51語言,為使按鍵抬起后LED能保持先前的點亮狀態(tài),需要在按鍵未壓下期間禁止向P2輸出P0狀態(tài)值。,【分析】,參考程序如下:,第4章單片機(jī)的C51語言,void main( ) char key = 0; /定義按鍵變量 while(1) key = P0 /有按鍵動作時,P0狀態(tài)值送P2 ,第4章單片機(jī)的C51語言,編程界面和運(yùn)行界面分別如下圖,第4章單片機(jī)的C51語言,實例1運(yùn)行效果,實例2 鍵控流水燈,第4章單片機(jī)的C51語言,【要求】 K1為“啟動鍵”,首次按壓K1可產(chǎn)生“自下向上” 的流水燈運(yùn)動; K2 為“停止鍵”,按壓K2可終止流水燈的運(yùn)動; K3和K4為“方向鍵”,分別產(chǎn)生 “自上向下”和 “自下向上” 運(yùn)動。,第4章單片機(jī)的C51語言,思路分析:設(shè)立狀態(tài)標(biāo)志變量根據(jù)鍵值修改標(biāo)志值根據(jù)標(biāo)志值控制燈的亮滅,總體關(guān)系流程圖,第4章單片機(jī)的C51語言,按鍵狀態(tài)值: 無按鍵 xxxx 1111B 按壓K1xxxx 1110B 按壓K2xxxx 1101B 按壓K3xxxx 1011B 按壓K4xxxx 0111B,按鍵動作判斷(P0 ,for (i=0; i=3; i+) P2 = led i; /移動,for (i=3; i=0; i- ) P2 = led i; /移動,查 表 方法,第4章單片機(jī)的C51語言,else,第4章單片機(jī)的C51語言,實例2原理圖與程序界面圖,實例2程序運(yùn)行效果,第4章單片機(jī)的C51語言,實例3 混合編程,將實例2中C51的delay函數(shù)改用匯編語言實現(xiàn),并完成系統(tǒng)的混合編程。,程序說明,分別編寫匯編語言(delay.asm)與C51語言(實例3.c)兩個程序文件,并將其添加到Keil的同一項目中。,第4章單片機(jī)的C51語言,C51部分與實例2基本相同,#include reg51.h unsigned char led=0 xfe,0 xfd,0 xfb,0 xf7;/LED燈的花樣數(shù)據(jù) void delay(unsigned char time); void main() bit dir=0,run=0;/標(biāo)志位定義及初始化 char i; while(1) switch (P0 /若run=0,燈全滅 ,第4章單片機(jī)的C51語言,delay.asm,與實例3.c文件中函數(shù)delay同名的子程序,匯編子程序的頭部格式,;延時處理函數(shù)(匯編語言) PUBLIC _DELAY DE SEGMENT CODE RSEG DE _DELAY:MOV R0,#225 DEL2: DJNZ R0,DEL2 DJNZ R7,_DELAY RET END,第4章單片機(jī)的C51語言,實例3的全部程序及運(yùn)行效果,第4章單片機(jī)的C51語言,4.5.1.2 LED數(shù)碼管原理與編程,LED顯示元件人機(jī)交互輸出設(shè)備,其作用是指示中間運(yùn)行結(jié)果與運(yùn)行狀態(tài)。,第4章單片機(jī)的C51語言,引腳配置,七段式LED數(shù)碼管,(Proteus:7-Segment Display),公共端接“0”,公共端接“1”,字符的顯示碼或字模與數(shù)碼管的類型有關(guān),第4章單片機(jī)的C51語言,共陰極型部分字符的顯示碼(字模)為:,七段LED數(shù)碼管的標(biāo)準(zhǔn)顯示字符為09,AF,顯示字符,顯示碼(共陰),其它字符:,0011 1000B = 0 x38,“L”字符的顯示碼,“H”字符的顯示碼,0111 0110B = 0 x76,第4章單片機(jī)的C51語言,實例4 LED數(shù)碼管顯示,在P0口連接一個共陰極數(shù)碼管,使之循環(huán)顯示09數(shù)字,間隔為500循環(huán)步。,分析: 將顯示碼循環(huán)輸出到P0口即可實現(xiàn)循環(huán)顯示。但由于數(shù)字09的顯示段碼沒有規(guī)律可循,需要采取查表方式進(jìn)行操作:,第4章單片機(jī)的C51語言,將顯示碼按序存放在一個數(shù)組中, 順序號與代表的顯示字符相對應(yīng)(如,char led_mod =x1,x2,.,xn); 通過查表語句(如,P0=led_modei)輸出顯示碼。,第4章單片機(jī)的C51語言,參考程序,第4章單片機(jī)的C51語言,實例4仿真運(yùn)行效果,第4章單片機(jī)的C51語言,實例5 (實驗1 ),根據(jù)如下共陰極型數(shù)碼管電路,編程實現(xiàn)計數(shù)顯示功能,即以十進(jìn)制形式顯示擊鍵次數(shù),次數(shù)大于99后重新由0開始。,個位LED接P2口,十位LED接P0口,按鈕接P3.7,抬起時為1電平,按壓時為0電平。,第4章單片機(jī)的C51語言,編程分析:,兩個新問題: 問題1:如何將計數(shù)值拆解成個位和十位兩個數(shù)? 問題2 :如何避免按鍵壓下時被連續(xù)計數(shù)?,第4章單片機(jī)的C51語言,初始化: P2 = P0 = table0;,取模運(yùn)算(%10)個位 整除10運(yùn)算(/10)十位,P2 = tablecount%10;,P0 = tablecount/10;,拆解計數(shù)值方法,第4章單片機(jī)的C51語言,避免連續(xù)計數(shù),方案1:更新后處理連擊,方案2:更新前處理連擊,第4章單片機(jī)的C51語言,參考程序,程序運(yùn)行效果,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,4.1 C51的程序結(jié)構(gòu) 4.2 C51的數(shù)據(jù)結(jié)構(gòu) 4.3 C51與匯編語言的混合編程 4.4 C51仿真開發(fā)環(huán)境 4.5 C51初步應(yīng)用編程 4.5.1 I/O端口的簡單應(yīng)用 4.5.2 I/O端口的進(jìn)階實踐,第4章單片機(jī)的C51語言,4.5.2.1 數(shù)碼管動態(tài)顯示原理與編程,兩種顯示接口:靜態(tài)顯示接口和動態(tài)顯示接口,靜態(tài)顯示接口:一個數(shù)碼管的引腳獨立占據(jù)一根I/O口線。 優(yōu)點:被顯示數(shù)據(jù)只要送入并行口后就不再需要CPU干預(yù),因而顯示效果穩(wěn)定。 缺點:占用資源較多,第4章單片機(jī)的C51語言,所有數(shù)碼管的輸入端(段碼線)對應(yīng)并聯(lián)在一個IO口上,而每位數(shù)碼管的公共端(位碼線)分別由一位IO線控制; 由IO口輸出的顯示碼可被所有數(shù)碼管收到,但只有滿足位碼線電平要求的數(shù)碼管可被驅(qū)動。,動態(tài)顯示接口,第4章單片機(jī)的C51語言,動態(tài)顯示編程原理: 快速(如10ms)切換段碼值和位碼值,使每一時刻只有一只數(shù)碼管被驅(qū)動。利用視力暫留特性,可獲得連續(xù)顯示效果。 優(yōu)點:占用IO口資源較少(節(jié)省空間) 缺點:需要CPU不斷進(jìn)行干預(yù)(占用機(jī)時),第4章單片機(jī)的C51語言,實例6,根據(jù)下圖共陰極型數(shù)碼管動態(tài)顯示電路,編程實現(xiàn)顯示字符“L2”的功能。,第4章單片機(jī)的C51語言,分析: Proteus中的雙聯(lián)LED數(shù)碼管相當(dāng)于兩個并聯(lián)的數(shù)碼管。,7SEG-MPX2-CC-BLUE,Blue,2 Digit,7-segment Cathode Display,第4章單片機(jī)的C51語言,P2 “0 x38”, P3.1“1”,P3.0 “0”,P2 “0 x5b”, P3.1“0”,P3.0 “1”,P2led_mode0, P3 0000 0010B =2 P2led_mode1, P3 0000 0001B =1,led_mode =0 x38,0 x5b,程序主要部分,第4章單片機(jī)的C51語言,#include char led_mod = 0 x38,0 x5B; void delay(unsigned int time); void main() char led_point = 0; while (1) P3 = 2 - led_point; P2= led_modled_point; led_point = 1 - led_point; delay(30); ,完整程序,第4章單片機(jī)的C51語言,第4章單片機(jī)的C51語言,運(yùn)行效果圖,第4章單片機(jī)的C51語言,4.5.2.2 行列式鍵盤原理與編程,獨立式鍵盤的電路簡單,易于編程,但占用的I/O口線較多,當(dāng)需要較多按鍵時可能產(chǎn)生IO口資源緊張問題。,獨立式鍵盤電路,第4章單片機(jī)的C51語言,行列式鍵盤將I/O口分為行線和列線,按鍵跨接在行線和列線上,列線通過上拉電阻接正電源。,44行列式鍵盤,行列式鍵盤的特點:占用I/O口線少,但軟件過程復(fù)雜。,第4章單片機(jī)的C51語言, 鍵盤列掃描,各行電平同時置1,各列電平輪流清0。,掃描碼:key_scan = 0 xef, 0 xdf, 0 xbf, 0 x7f; 寫P2: P2=key_scani;,行列式鍵盤編程原理(以P2口接44鍵盤為例),第一次 1110 1111B 第二次 1101 1111B 第三次 1011 1111B 第四次 0111 1111B,= 0 xef = 0 xdf = 0 xbf = 0 x7f,掃描輸出碼,第4章單片機(jī)的C51語言,如果 (P2 ,第4章單片機(jī)的C51語言, 查找閉合鍵鍵號,for (j = 0 ; j 16 ;j+) if (P2= key_buf j) return j; ,鍵值數(shù)組 key_buf = 0 xee, 0 xde, 0 xbe, 0 x7e, 0 xed, 0 xdd, 0 xbd, 0 x7d, 0 xeb, 0 xdb, 0 xbb, 0 x7b, 0 xe7, 0 xd7, 0 xb7, 0 x77;,鍵號按照一定規(guī)則給按鍵分配的編號,閉合鍵鍵號: 閉合鍵值與鍵值數(shù)組相等時的查詢號,第4章單片機(jī)的C51語言,實例7,功能要求:開機(jī)黑屏按下任意按鍵后,數(shù)碼管上顯示該鍵的鍵號(0F)若沒有新鍵按下,維持前次按鍵結(jié)果。,行列式鍵盤+共陰極數(shù)碼管,第4章單片機(jī)的C51語言,主程序流程圖,void main(void) char key = 0; P0 = 0 x00; /開機(jī)黑屏 while(1) key = getKey(); /獲得閉合鍵號 if (key != -1) P0 = led_modkey;/顯示閉合鍵號 ,第4章單片機(jī)的C51語言,獲取鍵號流程圖,第4章單片機(jī)的C51語言,實例7完整程序,第4章單片機(jī)的C51語言,程序運(yùn)行效果,第4章單片機(jī)的C51語言,按鍵在閉合和斷開瞬間會因彈簧開關(guān)的變形產(chǎn)生電壓波動,軟件消抖法: 延時10ms后再次掃描按鍵狀態(tài)。若仍判為“閉合”說明確有鍵壓下;若為“非閉合”說明是誤動作。,按鍵抖動波形,鍵盤消抖原理:,本章小結(jié),C51變量定義必須考慮單片機(jī)的多空間存儲結(jié)構(gòu)。其一般定義格式為:【存儲種類】數(shù)據(jù)類型【存儲類型】變量名。 在Keil下進(jìn)行C51編程的基本步驟是:建立工程輸入源程序添加源程序【工程設(shè)置】編譯源程序【動態(tài)調(diào)試 】 運(yùn)行。 單片機(jī)I/O口基本編程應(yīng)用包括按鍵(或開關(guān))狀態(tài)檢測、發(fā)光二極管輸出控制、數(shù)碼管動態(tài)顯示以及行列式鍵盤掃描編程等內(nèi)容。,第4章單片機(jī)的C51語言,
展開閱讀全文