單片機(jī)原理與應(yīng)用-基于AT89S51+Proteus仿真 第2版 課件 第3、4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì)、單片機(jī)的C語言程序設(shè)計(jì)_第1頁
單片機(jī)原理與應(yīng)用-基于AT89S51+Proteus仿真 第2版 課件 第3、4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì)、單片機(jī)的C語言程序設(shè)計(jì)_第2頁
單片機(jī)原理與應(yīng)用-基于AT89S51+Proteus仿真 第2版 課件 第3、4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì)、單片機(jī)的C語言程序設(shè)計(jì)_第3頁
單片機(jī)原理與應(yīng)用-基于AT89S51+Proteus仿真 第2版 課件 第3、4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì)、單片機(jī)的C語言程序設(shè)計(jì)_第4頁
單片機(jī)原理與應(yīng)用-基于AT89S51+Proteus仿真 第2版 課件 第3、4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì)、單片機(jī)的C語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩142頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

單片機(jī)原理與應(yīng)用第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)內(nèi)容指南:單片機(jī)的工作就是執(zhí)行程序,而程序是指令的有序集合。匯編語言是最基本的編程方式,而C語言則是單片機(jī)程序開發(fā)的主流。對于應(yīng)用C語言程序開發(fā)的讀者來說,了解單片機(jī)的指令系統(tǒng)和匯編語言也是十分必要的。本章主要介紹AT89S51單片機(jī)的指令系統(tǒng)與匯編語言程序設(shè)計(jì)。學(xué)習(xí)目標(biāo):掌握51單片機(jī)指令系統(tǒng)與匯編語言程序的基本概念。了解51單片機(jī)匯編指令的分類、語法規(guī)則、功能及程序用法。了解匯編語言程序設(shè)計(jì)步驟及編程方法。第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)3.1指令系統(tǒng)概述3.2尋址方式3.3指令詳解3.4匯編語言程序設(shè)計(jì)

第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)數(shù)據(jù)傳送類(28條)算術(shù)運(yùn)算類(24條)邏輯運(yùn)算類(25條)控制轉(zhuǎn)移類(17條)位操作類(17條)指令系統(tǒng)——計(jì)算機(jī)中全部指令的集合51單片機(jī)共有111條指令,按功能可劃分為五大類:指令——CPU用于指揮功能部件完成某一指定動作的指示

和命令第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)CPU能直接識別并執(zhí)行的指令是機(jī)器語言指令,表現(xiàn)形式為二進(jìn)制編碼。例如:0111010010101011機(jī)器語言指令顯然不利于閱讀與編程第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)為了改善可讀性約定了一些能反應(yīng)機(jī)器指令功能的單詞來代表該機(jī)器指令把內(nèi)部的各種資源符號化?。?111010010101011MOVA,#0ABH匯編指令機(jī)器指令第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)易懂的單詞ADDCLRSETBRETJMPSWAPNOPACCBDPTRP0TMODSBUF資源符號化第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)編譯器就是將“高級語言”翻譯為“機(jī)器語言”的程序KeiluVision4MicrosoftVisualC++6.0第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)匯編語言:用助記符號表示指令的計(jì)算機(jī)語言匯編指令集、偽指令和使用他們的規(guī)則的統(tǒng)稱特點(diǎn)1.與機(jī)器相關(guān)性不同型號CPU有不同的機(jī)器指令系統(tǒng),也就有不同的匯編語言2.執(zhí)行效率高匯編直接對硬件操作3.編寫程序較為復(fù)雜匯編語言要安排運(yùn)算的每一個(gè)細(xì)節(jié)4.匯編語言用到大量的各類轉(zhuǎn)移指令,這些跳轉(zhuǎn)指令加大了調(diào)試的難度第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)使用領(lǐng)域:要求執(zhí)行效率高,反應(yīng)快的領(lǐng)域如:操作系統(tǒng)內(nèi)核,實(shí)時(shí)系統(tǒng)與硬件資源密切相關(guān)的軟件開發(fā)如:設(shè)備驅(qū)動程序受存儲容量限制的應(yīng)用領(lǐng)域如:家用電器的計(jì)算機(jī)控制功能沒有適當(dāng)?shù)母呒壵Z言開發(fā)環(huán)境不宜使用的領(lǐng)域:大型軟件的整體開發(fā)第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)匯編語言(AssemblyLanguage)——用助記(字)符代替操作碼,用地址符號代替地址碼的一種面向機(jī)器的程序設(shè)計(jì)語言;本章學(xué)習(xí)目標(biāo):了解匯編語言的一般規(guī)則,借助指令手冊能讀懂匯編程序。匯編語言特點(diǎn)——代碼精煉、執(zhí)行速度快,但不便于編寫較復(fù)雜的程序;匯編程序處理過程——輸入源程序→檢查語法正確性(如有語法錯誤,輸出錯誤信息)→翻譯成二進(jìn)制目標(biāo)程序。第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)一條匯編語言指令中最多包含4個(gè)區(qū)段,其一般格式為:

[標(biāo)號:]操作碼[操作數(shù)][;注釋]標(biāo)號(標(biāo)識符)當(dāng)前指令行的符號地址,其值為

該指令的機(jī)器碼首字節(jié)在ROM中的存放地址;標(biāo)號由英文字母開頭的1~6個(gè)字符組成,不區(qū)分大小寫;標(biāo)號與(英文)冒號可以同時(shí)省略?!?…….0122H0123H0124H…….

xxH

xxH

xxH

74H

12HROMSTART→

[標(biāo)號:]

操作碼[操作數(shù)][;注釋] ……START:MOVA,#12H;機(jī)器碼7412H ……例如:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)

[標(biāo)號:]

操作碼

[操作數(shù)][;注釋]操作碼是指令的操作行為,由操作碼助記字符表征;51單片機(jī)共有42種操作碼助記符,不區(qū)分大小寫。MOVA,#12H;

move(傳送)SETBP1.0 ;setbit(置位)CJNEA,R0,START;compareandjumpifnotequal(比較跳轉(zhuǎn))舉例:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)

[標(biāo)號:]操作碼

[操作數(shù)]

[;注釋]操作數(shù)是指令的操作對象,用操作數(shù)簡記符表示,不區(qū)分大小寫;操作數(shù)可以是3個(gè)、2個(gè)、1個(gè)或沒有操作數(shù);操作數(shù)大于1時(shí)要用(英文)逗號隔開。CJNEA,R0,START;若A≠R0,轉(zhuǎn)STARTADDA,#10H ;A+10H→ACRLA ;A←0RET ;子程序返回舉例:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)

[標(biāo)號:]操作碼[操作數(shù)]

[;注釋]注釋是對指令的解釋性說明,用以提高程序的可讀性;可用任何文字或符號描述,可以省略;由(英文)分號開始,無需結(jié)束符號。MOVA,#12H;立即數(shù)12H→ASETBP1.0 ;P1.0←1CJNEA,R0,START;若A≠R0,轉(zhuǎn)START

舉例:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)指令手冊中,每條指令的操作數(shù)卻是以簡記符號表示的。掌握簡記符號規(guī)則→便于閱讀源程序(查指令手冊)真實(shí)指令中一般都含有具體的操作數(shù),例如:MOVA,R3或MOVA,#35H第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)簡記符號Rn(n=0~7)-當(dāng)前工作寄存器組中的寄存器R0~R7之一Ri(i=0,1)-當(dāng)前工作寄存器組中的寄存器R0或R1@----------間址寄存器前綴#data------8位立即數(shù)/#data16-----16位立即數(shù)direct------片內(nèi)低128個(gè)RAM單元地址及SFR地址addr11------11位目的地址addr16------16位目的地址rel---------8位地址偏移量,范圍:-128~+127bit---------片內(nèi)RAM位地址、SFR的位地址(X)------表示X地址單元或寄存器中的內(nèi)容((X))------由X間接尋址的單元中的內(nèi)容←----------箭頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所取代/----------位操作數(shù)的取反操作前綴第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)尋址方式是對操作數(shù)存在規(guī)律的歸納,一條指令究竟屬于哪種尋址方式往往并不重要,也不會影響它的使用,因而不必過意追究。51單片機(jī)共有七種尋址方式:直接尋址、寄存器尋址、寄存器間接尋址、立即尋址、變址尋址、位尋址、相對尋址。尋址方式越多,單片機(jī)的功能就越強(qiáng);CPU取得操作數(shù)的方法稱為尋址方法

尋址方式第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)立即尋址操作數(shù)在指令編碼中尋址空間:ROM對于MOVDPTR,#2100H指令,立即數(shù)高8位“21H”裝入DPH

【例】執(zhí)行MOVA,#50H

結(jié)果:(A)=50H

MOV A,#100MOV 33H,#10H

MOV R0,#0FFH

第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)寄存器尋址操作數(shù)在寄存器中尋址范圍:R0~R7、A、B、DPTR【例】若(R0)=30H,

執(zhí)行MOVA,R0后,(A)=30H

MOV A,R0

ADD A,R5

MOV

R7,A INCDPTR

第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)直接尋址指令中的操作數(shù)直接以單元地址的形式給出尋址空間:片內(nèi)RAM低128字節(jié);SFR(符號形式)另一類直接尋址是轉(zhuǎn)移目標(biāo)地址的尋址。如:LJMPADDR16【例】若(50H)=3AH,

執(zhí)行MOVA,50H后,(A)=3AH

MOV A,30HMOV 50H,BADD A,60HMOVA,P1第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)寄存器間接尋址寄存器中的內(nèi)容是操作數(shù)的地址尋址空間:片內(nèi)RAM(@Ri、SP) 片外RAM(@Ri、@DPTR)【例】若(R0)=30H,(30H)=5AH

執(zhí)行MOVA,@R0后,(A)=5AH

MOV A,@R0MOV @R1,AADD A,@R0MOVXA,@DPTR第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)位尋址(實(shí)質(zhì)屬于位的直接尋址)尋址位數(shù)據(jù)尋址空間:片內(nèi)RAM位空間、SFR位空間【例】位地址00H內(nèi)容為1,MOVC,00H執(zhí)行后,位地址PSW.7的內(nèi)容為1。位地址的表示方法:用位名稱如P1.5,Cy用位地址如95HMOV C,30HCLRCSETB20HCPLP1.0第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)變址尋址操作數(shù)地址:基地址+偏移量尋址空間:ROM【例】(A)=0FH,(DPTR)=2400H

執(zhí)行MOVCA,@A+DPTR(A)=88HMOVC

A,@A+DPTRMOVC

A,@A+PCJMP@A+DPTR第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)相對尋址用于跳轉(zhuǎn)指令,實(shí)現(xiàn)程序分支Rel常用符號地址表示,離源地址不要超過(-128~+127)

【例】若rel為75H,PSW.7為1,JCrel存于1000H開始的單元。執(zhí)行JCrel指令后,程序?qū)⑻D(zhuǎn)到1077H單元取指令并執(zhí)行。

JCrelJBP1.3,ALARMJZNEXTDJNZR7,LOOP第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)——可實(shí)現(xiàn)RAM、SFR和ROM之間的數(shù)據(jù)互傳或交換數(shù)據(jù)傳送與交換類指令

指令分類介紹第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)數(shù)據(jù)傳送與交換類指令共有8種操作碼: MOV用于訪問片內(nèi)RAM MOVX用于訪問片外RAM MOVC用于訪問程序存儲器 XCH和XCHD用于字節(jié)交換 SWAP用于A內(nèi)半字節(jié)交換 PUSH和POP用于堆棧操作第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)數(shù)據(jù)傳送類指令的基本通式為:

<

transfer>

<dest>,<src>表示將源操作數(shù)(src)的內(nèi)容傳送給目的操作數(shù)

(dest),傳送后源操作數(shù)中內(nèi)容不變。transfer具有三種具體形式:MOV——數(shù)據(jù)在片內(nèi)RAM范圍內(nèi)傳送MOVX——數(shù)據(jù)在A與片外RAM之間傳送MOVC——數(shù)據(jù)在A與ROM之間傳送第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)單向箭頭表示只能從源到目的雙向箭頭表示源和目的可以互換位置弧線箭頭表示源和目的相同(唯一)箭頭線旁邊的文字是相應(yīng)的操作碼基本規(guī)律:①立即數(shù)和ROM地址只能作為源操作數(shù)(單向箭頭);②內(nèi)外ROM與A的數(shù)據(jù)傳送只能用MOVC操作碼助記符;③片外RAM與A的數(shù)據(jù)傳送只能用MOVX操作碼助記符;④PUSH、POP、SWAP只有1個(gè)操作數(shù)(弧線箭頭);⑤位數(shù)據(jù)傳送只能在C(即Cy標(biāo)志位)與bit間進(jìn)行。數(shù)據(jù)傳送目的和源的快捷記憶法第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)算術(shù)運(yùn)算類指令

——可實(shí)現(xiàn)加、減、乘、除和增1、減1等運(yùn)算功能第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)算術(shù)運(yùn)算類指令共有8種操作碼: ADD用于不帶進(jìn)位加法 ADDC用于帶進(jìn)位加法 SUBB用于帶借位減法 INC和DEC用于加1和減1 MUL用于乘法 DIV用于除法

DA用于十進(jìn)制加法調(diào)整第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)特點(diǎn):①除加1和減1外,都需以累加器A為目的操作數(shù);②一般都會影響PSW中的CY、AC、OV和P四個(gè)標(biāo)志位。AC算術(shù)運(yùn)算類指令快捷記憶法第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)邏輯運(yùn)算及移位類指令

——可實(shí)現(xiàn)與、或、異或、求反、置1、清0、移位等功能第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)邏輯運(yùn)算及移位類指令共有10種操作碼: ANL用于邏輯與運(yùn)算 ORL用于邏輯或運(yùn)算 XRL用于邏輯異或運(yùn)算 SETB和CLR用于置1和清0 CPL用于取反 RL和RR于循環(huán)左移和循環(huán)右移

RLC和RRC用于帶C循環(huán)左移和帶C循環(huán)右移第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)特點(diǎn):字節(jié)運(yùn)算以A為目的操作數(shù)(#data與direct的運(yùn)算例外),位運(yùn)算以C為目的操作數(shù)。CLRCPLCLRSETB邏輯運(yùn)算指令快捷記憶法第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)特點(diǎn):只能針對A進(jìn)行操作左移1位相當(dāng)于乘2,右移1位相當(dāng)于除2。功能:對累加器A進(jìn)行循環(huán)移位操作循環(huán)移位指令的四種移位關(guān)系第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)控制轉(zhuǎn)移類指令

——通過改變程序計(jì)數(shù)器PC值,實(shí)現(xiàn)程序轉(zhuǎn)移功能

第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)控制轉(zhuǎn)移類指令共有18種操作碼:AJMP、SJMP、LJMP、JMP用于無條件轉(zhuǎn)移ACALL和LCALL用于子程序調(diào)用RET和RETI用于子程序和中斷返回JZ、JNZ、CJNE和DJNZ用于字節(jié)條件轉(zhuǎn)移

JC、JNC、JB、JNB和JBC用于位條件轉(zhuǎn)移NOP用于空操作第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)功能:根據(jù)轉(zhuǎn)移地址修改PC當(dāng)前值;轉(zhuǎn)移地址:LJMP——16位;AJMP——11位;

SJMP——8位;JMP——16位特點(diǎn):前三項(xiàng)都可用語句標(biāo)號代替具體地址;

(例如LJMPSTART或SJMP$)

第四項(xiàng)為變址尋址轉(zhuǎn)移指令

PC←A+@DPTR無條件轉(zhuǎn)移第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)功能:根據(jù)轉(zhuǎn)移地址(rel)修改PC當(dāng)前值;特點(diǎn):rel值為-128~127,可用語句標(biāo)號代替;

例如JCSMALL以rel表示操作數(shù)的存在方式——相對尋址條件轉(zhuǎn)移指令快捷記憶法

第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)偽指令

匯編語言指令的兩類指令:真指令(指令性語句)——匯編后可以產(chǎn)生機(jī)器碼的指令,如前介紹的111條指令;偽指令(指示性語句)——用于指示匯編系統(tǒng)軟件要完成的操作,一般不產(chǎn)生機(jī)器碼常用的偽指令:

ORG、END、EQU、DATA、BIT、DB第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)

MCS-51常用偽指令偽指令名稱格式功能描述ORG(Oringin)程序起始地址ORG16位地址用于定義匯編程序或數(shù)據(jù)在ROM中存放的起始地址EQU(Equate)等值指令標(biāo)識符EQU數(shù)或匯編符號用于將一個(gè)數(shù)值或匯編符號賦給該標(biāo)示符DATA(Data)數(shù)據(jù)地址賦值標(biāo)識符DATA內(nèi)存字節(jié)地址用于將一個(gè)內(nèi)部RAM的地址賦給該標(biāo)示符BIT(Bit)位地址賦值標(biāo)識符DATA位地址或位名稱用于將一個(gè)位地址或位名稱賦給該標(biāo)示符DB(DefineByte)定義字節(jié)[標(biāo)號:]DB<項(xiàng)或項(xiàng)表>用于把項(xiàng)或項(xiàng)表中的字節(jié)(8位)數(shù)值依次存入標(biāo)號開始的存儲單元中END(End)結(jié)束匯編END用于指示匯編源程序段結(jié)束第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)步驟

分析問題,確定算法或解題思路

畫程序流程圖編寫匯編程序程序調(diào)試與修改用匯編語言進(jìn)行程序設(shè)計(jì)的過程和用高級語言進(jìn)行程序設(shè)計(jì)的過程類似,一般需要經(jīng)過以下幾個(gè)步驟:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)流程圖(程序框圖)表示程序的執(zhí)行過程或解題步驟和方法給出程序的結(jié)構(gòu),體現(xiàn)整體與部分之間的關(guān)系便于閱讀、理解程序,查找錯誤起始第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)【例3-17】電路如圖3-8所示,AT89S51單片機(jī)的P2口作輸出,經(jīng)上拉電阻驅(qū)動連接8只發(fā)光二極管D1~D8,當(dāng)輸出位為1時(shí)發(fā)光二極管點(diǎn)亮;輸出位為0時(shí)發(fā)光二極管熄滅。試編制程序?qū)崿F(xiàn)以下發(fā)光二極管點(diǎn)亮的功能:D1D8亮其余滅→延時(shí)→D2D7亮其余滅→延時(shí)→D3D6亮其余滅→延時(shí)→D4D5亮其余滅→延時(shí)→D3D6亮其余滅→延時(shí)→D2D7亮其余滅→延時(shí)→D1D8亮其余滅,重復(fù)上述過程。第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)①確定解決方案高電平驅(qū)動的發(fā)光二極管,寫1燈亮,寫0燈滅;循環(huán)改寫P2.0~P2.7;通過軟件延時(shí)子程序調(diào)節(jié)P2口輸出頻率。第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)②畫程序流程圖盡可能詳細(xì)地表示出每一相關(guān)環(huán)節(jié)的內(nèi)容

③編寫匯編程序第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)④程序編譯調(diào)試第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)實(shí)際運(yùn)行效果:第3章指令系統(tǒng)與匯編語言程序設(shè)計(jì)單片機(jī)原理與應(yīng)用第4章單片機(jī)的C語言程序設(shè)計(jì)內(nèi)容指南本章主要介紹C51語言的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)、C51語言的運(yùn)算符與表達(dá)式、C51語言的函數(shù)等編程基礎(chǔ),在此基礎(chǔ)上結(jié)合Keil

uVision編譯調(diào)試環(huán)境和Proteus仿真設(shè)計(jì)環(huán)境,重點(diǎn)討論了單片機(jī)并行I/O口的C51編程應(yīng)用。學(xué)習(xí)目標(biāo)掌握C51語言的數(shù)據(jù)結(jié)構(gòu)和編程相關(guān)基礎(chǔ)。熟悉KeiluVision編譯調(diào)試環(huán)境和Proteus仿真設(shè)計(jì)環(huán)境的使用。掌握常用外設(shè)和單片機(jī)I/O的連接原理及編程方法。第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)匯編語言能直接操作單片機(jī)的系統(tǒng)硬件,程序代碼效率高。但其程序可讀性差,且編寫、移植困難。

C51是為51內(nèi)核單片機(jī)設(shè)計(jì)的一種C語言,其特點(diǎn):C51語言已成為51系列單片機(jī)程序開發(fā)的主流軟件方法。結(jié)構(gòu)化語言,代碼緊湊——效率可與匯編語言媲美接近真實(shí)語言,程序可讀性強(qiáng)——易于調(diào)試、維護(hù)庫函數(shù)豐富,編程工作量小——產(chǎn)品開發(fā)周期短機(jī)器級控制能力,功能很強(qiáng)——適合于嵌入式系統(tǒng)開發(fā)與匯編指令無關(guān),易于掌握——在單片機(jī)基礎(chǔ)上上手快第4章單片機(jī)的C語言程序設(shè)計(jì)4.1C51語言的數(shù)據(jù)結(jié)構(gòu)4.2C51語言的運(yùn)算符與表達(dá)式

4.3C51語言的函數(shù)4.4C51的程序結(jié)構(gòu)4.5C51開發(fā)調(diào)試環(huán)境4.6并行I/O口的應(yīng)用編程

第4章單片機(jī)的C語言程序設(shè)計(jì)4.1C51的數(shù)據(jù)結(jié)構(gòu)、C51的數(shù)據(jù)類型C51支持標(biāo)準(zhǔn)C中的基本數(shù)據(jù)類型,包括字符型char、整型int、長整型long和浮點(diǎn)型float。對整數(shù)類型,又可以分為signed(有符號數(shù))和unsigned(無符號數(shù))兩種。若聲明為signed,編譯器會將整數(shù)部分的最高位解釋為符號位。此外,根據(jù)51內(nèi)核單片機(jī)存儲結(jié)構(gòu)的特點(diǎn),C51增加了一些特有的數(shù)據(jù)類型,包括普通位類型bit、特殊功能寄存器可尋址位sbit、特殊功能寄存器sfr和sfr16。普通位類型bitAT89S51/S52單片機(jī)中,片內(nèi)RAM地址0x20~0x2f共16個(gè)字節(jié)是可以位尋址的。因此,C51中專門規(guī)定了位變量類型來方便這部分內(nèi)存的訪問。在C51中,用關(guān)鍵詞bit定義一個(gè)位變量,格式如下: bit

bit_name[=0或1]; 例如:bitdoor=0;//定義一個(gè)叫door的位變量且初值為0 可見與標(biāo)準(zhǔn)C的數(shù)據(jù)類型聲明的語法規(guī)則是一致的。第4章單片機(jī)的C語言程序設(shè)計(jì)

特殊功能寄存器可尋址位sbit對于可位尋址的特殊功能寄存器,可以使用sbit關(guān)鍵字將特殊功能寄存器位聲明為位變量以方便訪問。C51提供了以下三種方法聲明特殊功能寄存器位變量:(1)第1種方法

sbit

位名=特殊功能寄存器名^位置;(2)第2種方法

sbit

位名=字節(jié)地址^位置;(3)第3種方法

sbit

位名=位地址;第4章單片機(jī)的C語言程序設(shè)計(jì)例:

sfrPSW=0xD0;

sbitOV=PSW^2;

sbitOV=0xD0^2;

sbitOV=0xD2;第4章單片機(jī)的C語言程序設(shè)計(jì)特殊功能寄存器sfr和sfr16關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,格式如下:sfr

sfr_name=

字節(jié)地址常數(shù);sfr16sfr_name=

字節(jié)地址常數(shù);例如, sfrP0=0x80;//定義P0口地址80H

sfrPCON=0x87;//定義PCON地址87H sfr16DPTR=0x82;//定義DPTR的低地址82H第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)2.C51的變量

在程序執(zhí)行過程中,數(shù)值可以發(fā)生改變的量稱為變量。變量的基本屬性是變量名和變量值。變量名與存儲單元地址相對應(yīng)(變量名就是數(shù)據(jù)的符號地址),變量值與存儲單元的內(nèi)容相對應(yīng)。例如第4章單片機(jī)的C語言程序設(shè)計(jì)【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名;(標(biāo)準(zhǔn)C)(標(biāo)準(zhǔn)C)C51變量定義的四要素:(C51特有)(標(biāo)準(zhǔn)C+C51)括號項(xiàng)【】——可以缺省數(shù)據(jù)類型和變量名不能缺省要在C51程序中使用變量必須先對其進(jìn)行定義。第4章單片機(jī)的C語言程序設(shè)計(jì)【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名存儲種類用于說明變量的作用范圍:1、auto(自動型)——變量的作用范圍在定義它的函數(shù)體或語句塊內(nèi)。執(zhí)行結(jié)束后,變量所占內(nèi)存即被釋放。2、extern(外部型)——在一個(gè)源文件中被定義為外部型的變量,在其它源文件中需要通過extern說明方可使用。3、static(靜態(tài)型)——利用static可使變量定義所在的函數(shù)或語句塊執(zhí)行結(jié)束后,其分配的內(nèi)存單元繼續(xù)保留。4、register(寄存器型)——目前已不推薦使用。缺省存儲種類為auto(自動)型變量第4章單片機(jī)的C語言程序設(shè)計(jì)數(shù)據(jù)類型用于表示數(shù)據(jù)存放格式,C51支持的基本數(shù)據(jù)類型與標(biāo)準(zhǔn)C相同:*有符號數(shù)類型可以忽略signed標(biāo)識符【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit類型變量。用一條預(yù)處理命令#include<REG51.H>把這個(gè)頭文件包含到C51程序中,無需重新定義即可直接使用它們的名稱。第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)編程舉例:【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名存儲類型體現(xiàn)了變量的存放區(qū)域。51系列單片機(jī)共有6個(gè)存儲類型(分布在3個(gè)邏輯存儲空間中)。data區(qū)code區(qū)xdata區(qū)bdata區(qū)pdata區(qū)idata區(qū)第4章單片機(jī)的C語言程序設(shè)計(jì)不同存儲類型的特點(diǎn)SMALL系統(tǒng)COMPACT系統(tǒng)LARGE系統(tǒng)編譯模式第4章單片機(jī)的C語言程序設(shè)計(jì)三種編譯模式分別對應(yīng)于三種缺省存儲類型:如果定義變量時(shí)省略存儲類型,編譯器會自動默認(rèn)存儲類型(由編譯模式?jīng)Q定存儲類型,默認(rèn)SMALL模式)3種編譯模式分別對應(yīng)于3種缺省存儲類型:第4章單片機(jī)的C語言程序設(shè)計(jì)【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名C51編譯器可根據(jù)當(dāng)前采取的編譯模式自動認(rèn)定默認(rèn)的存儲類型約定:若無特殊聲明,一般均為“SMALL編譯模式”變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個(gè)字符必須為字母或下劃線,變量名長度隨編譯系統(tǒng)而定。變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量。強(qiáng)調(diào):頭文件中定義的變量都是大寫的,若程序采取小寫變量則需要重新定義。【存儲種類】

數(shù)據(jù)類型

【存儲類型】

變量名第4章單片機(jī)的C語言程序設(shè)計(jì)C51擴(kuò)展的若干關(guān)鍵字一覽表

變量名不得使用標(biāo)準(zhǔn)C語言和C51語言的關(guān)鍵字。第4章單片機(jī)的C語言程序設(shè)計(jì)unsignedchardatasystem_status=0;

//定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。數(shù)據(jù)結(jié)構(gòu)定義舉例變量名為system_status位與片內(nèi)RAM區(qū)無符號字符型自動型初值為零第4章單片機(jī)的C語言程序設(shè)計(jì)unsignedcharbdata

status_byte;

unsignedintcodeunit_id[2]={0x1234,0x89ab};

staticcharm,n;

//定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū)//定義unit_id[2]為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個(gè)位于data區(qū)中的有符號字符型靜態(tài)變量。第4章單片機(jī)的C語言程序設(shè)計(jì)3、C51的數(shù)組構(gòu)造數(shù)據(jù)類型之一數(shù)組:有序數(shù)據(jù)的集合,用數(shù)組名標(biāo)識元素:屬同一數(shù)據(jù)類型,用數(shù)組名和下標(biāo)確定第4章單片機(jī)的C語言程序設(shè)計(jì)一維數(shù)組的定義:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];

合法標(biāo)識符表示元素個(gè)數(shù)例

inta[6];a[0]a[1]a[2]a[3]a[4]a[5]a編譯時(shí)分配連續(xù)存儲地址存儲字節(jié)數(shù)=數(shù)組維數(shù)*

sizeof(元素?cái)?shù)據(jù)類型)數(shù)組名是表示數(shù)組首地址的地址常量第4章單片機(jī)的C語言程序設(shè)計(jì)一維數(shù)組的初始化

inta[5]={1,2,3,4,5};等價(jià)于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;說明:數(shù)組不初始化,其元素值為隨機(jī)數(shù)當(dāng)全部數(shù)組元素賦初值時(shí),可不指定數(shù)組長度

inta[]={1,2,3,4,5,6};編譯系統(tǒng)根據(jù)初值個(gè)數(shù)確定數(shù)組維數(shù)注意:數(shù)組的下標(biāo)是從0開始第4章單片機(jī)的C語言程序設(shè)計(jì)一維數(shù)組的引用數(shù)組必須先定義,后使用只能逐個(gè)引用數(shù)組元素,不能一次引用整個(gè)數(shù)組引用形式:數(shù)組名[下標(biāo)]其中:下標(biāo)從0開始到n-1,不能越界,下標(biāo)可以是變量、常量或整型表達(dá)式。例inta[10];

printf(“%d”,a);(

)必須for(j=0;j<10;j++)

printf(“%d\t”,a[j]);(

)第4章單片機(jī)的C語言程序設(shè)計(jì)數(shù)組元素也可以用指針來引用指向數(shù)組元素的指針變量例intarray[10];

int*p=&array[0](或int*p=array);array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]parray[i]

*(p+i)這里的*是取值運(yùn)算符第4章單片機(jī)的C語言程序設(shè)計(jì)4、C51的指針

指針:一個(gè)變量的地址稱為該變量的“指針”指針變量:存儲變量地址(指針)的變量稱為“指針變量”指針的值:某個(gè)變量在內(nèi)存中的首地址指針的類型:該指針?biāo)赶虻淖兞康念愋椭苯釉L問(直接尋址):通過變量名來訪問間接訪問(間接尋址):通過變量的指針來訪問第4章單片機(jī)的C語言程序設(shè)計(jì)指針指針變量指針的值指針的類型直接尋址間接尋址第4章單片機(jī)的C語言程序設(shè)計(jì)chara,b;char*p;p=&a;*p=10;b=*p指針有關(guān)的運(yùn)算符*取值運(yùn)算符&取地址運(yùn)算符(直接尋址)(間接尋址)char*p=&a;標(biāo)準(zhǔn)C語言指針的一般定義形式為:

數(shù)據(jù)類型*指針變量名[=&被指向變量名];其中,數(shù)據(jù)類型說明了該指針變量所指向的變量的類型。第4章單片機(jī)的C語言程序設(shè)計(jì)例:int*pointer;//定義一個(gè)指向整型變量的指針變量pointer注意:指針變量名前的“*”號表示該變量為指針變量,但指針變量名是pointer而不是*pointer。例:inta=’A’;int*p1=&a;這表示p1是一個(gè)指向int型變量的指針變量,此時(shí)p1的值為int型變量a的地址。對于C51,除了數(shù)據(jù)類型外,指針定義中還應(yīng)包含以下信息:1)指針變量自身位于哪個(gè)存儲區(qū)中?

2)被指向變量位于哪個(gè)存儲區(qū)中?故C51指針的一般定義形式:數(shù)據(jù)類型[存儲類型1]*[存儲類型2]指針變量名[=&被指向變量名]數(shù)據(jù)類型——被指向變量的類型,如int型或char型存儲類型1——被指向變量所在的存儲區(qū),缺省時(shí)由地址賦值關(guān)系決定存儲類型2——指針變量所在的存儲區(qū),缺省時(shí)為編譯器默認(rèn)的存儲區(qū)第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)如缺省存儲類型,C51編譯器會根據(jù)當(dāng)前編譯模式默認(rèn)存儲類型,例如:

inta=’A’; int*p1=&a;這表示p1是一個(gè)指向int型變量的指針變量,此時(shí)p1的值為int型變量a的地址,而a和p1兩個(gè)變量都位于C編譯器默認(rèn)的內(nèi)存區(qū)中。第4章單片機(jī)的C語言程序設(shè)計(jì)4.2C51語言的運(yùn)算符與表達(dá)式1.算術(shù)運(yùn)算符C51語言的運(yùn)算符與表達(dá)式與標(biāo)準(zhǔn)C語言相同C51語言中的算術(shù)運(yùn)算符有:+加法運(yùn)算符-減法運(yùn)算符*乘法運(yùn)算符。/除法運(yùn)算符。%模(求余)運(yùn)算符。用算術(shù)運(yùn)算符和括號將運(yùn)算對象連接起來的式子稱為算術(shù)表達(dá)式,其中的運(yùn)算對象包括常量,變量,函數(shù),數(shù)組等等。算術(shù)運(yùn)算符的優(yōu)先級規(guī)定為先乘除模,后加減,括號最優(yōu)先。第4章單片機(jī)的C語言程序設(shè)計(jì)4.2C51語言的運(yùn)算符與表達(dá)式2.賦值運(yùn)算符C51語言的運(yùn)算符與表達(dá)式與標(biāo)準(zhǔn)C語言相同 在C51語言中,賦值運(yùn)算符有兩類,一類是基本賦值運(yùn)算符“=”,一類是基本賦值運(yùn)算符派生出來的復(fù)合賦值運(yùn)算符,包括:+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=。 賦值運(yùn)算符將運(yùn)算符右側(cè)操作數(shù)的值賦給左側(cè)操作數(shù)或變量。復(fù)合賦值運(yùn)算符則首先對變量進(jìn)行某種運(yùn)算之后再將運(yùn)算結(jié)果賦給該變量。利用賦值運(yùn)算符將一個(gè)變量與一個(gè)表達(dá)式連接起來的式子稱為賦值表達(dá)式。第4章單片機(jī)的C語言程序設(shè)計(jì)4.2C51語言的運(yùn)算符與表達(dá)式3.關(guān)系運(yùn)算符C51語言的運(yùn)算符與表達(dá)式與標(biāo)準(zhǔn)C語言相同C51的關(guān)系運(yùn)算符有6種:<(小于)>(大于)<=(小于等于)>=(大于等于)==(等于)!=(不等于)前四種關(guān)系運(yùn)算符(<,>,<=,>=)的優(yōu)先級相同,后兩種也相同;前四種優(yōu)先級高于后兩種。關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符。第4章單片機(jī)的C語言程序設(shè)計(jì)4.2C51語言的運(yùn)算符與表達(dá)式4.邏輯運(yùn)算符C51語言的運(yùn)算符與表達(dá)式與標(biāo)準(zhǔn)C語言相同C51的邏輯運(yùn)算符有3種:&& 邏輯與(AND)|| 邏輯或(OR)! 邏輯非(NOT)邏輯與&&和邏輯或||是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對象;而邏輯非!是單目運(yùn)算符,只要求一個(gè)運(yùn)算對象。C51邏輯運(yùn)算符與算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符之間優(yōu)先級的次序?yàn)椋哼壿嫹?運(yùn)算符優(yōu)先級最高,關(guān)系運(yùn)算符低于算術(shù)運(yùn)算符但高于邏輯與&&和邏輯或||運(yùn)算符,最低的是賦值運(yùn)算符。第4章單片機(jī)的C語言程序設(shè)計(jì)4.2C51語言的運(yùn)算符與表達(dá)式5.位操作運(yùn)算符C51語言的運(yùn)算符與表達(dá)式與標(biāo)準(zhǔn)C語言相同 C51有如下位操作運(yùn)算符: &按位與 |接位或 ^接位異或 ~按位取反 <<位左移 >>位右移除了按位取反運(yùn)算符~以外,以上位操作運(yùn)算符都是兩目運(yùn)算符,即要求運(yùn)算符兩側(cè)各有一個(gè)運(yùn)算對象。位運(yùn)算對象只能是整型或字符型數(shù),不能為實(shí)型數(shù)據(jù)。第4章單片機(jī)的C語言程序設(shè)計(jì)4.3C51語言的函數(shù)標(biāo)準(zhǔn)庫函數(shù):標(biāo)準(zhǔn)庫函數(shù)是由C51編譯器提供的,用戶可直接調(diào)用C51庫函數(shù)而不需為這個(gè)函數(shù)編寫任何代碼,只需要包含具有該函數(shù)說明的頭文件即可。例如調(diào)用正弦計(jì)算函數(shù)sin(x)時(shí),要包含數(shù)學(xué)運(yùn)算庫文件: #include<math.h>用戶自定義函數(shù):用戶自定義函數(shù)是用戶根據(jù)需要所編寫的函數(shù)。從函數(shù)定義的形式分為無參函數(shù)、有參函數(shù)和空函數(shù)。中斷函數(shù):中斷函數(shù)是C51所特有的,使用interrupt關(guān)鍵字可以將一個(gè)函數(shù)定義成中斷服務(wù)函數(shù)。①預(yù)處理命令(文件包含、宏定義)全局變量定義、函數(shù)原型說明;②程序由函數(shù)組成,函數(shù)由局部變量定義和語句(程序體)組成;③程序從主函數(shù)開始執(zhí)行,主函數(shù)中的所有語句執(zhí)行完畢,則程序結(jié)束。④函數(shù)和變量都需遵循先定義后使用的基本原則;第4章單片機(jī)的C語言程序設(shè)計(jì)C51與標(biāo)準(zhǔn)C程序結(jié)構(gòu)完全相同4.4C51的程序結(jié)構(gòu)

函數(shù)原型聲明C語言程序的結(jié)構(gòu)特點(diǎn):1.一個(gè)程序由一個(gè)或多個(gè)源程序文件組成小程序往往只包括一個(gè)源程序文件一個(gè)源程序文件中可以包括三個(gè)部分:預(yù)處理指令全局聲明若干個(gè)函數(shù)#include<stdio.h>等全局變量及函數(shù)原型的聲明每個(gè)函數(shù)用來實(shí)現(xiàn)一定的功能第4章單片機(jī)的C語言程序設(shè)計(jì)2.函數(shù)是C程序的組成部分一個(gè)C程序是由一個(gè)或多個(gè)函數(shù)組成的.必須包含一個(gè)main函數(shù)(且只能有一個(gè)).每個(gè)函數(shù)都用來實(shí)現(xiàn)一個(gè)或幾個(gè)特定功能被調(diào)用的函數(shù)可以是庫函數(shù),也可以是自己編制設(shè)計(jì)的函數(shù).第4章單片機(jī)的C語言程序設(shè)計(jì)3.一個(gè)函數(shù)包括兩個(gè)部分:函數(shù)首部intmax(intx,

inty)函數(shù)的第1行函數(shù)類型函數(shù)名參數(shù)類型參數(shù)名若函數(shù)無參,在括弧中寫void或空括弧函數(shù)體

{}括起來部分聲明部分定義在本函數(shù)中所用到的變量執(zhí)行部分:由若干個(gè)語句組成,指定在函數(shù)中所進(jìn)行的操作;語句以;結(jié)束。第4章單片機(jī)的C語言程序設(shè)計(jì)4.程序總是從main函數(shù)開始執(zhí)行5.C程序?qū)C(jī)器的操作由C語句完成C程序書寫格式是比較自由的一行內(nèi)可以寫幾個(gè)語句一個(gè)語句可以分寫在多行上為清晰起見,習(xí)慣上每行只寫一個(gè)語句6.數(shù)據(jù)聲明和語句最后必須有分號7.程序應(yīng)當(dāng)包含注釋,增加可讀性第4章單片機(jī)的C語言程序設(shè)計(jì)C程序格式特點(diǎn):習(xí)慣用小寫字母不使用行號,無程序行概念可使用空行和空格常用鋸齒形書寫格式main(){

inti,j,sum;sum=0;

for(i=1;i<10;i++){

for(j=1;j<10;j++){sum+=i*j;}}

printf(“%d\n”,sum);}優(yōu)秀程序員的素質(zhì)之一:使用TAB縮進(jìn){}對齊有足夠的注釋有合適的空行第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)舉例:LED閃爍控制功能LOOP:CLRP1.0ACALLDEL50SETBP1.0ACALLDEL50SJMPLOOPDEL50:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND30p30p第4章單片機(jī)的C語言程序設(shè)計(jì)預(yù)處理命令---------函數(shù)聲明------------全局變量定義------

主函數(shù)------------自定義函數(shù)---------局部變量定義---------

程序體

程序體------將P1.0端口定義為p1_0位變量第4章單片機(jī)的C語言程序設(shè)計(jì)1、將Keil編譯形成的*.hex文件加載到*.DSN文件中,通過proteus控制仿真運(yùn)行(無法在運(yùn)行過程中進(jìn)行調(diào)試)在Keil

uVision進(jìn)行程序開發(fā)調(diào)試的步驟我們在第一章進(jìn)行了介紹。這里我們結(jié)合單片機(jī)仿真軟件Proteus來說明仿真開發(fā)運(yùn)行的兩種方式。4.5C51的程序開發(fā)與仿真調(diào)試

第4章單片機(jī)的C語言程序設(shè)計(jì)2、在Keil軟件里控制Proteus仿真運(yùn)行(可以在運(yùn)行過程中進(jìn)行調(diào)試)步驟:下載()→運(yùn)行()→停止()第4章單片機(jī)的C語言程序設(shè)計(jì)4.1C51語言的數(shù)據(jù)結(jié)構(gòu)4.2C51語言的運(yùn)算符與表達(dá)式

4.3C51語言的函數(shù)4.4C51的程序結(jié)構(gòu)4.5C51開發(fā)調(diào)試環(huán)境4.6并行I/O口的C51編程應(yīng)用第4章單片機(jī)的C語言程序設(shè)計(jì)基本輸出元件:發(fā)光二極管(LightEmittingDiode)低電平驅(qū)動高電平驅(qū)動灌電流拉電流基本I/O設(shè)備與單片機(jī)的連接灌入的最大電流為

10mA

拉出的最大電流為

1mA

單片機(jī)輸出低電平時(shí)驅(qū)動能力尚可,輸出高電平時(shí)驅(qū)動能力很差。

基本輸入元件:按鈕(Button)或開關(guān)(Switch)第4章單片機(jī)的C語言程序設(shè)計(jì)當(dāng)按鍵未按下壓時(shí),Px.n端口為高電平;按壓按鍵后為低電平?!纠?-1】如圖4-11單片機(jī)I/O引腳連接一開關(guān)和一LED,編程實(shí)現(xiàn)K1合上時(shí)L1點(diǎn)亮,K1斷開時(shí)L1熄滅(模擬開關(guān)燈)。

while(1) {L1=K1;}第4章單片機(jī)的C語言程序設(shè)計(jì)【例4-2】如圖4-13,P0口低四位連接了4個(gè)按鈕,P2口低四位連接了4個(gè)LED,開機(jī)時(shí)LED全熄,編程要求根據(jù)按鍵的動作使相應(yīng)的燈亮,并將亮燈狀態(tài)保持到按壓其它鍵時(shí)為止。第4章單片機(jī)的C語言程序設(shè)計(jì)程序分析:為使按鍵抬起后LED能保持先前的點(diǎn)亮狀態(tài),需要在按鍵未壓下期間禁止向P2輸出P0狀態(tài)值。第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)仿真運(yùn)行效果【例4-3】如圖4-14所示,8個(gè)發(fā)光二極管LED0~LED7經(jīng)限流電阻分別接至P2口的P2.0~P2.7引腳上,陽極共同接高電平。編程來實(shí)現(xiàn)發(fā)光二極管的從上到下然后從下到上的流水點(diǎn)亮,重復(fù)循環(huán)。第4章單片機(jī)的C語言程序設(shè)計(jì)程序分析:此例中是將P2口循環(huán)送出的亮燈碼構(gòu)造為一個(gè)數(shù)組tab[],通過主函數(shù)中的循環(huán)控制變量i作為數(shù)組的下標(biāo)來引用數(shù)組中的數(shù)據(jù)tab[i],依次送出到P2口。第4章單片機(jī)的C語言程序設(shè)計(jì)例4-4鍵控流水燈

第4章單片機(jī)的C語言程序設(shè)計(jì)【要求】K1為“啟動鍵”,首次按壓K1可產(chǎn)生“自下向上”的流水燈運(yùn)動;K2為“停止鍵”,按壓K2可終止流水燈的運(yùn)動;

K3和K4為“方向鍵”,分別產(chǎn)生“自上向下”和“自下向上”運(yùn)動。第4章單片機(jī)的C語言程序設(shè)計(jì)思路分析:設(shè)立狀態(tài)變量→根據(jù)鍵值修改變量值→根據(jù)變量值控制燈的亮滅第4章單片機(jī)的C語言程序設(shè)計(jì)按鍵狀態(tài)值:無按鍵——xxxx1111B按壓K1——xxxx1110B按壓K2——xxxx1101B按壓K3——xxxx1011B按壓K4——xxxx0111B按鍵動作判斷——(P0&0x0f)是否等于0x0f?若是,說明無按鍵動作,反之則有按鍵動作?!?x0f→0x0e→0x0d→0x0b→0x07獲取按鍵狀態(tài)第4章單片機(jī)的C語言程序設(shè)計(jì)修改方向和啟停標(biāo)志值

switch語句是多分支選擇語句,switch語句的一般形式如下:switch(表達(dá)式){ case常量表達(dá)式1:{語句1;}break; case常量表達(dá)式2:{語句2;}break;

…… case常量表達(dá)式n:{語句n;}break; default:{語句n+1;}}第4章單片機(jī)的C語言程序設(shè)計(jì)P2口亮燈編碼:xxxx1110xxxx1101xxxx1011xxxx0111D1~D4循環(huán)方向控制

charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓移動for(i=3;i>=0;i--){P2=led[i];}//↑移動查表方法第4章單片機(jī)的C語言程序設(shè)計(jì)if(表達(dá)式){語句1;}else{語句2;}相當(dāng)于雙分支選擇結(jié)構(gòu)voidmain(){bitdir=0,run=0;chari;while(1){switch(P0&0x0f){ //讀取鍵值case0x0e:run=1;break; //K1動作,設(shè)run=1case0x0d:run=0,dir=0;break;//K2動作,設(shè)run=dir=0case0x0b:dir=1;break; //K3動作,設(shè)dir=1case0x07:dir=0;break;}//K4動作,設(shè)dir=0

if(run) //若run=dir=1,自上而下

if(dir)

for(i=0;i<=3;i++) {P2=led[i]; delay(200); }else //若run=1,dir=0,自下而上

for(i=3;i>=0;i--) {P2=led[i]; delay(200);}elseP2=0xff; //若run=0,燈全滅}}#include"reg51.h"unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};voiddelay(unsignedchartime){unsignedintj=15000;

for(;time>0;time--)

for(;j>0;j--);}程序運(yùn)行效果第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)LED數(shù)碼管原理與應(yīng)用

LED顯示元件——人機(jī)交互輸出設(shè)備,其作用是指示中間運(yùn)行結(jié)果與運(yùn)行狀態(tài)。點(diǎn)式字段式點(diǎn)陣式光柱式LED的類型第4章單片機(jī)的C語言程序設(shè)計(jì)引腳配置七段式LED數(shù)碼管(Proteus:7-SegmentDisplay)共陽極型共陰極型公共端接“0”公共端接“1”字符的顯示碼或字模與數(shù)碼管的類型有關(guān)第4章單片機(jī)的C語言程序設(shè)計(jì)顯示字符dpgfedcba字型碼共陰極共陽極0001111113FC010000011006F92010110115BA43010011114FB040110011066995011011016D926011111017D8270000011107F88011111117F809011011116F90第4章單片機(jī)的C語言程序設(shè)計(jì)【例4-5】如圖4-19所示,在P0口連接一個(gè)共陰極數(shù)碼管,編程使數(shù)碼管循環(huán)顯示0~9數(shù)字。分析:將顯示碼循環(huán)輸出到P0口即可實(shí)現(xiàn)循環(huán)顯示。但由于數(shù)字0~9的顯示段碼沒有規(guī)律可循,需要采取查表方式進(jìn)行操作:第4章單片機(jī)的C語言程序設(shè)計(jì)①將顯示碼按序存放在一個(gè)數(shù)組中,順序號與代表的顯示字符相對應(yīng)(如,charled_mod[]={x1,x2,….,xn);②通過查表語句(如,P0=led_mode[i])輸出顯示碼。第4章單片機(jī)的C語言程序設(shè)計(jì)參考程序第4章單片機(jī)的C語言程序設(shè)計(jì)仿真運(yùn)行效果第4章單片機(jī)的C語言程序設(shè)計(jì)【例4-6】計(jì)數(shù)顯示器根據(jù)如下共陰極型數(shù)碼管電路,編程實(shí)現(xiàn)計(jì)數(shù)顯示功能,即以十進(jìn)制形式顯示擊鍵次數(shù),次數(shù)大于99后重新由0開始。個(gè)位LED接P2口,十位LED接P0口按鈕接P3.2,抬起時(shí)為1電平,按壓時(shí)為0電平。第4章單片機(jī)的C語言程序設(shè)計(jì)編程分析:兩個(gè)問題:1:如何將計(jì)數(shù)值拆解成個(gè)位和十位兩個(gè)數(shù)?2:如何避免按鍵壓下時(shí)被連續(xù)計(jì)數(shù)?第4章單片機(jī)的C語言程序設(shè)計(jì)初始化:P2=P0=table[0];取模運(yùn)算(%10)→個(gè)位整除10運(yùn)算(/10)→十位P2=table[count%10];P0=table[count/10];拆解計(jì)數(shù)值方法:第4章單片機(jī)的C語言程序設(shè)計(jì)避免連續(xù)計(jì)數(shù)——等待按鍵釋放時(shí)才統(tǒng)計(jì)一次計(jì)數(shù)第4章單片機(jī)的C語言程序設(shè)計(jì)參考程序程序運(yùn)行效果

第4章單片機(jī)的C語言程序設(shè)計(jì)第4章單片機(jī)的C語言程序設(shè)計(jì)按鍵在閉合和斷開瞬間會因彈簧開

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論