版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、3.1 單片機系統(tǒng)開發(fā)過程,簡單的例子:讓一個發(fā)光二極管閃爍5次。,1、明確系統(tǒng)功能:讓一個發(fā)光二極管閃爍5次。,系統(tǒng)啟動后,一支發(fā)光二極管閃爍5次后熄滅, 當按下一個按鈕開關(guān)后再閃爍5次后熄滅。 以后每次按下按鈕開關(guān),發(fā)光二極管都會閃爍5次。,第三章 單片機系統(tǒng)開發(fā)過程 51單片機指令系統(tǒng)簡介,2、硬件設(shè)計(單片機+外圍器件),外圍器件:,一個發(fā)光二極管、三個電阻、三個電容,一個按鈕開關(guān),3、 搭建硬件平臺,在面包板上插入器件,用導線完成電氣連接。,4、 軟件設(shè)計 ORG 00H ; 設(shè)置起始地址 START: MOV R0, #5 ; 循環(huán)閃爍5次,R0為計數(shù)器 LOOP: MOV P1,
2、#00H ; P1口輸出全0,點亮二極管 CALL DELAY ; 調(diào)用延時子程序 MOV P1,#0FFH ; P1口輸出全1,熄滅二極管 CALL DELAY ; 調(diào)用延時子程序 DJNZ R0, LOOP ; R0減1,若不為0轉(zhuǎn)LOOP處,JB P2.0, $ ; 測P2.0為高電平(無按鍵)則執(zhí)行本行 JMP START ; 否則,有鍵按下,跳到START處重新開 始執(zhí)行,DELAY: ; 延時子程序(500ms) RET ; 返回主程序 END ; 匯編程序結(jié)束,5 、下載程序到單片機并調(diào)試,(1) 在Vision中把目標程序編輯好, (2)編譯、連接無錯后生成單片機可執(zhí)行的代碼文
3、件, (3) 用下載線下載到單片機系統(tǒng)板中, (4)運行程序,(5)根據(jù)運行結(jié)果檢查功能實現(xiàn)情況,若未達系統(tǒng)要求,則在Vision中修改程序,然后重復步驟 (2)(5),直至達到系統(tǒng)要求.,在程序反復檢查無邏輯錯誤時,應(yīng)檢查硬件電路是否有問題.,3.2 Vision Vision軟件的使用 1、新建一個工程(項目),并為該項目選定合適的CPU然后保存該工程。,具體步驟: 選Project New Project保存工程,在彈出窗口中選所需CPU(如選ATMEL),雙擊該.CPU.,選AT89S51, 并確定。,2、設(shè)置工程,使編譯、連接后能生成可執(zhí)行代碼文件,右擊,Options for Ta
4、rget 1,選擇Create HEX,在彈出的窗口選,3、新建源文件,選FileNew輸入源程序保存,(匯編程序:文件名.asm; C程序:文件名.c,(存在工程文件夾),4、為工程中添加源程序文件,在右邊Project窗口單擊 Source Group 1,在下拉菜單中選 Add Files to GroupSource Group 1選項,,在彈出的框中選擇你的源文件和文件類型,然后點擊ADD,再點擊close。,5、編譯工程中的源程序,生成 .HEX(可執(zhí)行)文件,在Project窗口中選 Target 1Build Target F7, (點擊 )對源程序編譯連接。(或點擊 RBui
5、ld Target ),程序有語法錯誤時,會在輸出窗口(Output Windows)中顯示錯誤信息和警告信息,修改編譯成功后生成 HEX文件,生成.HEX文件后,可利用專門的下載程序,將此可執(zhí)行程序下載到單片機內(nèi)的ROM中運行,3、在窗口中點擊 , 打開你系統(tǒng)的.hex文件,3.3 STC-ISP V3.91 軟件的使用 1、雙擊 , 打開在線燒錄程序,2、在窗口的“MCU TYPE ”下拉菜單中選擇(STC89C51RC),4、在COM欄選下載端口(一般是COM1) 5、關(guān)電路板上的電源 6、點擊Download,打開電路板上的電源,燒錄程序,若燒錄出現(xiàn)問 題,點擊stop。,注意: 5、
6、6 兩步驟的順序不能顛倒!即在點擊Download之前要先關(guān)掉板上的電源。,7、打開電路板上的電源 ,程序即開始運行。,3.4 單片機應(yīng)用系統(tǒng)C語言程序設(shè)計,單片機應(yīng)用系統(tǒng)的程序設(shè)計有兩種方法:一種是基于匯編語言的,另一種是基于C語言的。,匯編語言程序的機器代碼生成效率高,但可讀性較差,而C語言程序的可讀性和可移植性遠超過匯編語言。,C51是一種專門為51單片機設(shè)計的高級語言C編譯器,支持符合ANSI標準的C語言,同時針對51單片機的特點做了一些特殊擴展。,C語言的主要特點:, 語言簡潔,使用方便靈活。它是程序設(shè)計語言中規(guī)模最小的語言之一。,ANSI標準C語言只有32個關(guān)鍵字,9種流程控制語句
7、。,程序可移植性好。,所設(shè)計的程序不依賴機器硬件。,表達方式靈活。,利用 C語言的多種運算符可組成各種表達式,還可采用多種方法來獲得表達式的值,使程序設(shè)計具有更大的靈活性。,表達能力強。,具有豐富的數(shù)據(jù)結(jié)構(gòu)類型和多種運算符。用戶可靈活采用多種數(shù)據(jù)類型和使用各種運算符,實現(xiàn)復雜運算。,可直接操作計算機硬件。,C語言具有直接訪問機器物理地址的能力,C51的編譯器都可直接對單片機內(nèi)部的SFR和I/O端口進行操作,可以直接訪問片內(nèi)、片外存儲器,還可以進行各種為操作。,生成的目標代碼質(zhì)量較高。,可進行結(jié)構(gòu)化程序設(shè)計。,C語言以函數(shù)作為程序設(shè)計的基本單位,非常適合結(jié)構(gòu)化程序設(shè)計。,用C51語言編寫單片機應(yīng)
8、用程序,不用具體組織、分配存儲器資源和處理端口數(shù)據(jù),但對數(shù)據(jù)類型與變量的定義,必須要與單片機的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。,與標準C語言相比,C51包含的數(shù)據(jù)類型、變量存儲模式、輸入輸出處理、函數(shù)等方面有一定差異,需根據(jù)單片機存儲結(jié)構(gòu)及內(nèi)部資源來定義相應(yīng)的數(shù)據(jù)類型和變量,而其它語法規(guī)則、程序結(jié)構(gòu)及設(shè)計方法等與標準C語言相同。,3.4.1 C51的程序結(jié)構(gòu),一、 C51語言概述,C語言程序由若干函數(shù)組成,其中有且僅有一個主函數(shù),每個函數(shù)都是完成某個特殊任務(wù)的子程序段。,組成程序的若干函數(shù)可保存在一個源程序文件中,也可保存在幾個源程序文件中,最后將它們連接在一起。,函數(shù)之間可以互
9、相調(diào)用,但主函數(shù)只能調(diào)用其它函數(shù)而不能被其它函數(shù)調(diào)用。,主函數(shù)是程序的入口,主函數(shù)中的所有語句執(zhí)行完畢,則程序結(jié)束。,二. 、C51語言程序結(jié)構(gòu),可實現(xiàn)一個LED閃爍控制功能的C51源程序,C51語言程序的基本結(jié)構(gòu):,式中: func1()funcN()代表用戶定義的函數(shù), 程序體指C51提供的任何庫函數(shù)調(diào)用語句、控制流程語句或其它函數(shù)調(diào)用語句。,3.4.2 C51的數(shù)據(jù)結(jié)構(gòu),1. C51的變量,變量的基本屬性是變量名和變量值。在程序中定義了變量,C51編譯器就會給這個變量分配相應(yīng)的存儲單元。此后變量名就與存儲單元地址相對應(yīng),變量值就與存儲單元的內(nèi)容相對應(yīng)。,定義一個變量的格式如下: 存儲種類
10、數(shù)據(jù)類型存儲類型變量名,C51的變量概念示意圖,圖中引用變量a實現(xiàn)了對分配內(nèi)存20H單元的數(shù)據(jù)操作,(1)存儲種類,存儲種類是指變量在程序執(zhí)行過程中的作用范圍。,變量的存儲種類有四種: 自動(auto) 用存儲種類說明符auto定義的變量 外部(extern) 用外部種類存儲符extern定義的變量 靜態(tài)(static) 用存儲種類說明符static定義的變量 寄存器(register)用存儲種類說明符register定義的 變量,自動變量:,自動變量作用范圍在定義它的函數(shù)體或復合語句內(nèi)部,在定義它的函數(shù)體或復合語句被執(zhí)行時,C51才為該變量分配內(nèi)存空間,當函數(shù)調(diào)用結(jié)束或復合語句執(zhí)行結(jié)束時,自
11、動變量占用的內(nèi)存空間被釋放。,定義變量時若省略存儲種類,則變量默認為自動變量。通常將函數(shù)體內(nèi)和復合語句中使用頻繁的變量放在片內(nèi)RAM中,且定義為自動變量,可有效利用片內(nèi)RAM資源。,外部變量:,在一個函數(shù)內(nèi),要使用已在本函數(shù)外或別的程序模塊文件中定義過的外部變量時,在本函數(shù)體內(nèi)要用extern說明該變量。,通常將多個函數(shù)或模塊共享的變量定義為外部變量。,外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。當片內(nèi)RAM資源緊張時,不建議將外部變量放在片內(nèi)RAM。,外部變量被定義后,即分配了固定的內(nèi)存空間,在程序的整個執(zhí)行時間內(nèi)都是有效的。,靜態(tài)變量:,靜態(tài)變量又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變
12、量。,在函數(shù)體內(nèi)定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在該函數(shù)體內(nèi)有效,但在該函數(shù)體外不可見,這使變量在定義它的函數(shù)體外被保護,實現(xiàn)了離開函數(shù)時值不會被改變。,寄存器變量:,通常將使用頻率最高的那些變量定義為寄存器變量,但目前已不推薦使用這種方式。,外部靜態(tài)變量是在函數(shù)外部定義的靜態(tài)變量。它在程序中一直可見,但在定義的范圍之外是不可見的。,在多文件或多模塊處理中,外部靜態(tài)變量只在定義其的文件內(nèi)部或模塊內(nèi)部有效。,(2)數(shù)據(jù)類型,數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型,有符號數(shù)據(jù)類型可以忽略signed標識符,如int 等價于signed int , char 等價于signed char等。,為了更有效地利用5
13、1單片機的內(nèi)部結(jié)構(gòu), C51還增加了一些特殊的數(shù)據(jù)類型,它們分別對應(yīng)于bit、sfr、sfr16和sbit四個關(guān)鍵字。,bit 位型,利用bit 位型,可定義一個位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是0 就是1。,C51增加的特殊數(shù)據(jù)類型,sfr特殊功能寄存器型,51系列單片機內(nèi)的21個特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié),地址為80HFFH。為了能直接訪問這些SFR,需要通過關(guān)鍵字“sfr”對其進行定義,語法如下: sfr sfr_name = 地址常數(shù);,sfr_name是一個特殊功能寄存器名,“=”后面必須是常數(shù),其數(shù)值范圍必
14、須在特殊功能寄存器地址范圍內(nèi),即位于0 x80-0 xFF之間。 例如, sfr P1 = 0 x90; /定義P1口地址90H sfr PSW = 0 xD0; /定義PSW地址D0H,對于16位SFR,要使用關(guān)鍵字“sfr16”,定義的地址必須是16位SFR的低端地址。 sfr16 DPTR = 0 x82;/定義DPTR,其DPL = 82H DPH=83H,注意:不能用sfr16定義定時器/計數(shù)器0和1。,sbit可尋址位,在單片機應(yīng)用中,經(jīng)常要訪問特殊功能寄存器中的某些位,用關(guān)鍵字sbit定義可位尋址的特殊功能寄存器的位尋址對象。定義方法有如下三種:,sbit 位變量名 = 位地址
15、將位的絕對地址賦給位變量名,位地址必須位于0 x80H0 xFF之間。 例:sbit CY=0 xD7; /將位的絕對地址賦給變量,sbit 位變量名 = SFR名稱 位位置 當可尋址位位于特殊功能寄存器中時,可采用這種方法。其中SFR名稱必須是已定義的SFR的名字,位位置是一個07之間的常數(shù)。 例: sfr PSW = 0 xD0; sbit CY=PSW7; /定義CY位為PSW.7,位地址為 0 xD7,sbit 位變量名 = 字節(jié)地址 位位置 這種方法是以一個字節(jié)地址作為基地址,該地址必須在0 x80H0 xFF之間。 例如,sbit CY = 0 xD07; /將位的相對地址賦給變量
16、,注:C51編譯器把51單片機常用特殊功能寄存器和特殊位進行了統(tǒng)一定義,并存放在 “reg51.h”或“reg52.h” 頭文件中,只須在使用前用預處理命令#include 把這頭文件包含到程序中,就可使用殊功能寄存器名和特殊位名稱。,(3)存儲類型,51系列單片機有三個邏輯存儲空間:片內(nèi)低128B RAM,片外64KB RAM和片內(nèi)外統(tǒng)一編址的64KB ROM。,51系列單片機邏輯存儲空間示意圖,C51的存儲類型與存儲空間對應(yīng)關(guān)系表,注:一個變量除了與存儲單元相對應(yīng)外,還與它所在的存儲空間有關(guān),即還需要指出其存儲類型。,如果在定義變量時省略了存儲類型標識符,C51編譯器會根據(jù)當前編譯模式自動
17、認定默認的存儲類型。編譯模式共分為:小編譯模式(SMALL)、緊湊編譯模式(COMPACT)和大編譯模式(LARGE)三種模式,編譯模式與存儲類型,(4)變量名,C51對變量名的規(guī)定與標準C類似,由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度無統(tǒng)一規(guī)定,隨編譯系統(tǒng)而定。,注意:大寫和小寫字母是兩個不同的標識符,習慣上變量用小寫表示。變量名除了不可使用標準C語言的32個關(guān)鍵字外,還要不可使用C51擴展的新關(guān)鍵字。,C51擴展的21個關(guān)鍵字一覽表,C51擴展的21個關(guān)鍵字一覽表(續(xù)),注: 所有變量在使用前必須說明,即必須“先定義,后使用”,凡未被定義的,不作為變量名
18、。,unsigned char data system_status=0; /定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。,unsigned char bdata status_byte; /定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū)中。,unsigned int code unit_id2=0 x1234, 0 x89ab; /定義unit_id2為無符號整型自動變量,該變量位于code區(qū)中,為長度為2的數(shù)組,初值為0 x1234和0 x89ab。,static char m, n; /定義m和n為2個位于data區(qū)中
19、的有符號字符型靜態(tài)變量。,extern float xdata var4; /在片外RAM 空間定義外部實型變量var4。,C51的指針與標準C的指針幾乎是一樣的,都可以簡單理解為“存儲某個地址的變量”。,2. C51的指針,例如要存取變量a中的值時,可以先將變量a的地址放在另一個變量b中,訪問時先找到變量b,從中取出變量a的地址,然后根據(jù)這個地址從內(nèi)存單元中取出變量a的值。在這里,變量b稱為指針變量。,上述說法相當于 int a=AA; int *b= char * ptr = ,ptr是一個char型的指針變量,它本身位于默認的data存儲區(qū)(因為它省略了存儲類型),它的值是xdata存儲
20、區(qū)里變量a的地址。,例2 char xdata a = A; char * ptr = 變量b位于idata存儲區(qū)中,執(zhí)行完*ptr= 變量a是idata區(qū)域里的變量; char idata * ptr = 定義指針時就限定它只能指向某一個區(qū)域,例如idata,例4 若例3中的ptr指針自身位于xdata存儲區(qū),由于指針變量本質(zhì)上也是變量,所以,可在例3的“char idata * ptr”里,為ptr加上指明所在區(qū)域的xdata即可,char idata a = A; char idata * xdata ptr = xdata指明了ptr本身是在xdata存儲區(qū)里的,而它是一個(char
21、idata *)類型的變量,即指向idata區(qū)域的一個char類型的指針。,3. 4. 3 C51的運算符,說明 : (1)關(guān)于/ (除)運算的結(jié)果, 若: 兩個整數(shù)相除 ,運算結(jié)果的值為整數(shù)(如 5 / 3,結(jié)果為1) 兩數(shù)中有一個為負值時,結(jié)果向零取整。(如-5/3為 -1 兩數(shù)中有一個為實數(shù)時,結(jié)果為 double 型,1 C51的基本算術(shù)運算符 基本算術(shù)運算符有5種:,* (乘),/ (除), (模運算符,又稱求余)。,-7 % 4 ,7 % -4 ,-7 % -4的值為多少?,(2)參加/(模)運算的兩數(shù)為整型數(shù)據(jù)結(jié)果, 結(jié)果為整型數(shù),如 7 % 4 的值為 3,(-3,3,-3),
22、關(guān)系運算符有6種: (小于)、(大于)、(小于或等于)、(大于或等于) (相等),!(不等于)。,2 C51的關(guān)系運算符,前4種運算符的優(yōu)先級別高(彼此間優(yōu)先級相同),后兩種運算符的優(yōu)先級較低(彼此間優(yōu)先級相同)。,關(guān)系運算的結(jié)果只有兩種:“真”(1)和“假”(0)。,例:設(shè)a5,b4,c3, 則ab的值為“真”,表達式的值為1,若有賦值語句 d(ab)c 按優(yōu)先級,先算ab,表達式的值為1;再算1c,表達式的值為0,所以d0。,邏輯運算符有3種:”就構(gòu)成了表達式語句,如算術(shù)表達式、關(guān)系表達式等。最典型的是用賦值表達式組成的賦值語句。例如: i = 1; i+;,1、表達式語句 C 語言所有的
23、操作都是通過表達式來實現(xiàn)的。 表達式語句: 表達式 ;,2、函數(shù)調(diào)用語句 函數(shù)調(diào)用語句由函數(shù)名、括號、實際參數(shù)加上分號“;”組成。其一般形式為: 函數(shù)名( 實際參數(shù)表 ); 例: printf (Hello , worldn);,“函數(shù)調(diào)用語句”也可以看成是表達式語句,C語言稱為“表達式語言”。,3.4.4 C語句概述,3、控制語句 控制語句用于控制程序流程,以實現(xiàn)程序的各種基本結(jié)構(gòu)。共有9種控制語句,分成三類:選擇語句 、循環(huán)語句 和轉(zhuǎn)移語句 。 C 使用控制語句控制程序的執(zhí)行,常用的控制語句有: if else switch 選擇控制 for while do while 循環(huán)控制 con
24、tinue break return goto 轉(zhuǎn)移控制,條件語句有三種格式:,格式1: If (條件表達式) 語句1,格式2: If (條件表達式) 語句1 else 語句2,格式3: If (條件表達式1) 語句1 else if (條件表達式2)語句2 else if (條件表達式3)語句3 . else if (條件表達式m)語句m else 語句 n,注意: 1) 當條件后面的語句多于一句時,要用一對 “ ”把這些語句括起來。 2)用格式3實現(xiàn)多重if else 嵌套時, 注意if-else的配對,else總是和其前面最近的if相配。此外,嵌套層數(shù)會增加程序閱讀難度。,開關(guān)語句,Sw
25、itch(表達式) case 常量表達式1:語句1 break; case 常量表達式2:語句2 break; . case 常量表達式n:語句n break; Default: 語句d,循環(huán)語句,while (表達式) 其含義是:當條件成立時反復執(zhí)行循環(huán)體中的語句,直到條件不成立時為止。,do while (條件),for(; ; ) ,break語句 作用:跳出當前的switch語句或循環(huán)語句,流程控制語句,continue語句 作用:結(jié)束當前這一輪循環(huán),即跳過循環(huán)語句中尚未執(zhí)行的語句,開始下一輪循環(huán),而不是結(jié)束整個循環(huán)。,注:continue只用在for、while、do-while等循
26、環(huán)語句中,一般與if語句一起使用,可以加速循環(huán)。,返回語句 return return (表達式) return 表達式,作用:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)。,跳轉(zhuǎn)語句 goto 語句標號 作用: 無條件轉(zhuǎn)移到指定標號處,注:最好不使用goto語句,4、復合語句,例:while ( i 1) sum = sum + i; i = i + 1; ,說明: 復合語句的 之后不能有 “;” 允許一行寫幾個語句,或者一條語句寫幾行 復合語句中還可以包含復合語句,由括在 內(nèi)的若干C語句組成,5、空語句 只有一個分號的語句,不產(chǎn)生任何操作 例:for ( i=1; i
27、100 ; i +) ;,空語句什么也不做,可用來做被轉(zhuǎn)向點,或循環(huán)語句中的循環(huán)體(循環(huán)體是空語句,表示循環(huán)體什么也不做)。,當程序中出現(xiàn)連續(xù)的兩個分號“;”時,一般可把后面的分號看作空語句。,rept: ; . goto rept;,#include char _getkey() char c; while (!RI) ; /*用空語句等待串口接收結(jié)束 C=SBUF; RI=0; return(c); ,一個讀取串口數(shù)據(jù)的函數(shù),不要濫用空語句,以免引起程序誤操作或語法錯誤,賦值語句是由賦值表達式加上一個分號構(gòu)成的,是用于實現(xiàn)計算和賦值的一類最基本的語句。 其一般形式如下: 可賦值對象v =
28、表達式e;,注意: (1)如果賦值運算符兩邊的類型不一致,則系統(tǒng)在算出表達式的值之后,先將該值轉(zhuǎn)換為左邊變量的類型,然后再賦值給左邊的變量。 (2)賦值運算符“=”右邊的表達式可以又是一個賦值表達式,形式為: 變量=變量=表達式; (3)在變量說明中,不允許連續(xù)給多個變量賦初值。,6、賦值語句,一、 函數(shù)的分類與定義 1函數(shù)的分類 (1) 從語言結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)main()和普通函數(shù)兩類。 (2) 從使用角度劃分,函數(shù)分為標準庫函數(shù)和用戶自定義函數(shù)兩類。 庫函數(shù)是C編譯系統(tǒng)提供的一系列標準函數(shù),它們放在一些頭文件中,用戶可直接調(diào)用,使用它們必須先用# include語句將相應(yīng)頭文件包含
29、在程序中。 用戶自定義函數(shù)是用戶按任務(wù)需要編寫的函數(shù)。,3.4.5 C51函數(shù)及功能,(3) 從參數(shù)形式上劃分,函數(shù)分為無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)三類。 無參數(shù)函數(shù)調(diào)用時無須輸入?yún)?shù),也無結(jié)果返回。 有參數(shù)函數(shù)調(diào)用時要給被調(diào)用函數(shù)提供實質(zhì)參數(shù),被調(diào)用函數(shù)運行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。 空函數(shù)是內(nèi)無語句的空白函數(shù),調(diào)用時不產(chǎn)生任何操作,這種函數(shù)用于功能備用,以便擴充。,2函數(shù)的定義 (1) 無參數(shù)函數(shù)的定義形式: 返回值類型標識符 函數(shù)名() 函數(shù)體語句 無參數(shù)函數(shù)通常不帶返回值,因此標識符可省略或用void。,(2) 有參數(shù)函數(shù)的定義形式: 返回值類型標識符 函數(shù)名(形式參數(shù)表)
30、 形式參數(shù)說明 函數(shù)體語句 return(返回參數(shù)名) (3) 空函數(shù)的定義形式: 返回值類型說明符 函數(shù)名() ,用return(返回)語句使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返回值帶給調(diào)用函數(shù)。,3. 函數(shù)的返回值,void型函數(shù)(不需要返回值),無return語句。 對于int類型的函數(shù),不寫return語句時,相當于執(zhí)行了rerun 0;語句。, return 語句中表達式的值一般應(yīng)與函數(shù)類型一致。,二、 函數(shù)的調(diào)用 函數(shù)一般調(diào)用形式定義為: 函數(shù)名(實際參數(shù)表列) 無參數(shù)函數(shù)不存在“實際參數(shù)表列”。有參數(shù)函數(shù)的“實際參數(shù)表列”的各參數(shù)之間用逗號隔開,主調(diào)函數(shù)與被調(diào)函數(shù)的形式
31、參數(shù)數(shù)目應(yīng)該相等,實際參數(shù)按順序依次對應(yīng)傳遞給形式參數(shù)。,函數(shù)調(diào)用有三種方式: (1) 使用函數(shù)調(diào)用語句,被調(diào)函數(shù)名作為主調(diào)函數(shù)中的一個語句。如: print_message(); /*message()是被調(diào)用函數(shù) */ (2) 被調(diào)函數(shù)作為表達式的運算對象。如: result5*good(x,y) (3) 被調(diào)函數(shù)作為另一個函數(shù)的實際參數(shù)。如: mmin(x,alpha(a,b),三、函數(shù)調(diào)用條件 主調(diào)函數(shù)調(diào)用被調(diào)函數(shù),必須滿足如下條件: (1) 被調(diào)函數(shù)必須已經(jīng)存在,是庫函數(shù)或用戶自定義函數(shù)。 (2) 程序中如要使用庫函數(shù),或使用不在同一文件中的其它用戶定義函數(shù),必須在程序的開頭用#in
32、clude語句,將所用函數(shù)信息包括到程序中來 (3) 如被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,應(yīng)在主調(diào)函數(shù)前對被調(diào)函數(shù)的返回值類型予以說明。說明方式為: 返回值類型被調(diào)函數(shù)名(形式參列),【例】 被調(diào)函數(shù)在主調(diào)函數(shù)后,需要說明。 main() int max();/*被調(diào)函數(shù)說明*/ int x = 70, y = 40, m; m=max(X,Y); int max(a,b);/*被調(diào)函數(shù),在主調(diào)函數(shù)之后出現(xiàn)*/ int a,b; return(ab?a:b); ,(4) 被調(diào)函數(shù)說明的語句int max(a,b)也可以移至主調(diào)函數(shù)man()前,可不必說明。 int max(a,b); /*被調(diào)函數(shù),
33、在主調(diào)函數(shù)之前出現(xiàn)*/ int a,b; return(ab?a:b); main() /*主調(diào)函數(shù),函數(shù)內(nèi)無被調(diào)函數(shù)說明int max();*/ int x = 70, y = 40, m; m=max(X,Y); ,(1) 函數(shù)是C51程序的基本單位,一個C51程序至少有一個主函數(shù)main(),也可以由一個主函數(shù)main()和若干個其它函數(shù)構(gòu)成。若干其它函數(shù)受主函數(shù)調(diào)用,被調(diào)用的函數(shù)既可以是編譯器提供的庫函數(shù),也可以是用戶自己根據(jù)需要設(shè)定編制的函數(shù)。 (2) 一個函數(shù)由函數(shù)說明部分和函數(shù)體兩部分組成。 (3) 函數(shù)說明部分由函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)名和形式參數(shù)類型組成,其中允許
34、沒有函數(shù)參數(shù),函數(shù)名后面必須有1個圓括號,括號內(nèi)就是可有可無的形式參數(shù)表。 (4) 函數(shù)體是用大括號圍起來的部分。大括號內(nèi)有兩部分內(nèi)容:一部分是變量及變量的定義;另一部分是由若干語句組成的執(zhí)行部分。如果一個函數(shù)內(nèi)有多個大括號,則最外層的一對大括號為函數(shù)體的范圍。有的函數(shù)體既有變量定義部分,又有執(zhí)行部分;有的函數(shù)體僅有執(zhí)行部分無變量定義部分;有的函數(shù)這兩部分都沒有。,3.4.6 C51程序設(shè)計的編程規(guī)則,(5) 語句的組成規(guī)則為: 每個變量必須先定義后使用; 變量名由英文字母組成,英文字母要區(qū)分大小寫,大小寫不同則變量名不同; 書寫格式自由,一行可以寫多個語句,一個語句也可以寫成多行,但每條語句
35、必須以“;”結(jié)尾; 分號是C語言的必須組成部分,每個語句和數(shù)據(jù)在定義的最后必須有一個分號,程序的最后一個語句也應(yīng)有分號。,(6) C語言對I/O操作實現(xiàn)了“函數(shù)化”,分別調(diào)用庫函數(shù)scanf和printf等函數(shù)完成,無專門的輸入/輸出語句。 (7) C51的注釋用/*/表示,有了注釋,閱讀程序更方便。 C51程序結(jié)構(gòu)如下: 全局變量說明/*可被各函數(shù)引用*/ main()/*主函數(shù)*/ /*函數(shù)體開始*/ 局部變量說明/*限于在本函數(shù)內(nèi)使用*/ 執(zhí)行語句(包括調(diào)用其它函數(shù)的語句) /*主函數(shù)的函數(shù)體結(jié)束*/,function 1(形式參數(shù)表)/*可被調(diào)用的一個函數(shù)*/ 形式參數(shù)說明 /*函數(shù)1
36、的函數(shù)體開始*/ 局部變量說明 執(zhí)行語句(包括調(diào)用其它函數(shù)的語句) /*函數(shù)1的函數(shù)體結(jié)束*/ function n(形式參數(shù)表)/*可被調(diào)用的第n個函數(shù)*/ /*格式同函數(shù)1,從“”開始,到“”結(jié)束*/,3.5 C51初步應(yīng)用編程,1. I/O端口的簡單應(yīng)用,(1)基本輸入輸出單元與編程,輸出: 發(fā)光二極管作為輸出狀態(tài)顯示設(shè)備具有電路簡單、功耗低、壽命長、響應(yīng)速度快等特點。 最簡單的發(fā)光二極管接口形式是通過限流電阻R直接掛在IO口線上,限流電阻通常取1001k左右,發(fā)光二極管與單片機的簡單接口,輸入 按鍵、開關(guān)是最基本的輸入設(shè)備,與單片機相連的簡單方式是直接與IO口線連接。當按鍵、開關(guān)閉合時
37、,對應(yīng)口線的電平就會發(fā)生反轉(zhuǎn),CPU通過讀端口電平即可識別是哪個按鍵或開關(guān)閉合。,注意:P0口內(nèi)部結(jié)構(gòu)為漏極開路狀態(tài),因此與按鍵或開關(guān)接口時需要有上拉電阻,而P1-P3不需要。,按鍵或開關(guān)與單片機的簡單接口,獨立按鍵識別和控制LED點亮程序設(shè)計,要求開始時LED均熄滅,隨后根據(jù)按鍵動作點亮相應(yīng)LED,按鍵釋放后繼續(xù)保持直至新的按鍵按下為止。,電路如下圖,由電路可知,接于P0.0-P0.3的任意一個按鍵按下時,相應(yīng)端口的電平將由“1”狀態(tài)變?yōu)椤?”狀態(tài);而接于P2.0-P2.3的任意一個LED在端口輸出“1” 時將被點亮。,參考程序如下,#include / 定義 51寄存器頭文件包含到程序中,
38、void main(void), char key =0; /定義一個變量,初值為0,P2 = 0; /熄滅所有LED P0 = 0 xff; / 向P0寫“1”,使P0口可正確讀入按鍵狀態(tài),while(1) /循環(huán) key =P0 /將P0口讀入的按鍵狀態(tài)取反并 /與0f H按位與,清高4位留低4位,if (key != 0) P2 = key ; / key不為0有鍵按下則將key / 送P2口控制相應(yīng)的LED點亮 /否則,再循環(huán)讀按鍵狀態(tài),編程界面和運行界面分別如圖,例2 :鍵控流水燈,在上例電路圖的基礎(chǔ)上,編寫可鍵控的流水燈程序。要求實現(xiàn)功能為,當K1 按下時,要求流水燈流動;K2 按
39、下時停止流動,且全部燈滅;K3按下時使燈由上往下流動,K4 則使燈由下往上流動。,程序說明,判斷按鍵動作,并根據(jù)按鍵的組合狀態(tài)控制流水燈狀態(tài)。流水燈控制碼事先存放在數(shù)組中。 本例電路中LED為低電平驅(qū)動,故控制碼中輸出0電平對應(yīng)著燈亮,反之,1電平對應(yīng)著燈滅。流水速度可以根據(jù)需要調(diào)整延時數(shù)值了。,參考程序如下,/定義數(shù)組,并將控制各位燈亮的碼作為 /初值放入其中,/定義delay延時函數(shù)(帶參數(shù)time),/定義內(nèi)循環(huán)控制變量j,/定義按鍵掃描函數(shù),/若無按鍵返回0,否則返回 /從P0口讀入的按鍵狀態(tài)(高/ 4位被清0。,/定義兩個位變量dir,run,并賦初值,/定義int型變量i,/根據(jù)k
40、ey函數(shù)返回值決定如何控制LED,/若K1按下run=1,跳出switch /若K2按下run=0,跳出switch /若K3按下dir=1,跳出switch /若K4按下dir=0,跳出switch,/若ren=1 (K1按下),去判斷dir的值,/否則(ren=0,K2按下),向P2口輸出0,熄滅所有LED,/由i控制順序取出控制碼,/若dir=1,控制LED,/調(diào)用延時函數(shù),/否則(dir=0),控制LED,/由i控制反序取出控制碼,/送P2,/送P2,/調(diào)用延時函數(shù),第4章單片機的C51語言,Keil項目和程序界面如下圖所示,(2)LED數(shù)碼管原理與編程,數(shù)碼管這種七段顯示器內(nèi)部由7個
41、條形發(fā)光二極管和一個小圓點發(fā)光二極管組成,分為兩種: 共陰極 所有二極管的陰極連接在一起為公共端 共陽極 所有二極管的陽極連接在一起為公共端,單個數(shù)碼管的引腳配置如下圖所示,其中com為公共端。,共陰極,共陽極,com,com,又稱COM:字選線 adp:段選線,給a-g7個發(fā)光二極管和dp加正電壓點亮,加零電壓熄滅,不同亮暗的組合形成不同的字形,這種組合成為段碼。,共陽極七段碼,共陰極七段碼,C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H,3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH,用1個I/O口線控制 dp g f e d
42、 c b a,用8位I/O口線控制數(shù)碼管,若其各位與七段發(fā)光管和小數(shù)位發(fā)光管的對應(yīng)關(guān)系如下的話: D7 D6 D5 D4 D3 D2 D1 D0 dp g f e d c b a 則LED顯示的字型和字段(控制)碼有如下的對應(yīng)關(guān)系。,例3:LED數(shù)碼管顯示,將單片機P0口的P0.0-P0.7與1個共陰極數(shù)碼管的a-dp引腳相連,編程控制循環(huán)顯示0-9數(shù)字,時間間隔0.2s。,硬件電路原理圖,程序設(shè)計: 顯示的數(shù)字0-9的段碼之間沒有規(guī)律可循,故采取查表的方式來完成所需段碼的獲取。按數(shù)字的順序存放待顯示字型的字段碼。在程序中建立字段碼數(shù)組led_mod 如下: 0 x3f, 0 x06, 0 x
43、5b ,0 x4f, 0 x66, 0 x6d, 0 x7d, 0 x07, 0 x7f, 0 x6f。,定義i變量初值為0,i=0,i=9,N,Y,P0= led_modi,延時,i=i+1,主函數(shù)流程,參考程序,/定義帶參的延時函數(shù),形參time,/定義整型變量j,控制內(nèi)循環(huán),/time控制外循環(huán),/定義主函數(shù),/內(nèi)循環(huán)體為空語句,/定義字符型變量i, 用于控制循環(huán)和取數(shù)組元素,/循環(huán)取各數(shù)字字段碼送P0口顯示,/延時,例4: 靜態(tài)顯示方式的計數(shù)顯示器,對按鍵動作進行統(tǒng)計,并將按鍵次數(shù)通過數(shù)碼管顯示。要求顯示范圍為1-99,增量為1,超過99后自動循環(huán)顯示。,硬件電路原理圖,P3.7,采用
44、共陽極數(shù)碼管 簡單按鍵接口,P3.7,程序設(shè)計: 初始顯示00,定義1個計數(shù)變量,不斷掃描按鍵,有按鍵計數(shù)變量加1,并判斷是否超范圍,超則將其置為0。改變顯示的數(shù),方法是:將計數(shù)結(jié)果拆分成十位和個位(計數(shù)值整除10得到十位上的數(shù)值,它對10 取模得到個位上的數(shù)值),再分別查找取出對應(yīng)字段碼送相應(yīng)顯示端口。檢測等待按鍵松開,如此反復 。,計數(shù)變量count=0,設(shè)P3.7做輸入,0的字段碼送p0、p1口,count=0,N,Y,P0= tablecount/10 P1= tablecount%10,延時,count+1,主函數(shù)流程,P3.7=0,P3.7=0,N,count=100?,Y,Y,N
45、,等鍵釋放,參考程序,P3_7=1;,,將P3_7置1以保證正確輸入,P1,/P1,P1,;/P1,例5. 數(shù)碼管動態(tài)顯示原理與編程,數(shù)碼管與單片機的接口方式有靜態(tài)顯示接口和動態(tài)顯示接口之分。,靜態(tài)顯示:靜態(tài)顯示接口是一個并行口接一個數(shù)碼管,其優(yōu)點是:被顯示數(shù)據(jù)只要送入并行口后就不再需要CPU干預,因而顯示效果穩(wěn)定。但該方法占用資源較多,動態(tài)顯示:動態(tài)顯示接口是將所有數(shù)碼管的個段碼線對應(yīng)端并聯(lián)起來分別接在8位并行口的對應(yīng)口線上,而每位數(shù)碼管的公共端分別由另外一個口的不同I/O線控制。,數(shù)碼管動態(tài)顯示接口示意圖,動態(tài)顯示:動態(tài)顯示采用循環(huán)導通1位數(shù)碼管截止其它數(shù)碼管的做法。當循環(huán)顯示間隔時間較小
46、(如10ms)時,由于人眼的暫留特性,將看不出數(shù)碼管的閃爍。動態(tài)顯示接口的特點是占用資源較少,但由于顯示值需要CPU隨時刷新,故占用機時較多。,六位共陰極LED動態(tài)顯示接口,7407驅(qū)動LED的段,P1.0P1.5作位選經(jīng)7404驅(qū)動連接各LED的com端,要求數(shù)碼管從左至右顯示123456。,程序設(shè)計 將要顯示的數(shù)123456的七段碼依次放入數(shù)組,從數(shù)組中取第1個七段碼送P0口,控制從左開始選通數(shù)碼管顯示,顯示幾毫秒后,左移修改字選控制碼。,然后從數(shù)組取下一待顯數(shù)的七段碼送P0口在下一位顯示,如此循環(huán)逐位顯示完6位,再從頭開始。,#include char led_mod =0 x06, 0
47、 x5b ,0 x4f, 0 x66, 0 x6d, 0 x7d;,void delay(unsigned int time);,void main() unsigned char i; /定義控制從數(shù)組中取七段碼的位置變量 unsigned char led_vei; /定義存字選控制碼變量,while(1) led_vei = 0 x01; /字選控制碼初值(點亮最左邊數(shù)碼管),for(i = 0;i 6;i+) /循環(huán)6次逐個點亮, P0= led_mod i ; /取數(shù)組中第i個字型七段碼送P0口 P1 = led_vei; /字選控制碼送P1口 delay(30); led_vei
48、= _crol_(led_vei,1); /字選控制碼循環(huán)左移1位 ,void delay(unsigned int time) unsigned int j=0; for( ; time0; time-) for(j=0; j125; j+) ; ,(3)行列式鍵盤原理與編程,前面例題中的按鍵都是每鍵分別接在一根IO口線上,這稱為獨立式鍵盤。它的電路簡單,易于編程,但占用的IO口線較多,當需要較多按鍵時可能產(chǎn)生IO資源緊張問題,這時應(yīng)采用行列式鍵盤。,行列式鍵盤方案的一般做法是,將IO口分為行線和列線,按鍵置于行線和列線交叉位置的上方,行線則通過上拉電阻接正電源。按鍵壓下時,行線和列線將發(fā)生
49、短接,利用軟件掃描技術(shù)可以判斷出閉合狀態(tài)。,44行列式鍵盤硬件電路圖,行列式(矩陣)鍵盤識別的常用方法有兩種: 列掃描法 線反轉(zhuǎn)法,1) 列掃描法(逐列進行) 向某列線發(fā)出低電平信號, 如該列線上所設(shè)置的鍵沒有任何一個按下的話, 則行線端口讀回的是全“1”信號, 否則,得到非全“1”信號,且為“0”位的位置對應(yīng)按鍵所在行的位置。 ,找到閉合鍵后, 獲取其鍵值, 據(jù)此轉(zhuǎn)至該鍵對應(yīng)的功能程序。,為防止多鍵同時按下, 往往從第 0 列一直掃描到最后 1 列, 若只發(fā)現(xiàn) 1 個閉合鍵, 則為有效按鍵, 否則,全部作廢。,行和列是人為認定的,為此認定:通過上拉電阻接電源的口線對應(yīng)的是行線。,按鍵在閉合和
50、斷開瞬間會因彈簧開關(guān)的變形而產(chǎn)生電壓波動現(xiàn)象,其按鍵抖動波形如圖,按鍵抖動會造成一次按鍵對應(yīng)多次響應(yīng)的問題,需要采用措施消除抖動影響。單片機常用軟件延時10ms的辦法來消除抖動的影響。當檢測到有鍵按下時,先延時10ms,然后再檢測按鍵的狀態(tài),若仍是閉合狀態(tài),則認為真正有鍵按下。當需要檢測到按鍵釋放時,也需做同樣的處理。,a.先檢查是否鍵按下。 向列線端口送全列掃描碼(列線全送“0”),行線端口做輸入(行線全送“1”),然后,讀入行線端口的狀態(tài),若行線中有為0位(即非全“1”),則有鍵按下。,c.判斷按鍵位置。 進行逐列掃描,被掃描列送0,其余列送“1”,每次均讀入行線端口狀態(tài),看哪條行線為“0
51、” 。由行、列線的狀態(tài)可判斷是哪個鍵被按下(為“0”的行、列交叉處),d.計算確定按鍵的鍵號 N N=為0行的行首鍵號+(發(fā)現(xiàn)按鍵時正掃描的)列號,具體實現(xiàn)步驟,b.有鍵按下則延時除抖動。 即延時20mS左右,再次讀行線端口看是否仍為有鍵按下,若有,則確認為一次有效按鍵。,4行X4列矩陣鍵盤控制如圖 P1.4 - P1.7控制行線 P1.0 - P1.3控制列線,列掃描法匯編程序設(shè)計,行置1,MOV 30H,#0 ; 存鍵值單元清0 MOV P1,#0F0H ;列全“0”行全“1” MOV A, P1 ;讀P1口 ANL A,#0F0H ;保留高4位 CJNE A,#0F0H, JIN ;判是
52、否有按鍵, RET JIN:ACALL DELAY20ms JIN0: MOV R2, #4 ;循環(huán)列掃描次(R2記錄掃到第幾列) MOV R3,#01H ;起始列掃描碼 R3,初始掃3號列 JIN1: MOV A, R3 ; 當前掃描碼A CPL A ;獲得本次列掃描信號 MOV P1, A ;列掃描輸出 MOV A, P1 ;讀鍵盤 ANL A, #0F0H ;保留讀回的行信息 CJNE A,#0F0H, JIN2 ;判斷有無按鍵,有則轉(zhuǎn)JIN2 MOV A, R3;無按鍵,列掃描碼A,準備掃下一列,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,+5v,P1.
53、7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P.10,3號列,0號列,RL A ;A右移1位, 修改列掃描碼 MOV R3, A ;保存當前列掃描碼 DJNZ R2, JIN1 ;4列未掃完繼續(xù)循環(huán) RET ;無鍵按下返回 JIN2:DEC R2 ;獲得按鍵所在列的列號 MOV R1,#0; 0行行首鍵號 R1 JNB ACC.7, JIN3 ;是0行有鍵按下則轉(zhuǎn)JIN3 MOV R1,#4 ;否則,1行行首鍵號 R1 JNB ACC.6, JIN3 ;是1行有鍵按下則轉(zhuǎn)JIN3 MOV R1,#8 ;否則, 2行行首鍵號 R1 JNB ACC.5, JIN3 ;是2行有鍵
54、按下則轉(zhuǎn)JIN3 MOV R1,#12 否則, 3行行首鍵號 R1 JIN3:MOV A, R1 ;按鍵所在行的行首鍵號 A ADD A,R2;計算鍵值=行首鍵號+列號 MOV 30H,A ;存鍵值到30H單元 JN4:MOV A,P1 ;讀鍵盤,等待鍵釋放 ANL A,#0F0H ;保留行狀態(tài)值 CJNE A,#0F0H, JN4 ;若行狀態(tài)值不為全”1”則轉(zhuǎn)RET,2) 線反轉(zhuǎn)法 線反轉(zhuǎn)法比列掃描法速度快, 但在硬件上要求行線與列線外接上拉電阻。方法如下: ,先將行線作為輸出, 列線作為輸入,行線輸出全“0”、列線全“1”, 接著讀入列線的值; 然后,再將行線作為輸入,列線作為輸出, 并將
55、剛才讀到的列線值從列線所接的端口輸出, 再讀取行線的輸入值。那么在閉合鍵所在的行線上值必為 0。,這樣, 當一個鍵被按下時, 必定可讀到一對唯一的只有1位為0的行、列值。,根據(jù)上兩步的結(jié)果,可確定按鍵所在行和列。,a. 先將行線編程為輸入,列線輸出全0列信號,讀入行線狀態(tài),若非全1則有鍵按下,此時,為0位對應(yīng)行為按鍵所在行,線反轉(zhuǎn)法具體實現(xiàn)步驟,b. 再將行線編程為輸出,列線做輸入,行線輸出全0行信號,讀入列線狀態(tài),此時為0位對應(yīng)列為按鍵所在列。,c .計算該按鍵的鍵號 N=行首鍵號+列號,線反轉(zhuǎn)法鍵盤掃描流程,與寫入的相等否,與寫入的相等否,例6 行列式鍵盤應(yīng)用,44行列式鍵盤電路原理圖如下
56、,要求按任意按鍵后,顯示出該按鍵對應(yīng)的數(shù)(0-F)。,第一行,第一列,若用8位2進制數(shù)用以下方式來表示鍵編碼: 高4位對應(yīng)行、低4位對應(yīng)列,每個鍵的編碼是,除其所在行、列對應(yīng)位為1外,其余位為0,則有:,1行1列鍵編碼11H 2行1列鍵編碼21H 3行1列鍵編碼41H 4行1列鍵編碼81H 1行2列鍵編碼12H 2行2列鍵編碼22H . 3行3列鍵編碼44H 4行3列鍵編碼84H . 4行4列鍵編碼88H,0,1,2,4,E,F,D,C,5,8,9,B,P2,P3.7,P3.0,參考程序,0-F16個數(shù)符的共陰七段碼依次放入led_mod數(shù)組,0-F16個鍵對應(yīng)的編碼依次放入key_buf數(shù)組
57、,/ 說明掃描鍵盤返回鍵值函數(shù),本程序有鍵盤掃描和軟件延時兩個子程序函數(shù),主函數(shù)調(diào)用鍵盤掃描子程序,獲取用戶按鍵對應(yīng)值年,完成靜態(tài)顯示。,/ 帶參延時函數(shù),線反轉(zhuǎn)法掃描鍵盤返回鍵值(該數(shù)對應(yīng)段碼在led_mod中的位置),k1存首次發(fā)現(xiàn)有鍵按下時的鍵盤狀態(tài),k2存按鍵碼,送全列掃描碼:行線高電平、列線低電平,/調(diào)用鍵盤掃描函數(shù),返回鍵值送key保存,/key用來存放按鍵對應(yīng)值,/00H送P2口,滅數(shù)碼管,/有鍵按下則據(jù)鍵值從led_mod中/取對應(yīng)段碼送P2口顯示,/延時一段時間,/讀回P3的值不等于f0H則有鍵按下,否則無按鍵 /有鍵按下則讀回P3的狀態(tài)存k1,,/若鍵盤狀態(tài)與前鍵盤狀態(tài)k1相同則確有鍵按下 /送全行掃描碼,行線全0,列線全1,/全行、列掃描讀回值相或后取反,得鍵編碼,/據(jù)鍵編碼在key_buf 中搜索,,k2=(P3k1);,/無鍵按下則返回 -1,/延時,(4) 并行I/O口綜合應(yīng)用:步進電機的控制與編程,步進電機是一個數(shù)字角度轉(zhuǎn)換器,也是一個串行的數(shù)模轉(zhuǎn)換器,它是用電脈沖控制轉(zhuǎn)動速度和轉(zhuǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度坂田二期消防監(jiān)控中心建設(shè)與運營合同3篇
- 二零二五年度旅游景點場地租賃安全協(xié)議及游客安全保障3篇
- 二零二五年度物流運輸合同標的詳細規(guī)范與實施細則2篇
- 二零二五年度工程車輛銷售、租賃與培訓服務(wù)合同3篇
- 2025委托設(shè)計合同樣式
- 二零二五年度環(huán)保節(jié)能房地產(chǎn)典當合同范本3篇
- 2025年博物館項目提案報告范文
- 2024版瓦屋面勞務(wù)分包合同
- 2024版家居裝修協(xié)議書5篇
- 二零二五年度房地產(chǎn)銷售法律風險防控內(nèi)部承包合同3篇
- 完整版:美制螺紋尺寸對照表(牙數(shù)、牙高、螺距、小徑、中徑外徑、鉆孔)
- TCI 373-2024 中老年人免散瞳眼底疾病篩查規(guī)范
- 2024四川太陽能輻射量數(shù)據(jù)
- 石油鉆采專用設(shè)備制造考核試卷
- 法人變更股權(quán)轉(zhuǎn)讓協(xié)議書(2024版)
- 研究生中期考核匯報模板幻燈片
- AQ/T 2061-2018 金屬非金屬地下礦山防治水安全技術(shù)規(guī)范(正式版)
- 培訓機構(gòu)與學校合作協(xié)議書范本
- 留置導尿法操作評分標準
- 2024年高考數(shù)學經(jīng)典解答題-立體幾何專項復習17題(附答案)
- 麻醉管理-血氣分析在手術(shù)中的應(yīng)用
評論
0/150
提交評論