




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3.1 單片機(jī)系統(tǒng)開(kāi)發(fā)過(guò)程簡(jiǎn)單的例子:讓一個(gè)發(fā)光二極管閃爍5次。1、明確系統(tǒng)功能:讓一個(gè)發(fā)光二極管閃爍5次。系統(tǒng)啟動(dòng)后,一支發(fā)光二極管閃爍5次后熄滅,當(dāng)按下一個(gè)按鈕開(kāi)關(guān)后再閃爍5次后熄滅。以后每次按下按鈕開(kāi)關(guān),發(fā)光二極管都會(huì)閃爍5次。第三章 單片機(jī)系統(tǒng)開(kāi)發(fā)過(guò)程 51單片機(jī)指令系統(tǒng)簡(jiǎn)介 2、硬件設(shè)計(jì)(單片機(jī)+外圍器件)外圍器件:一個(gè)發(fā)光二極管、三個(gè)電阻、三個(gè)電容一個(gè)按鈕開(kāi)關(guān)3、 搭建硬件平臺(tái)在面包板上插入器件,用導(dǎo)線(xiàn)完成電氣連接。 4、 軟件設(shè)計(jì) ORG 00H ; 設(shè)置起始地址START: MOV R0, #5 ; 循環(huán)閃爍5次,R0為計(jì)數(shù)器LOOP: MOV P1,#00H ; P1口輸出全
2、0,點(diǎn)亮二極管 CALL DELAY ; 調(diào)用延時(shí)子程序 MOV P1,#0FFH ; P1口輸出全1,熄滅二極管 CALL DELAY ; 調(diào)用延時(shí)子程序 DJNZ R0, LOOP ; R0減1,若不為0轉(zhuǎn)LOOP處 JB P2.0, $ ; 測(cè)P2.0為高電平(無(wú)按鍵)則執(zhí)行本行 JMP START ; 否則,有鍵按下,跳到START處重新開(kāi) 始執(zhí)行DELAY: ; 延時(shí)子程序(500ms) RET ; 返回主程序 END ; 匯編程序結(jié)束5 、下載程序到單片機(jī)并調(diào)試(1) 在Vision中把目標(biāo)程序編輯好,(2)編譯、連接無(wú)錯(cuò)后生成單片機(jī)可執(zhí)行的代碼文件,(3) 用下載線(xiàn)下載到單片機(jī)系
3、統(tǒng)板中,(4)運(yùn)行程序(5)根據(jù)運(yùn)行結(jié)果檢查功能實(shí)現(xiàn)情況,若未達(dá)系統(tǒng)要求,則在Vision中修改程序,然后重復(fù)步驟 (2)(5),直至達(dá)到系統(tǒng)要求.在程序反復(fù)檢查無(wú)邏輯錯(cuò)誤時(shí),應(yīng)檢查硬件電路是否有問(wèn)題. 3.2 Vision Vision軟件的使用1、新建一個(gè)工程(項(xiàng)目),并為該項(xiàng)目選定合適的CPU然后保存該工程。具體步驟:選Project New Project保存工程在彈出窗口中選所需CPU(如選ATMEL),雙擊該.CPU.選AT89S51, 并確定。2、設(shè)置工程,使編譯、連接后能生成可執(zhí)行代碼文件右擊Options for Target 1選擇Create HEX 在彈出的窗口選3、新
4、建源文件選FileNew輸入源程序保存(匯編程序:文件名.asm; C程序:文件名.c(存在工程文件夾)4、為工程中添加源程序文件在右邊Project窗口單擊 Source Group 1,在下拉菜單中選 Add Files to GroupSource Group 1選項(xiàng),在彈出的框中選擇你的源文件和文件類(lèi)型,然后點(diǎn)擊ADD,再點(diǎn)擊close。 5、編譯工程中的源程序,生成 .HEX(可執(zhí)行)文件 在Project窗口中選 Target 1Build Target F7, (點(diǎn)擊 )對(duì)源程序編譯連接。(或點(diǎn)擊 RBuild Target ) 程序有語(yǔ)法錯(cuò)誤時(shí),會(huì)在輸出窗口(Output Wi
5、ndows)中顯示錯(cuò)誤信息和警告信息,修改編譯成功后生成 HEX文件生成.HEX文件后,可利用專(zhuān)門(mén)的下載程序,將此可執(zhí)行程序下載到單片機(jī)內(nèi)的ROM中運(yùn)行 3、在窗口中點(diǎn)擊 , 打開(kāi)你系統(tǒng)的.hex文件 3.3 STC-ISP V3.91 軟件的使用1、雙擊 , 打開(kāi)在線(xiàn)燒錄程序 2、在窗口的“MCU TYPE ”下拉菜單中選擇(STC89C51RC)4、在COM欄選下載端口(一般是COM1)5、關(guān)電路板上的電源6、點(diǎn)擊Download,打開(kāi)電路板上的電源,燒錄程序,若燒錄出現(xiàn)問(wèn)題,點(diǎn)擊stop。注意: 5、6 兩步驟的順序不能顛倒!即在點(diǎn)擊Download之前要先關(guān)掉板上的電源。7、打開(kāi)電路板
6、上的電源 ,程序即開(kāi)始運(yùn)行。 3.4 單片機(jī)應(yīng)用系統(tǒng)C語(yǔ)言程序設(shè)計(jì) 單片機(jī)應(yīng)用系統(tǒng)的程序設(shè)計(jì)有兩種方法:一種是基于匯編語(yǔ)言的,另一種是基于C語(yǔ)言的。 匯編語(yǔ)言程序的機(jī)器代碼生成效率高,但可讀性較差,而C語(yǔ)言程序的可讀性和可移植性遠(yuǎn)超過(guò)匯編語(yǔ)言。 C51是一種專(zhuān)門(mén)為51單片機(jī)設(shè)計(jì)的高級(jí)語(yǔ)言C編譯器,支持符合ANSI標(biāo)準(zhǔn)的C語(yǔ)言,同時(shí)針對(duì)51單片機(jī)的特點(diǎn)做了一些特殊擴(kuò)展。 C語(yǔ)言的主要特點(diǎn): 語(yǔ)言簡(jiǎn)潔,使用方便靈活。它是程序設(shè)計(jì)語(yǔ)言中規(guī)模最小的語(yǔ)言之一。 ANSI標(biāo)準(zhǔn)C語(yǔ)言只有32個(gè)關(guān)鍵字,9種流程控制語(yǔ)句。程序可移植性好。所設(shè)計(jì)的程序不依賴(lài)機(jī)器硬件。表達(dá)方式靈活。 利用 C語(yǔ)言的多種運(yùn)算符可組成
7、各種表達(dá)式,還可采用多種方法來(lái)獲得表達(dá)式的值,使程序設(shè)計(jì)具有更大的靈活性。表達(dá)能力強(qiáng)。 具有豐富的數(shù)據(jù)結(jié)構(gòu)類(lèi)型和多種運(yùn)算符。用戶(hù)可靈活采用多種數(shù)據(jù)類(lèi)型和使用各種運(yùn)算符,實(shí)現(xiàn)復(fù)雜運(yùn)算??芍苯硬僮饔?jì)算機(jī)硬件。 C語(yǔ)言具有直接訪(fǎng)問(wèn)機(jī)器物理地址的能力,C51的編譯器都可直接對(duì)單片機(jī)內(nèi)部的SFR和I/O端口進(jìn)行操作,可以直接訪(fǎng)問(wèn)片內(nèi)、片外存儲(chǔ)器,還可以進(jìn)行各種為操作。生成的目標(biāo)代碼質(zhì)量較高??蛇M(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。 C語(yǔ)言以函數(shù)作為程序設(shè)計(jì)的基本單位,非常適合結(jié)構(gòu)化程序設(shè)計(jì)。 用C51語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序,不用具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但對(duì)數(shù)據(jù)類(lèi)型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)
8、聯(lián),否則編譯器不能正確地映射定位。 與標(biāo)準(zhǔn)C語(yǔ)言相比,C51包含的數(shù)據(jù)類(lèi)型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面有一定差異,需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源來(lái)定義相應(yīng)的數(shù)據(jù)類(lèi)型和變量,而其它語(yǔ)法規(guī)則、程序結(jié)構(gòu)及設(shè)計(jì)方法等與標(biāo)準(zhǔn)C語(yǔ)言相同。 3.4.1 C51的程序結(jié)構(gòu) 一、 C51語(yǔ)言概述 C語(yǔ)言程序由若干函數(shù)組成,其中有且僅有一個(gè)主函數(shù),每個(gè)函數(shù)都是完成某個(gè)特殊任務(wù)的子程序段。 組成程序的若干函數(shù)可保存在一個(gè)源程序文件中,也可保存在幾個(gè)源程序文件中,最后將它們連接在一起。 函數(shù)之間可以互相調(diào)用,但主函數(shù)只能調(diào)用其它函數(shù)而不能被其它函數(shù)調(diào)用。 主函數(shù)是程序的入口,主函數(shù)中的所有語(yǔ)句執(zhí)行完畢,則
9、程序結(jié)束。二. 、C51語(yǔ)言程序結(jié)構(gòu) 可實(shí)現(xiàn)一個(gè)LED閃爍控制功能的C51源程序C51語(yǔ)言程序的基本結(jié)構(gòu): 式中: func1()funcN()代表用戶(hù)定義的函數(shù),程序體指C51提供的任何庫(kù)函數(shù)調(diào)用語(yǔ)句、控制流程語(yǔ)句或其它函數(shù)調(diào)用語(yǔ)句。3.4.2 C51的數(shù)據(jù)結(jié)構(gòu) 1. C51的變量 變量的基本屬性是變量名和變量值。在程序中定義了變量,C51編譯器就會(huì)給這個(gè)變量分配相應(yīng)的存儲(chǔ)單元。此后變量名就與存儲(chǔ)單元地址相對(duì)應(yīng),變量值就與存儲(chǔ)單元的內(nèi)容相對(duì)應(yīng)。 定義一個(gè)變量的格式如下:存儲(chǔ)種類(lèi)數(shù)據(jù)類(lèi)型存儲(chǔ)類(lèi)型變量名C51的變量概念示意圖 圖中引用變量a實(shí)現(xiàn)了對(duì)分配內(nèi)存20H單元的數(shù)據(jù)操作 (1)存儲(chǔ)種類(lèi) 存
10、儲(chǔ)種類(lèi)是指變量在程序執(zhí)行過(guò)程中的作用范圍。變量的存儲(chǔ)種類(lèi)有四種:自動(dòng)(auto) 用存儲(chǔ)種類(lèi)說(shuō)明符auto定義的變量外部(extern) 用外部種類(lèi)存儲(chǔ)符extern定義的變量靜態(tài)(static) 用存儲(chǔ)種類(lèi)說(shuō)明符static定義的變量寄存器(register)用存儲(chǔ)種類(lèi)說(shuō)明符register定義的 變量自動(dòng)變量: 自動(dòng)變量作用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,在定義它的函數(shù)體或復(fù)合語(yǔ)句被執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語(yǔ)句執(zhí)行結(jié)束時(shí),自動(dòng)變量占用的內(nèi)存空間被釋放。 定義變量時(shí)若省略存儲(chǔ)種類(lèi),則變量默認(rèn)為自動(dòng)變量。通常將函數(shù)體內(nèi)和復(fù)合語(yǔ)句中使用頻繁的變量放在片內(nèi)RA
11、M中,且定義為自動(dòng)變量,可有效利用片內(nèi)RAM資源。外部變量: 在一個(gè)函數(shù)內(nèi),要使用已在本函數(shù)外或別的程序模塊文件中定義過(guò)的外部變量時(shí),在本函數(shù)體內(nèi)要用extern說(shuō)明該變量。 通常將多個(gè)函數(shù)或模塊共享的變量定義為外部變量。 外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。當(dāng)片內(nèi)RAM資源緊張時(shí),不建議將外部變量放在片內(nèi)RAM。 外部變量被定義后,即分配了固定的內(nèi)存空間,在程序的整個(gè)執(zhí)行時(shí)間內(nèi)都是有效的。 靜態(tài)變量: 靜態(tài)變量又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。 在函數(shù)體內(nèi)定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在該函數(shù)體內(nèi)有效,但在該函數(shù)體外不可見(jiàn),這使變量在定義它的函數(shù)體外被保護(hù),實(shí)現(xiàn)了離開(kāi)
12、函數(shù)時(shí)值不會(huì)被改變。 寄存器變量: 通常將使用頻率最高的那些變量定義為寄存器變量,但目前已不推薦使用這種方式。 外部靜態(tài)變量是在函數(shù)外部定義的靜態(tài)變量。它在程序中一直可見(jiàn),但在定義的范圍之外是不可見(jiàn)的。 在多文件或多模塊處理中,外部靜態(tài)變量只在定義其的文件內(nèi)部或模塊內(nèi)部有效。(2)數(shù)據(jù)類(lèi)型 數(shù)據(jù)的不同格式叫做數(shù)據(jù)類(lèi)型 有符號(hào)數(shù)據(jù)類(lèi)型可以忽略signed標(biāo)識(shí)符,如int 等價(jià)于signed int , char 等價(jià)于signed char等。 為了更有效地利用51單片機(jī)的內(nèi)部結(jié)構(gòu), C51還增加了一些特殊的數(shù)據(jù)類(lèi)型,它們分別對(duì)應(yīng)于bit、sfr、sfr16和sbit四個(gè)關(guān)鍵字。bit 位型 利
13、用bit 位型,可定義一個(gè)位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0 就是1。C51增加的特殊數(shù)據(jù)類(lèi)型sfr特殊功能寄存器型 51系列單片機(jī)內(nèi)的21個(gè)特殊功能寄存器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié),地址為80HFFH。為了能直接訪(fǎng)問(wèn)這些SFR,需要通過(guò)關(guān)鍵字“sfr”對(duì)其進(jìn)行定義,語(yǔ)法如下: sfr sfr_name = 地址常數(shù); sfr_name是一個(gè)特殊功能寄存器名,“=”后面必須是常數(shù),其數(shù)值范圍必須在特殊功能寄存器地址范圍內(nèi),即位于0 x80-0 xFF之間。例如, sfr P1 = 0 x90; /定義P1口地址90H sfr PS
14、W = 0 xD0; /定義PSW地址D0H 對(duì)于16位SFR,要使用關(guān)鍵字“sfr16”,定義的地址必須是16位SFR的低端地址。 sfr16 DPTR = 0 x82;/定義DPTR,其DPL = 82H DPH=83H 注意:不能用sfr16定義定時(shí)器/計(jì)數(shù)器0和1。 sbit可尋址位 在單片機(jī)應(yīng)用中,經(jīng)常要訪(fǎng)問(wèn)特殊功能寄存器中的某些位,用關(guān)鍵字sbit定義可位尋址的特殊功能寄存器的位尋址對(duì)象。定義方法有如下三種:sbit 位變量名 = 位地址 將位的絕對(duì)地址賦給位變量名,位地址必須位于0 x80H0 xFF之間。 例:sbit CY=0 xD7; /將位的絕對(duì)地址賦給變量sbit 位變
15、量名 = SFR名稱(chēng) 位位置 當(dāng)可尋址位位于特殊功能寄存器中時(shí),可采用這種方法。其中SFR名稱(chēng)必須是已定義的SFR的名字,位位置是一個(gè)07之間的常數(shù)。例: sfr PSW = 0 xD0; sbit CY=PSW7; /定義CY位為PSW.7,位地址為 0 xD7sbit 位變量名 = 字節(jié)地址 位位置 這種方法是以一個(gè)字節(jié)地址作為基地址,該地址必須在0 x80H0 xFF之間。例如,sbit CY = 0 xD07; /將位的相對(duì)地址賦給變量 注:C51編譯器把51單片機(jī)常用特殊功能寄存器和特殊位進(jìn)行了統(tǒng)一定義,并存放在 “reg51.h”或“reg52.h” 頭文件中,只須在使用前用預(yù)處理
16、命令#include 把這頭文件包含到程序中,就可使用殊功能寄存器名和特殊位名稱(chēng)。(3)存儲(chǔ)類(lèi)型 51系列單片機(jī)有三個(gè)邏輯存儲(chǔ)空間:片內(nèi)低128B RAM,片外64KB RAM和片內(nèi)外統(tǒng)一編址的64KB ROM。51系列單片機(jī)邏輯存儲(chǔ)空間示意圖 C51的存儲(chǔ)類(lèi)型與存儲(chǔ)空間對(duì)應(yīng)關(guān)系表 注:一個(gè)變量除了與存儲(chǔ)單元相對(duì)應(yīng)外,還與它所在的存儲(chǔ)空間有關(guān),即還需要指出其存儲(chǔ)類(lèi)型。 如果在定義變量時(shí)省略了存儲(chǔ)類(lèi)型標(biāo)識(shí)符,C51編譯器會(huì)根據(jù)當(dāng)前編譯模式自動(dòng)認(rèn)定默認(rèn)的存儲(chǔ)類(lèi)型。編譯模式共分為:小編譯模式(SMALL)、緊湊編譯模式(COMPACT)和大編譯模式(LARGE)三種模式 編譯模式與存儲(chǔ)類(lèi)型(4)變量
17、名 C51對(duì)變量名的規(guī)定與標(biāo)準(zhǔn)C類(lèi)似,由字母、數(shù)字和下劃線(xiàn)三種字符組成,且第一個(gè)字符必須為字母或下劃線(xiàn),變量名長(zhǎng)度無(wú)統(tǒng)一規(guī)定,隨編譯系統(tǒng)而定。 注意:大寫(xiě)和小寫(xiě)字母是兩個(gè)不同的標(biāo)識(shí)符,習(xí)慣上變量用小寫(xiě)表示。變量名除了不可使用標(biāo)準(zhǔn)C語(yǔ)言的32個(gè)關(guān)鍵字外,還要不可使用C51擴(kuò)展的新關(guān)鍵字。 C51擴(kuò)展的21個(gè)關(guān)鍵字一覽表 C51擴(kuò)展的21個(gè)關(guān)鍵字一覽表(續(xù)) 注: 所有變量在使用前必須說(shuō)明,即必須“先定義,后使用”,凡未被定義的,不作為變量名。unsigned char data system_status=0; /定義system_status為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于data區(qū)中且初值
18、為0。 unsigned char bdata status_byte; /定義status_byte為無(wú)符號(hào)字符型自動(dòng)變量,該變量位于bdata區(qū)中。unsigned int code unit_id2=0 x1234, 0 x89ab; /定義unit_id2為無(wú)符號(hào)整型自動(dòng)變量,該變量位于code區(qū)中,為長(zhǎng)度為2的數(shù)組,初值為0 x1234和0 x89ab。static char m, n; /定義m和n為2個(gè)位于data區(qū)中的有符號(hào)字符型靜態(tài)變量。extern float xdata var4; /在片外RAM 空間定義外部實(shí)型變量var4。 C51的指針與標(biāo)準(zhǔn)C的指針幾乎是一樣的,都
19、可以簡(jiǎn)單理解為“存儲(chǔ)某個(gè)地址的變量”。 2. C51的指針 例如要存取變量a中的值時(shí),可以先將變量a的地址放在另一個(gè)變量b中,訪(fǎng)問(wèn)時(shí)先找到變量b,從中取出變量a的地址,然后根據(jù)這個(gè)地址從內(nèi)存單元中取出變量a的值。在這里,變量b稱(chēng)為指針變量。上述說(shuō)法相當(dāng)于 int a=AA; int *b=&a在C51里定義指針,還需要額外指明兩個(gè)問(wèn)題: 1)指針變量自身位于哪個(gè)存儲(chǔ)區(qū)域; 2)該指針的值代表的是哪個(gè)存儲(chǔ)區(qū)域里的地址。在SMALL編譯模式下的例子例1 char xdata a = A; char * ptr = &a; ptr是一個(gè)char型的指針變量,它本身位于默認(rèn)的data存儲(chǔ)區(qū)(因?yàn)樗÷?/p>
20、了存儲(chǔ)類(lèi)型),它的值是xdata存儲(chǔ)區(qū)里變量a的地址。 例2 char xdata a = A; char * ptr = &a; char idata b = B; * ptr = &b; 變量b位于idata存儲(chǔ)區(qū)中,執(zhí)行完*ptr=&b之后,ptr里的值就是idata空間里的b變量的地址。 例3 char idata a = A; 變量a是idata區(qū)域里的變量; char idata * ptr = &a; 定義指針時(shí)就限定它只能指向某一個(gè)區(qū)域,例如idata 例4 若例3中的ptr指針自身位于xdata存儲(chǔ)區(qū),由于指針變量本質(zhì)上也是變量,所以,可在例3的“char idata * p
21、tr”里,為ptr加上指明所在區(qū)域的xdata即可 char idata a = A; char idata * xdata ptr = &a; xdata指明了ptr本身是在xdata存儲(chǔ)區(qū)里的,而它是一個(gè)(char idata *)類(lèi)型的變量,即指向idata區(qū)域的一個(gè)char類(lèi)型的指針。 3. 4. 3 C51的運(yùn)算符說(shuō)明 : (1)關(guān)于/ (除)運(yùn)算的結(jié)果, 若: 兩個(gè)整數(shù)相除 ,運(yùn)算結(jié)果的值為整數(shù)(如 5 / 3,結(jié)果為1) 兩數(shù)中有一個(gè)為負(fù)值時(shí),結(jié)果向零取整。(如-5/3為 -1 兩數(shù)中有一個(gè)為實(shí)數(shù)時(shí),結(jié)果為 double 型1 C51的基本算術(shù)運(yùn)算符基本算術(shù)運(yùn)算符有5種:,* (
22、乘),/ (除), (模運(yùn)算符,又稱(chēng)求余)。-7 % 4 ,7 % -4 ,-7 % -4的值為多少?(2)參加/(模)運(yùn)算的兩數(shù)為整型數(shù)據(jù)結(jié)果, 結(jié)果為整型數(shù)如 7 % 4 的值為 3(-3,3,-3) 關(guān)系運(yùn)算符有6種:(小于)、(大于)、(小于或等于)、(大于或等于)(相等),!(不等于)。2 C51的關(guān)系運(yùn)算符前4種運(yùn)算符的優(yōu)先級(jí)別高(彼此間優(yōu)先級(jí)相同),后兩種運(yùn)算符的優(yōu)先級(jí)較低(彼此間優(yōu)先級(jí)相同)。關(guān)系運(yùn)算的結(jié)果只有兩種:“真”(1)和“假”(0)。例:設(shè)a5,b4,c3,則ab的值為“真”,表達(dá)式的值為1若有賦值語(yǔ)句 d(ab)c按優(yōu)先級(jí),先算ab,表達(dá)式的值為1;再算1c,表達(dá)式
23、的值為0,所以d0。邏輯運(yùn)算符有3種:&(邏輯與),(邏輯或),!(邏輯非)。邏輯運(yùn)算結(jié)果只有兩個(gè):“真”(1)和“假”(0)。3 C51的邏輯運(yùn)算符C51的算術(shù)、關(guān)系、邏輯運(yùn)算符的優(yōu)先級(jí)別見(jiàn)右圖。位操作運(yùn)算符有6種:&(按位與), (按位或),(按位異或), (位取反),(位右移,當(dāng)操作數(shù)為無(wú)符號(hào)數(shù)時(shí),高位補(bǔ)零,為有符號(hào)數(shù),則高位保持原狀態(tài))?!纠?-4】 設(shè)X1001 1110B,Y1010 0101B,則XY的運(yùn)算過(guò)程為:XY的值為0011 1011B。4 C51位操作運(yùn)算符自增減運(yùn)算符有4種:+i(先將i加1,再使用i),-i (先將i減1,再使用i),i+(使用i后,再將i加1),i
24、-(使用i后,再將i減1)?!纠?-6】 設(shè)i值為8,則j+i,使用前i為8,加1后為9,則i、j值都是9;ji+,使用前i為8,先將8賦給j,使用后使i加1,所以i9,j8。5C51自增、減運(yùn)算符復(fù)合賦值運(yùn)算符有10種:,* ,/,。6C51賦值運(yùn)算符7C51復(fù)合賦值運(yùn)算符用賦值運(yùn)算符將變量與表達(dá)式連接起來(lái),就構(gòu)成了賦值表達(dá)式,在賦值表達(dá)式 之后加上分號(hào)“;”便構(gòu)成了賦值語(yǔ)句。X=Y=8;復(fù)合賦值運(yùn)算首先對(duì)變量進(jìn)行某種運(yùn)算,然后將運(yùn)算結(jié)果再賦給變量。采用復(fù)合賦值運(yùn)算符,可使程序簡(jiǎn)化和提高程序編譯效率。例如, x*y+8 等價(jià)于x x *( y+8 )8C51的條件運(yùn)算符條件運(yùn)算符 ? :它是
25、C語(yǔ)言中唯一一個(gè)三目運(yùn)算符邏輯表達(dá)式 ?表達(dá)式1 :表達(dá)式2邏輯表達(dá)式結(jié)果為真時(shí),表達(dá)式的值等于表達(dá)式1的值 ,否則,等于表達(dá)式2的值 。此外,還有逗號(hào)運(yùn)算符、指針和地址運(yùn)算符、強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符、取數(shù)據(jù)類(lèi)型運(yùn)算符。 一個(gè)表達(dá)式后加上“;”就構(gòu)成了表達(dá)式語(yǔ)句,如算術(shù)表達(dá)式、關(guān)系表達(dá)式等。最典型的是用賦值表達(dá)式組成的賦值語(yǔ)句。例如: i = 1; i+;1、表達(dá)式語(yǔ)句C 語(yǔ)言所有的操作都是通過(guò)表達(dá)式來(lái)實(shí)現(xiàn)的。表達(dá)式語(yǔ)句: 表達(dá)式 ; 2、函數(shù)調(diào)用語(yǔ)句函數(shù)調(diào)用語(yǔ)句由函數(shù)名、括號(hào)、實(shí)際參數(shù)加上分號(hào)“;”組成。其一般形式為: 函數(shù)名( 實(shí)際參數(shù)表 ); 例: printf (Hello , world
26、n);“函數(shù)調(diào)用語(yǔ)句”也可以看成是表達(dá)式語(yǔ)句,C語(yǔ)言稱(chēng)為“表達(dá)式語(yǔ)言”。 3.4.4 C語(yǔ)句概述3、控制語(yǔ)句 控制語(yǔ)句用于控制程序流程,以實(shí)現(xiàn)程序的各種基本結(jié)構(gòu)。共有9種控制語(yǔ)句,分成三類(lèi):選擇語(yǔ)句 、循環(huán)語(yǔ)句 和轉(zhuǎn)移語(yǔ)句 。C 使用控制語(yǔ)句控制程序的執(zhí)行,常用的控制語(yǔ)句有:if else switch 選擇控制for while do while 循環(huán)控制continue break return goto 轉(zhuǎn)移控制條件語(yǔ)句有三種格式:格式1: If (條件表達(dá)式) 語(yǔ)句1格式2: If (條件表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2格式3: If (條件表達(dá)式1) 語(yǔ)句1 else if (條件
27、表達(dá)式2)語(yǔ)句2 else if (條件表達(dá)式3)語(yǔ)句3 . else if (條件表達(dá)式m)語(yǔ)句m else 語(yǔ)句 n注意: 1) 當(dāng)條件后面的語(yǔ)句多于一句時(shí),要用一對(duì) “ ”把這些語(yǔ)句括起來(lái)。 2)用格式3實(shí)現(xiàn)多重if else 嵌套時(shí), 注意if-else的配對(duì),else總是和其前面最近的if相配。此外,嵌套層數(shù)會(huì)增加程序閱讀難度。開(kāi)關(guān)語(yǔ)句Switch(表達(dá)式) case 常量表達(dá)式1:語(yǔ)句1 break; case 常量表達(dá)式2:語(yǔ)句2 break; . case 常量表達(dá)式n:語(yǔ)句n break; Default: 語(yǔ)句d循環(huán)語(yǔ)句while (表達(dá)式)其含義是:當(dāng)條件成立時(shí)反復(fù)執(zhí)行循
28、環(huán)體中的語(yǔ)句,直到條件不成立時(shí)為止。do while (條件)for(; ; )break語(yǔ)句作用:跳出當(dāng)前的switch語(yǔ)句或循環(huán)語(yǔ)句流程控制語(yǔ)句continue語(yǔ)句作用:結(jié)束當(dāng)前這一輪循環(huán),即跳過(guò)循環(huán)語(yǔ)句中尚未執(zhí)行的語(yǔ)句,開(kāi)始下一輪循環(huán),而不是結(jié)束整個(gè)循環(huán)。注:continue只用在for、while、do-while等循環(huán)語(yǔ)句中,一般與if語(yǔ)句一起使用,可以加速循環(huán)。返回語(yǔ)句return return (表達(dá)式) return 表達(dá)式 作用:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)。 跳轉(zhuǎn)語(yǔ)句goto 語(yǔ)句標(biāo)號(hào) 作用: 無(wú)條件轉(zhuǎn)移到指定標(biāo)號(hào)處注:最好不使用goto
29、語(yǔ)句4、復(fù)合語(yǔ)句例:while ( i 1) sum = sum + i; i = i + 1;說(shuō)明: 復(fù)合語(yǔ)句的 之后不能有 “;” 允許一行寫(xiě)幾個(gè)語(yǔ)句,或者一條語(yǔ)句寫(xiě)幾行 復(fù)合語(yǔ)句中還可以包含復(fù)合語(yǔ)句由括在 內(nèi)的若干C語(yǔ)句組成5、空語(yǔ)句 只有一個(gè)分號(hào)的語(yǔ)句,不產(chǎn)生任何操作例:for ( i=1; i 100 ; i +) ;空語(yǔ)句什么也不做,可用來(lái)做被轉(zhuǎn)向點(diǎn),或循環(huán)語(yǔ)句中的循環(huán)體(循環(huán)體是空語(yǔ)句,表示循環(huán)體什么也不做)。 當(dāng)程序中出現(xiàn)連續(xù)的兩個(gè)分號(hào)“;”時(shí),一般可把后面的分號(hào)看作空語(yǔ)句。 rept: ; . goto rept; #include char _getkey() char c
30、; while (!RI) ; /*用空語(yǔ)句等待串口接收結(jié)束 C=SBUF; RI=0; return(c); 一個(gè)讀取串口數(shù)據(jù)的函數(shù)不要濫用空語(yǔ)句,以免引起程序誤操作或語(yǔ)法錯(cuò)誤 賦值語(yǔ)句是由賦值表達(dá)式加上一個(gè)分號(hào)構(gòu)成的,是用于實(shí)現(xiàn)計(jì)算和賦值的一類(lèi)最基本的語(yǔ)句。其一般形式如下:可賦值對(duì)象v = 表達(dá)式e; 注意:(1)如果賦值運(yùn)算符兩邊的類(lèi)型不一致,則系統(tǒng)在算出表達(dá)式的值之后,先將該值轉(zhuǎn)換為左邊變量的類(lèi)型,然后再賦值給左邊的變量。 (2)賦值運(yùn)算符“=”右邊的表達(dá)式可以又是一個(gè)賦值表達(dá)式,形式為: 變量=變量=表達(dá)式; (3)在變量說(shuō)明中,不允許連續(xù)給多個(gè)變量賦初值。 6、賦值語(yǔ)句一、 函數(shù)的
31、分類(lèi)與定義1函數(shù)的分類(lèi)(1) 從語(yǔ)言結(jié)構(gòu)劃分,函數(shù)分為主函數(shù)main()和普通函數(shù)兩類(lèi)。(2) 從使用角度劃分,函數(shù)分為標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶(hù)自定義函數(shù)兩類(lèi)。 庫(kù)函數(shù)是C編譯系統(tǒng)提供的一系列標(biāo)準(zhǔn)函數(shù),它們放在一些頭文件中,用戶(hù)可直接調(diào)用,使用它們必須先用# include語(yǔ)句將相應(yīng)頭文件包含在程序中。 用戶(hù)自定義函數(shù)是用戶(hù)按任務(wù)需要編寫(xiě)的函數(shù)。3.4.5 C51函數(shù)及功能(3) 從參數(shù)形式上劃分,函數(shù)分為無(wú)參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)三類(lèi)。 無(wú)參數(shù)函數(shù)調(diào)用時(shí)無(wú)須輸入?yún)?shù),也無(wú)結(jié)果返回。 有參數(shù)函數(shù)調(diào)用時(shí)要給被調(diào)用函數(shù)提供實(shí)質(zhì)參數(shù),被調(diào)用函數(shù)運(yùn)行后產(chǎn)生的結(jié)果也要返回給調(diào)用函數(shù)使用。 空函數(shù)是內(nèi)無(wú)語(yǔ)句的
32、空白函數(shù),調(diào)用時(shí)不產(chǎn)生任何操作,這種函數(shù)用于功能備用,以便擴(kuò)充。2函數(shù)的定義(1) 無(wú)參數(shù)函數(shù)的定義形式: 返回值類(lèi)型標(biāo)識(shí)符 函數(shù)名() 函數(shù)體語(yǔ)句無(wú)參數(shù)函數(shù)通常不帶返回值,因此標(biāo)識(shí)符可省略或用void。(2) 有參數(shù)函數(shù)的定義形式:返回值類(lèi)型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)表)形式參數(shù)說(shuō)明函數(shù)體語(yǔ)句return(返回參數(shù)名)(3) 空函數(shù)的定義形式:返回值類(lèi)型說(shuō)明符 函數(shù)名() 用return(返回)語(yǔ)句使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)。3. 函數(shù)的返回值 void型函數(shù)(不需要返回值),無(wú)return語(yǔ)句。 對(duì)于int類(lèi)型的函數(shù),不寫(xiě)return語(yǔ)句時(shí),相當(dāng)于執(zhí)行了
33、rerun 0;語(yǔ)句。 return 語(yǔ)句中表達(dá)式的值一般應(yīng)與函數(shù)類(lèi)型一致。二、 函數(shù)的調(diào)用函數(shù)一般調(diào)用形式定義為:函數(shù)名(實(shí)際參數(shù)表列)無(wú)參數(shù)函數(shù)不存在“實(shí)際參數(shù)表列”。有參數(shù)函數(shù)的“實(shí)際參數(shù)表列”的各參數(shù)之間用逗號(hào)隔開(kāi),主調(diào)函數(shù)與被調(diào)函數(shù)的形式參數(shù)數(shù)目應(yīng)該相等,實(shí)際參數(shù)按順序依次對(duì)應(yīng)傳遞給形式參數(shù)。函數(shù)調(diào)用有三種方式:(1) 使用函數(shù)調(diào)用語(yǔ)句,被調(diào)函數(shù)名作為主調(diào)函數(shù)中的一個(gè)語(yǔ)句。如:print_message(); /*message()是被調(diào)用函數(shù) */(2) 被調(diào)函數(shù)作為表達(dá)式的運(yùn)算對(duì)象。如:result5*good(x,y)(3) 被調(diào)函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)。如:mmin(x,
34、alpha(a,b)三、函數(shù)調(diào)用條件主調(diào)函數(shù)調(diào)用被調(diào)函數(shù),必須滿(mǎn)足如下條件:(1) 被調(diào)函數(shù)必須已經(jīng)存在,是庫(kù)函數(shù)或用戶(hù)自定義函數(shù)。(2) 程序中如要使用庫(kù)函數(shù),或使用不在同一文件中的其它用戶(hù)定義函數(shù),必須在程序的開(kāi)頭用#include語(yǔ)句,將所用函數(shù)信息包括到程序中來(lái)(3) 如被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之后,應(yīng)在主調(diào)函數(shù)前對(duì)被調(diào)函數(shù)的返回值類(lèi)型予以說(shuō)明。說(shuō)明方式為:返回值類(lèi)型被調(diào)函數(shù)名(形式參列)【例】 被調(diào)函數(shù)在主調(diào)函數(shù)后,需要說(shuō)明。 main() int max();/*被調(diào)函數(shù)說(shuō)明*/ int x = 70, y = 40, m; m=max(X,Y); int max(a,b);/*被調(diào)
35、函數(shù),在主調(diào)函數(shù)之后出現(xiàn)*/int a,b;return(ab?a:b);(4) 被調(diào)函數(shù)說(shuō)明的語(yǔ)句int max(a,b)也可以移至主調(diào)函數(shù)man()前,可不必說(shuō)明。 int max(a,b); /*被調(diào)函數(shù),在主調(diào)函數(shù)之前出現(xiàn)*/int a,b;return(ab?a:b);main() /*主調(diào)函數(shù),函數(shù)內(nèi)無(wú)被調(diào)函數(shù)說(shuō)明int max();*/int x = 70, y = 40, m;m=max(X,Y);(1) 函數(shù)是C51程序的基本單位,一個(gè)C51程序至少有一個(gè)主函數(shù)main(),也可以由一個(gè)主函數(shù)main()和若干個(gè)其它函數(shù)構(gòu)成。若干其它函數(shù)受主函數(shù)調(diào)用,被調(diào)用的函數(shù)既可以是編譯
36、器提供的庫(kù)函數(shù),也可以是用戶(hù)自己根據(jù)需要設(shè)定編制的函數(shù)。(2) 一個(gè)函數(shù)由函數(shù)說(shuō)明部分和函數(shù)體兩部分組成。(3) 函數(shù)說(shuō)明部分由函數(shù)名、函數(shù)類(lèi)型、函數(shù)屬性、函數(shù)參數(shù)名和形式參數(shù)類(lèi)型組成,其中允許沒(méi)有函數(shù)參數(shù),函數(shù)名后面必須有1個(gè)圓括號(hào),括號(hào)內(nèi)就是可有可無(wú)的形式參數(shù)表。(4) 函數(shù)體是用大括號(hào)圍起來(lái)的部分。大括號(hào)內(nèi)有兩部分內(nèi)容:一部分是變量及變量的定義;另一部分是由若干語(yǔ)句組成的執(zhí)行部分。如果一個(gè)函數(shù)內(nèi)有多個(gè)大括號(hào),則最外層的一對(duì)大括號(hào)為函數(shù)體的范圍。有的函數(shù)體既有變量定義部分,又有執(zhí)行部分;有的函數(shù)體僅有執(zhí)行部分無(wú)變量定義部分;有的函數(shù)這兩部分都沒(méi)有。 3.4.6 C51程序設(shè)計(jì)的編程規(guī)則(5
37、) 語(yǔ)句的組成規(guī)則為:每個(gè)變量必須先定義后使用;變量名由英文字母組成,英文字母要區(qū)分大小寫(xiě),大小寫(xiě)不同則變量名不同;書(shū)寫(xiě)格式自由,一行可以寫(xiě)多個(gè)語(yǔ)句,一個(gè)語(yǔ)句也可以寫(xiě)成多行,但每條語(yǔ)句必須以“;”結(jié)尾;分號(hào)是C語(yǔ)言的必須組成部分,每個(gè)語(yǔ)句和數(shù)據(jù)在定義的最后必須有一個(gè)分號(hào),程序的最后一個(gè)語(yǔ)句也應(yīng)有分號(hào)。(6) C語(yǔ)言對(duì)I/O操作實(shí)現(xiàn)了“函數(shù)化”,分別調(diào)用庫(kù)函數(shù)scanf和printf等函數(shù)完成,無(wú)專(zhuān)門(mén)的輸入/輸出語(yǔ)句。(7) C51的注釋用/*/表示,有了注釋?zhuān)喿x程序更方便。C51程序結(jié)構(gòu)如下:全局變量說(shuō)明/*可被各函數(shù)引用*/main()/*主函數(shù)*/*函數(shù)體開(kāi)始*/局部變量說(shuō)明/*限于在本
38、函數(shù)內(nèi)使用*/執(zhí)行語(yǔ)句(包括調(diào)用其它函數(shù)的語(yǔ)句)/*主函數(shù)的函數(shù)體結(jié)束*/function 1(形式參數(shù)表)/*可被調(diào)用的一個(gè)函數(shù)*/形式參數(shù)說(shuō)明/*函數(shù)1的函數(shù)體開(kāi)始*/局部變量說(shuō)明執(zhí)行語(yǔ)句(包括調(diào)用其它函數(shù)的語(yǔ)句)/*函數(shù)1的函數(shù)體結(jié)束*/function n(形式參數(shù)表)/*可被調(diào)用的第n個(gè)函數(shù)*/*格式同函數(shù)1,從“”開(kāi)始,到“”結(jié)束*/3.5 C51初步應(yīng)用編程 1. I/O端口的簡(jiǎn)單應(yīng)用 (1)基本輸入輸出單元與編程 輸出: 發(fā)光二極管作為輸出狀態(tài)顯示設(shè)備具有電路簡(jiǎn)單、功耗低、壽命長(zhǎng)、響應(yīng)速度快等特點(diǎn)。 最簡(jiǎn)單的發(fā)光二極管接口形式是通過(guò)限流電阻R直接掛在IO口線(xiàn)上,限流電阻通常取1
39、001k左右發(fā)光二極管與單片機(jī)的簡(jiǎn)單接口 輸入 按鍵、開(kāi)關(guān)是最基本的輸入設(shè)備,與單片機(jī)相連的簡(jiǎn)單方式是直接與IO口線(xiàn)連接。當(dāng)按鍵、開(kāi)關(guān)閉合時(shí),對(duì)應(yīng)口線(xiàn)的電平就會(huì)發(fā)生反轉(zhuǎn),CPU通過(guò)讀端口電平即可識(shí)別是哪個(gè)按鍵或開(kāi)關(guān)閉合。注意:P0口內(nèi)部結(jié)構(gòu)為漏極開(kāi)路狀態(tài),因此與按鍵或開(kāi)關(guān)接口時(shí)需要有上拉電阻,而P1-P3不需要。 按鍵或開(kāi)關(guān)與單片機(jī)的簡(jiǎn)單接口 獨(dú)立按鍵識(shí)別和控制LED點(diǎn)亮程序設(shè)計(jì)要求開(kāi)始時(shí)LED均熄滅,隨后根據(jù)按鍵動(dòng)作點(diǎn)亮相應(yīng)LED,按鍵釋放后繼續(xù)保持直至新的按鍵按下為止。電路如下圖由電路可知,接于P0.0-P0.3的任意一個(gè)按鍵按下時(shí),相應(yīng)端口的電平將由“1”狀態(tài)變?yōu)椤?”狀態(tài);而接于P2.
40、0-P2.3的任意一個(gè)LED在端口輸出“1” 時(shí)將被點(diǎn)亮。 參考程序如下 #include / 定義 51寄存器頭文件包含到程序中void main(void) char key =0; /定義一個(gè)變量,初值為0 P2 = 0; /熄滅所有LEDP0 = 0 xff; / 向P0寫(xiě)“1”,使P0口可正確讀入按鍵狀態(tài) while(1) /循環(huán) key =P0 & 0 x0f ; /將P0口讀入的按鍵狀態(tài)取反并 /與0f H按位與,清高4位留低4位if (key != 0) P2 = key ; / key不為0有鍵按下則將key / 送P2口控制相應(yīng)的LED點(diǎn)亮 /否則,再循環(huán)讀按鍵狀態(tài) 編程界
41、面和運(yùn)行界面分別如圖 例2 :鍵控流水燈 在上例電路圖的基礎(chǔ)上,編寫(xiě)可鍵控的流水燈程序。要求實(shí)現(xiàn)功能為,當(dāng)K1 按下時(shí),要求流水燈流動(dòng);K2 按下時(shí)停止流動(dòng),且全部燈滅;K3按下時(shí)使燈由上往下流動(dòng),K4 則使燈由下往上流動(dòng)。 程序說(shuō)明 判斷按鍵動(dòng)作,并根據(jù)按鍵的組合狀態(tài)控制流水燈狀態(tài)。流水燈控制碼事先存放在數(shù)組中。 本例電路中LED為低電平驅(qū)動(dòng),故控制碼中輸出0電平對(duì)應(yīng)著燈亮,反之,1電平對(duì)應(yīng)著燈滅。流水速度可以根據(jù)需要調(diào)整延時(shí)數(shù)值了。 參考程序如下 /定義數(shù)組,并將控制各位燈亮的碼作為/初值放入其中/定義delay延時(shí)函數(shù)(帶參數(shù)time)/定義內(nèi)循環(huán)控制變量j/定義按鍵掃描函數(shù)/若無(wú)按鍵返
42、回0,否則返回/從P0口讀入的按鍵狀態(tài)(高/ 4位被清0。/定義兩個(gè)位變量dir,run,并賦初值/定義int型變量i/根據(jù)key函數(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í)函數(shù)/否則(dir=0),控制LED/由i控制反序取出控制碼/送P2/送P2/調(diào)用延時(shí)函數(shù)第4章單片機(jī)的C51語(yǔ)言
43、Keil項(xiàng)目和程序界面如下圖所示 (2)LED數(shù)碼管原理與編程 數(shù)碼管這種七段顯示器內(nèi)部由7個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,分為兩種:共陰極 所有二極管的陰極連接在一起為公共端共陽(yáng)極 所有二極管的陽(yáng)極連接在一起為公共端單個(gè)數(shù)碼管的引腳配置如下圖所示,其中com為公共端。共陰極共陽(yáng)極comcom又稱(chēng)COM:字選線(xiàn) adp:段選線(xiàn) 給a-g7個(gè)發(fā)光二極管和dp加正電壓點(diǎn)亮,加零電壓熄滅,不同亮暗的組合形成不同的字形,這種組合成為段碼。 共陽(yáng)極七段碼共陰極七段碼C0HF9HA4HB0H99H92H82HF8H80H90H3FH06H5BH4FH66H6DH7DH07H7FH6FH用1個(gè)I
44、/O口線(xiàn)控制 dp g f e d c b a 用8位I/O口線(xiàn)控制數(shù)碼管,若其各位與七段發(fā)光管和小數(shù)位發(fā)光管的對(duì)應(yīng)關(guān)系如下的話(huà): D7 D6 D5 D4 D3 D2 D1 D0 dp g f e d c b a則LED顯示的字型和字段(控制)碼有如下的對(duì)應(yīng)關(guān)系。 例3:LED數(shù)碼管顯示 將單片機(jī)P0口的P0.0-P0.7與1個(gè)共陰極數(shù)碼管的a-dp引腳相連,編程控制循環(huán)顯示0-9數(shù)字,時(shí)間間隔0.2s。硬件電路原理圖程序設(shè)計(jì): 顯示的數(shù)字0-9的段碼之間沒(méi)有規(guī)律可循,故采取查表的方式來(lái)完成所需段碼的獲取。按數(shù)字的順序存放待顯示字型的字段碼。在程序中建立字段碼數(shù)組led_mod 如下:0 x3
45、f, 0 x06, 0 x5b ,0 x4f, 0 x66, 0 x6d, 0 x7d, 0 x07, 0 x7f, 0 x6f。定義i變量初值為0 i=0 i=9NYP0= led_modi 延時(shí) i=i+1主函數(shù)流程參考程序 /定義帶參的延時(shí)函數(shù),形參time/定義整型變量j,控制內(nèi)循環(huán)/time控制外循環(huán)/定義主函數(shù)/內(nèi)循環(huán)體為空語(yǔ)句/定義字符型變量i, 用于控制循環(huán)和取數(shù)組元素/循環(huán)取各數(shù)字字段碼送P0口顯示/延時(shí)例4: 靜態(tài)顯示方式的計(jì)數(shù)顯示器 對(duì)按鍵動(dòng)作進(jìn)行統(tǒng)計(jì),并將按鍵次數(shù)通過(guò)數(shù)碼管顯示。要求顯示范圍為1-99,增量為1,超過(guò)99后自動(dòng)循環(huán)顯示。 硬件電路原理圖P3.7采用共陽(yáng)極
46、數(shù)碼管簡(jiǎn)單按鍵接口P3.7程序設(shè)計(jì): 初始顯示00,定義1個(gè)計(jì)數(shù)變量,不斷掃描按鍵,有按鍵計(jì)數(shù)變量加1,并判斷是否超范圍,超則將其置為0。改變顯示的數(shù),方法是:將計(jì)數(shù)結(jié)果拆分成十位和個(gè)位(計(jì)數(shù)值整除10得到十位上的數(shù)值,它對(duì)10 取模得到個(gè)位上的數(shù)值),再分別查找取出對(duì)應(yīng)字段碼送相應(yīng)顯示端口。檢測(cè)等待按鍵松開(kāi),如此反復(fù) 。計(jì)數(shù)變量count=0,設(shè)P3.7做輸入,0的字段碼送p0、p1口 count=0NYP0= tablecount/10P1= tablecount%10 延時(shí) count+1主函數(shù)流程P3.7=0P3.7=0Ncount=100?YYN 等鍵釋放參考程序 P3_7=1;,將
47、P3_7置1以保證正確輸入P1/P1P1;/P1例5. 數(shù)碼管動(dòng)態(tài)顯示原理與編程 數(shù)碼管與單片機(jī)的接口方式有靜態(tài)顯示接口和動(dòng)態(tài)顯示接口之分。 靜態(tài)顯示:靜態(tài)顯示接口是一個(gè)并行口接一個(gè)數(shù)碼管,其優(yōu)點(diǎn)是:被顯示數(shù)據(jù)只要送入并行口后就不再需要CPU干預(yù),因而顯示效果穩(wěn)定。但該方法占用資源較多 動(dòng)態(tài)顯示:動(dòng)態(tài)顯示接口是將所有數(shù)碼管的個(gè)段碼線(xiàn)對(duì)應(yīng)端并聯(lián)起來(lái)分別接在8位并行口的對(duì)應(yīng)口線(xiàn)上,而每位數(shù)碼管的公共端分別由另外一個(gè)口的不同I/O線(xiàn)控制。 數(shù)碼管動(dòng)態(tài)顯示接口示意圖 動(dòng)態(tài)顯示:動(dòng)態(tài)顯示采用循環(huán)導(dǎo)通1位數(shù)碼管截止其它數(shù)碼管的做法。當(dāng)循環(huán)顯示間隔時(shí)間較?。ㄈ?0ms)時(shí),由于人眼的暫留特性,將看不出數(shù)碼管
48、的閃爍。動(dòng)態(tài)顯示接口的特點(diǎn)是占用資源較少,但由于顯示值需要CPU隨時(shí)刷新,故占用機(jī)時(shí)較多。 六位共陰極LED動(dòng)態(tài)顯示接口7407驅(qū)動(dòng)LED的段P1.0P1.5作位選經(jīng)7404驅(qū)動(dòng)連接各LED的com端要求數(shù)碼管從左至右顯示123456。程序設(shè)計(jì)將要顯示的數(shù)123456的七段碼依次放入數(shù)組從數(shù)組中取第1個(gè)七段碼送P0口,控制從左開(kāi)始選通數(shù)碼管顯示,顯示幾毫秒后,左移修改字選控制碼。然后從數(shù)組取下一待顯數(shù)的七段碼送P0口在下一位顯示,如此循環(huán)逐位顯示完6位,再?gòu)念^開(kāi)始。#include char led_mod =0 x06, 0 x5b ,0 x4f, 0 x66, 0 x6d, 0 x7d;v
49、oid delay(unsigned int time);void main() unsigned char i; /定義控制從數(shù)組中取七段碼的位置變量 unsigned char led_vei; /定義存字選控制碼變量while(1) led_vei = 0 x01; /字選控制碼初值(點(diǎn)亮最左邊數(shù)碼管) for(i = 0;i 0; time-) for(j=0; j125; j+) ; (3)行列式鍵盤(pán)原理與編程 前面例題中的按鍵都是每鍵分別接在一根IO口線(xiàn)上,這稱(chēng)為獨(dú)立式鍵盤(pán)。它的電路簡(jiǎn)單,易于編程,但占用的IO口線(xiàn)較多,當(dāng)需要較多按鍵時(shí)可能產(chǎn)生IO資源緊張問(wèn)題,這時(shí)應(yīng)采用行列式鍵盤(pán)
50、。行列式鍵盤(pán)方案的一般做法是,將IO口分為行線(xiàn)和列線(xiàn),按鍵置于行線(xiàn)和列線(xiàn)交叉位置的上方,行線(xiàn)則通過(guò)上拉電阻接正電源。按鍵壓下時(shí),行線(xiàn)和列線(xiàn)將發(fā)生短接,利用軟件掃描技術(shù)可以判斷出閉合狀態(tài)。44行列式鍵盤(pán)硬件電路圖 行列式(矩陣)鍵盤(pán)識(shí)別的常用方法有兩種: 列掃描法 線(xiàn)反轉(zhuǎn)法1) 列掃描法(逐列進(jìn)行) 向某列線(xiàn)發(fā)出低電平信號(hào), 如該列線(xiàn)上所設(shè)置的鍵沒(méi)有任何一個(gè)按下的話(huà), 則行線(xiàn)端口讀回的是全“1”信號(hào), 否則,得到非全“1”信號(hào),且為“0”位的位置對(duì)應(yīng)按鍵所在行的位置。 找到閉合鍵后, 獲取其鍵值, 據(jù)此轉(zhuǎn)至該鍵對(duì)應(yīng)的功能程序。 為防止多鍵同時(shí)按下, 往往從第 0 列一直掃描到最后 1 列, 若只
51、發(fā)現(xiàn) 1 個(gè)閉合鍵, 則為有效按鍵, 否則,全部作廢。 行和列是人為認(rèn)定的,為此認(rèn)定:通過(guò)上拉電阻接電源的口線(xiàn)對(duì)應(yīng)的是行線(xiàn)。 按鍵在閉合和斷開(kāi)瞬間會(huì)因彈簧開(kāi)關(guān)的變形而產(chǎn)生電壓波動(dòng)現(xiàn)象,其按鍵抖動(dòng)波形如圖 按鍵抖動(dòng)會(huì)造成一次按鍵對(duì)應(yīng)多次響應(yīng)的問(wèn)題,需要采用措施消除抖動(dòng)影響。單片機(jī)常用軟件延時(shí)10ms的辦法來(lái)消除抖動(dòng)的影響。當(dāng)檢測(cè)到有鍵按下時(shí),先延時(shí)10ms,然后再檢測(cè)按鍵的狀態(tài),若仍是閉合狀態(tài),則認(rèn)為真正有鍵按下。當(dāng)需要檢測(cè)到按鍵釋放時(shí),也需做同樣的處理。 a.先檢查是否鍵按下。向列線(xiàn)端口送全列掃描碼(列線(xiàn)全送“0”),行線(xiàn)端口做輸入(行線(xiàn)全送“1”),然后,讀入行線(xiàn)端口的狀態(tài),若行線(xiàn)中有為0位
52、(即非全“1”),則有鍵按下。c.判斷按鍵位置。 進(jìn)行逐列掃描,被掃描列送0,其余列送“1”,每次均讀入行線(xiàn)端口狀態(tài),看哪條行線(xiàn)為“0” 。由行、列線(xiàn)的狀態(tài)可判斷是哪個(gè)鍵被按下(為“0”的行、列交叉處) d.計(jì)算確定按鍵的鍵號(hào) N N=為0行的行首鍵號(hào)+(發(fā)現(xiàn)按鍵時(shí)正掃描的)列號(hào) 具體實(shí)現(xiàn)步驟b.有鍵按下則延時(shí)除抖動(dòng)。即延時(shí)20mS左右,再次讀行線(xiàn)端口看是否仍為有鍵按下,若有,則確認(rèn)為一次有效按鍵。4行X4列矩陣鍵盤(pán)控制如圖P1.4 - P1.7控制行線(xiàn)P1.0 - P1.3控制列線(xiàn)列掃描法匯編程序設(shè)計(jì)行置1MOV 30H,#0 ; 存鍵值單元清0MOV P1,#0F0H ;列全“0”行全“1
53、”MOV A, P1 ;讀P1口ANL A,#0F0H ;保留高4位CJNE A,#0F0H, JIN ;判是否有按鍵,RETJIN:ACALL DELAY20msJIN0: MOV R2, #4 ;循環(huán)列掃描次(R2記錄掃到第幾列)MOV R3,#01H ;起始列掃描碼 R3,初始掃3號(hào)列JIN1: MOV A, R3 ; 當(dāng)前掃描碼ACPL A ;獲得本次列掃描信號(hào)MOV P1, A ;列掃描輸出MOV A, P1 ;讀鍵盤(pán)ANL A, #0F0H ;保留讀回的行信息CJNE A,#0F0H, JIN2 ;判斷有無(wú)按鍵,有則轉(zhuǎn)JIN2MOV A, R3;無(wú)按鍵,列掃描碼A,準(zhǔn)備掃下一列01
54、23456789101112131415+5vP1.7P1.6P1.5P1.4P1.3P1.2P1.1P.103號(hào)列0號(hào)列RL A ;A右移1位, 修改列掃描碼MOV R3, A ;保存當(dāng)前列掃描碼DJNZ R2, JIN1 ;4列未掃完繼續(xù)循環(huán)RET ;無(wú)鍵按下返回JIN2:DEC R2 ;獲得按鍵所在列的列號(hào)MOV R1,#0; 0行行首鍵號(hào) R1JNB ACC.7, JIN3 ;是0行有鍵按下則轉(zhuǎn)JIN3MOV R1,#4 ;否則,1行行首鍵號(hào) R1JNB ACC.6, JIN3 ;是1行有鍵按下則轉(zhuǎn)JIN3MOV R1,#8 ;否則, 2行行首鍵號(hào) R1JNB ACC.5, JIN3
55、;是2行有鍵按下則轉(zhuǎn)JIN3MOV R1,#12 否則, 3行行首鍵號(hào) R1JIN3:MOV A, R1 ;按鍵所在行的行首鍵號(hào) AADD A,R2;計(jì)算鍵值=行首鍵號(hào)+列號(hào)MOV 30H,A ;存鍵值到30H單元JN4:MOV A,P1 ;讀鍵盤(pán),等待鍵釋放ANL A,#0F0H ;保留行狀態(tài)值 CJNE A,#0F0H, JN4 ;若行狀態(tài)值不為全”1”則轉(zhuǎn)RET 2) 線(xiàn)反轉(zhuǎn)法 線(xiàn)反轉(zhuǎn)法比列掃描法速度快, 但在硬件上要求行線(xiàn)與列線(xiàn)外接上拉電阻。方法如下: 先將行線(xiàn)作為輸出, 列線(xiàn)作為輸入,行線(xiàn)輸出全“0”、列線(xiàn)全“1”, 接著讀入列線(xiàn)的值; 然后,再將行線(xiàn)作為輸入,列線(xiàn)作為輸出, 并將剛
56、才讀到的列線(xiàn)值從列線(xiàn)所接的端口輸出, 再讀取行線(xiàn)的輸入值。那么在閉合鍵所在的行線(xiàn)上值必為 0。 這樣, 當(dāng)一個(gè)鍵被按下時(shí), 必定可讀到一對(duì)唯一的只有1位為0的行、列值。 根據(jù)上兩步的結(jié)果,可確定按鍵所在行和列。 a. 先將行線(xiàn)編程為輸入,列線(xiàn)輸出全0列信號(hào),讀入行線(xiàn)狀態(tài),若非全1則有鍵按下,此時(shí),為0位對(duì)應(yīng)行為按鍵所在行線(xiàn)反轉(zhuǎn)法具體實(shí)現(xiàn)步驟 b. 再將行線(xiàn)編程為輸出,列線(xiàn)做輸入,行線(xiàn)輸出全0行信號(hào),讀入列線(xiàn)狀態(tài),此時(shí)為0位對(duì)應(yīng)列為按鍵所在列。 c .計(jì)算該按鍵的鍵號(hào) N=行首鍵號(hào)+列號(hào)線(xiàn)反轉(zhuǎn)法鍵盤(pán)掃描流程與寫(xiě)入的相等否與寫(xiě)入的相等否例6 行列式鍵盤(pán)應(yīng)用 44行列式鍵盤(pán)電路原理圖如下,要求按任意
57、按鍵后,顯示出該按鍵對(duì)應(yīng)的數(shù)(0-F)。 第一行第一列若用8位2進(jìn)制數(shù)用以下方式來(lái)表示鍵編碼:高4位對(duì)應(yīng)行、低4位對(duì)應(yīng)列,每個(gè)鍵的編碼是,除其所在行、列對(duì)應(yīng)位為1外,其余位為0,則有:1行1列鍵編碼11H2行1列鍵編碼21H3行1列鍵編碼41H4行1列鍵編碼81H1行2列鍵編碼12H2行2列鍵編碼22H.3行3列鍵編碼44H4行3列鍵編碼84H.4行4列鍵編碼88H0124EFDC589BP2P3.7P3.0參考程序 0-F16個(gè)數(shù)符的共陰七段碼依次放入led_mod數(shù)組0-F16個(gè)鍵對(duì)應(yīng)的編碼依次放入key_buf數(shù)組/ 說(shuō)明掃描鍵盤(pán)返回鍵值函數(shù) 本程序有鍵盤(pán)掃描和軟件延時(shí)兩個(gè)子程序函數(shù),主
58、函數(shù)調(diào)用鍵盤(pán)掃描子程序,獲取用戶(hù)按鍵對(duì)應(yīng)值年,完成靜態(tài)顯示。/ 帶參延時(shí)函數(shù)線(xiàn)反轉(zhuǎn)法掃描鍵盤(pán)返回鍵值(該數(shù)對(duì)應(yīng)段碼在led_mod中的位置)k1存首次發(fā)現(xiàn)有鍵按下時(shí)的鍵盤(pán)狀態(tài),k2存按鍵碼送全列掃描碼:行線(xiàn)高電平、列線(xiàn)低電平/調(diào)用鍵盤(pán)掃描函數(shù),返回鍵值送key保存/key用來(lái)存放按鍵對(duì)應(yīng)值/00H送P2口,滅數(shù)碼管/有鍵按下則據(jù)鍵值從led_mod中/取對(duì)應(yīng)段碼送P2口顯示/延時(shí)一段時(shí)間/讀回P3的值不等于f0H則有鍵按下,否則無(wú)按鍵/有鍵按下則讀回P3的狀態(tài)存k1,/若鍵盤(pán)狀態(tài)與前鍵盤(pán)狀態(tài)k1相同則確有鍵按下/送全行掃描碼,行線(xiàn)全0,列線(xiàn)全1/全行、列掃描讀回值相或后取反,得鍵編碼/據(jù)鍵編碼
59、在key_buf 中搜索,k2=(P3k1);/無(wú)鍵按下則返回 -1/延時(shí)(4) 并行I/O口綜合應(yīng)用:步進(jìn)電機(jī)的控制與編程 步進(jìn)電機(jī)是一個(gè)數(shù)字角度轉(zhuǎn)換器,也是一個(gè)串行的數(shù)模轉(zhuǎn)換器,它是用電脈沖控制轉(zhuǎn)動(dòng)速度和轉(zhuǎn)角的電磁機(jī)械裝置。 步進(jìn)電機(jī)最大的應(yīng)用是在數(shù)控機(jī)床的制造中,因?yàn)槠洳恍枰狝/D轉(zhuǎn)換,能直接將數(shù)字脈沖信號(hào)轉(zhuǎn)化成角位移,所以,是理想的數(shù)控機(jī)床的執(zhí)行元件。如:步進(jìn)電機(jī)用作數(shù)控銑床進(jìn)給伺服機(jī)構(gòu)的驅(qū)動(dòng)電動(dòng)機(jī) 。 步進(jìn)電機(jī)還可用在其他機(jī)械上,如:作為自動(dòng)送料機(jī)和軟盤(pán)驅(qū)動(dòng)器的馬達(dá),也可應(yīng)用在打印機(jī)和繪圖儀中。 步進(jìn)電機(jī)是過(guò)程控制及儀表中的主要控制元件,廣泛用于定位系統(tǒng)。步進(jìn)電機(jī)的工作、控制原理 磁
60、極上有5個(gè)均勻分布的矩形小齒,轉(zhuǎn)子上沒(méi)有繞組,而有40個(gè)小齒均勻分布在其圓周上,且相鄰兩個(gè)齒之間的夾角為9。 步進(jìn)電機(jī)上的定子有6個(gè)等間距的磁極,兩個(gè)相鄰磁極之間的夾角為60,線(xiàn)圈繞過(guò)相對(duì)的兩個(gè)磁極,構(gòu)成一相(A-A,B-B,C-C)。 這使定子上相鄰兩磁極間對(duì)應(yīng)轉(zhuǎn)子上的小齒數(shù)為 6 個(gè),出現(xiàn)了錯(cuò)齒現(xiàn)象。23 給某組繞組通電時(shí),相應(yīng)的兩個(gè)磁極就形成N-S極,產(chǎn)生磁場(chǎng),并與轉(zhuǎn)子形成磁路。若這時(shí)定子的小齒與轉(zhuǎn)子沒(méi)有對(duì)齊,則在磁場(chǎng)的作用下轉(zhuǎn)子將轉(zhuǎn)動(dòng)一定的角度,使轉(zhuǎn)子齒與定子齒對(duì)齊,從而使步進(jìn)電機(jī)向前“走”一步,轉(zhuǎn)動(dòng)一個(gè)固定的步距(進(jìn))角度。 通電一周,轉(zhuǎn)子轉(zhuǎn)過(guò)一個(gè)齒距角,一個(gè)齒距角分N步(拍)走完。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人力資源咨詢(xún)顧問(wèn)合同書(shū)
- 產(chǎn)品售后服務(wù)情況說(shuō)明表
- 制造業(yè)企業(yè)知識(shí)產(chǎn)權(quán)保護(hù)策略研究
- 光纜遷移施工方案范本
- 橡膠跑道施工方案
- 涼山道路施工方案
- TCSMT YB011-2024 天然氣發(fā)熱量測(cè)量裝置測(cè)試技術(shù)規(guī)范
- 建筑工程人工費(fèi)承包合同-@-1
- 物業(yè)地面處理方案
- 透水砼路面施工方案
- 《農(nóng)村合作金融機(jī)構(gòu)非信貸資產(chǎn)風(fēng)險(xiǎn)分類(lèi)指引》(銀監(jiān)發(fā)[2007]29號(hào))
- 電纜敷設(shè)施工方案及安全措施范文
- 卡通手繪可愛(ài)小兔子PPT模板
- 小兒體格檢查(課堂PPT)
- ppt模板:信保專(zhuān)用中國(guó)出口信用保險(xiǎn)公司課件
- (高清版)建筑塑料復(fù)合模板工程技術(shù)規(guī)程JGJ_T 352-2014
- 人教版八年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教案(完整版)教學(xué)設(shè)計(jì)
- 電機(jī)零部件中英文對(duì)照表
- 設(shè)備安裝工程監(jiān)理規(guī)劃
- 注冊(cè)安全工程師(延續(xù)注冊(cè))履職情況說(shuō)明
- 路長(zhǎng)制巡查記錄表
評(píng)論
0/150
提交評(píng)論