




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C單片機(jī)的C語(yǔ)言程序設(shè)計(jì)第1頁(yè),共44頁(yè)。2022/8/4210.1 單片機(jī)C語(yǔ)言概述 10.1.1 C51程序開(kāi)發(fā)過(guò)程 編譯器能自動(dòng)完成變量的存儲(chǔ)單元的分配 對(duì)常用功能模塊和算法編制相應(yīng)的函數(shù),方便移植 采用C51的優(yōu)點(diǎn) C語(yǔ)言具有良好的可讀性、可移植性和基本的硬件操作能力。 C51程序開(kāi)發(fā)過(guò)程 編寫源程序 建立工程,加入源程序 編譯生產(chǎn)目標(biāo)程序 仿真調(diào)試、寫存儲(chǔ)器第2頁(yè),共44頁(yè)。2022/8/43第3頁(yè),共44頁(yè)。2022/8/4410.1.2 C51程序結(jié)構(gòu)#include #include void delayms(unsigned);void main(void) unsigned
2、 char i; P1=0 x01; do for (i=0;i=7;i+) delayms(5000); P1=P11; if(P1=0 x0)P1=0 x01; while(1);void delayms(unsigned x) unsigned char j; while(x-) for(j=0;j123;j+); 第4頁(yè),共44頁(yè)。2022/8/4510.2.1 C51的數(shù)據(jù)類型10.2 C51的數(shù)據(jù)類型與運(yùn)算 數(shù)據(jù)類型決定其取值范圍、占用存儲(chǔ)器的大小及可參與哪種運(yùn)算。 數(shù)據(jù)類型長(zhǎng)度(位)取值范圍字符型signed char8-128 127unsigned char80 255整 型
3、signed int16-32768 32767unsigned int160 65535長(zhǎng)整型signed long32-21474883648 21474883647unsigned long320 4294967295浮點(diǎn)型float321.75494E-38 3.402823E+38位 型bit10,1sbit10,1訪問(wèn)SFRsfr80 255sfr16160 65535第5頁(yè),共44頁(yè)。2022/8/46盡可能采用無(wú)符號(hào)格式bit用于定義位變量的名字,編譯器會(huì)對(duì)其分配地址(RAM的20H 2FH 區(qū)域)sbit用于定義位變量的名字和地址,地址是確定的且不用編譯器分配(SFR及RAM
4、的20H2FH 區(qū)域)C51編譯器在編譯時(shí)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換 幾點(diǎn)說(shuō)明:第6頁(yè),共44頁(yè)。2022/8/4710.2.2 C51數(shù)據(jù)的存儲(chǔ)類型C51的存儲(chǔ)器類型存儲(chǔ)器類型長(zhǎng)度(位)對(duì)應(yīng)單片機(jī)存儲(chǔ)器bdata1片內(nèi)RAM位尋址區(qū),共128位。(亦能字節(jié)訪問(wèn))data8直接尋址,共128字節(jié)。idata8間接尋址,共256字節(jié)。pdata8片外RAM分頁(yè)間址,共256字節(jié)。(MOVX Ri)xdata16間接尋址,共64k字節(jié)。(MOVX DPTR)code16ROM間接尋址,共64k字節(jié)。(MOVC A,A+DPTR)第7頁(yè),共44頁(yè)。2022/8/48經(jīng)常使用的變量應(yīng)該置于片內(nèi)RAM中,要用b
5、data、data、idata來(lái)定義。不經(jīng)常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來(lái)定義。默認(rèn)存儲(chǔ)器類型由編譯控制命令的存儲(chǔ)模式指令限制。 存儲(chǔ)模式默認(rèn)存儲(chǔ)類型特 點(diǎn)SMALLdata 小模式。 變量默認(rèn)在片內(nèi)RAM。空間小,速度塊。COMPACTpdata緊湊模式。變量默認(rèn)在片外RAM的頁(yè)(256字節(jié),頁(yè)號(hào)由P2口決定)。LARGExdata大模式。 變量默認(rèn)在片外RAM的64KB范圍。空間大,速度慢。第8頁(yè),共44頁(yè)。2022/8/4910.2.3 80C51硬件結(jié)構(gòu)的C51定義特殊功能寄存器的聲明 sfr 特殊功能寄存器名 = 地址常數(shù);格式:例如:s
6、fr SCON = 0 x98;sfr P0 = 0 x80; 第9頁(yè),共44頁(yè)。2022/8/410特殊功能寄存器中特定位的聲明 sbit 位變量名=特殊功能寄存器名位的位置(07) 例如: sfr PSW = 0 xD0; sbit OV = PSW2; sbit 位變量名 = 字節(jié)地址位的位置(07) 例如: sbit OV = 0 xD02; sbit CY = 0 xD07; sbit 位變量名 = 位地址 例如: sbit OV = 0 xD2; sbit CY = 0 xD7; 第10頁(yè),共44頁(yè)。2022/8/411內(nèi)部RAM中可位尋址對(duì)象的定義 先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型
7、 例如: int bdata ibase; char bdata array4; 再利用sbit進(jìn)行聲明 例如: sbit mybit0 = ibase0; sbit mybit15 = ibase15; sbit ary07 = array07; sbit ary37 = array37; 訪問(wèn)示例:ibase = -1;array2 = a;array2 = 0第11頁(yè),共44頁(yè)。2022/8/412算術(shù)運(yùn)算符和算術(shù)表達(dá)式 10.2.4 C51的運(yùn)算符和表達(dá)式 基本算術(shù)運(yùn)算符 例如: + 加法運(yùn)算符; - 減法(取負(fù))運(yùn)算符; * 乘法運(yùn)算符; / 除法運(yùn)算符; % 取余數(shù)運(yùn)算符。 示例:
8、25.0/20.0 = 1.25 25/20 = 125%20 = 5 取負(fù)運(yùn)算優(yōu)先級(jí)最高。 第12頁(yè),共44頁(yè)。2022/8/413自增、自減運(yùn)算符(僅能用于變量) 例如: + 自增運(yùn)算符; - 自減運(yùn)算符;類型轉(zhuǎn)換運(yùn)算符 自動(dòng)轉(zhuǎn)換,順序:bitcharintlongfloat 強(qiáng)制類型轉(zhuǎn)換,如:(double)a 第13頁(yè),共44頁(yè)。2022/8/414關(guān)系運(yùn)算符和關(guān)系表達(dá)式 關(guān)系運(yùn)算符 小于; 大于; = 大于等于; = = 等于; != 不等于。關(guān)系表達(dá)式關(guān)系表達(dá)式的值為邏輯值:真(1)和假(0)第14頁(yè),共44頁(yè)。2022/8/415邏輯運(yùn)算符和邏輯表達(dá)式 邏輯運(yùn)算符 & 邏輯與 |
9、 邏輯或 ! 邏輯非 邏輯表達(dá)式邏輯表達(dá)式的值為邏輯值:真(1)和假(0)例:5| | 0結(jié)果為1,2&0結(jié)果為0。 第15頁(yè),共44頁(yè)。2022/8/416位運(yùn)算符 & 按位與 | 按位或 按位異或 按位取反 右移 例:P1=P11表示對(duì)P1口的所有位左移1位 第16頁(yè),共44頁(yè)。2022/8/417賦值和復(fù)合賦值運(yùn)算符 復(fù)合賦值運(yùn)算符 += 加法賦值; -= 減法賦值; *= 乘法賦值; /= 除法賦值; %= 取模賦值; 符號(hào)“=”稱為賦值運(yùn)算符 = 右移位賦值; &= 邏輯與賦值; |= 邏輯或賦值; = 邏輯異或賦值; = 邏輯非賦值; 例:a* = 5相當(dāng)于a = a*5;b& =
10、 0 x80相當(dāng)于b = b&0 x80。第17頁(yè),共44頁(yè)。2022/8/41810.3 C51流程控制語(yǔ)句 10.3.1 C51選擇語(yǔ)句 條件語(yǔ)句if(條件表達(dá)式)語(yǔ)句 例如: if(p1!= 0) c = 20; if(條件表達(dá)式)語(yǔ)句1 else 語(yǔ)句2 例如: if(p1!= 0) c = 20; else c = 0; 第18頁(yè),共44頁(yè)。2022/8/419if(條件表達(dá)式1)語(yǔ)句1 else if (條件表達(dá)式2)語(yǔ)句2 else if (條件表達(dá)式3)語(yǔ)句3 else if (條件表達(dá)式n)語(yǔ)句n else 語(yǔ)句n+1 第19頁(yè),共44頁(yè)。2022/8/420開(kāi)關(guān)語(yǔ)句swit
11、ch (表達(dá)式) case 常量表達(dá)式1:語(yǔ)句1;break; case 常量表達(dá)式2:語(yǔ)句2;break; case 常量表達(dá)式n:語(yǔ)句n;break; default :語(yǔ)句n+1; 第20頁(yè),共44頁(yè)。2022/8/42110.3.2 C51循環(huán)語(yǔ)句 while語(yǔ)句 一般形式為: while(條件表達(dá)式)語(yǔ)句;如果條件表達(dá)式的結(jié)果一開(kāi)始就為假,則后面的語(yǔ)句一次也不能執(zhí)行。 Do - while語(yǔ)句 一般形式為: do語(yǔ)句 while(條件表達(dá)式);任何條件下,循環(huán)體語(yǔ)句至少會(huì)被執(zhí)行一次。 第21頁(yè),共44頁(yè)。2022/8/422for語(yǔ)句一般形式為:for(初值表達(dá)式;條件表達(dá)式;更新表
12、達(dá)式)語(yǔ)句if語(yǔ)句與goto語(yǔ)句結(jié)合 當(dāng)型循環(huán) 形式為: loop:if(表達(dá)式) 語(yǔ)句 goto loop; 第22頁(yè),共44頁(yè)。2022/8/423直到型循環(huán) 形式為: loop:語(yǔ)句 if(表達(dá)式) goto loop; continue是一種循環(huán)中斷語(yǔ)句,它并不跳出循環(huán)體;break語(yǔ)句只能跳出它所處的那一層循環(huán);goto語(yǔ)句可以用于跳出多重循環(huán)(從內(nèi)層到外層)。注意:第23頁(yè),共44頁(yè)。2022/8/42410.4 C51的指針類型 有一個(gè)變量a,利用&a表示變量a的地址 。則語(yǔ)句 p = &a; 把a(bǔ)的地址賦給了指針變量p,則“p指向了變量a”。 *P表示變量a的內(nèi)容 指針變量的定
13、義 char data *p /* 定義指針變量 */ p = 30H /* 為指針變量賦值,30H為片內(nèi)RAM地址 */ x = *p /* 30H單元的內(nèi)容送給變量x */第24頁(yè),共44頁(yè)。2022/8/425定義時(shí)未指定它所指向的對(duì)象的存儲(chǔ)器類型 10.4.1 一般指針 一般指針占3個(gè)字節(jié)第一字節(jié)存放該指針的默認(rèn)存儲(chǔ)器類型編碼(見(jiàn)表)第二字節(jié)存放該指針的高位地址偏移量第三字節(jié)存放該指針的低位地址偏移量 存儲(chǔ)器類型編碼 存儲(chǔ)器類型bdata/ data / idataxdatapdatacode編碼0 x000 x010 xfe0 xff第25頁(yè),共44頁(yè)。2022/8/426一般指針定
14、義示例:char *xdata strptr; /* 指針本身存于xdata 空間,它指向char型數(shù)據(jù) */int *data number; /* 指針本身存于data 空間,它指向int型數(shù)據(jù) */ 由于指向?qū)ο蟮拇鎯?chǔ)空間在編譯時(shí)無(wú)法確定(運(yùn)行時(shí)確定),因此必須生成一般代碼以保證對(duì)任意空間的對(duì)象進(jìn)行存取。所以一般指針?biāo)a(chǎn)生的代碼速度較慢。第26頁(yè),共44頁(yè)。2022/8/42710.4.2 基于存儲(chǔ)器的指針定義時(shí)就指定它所指向的對(duì)象的存儲(chǔ)器類型 指針占1個(gè)字節(jié)(idata *,data *,pdata *)或2個(gè)字節(jié)(code *,xdata *) 基于存儲(chǔ)器指針定義示例:char da
15、ta *str; /* 指針指向的char型數(shù)據(jù)存于data 空間 */int xdata *num; /* 指針指向的int型數(shù)據(jù)存于xdata 空間 */ 基于存儲(chǔ)器的指針長(zhǎng)度比一般指針短,可以節(jié)省存儲(chǔ)器空間,運(yùn)行速度快,但它所指對(duì)象具有確定的存儲(chǔ)器空間,兼容性不好。第27頁(yè),共44頁(yè)。2022/8/42810.5 C51的函數(shù) 10.5.1 C51函數(shù)的定義一般形式:返回值類型 函數(shù)名(形式參數(shù)列表)編譯模式reentrantinterrupt nusing n 函數(shù)體編譯模式為SMALL、COPACT或LARGEreentrant用于定義可重入函數(shù)interrupt n 用于定義中斷函
16、數(shù),n為中斷號(hào),可以為031using n 確定工作寄存器組,取值為03 第28頁(yè),共44頁(yè)。2022/8/42910.5.2 C51函數(shù)的調(diào)用與參數(shù)傳遞 主調(diào)函數(shù)要向被調(diào)函數(shù)傳遞所需的參數(shù)傳遞給被調(diào)函數(shù)的數(shù)據(jù)稱為實(shí)際參數(shù),即實(shí)參實(shí)參向形參的傳遞是單向的參數(shù)傳遞可以采用寄存器、固定存儲(chǔ)器位置方式 參數(shù)傳遞寄存器參數(shù)傳遞傳遞的參數(shù)char、1字節(jié)指針int、2字節(jié)指針long、float一般指針參數(shù)1R7R6、R7R4R7R1、R2、R3參數(shù)2R5R4、R5R4R7R1、R2、R3參數(shù)3R3R2、R3R1、R2、R3第29頁(yè),共44頁(yè)。2022/8/430SMALL模式下,在內(nèi)部RAM中完成 C
17、OMPACT模式下,在外部RAM中完成LARGER模式下,在外部RAM中完成固定存儲(chǔ)器位置參數(shù)傳遞 80C51單片機(jī)不采用堆棧傳遞參數(shù)。但C51提供一種模擬堆棧,從而支持可重入函數(shù)的遞歸調(diào)用。 10.5.3 C51的庫(kù)函數(shù)常用的C51庫(kù)函數(shù)參見(jiàn)附錄B.2 第30頁(yè),共44頁(yè)。2022/8/43110.6 C51編程實(shí)例 10.6.1 80C51內(nèi)部資源的編程 中斷服務(wù)函數(shù)示例中斷函數(shù)的定義形式void 函數(shù)名(void)interrupt n using m 函數(shù)體 中斷源外中斷0定時(shí)器0外中斷1定時(shí)器1串行口中斷號(hào)01234第31頁(yè),共44頁(yè)。2022/8/432【例10-1】單片機(jī)應(yīng)用系統(tǒng)
18、中,外中斷0引腳接一個(gè)開(kāi)關(guān),并行口線P1.0接一個(gè)發(fā)光二級(jí)管。要求:開(kāi)關(guān)閉合一次,發(fā)光二極管的狀態(tài)改變一次。試編寫程序 #include “reg51.h”#include “intrins.h” sbit P10 = P10; void delay(void)int a = 5000; while(a - - )_nop_( );void int_srv(void)interrupt 0 delay( ); if(INT0 = = 0)P10 = ! P10;while(INT0 = = 0); void main() P10 = 0; EA = 1; EX0 = 1; while(1);
19、第32頁(yè),共44頁(yè)。2022/8/433定時(shí)計(jì)數(shù)器編程示例【例10-2】 利用定時(shí)/計(jì)數(shù)器T0的方式1,產(chǎn)生10ms的定時(shí),并使P1.0引腳上輸出周期為20ms的方波,采用中斷方式,設(shè)系統(tǒng)時(shí)鐘頻率為12 MHz。1、計(jì)算計(jì)數(shù)初值X: Nt/ Tcy 1010-3/110-610000計(jì)數(shù)器初值應(yīng)為-10000。即應(yīng)將 -(10000/256)送入TH0中,-(10000%256)送入TL0中。 2、求T0的方式控制字TMOD:M1M0 = 01,GATE = 0,C/T = 0,可取方式控制字為01H。 3、程序清單(見(jiàn)下頁(yè)) 第33頁(yè),共44頁(yè)。2022/8/434#include “reg
20、51.h”sbit P10 = P10;void timer0(void)interrupt 1 P10 = ! P10; TH0 = -(10000/256); TL0 = -(10000%256); void main(void)TMOD = 0 x01;P10 = 0;TH0 = -(10000 / 256);TL0 = -(10000 % 256);EA = 1;ET0 = 1;TR0 = 1;while(1);第34頁(yè),共44頁(yè)。2022/8/43510.6.2 80C51擴(kuò)展資源的編程 通用并行口編程示例 【例10-3】用81C55作為微型打印機(jī)與單片機(jī)間的接口電路。 第35頁(yè),共
21、44頁(yè)。2022/8/436#include “reg51.h”#include “absacc.h” /*含有對(duì)XBYTE等絕對(duì)地址訪問(wèn)宏的定義*/#define uchar unsigned char#define COMD8155 XBYTE0 x7f00#define PA8155 XBYTE0 x7f01#define PB8155 XBYTE0 x7f02#define PC8155 XBYTE0 x7f03sbit BUSY = P33; 第36頁(yè),共44頁(yè)。2022/8/437uchar code tab17 =0 xb8,0 xdf,0 xbd,0 xcc,0 x20, 0 xb3,0 xf6,0 xb0,0 xe6,0 xc9,0 xe7,0 x20, 0 x32,0 x30,0 x30,0 x38,0 x0a;/*高教 出版社 2008*/ uchar t1 = 17;void ptr(uchar d) /*打印字符函數(shù)*/ PA8155 = d; PC8155 = 0 x00; /*產(chǎn)生選通脈沖*/ PC8155 = 0 x01; while(BUSY);第37頁(yè),共44頁(yè)。2022/8/438void main(void) COMD8155 = 0 x0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同變更協(xié)議書共
- 廢舊瀝青購(gòu)買合同
- 水穩(wěn)料供銷合同
- 廠房電路安裝合同
- 拆舊合同協(xié)議
- 連鎖超市合作協(xié)議合同書
- 甲方更改合同協(xié)議
- 工程裝修維修協(xié)議合同書
- 重要的合同協(xié)議放在哪兒
- 合同附件技術(shù)協(xié)議
- 基于STM32智能停車場(chǎng)管理系統(tǒng)設(shè)計(jì)
- 中藥炮制完整版本
- 高空拋物安全教育主題班會(huì)
- 急性胰腺炎護(hù)理查房
- 飼料學(xué)全套課件
- 血液透析相關(guān)無(wú)菌技術(shù)操作護(hù)理課件
- 注塑產(chǎn)品常見(jiàn)外觀缺陷課件
- 個(gè)人體檢報(bào)告
- 初中八年級(jí)音樂(lè)-跳月歌
- 未來(lái)人工智能在麻醉學(xué)中的應(yīng)用前景分析培訓(xùn)課件
- 醫(yī)院培訓(xùn)課件:《枸櫞酸鈉抗凝劑在CRRT中的應(yīng)用》
評(píng)論
0/150
提交評(píng)論