第七章單片機(jī)c51基礎(chǔ)_第1頁
第七章單片機(jī)c51基礎(chǔ)_第2頁
第七章單片機(jī)c51基礎(chǔ)_第3頁
第七章單片機(jī)c51基礎(chǔ)_第4頁
第七章單片機(jī)c51基礎(chǔ)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章單片機(jī)C51基礎(chǔ)7.1C51的程序結(jié)構(gòu)7.2C51的數(shù)據(jù)結(jié)構(gòu)7.3C51與匯編語言的混合編程7.4C51仿真開發(fā)環(huán)境7.5C51初步應(yīng)用編程51匯編語言能直接操作單片機(jī)的系統(tǒng)硬件,指令執(zhí)行速度快。但其程序可讀性差,且編寫、移植困難。

匯編語言的問題C51是為51系列單片機(jī)設(shè)計的一種C語言,其特點(diǎn):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ǔ)上上手快C51的好處相同之處:語法規(guī)則、程序結(jié)構(gòu)、編程方法差異之處:數(shù)據(jù)類型、存儲模式、中斷處理教學(xué)安排:①

介紹C51語言的數(shù)據(jù)結(jié)構(gòu)及C51編程手段;②

介紹單片機(jī)I/O口的初步應(yīng)用及C51編程方法。C51與標(biāo)準(zhǔn)C語言對比7.1C51的程序結(jié)構(gòu)7.2C51的數(shù)據(jù)結(jié)構(gòu)7.3MCS-51內(nèi)部資源使用的C語言編程7.4C51與匯編語言的混合編程

1.在C51中調(diào)用匯編程序

2.C51中嵌入?yún)R編代碼7.5C51仿真開發(fā)環(huán)境7.6C51初步應(yīng)用編程

7.1C51的程序結(jié)構(gòu)Project(可包含若干程序文件)C51(庫函數(shù))LIB(庫函數(shù))(頭文件)KeilC51(μVionsion3)Main(函數(shù))File_1(*.c)Func_k(函數(shù))…….………File_n(*.*)Func_1(函數(shù))Func_n(函數(shù))…….用戶編程編譯系統(tǒng)C51單片機(jī)軟件系統(tǒng)結(jié)構(gòu)①程序由函數(shù)組成(一個主函數(shù),或一個主函數(shù)和若干自定義函數(shù));②利用預(yù)處理命令對變量或函數(shù)進(jìn)行集中定義或說明;③函數(shù)和變量都需遵循先定義后使用的基本原則;④主函數(shù)中的所有語句執(zhí)行完畢,則程序結(jié)束。C51與標(biāo)準(zhǔn)C程序結(jié)構(gòu)完全相同程序結(jié)構(gòu)舉例:LED閃爍控制功能預(yù)處理命令---------函數(shù)說明------------全局變量定義------

主函數(shù)------------調(diào)用函數(shù)------------局部變量定義---------

程序體

程序體------C51程序代碼7.1C51的程序結(jié)構(gòu)7.2C51的數(shù)據(jù)結(jié)構(gòu)7.3MCS-51內(nèi)部資源使用的C語言編程7.4C51與匯編語言的混合編程

1.在C51中調(diào)用匯編程序

2.C51中嵌入?yún)R編代碼7.5C51仿真開發(fā)環(huán)境7.6C51初步應(yīng)用編程7.2C51的數(shù)據(jù)結(jié)構(gòu)在程序執(zhí)行過程中,數(shù)值可以發(fā)生改變的量稱為變量。變量名與存儲單元地址相對應(yīng),變量值與存儲單元的內(nèi)容相對應(yīng)。例如在哈佛結(jié)構(gòu)的存儲空間中如何建立變量概念?1.C51的變量【存儲種類】數(shù)據(jù)類型【存儲類型】變量名存儲地址(標(biāo)準(zhǔn)C)作用范圍(標(biāo)準(zhǔn)C)*方括號項——可以缺省存儲空間(C51特有)數(shù)據(jù)格式(C51擴(kuò)充)C51變量定義的四個要素:

①自動變量(auto)——在函數(shù)內(nèi)部定義的變量,退出函數(shù)后,分配給該變量的存儲單元即自行消失(局部變量)?!敬鎯ΨN類】

數(shù)據(jù)類型【存儲類型】變量名②外部變量(extern)——在函數(shù)外部定義的變量,可始終保持變量的數(shù)值(全局變量)。

【強(qiáng)調(diào)】一個外部變量只能被定義一次,在定義文件之外的地方使用時需用extern進(jìn)行聲明。③靜態(tài)變量(static)——靜態(tài)局部變量/靜態(tài)全局變量④寄存器變量(register)——以寄存器為存儲空間的變量*若省略存儲種類選項,則變量默認(rèn)為自動變量

存儲種類舉例:自動變量與外部變量的差異數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型*有符號數(shù)類型可以忽略signed標(biāo)識符標(biāo)準(zhǔn)C語言的數(shù)據(jù)類型【存儲種類】

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

【存儲類型】變量名數(shù)據(jù)類型bit型用bit定義一個位變量,語法規(guī)則如下:bitbit_name

[=常數(shù)0~1];例如:bitdoor=0;//定義一個叫door的變量且初值為0注意:利用bit可以定義一個位變量或位函數(shù),但不能定義位指針,也不能定義位數(shù)組。例如:

bitgate=0;

C51擴(kuò)充數(shù)據(jù)類型:bit、sfr或sfr16、sbit

sfr定義特殊功能寄存器SFR,語法規(guī)則如下:

sfr

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

sfrPCON=0x87;//定義PCON地址87H

sfr16DPTR=0x82;//定義DPTR的低端地址82H將SFR范圍內(nèi)的位地址(0x80~0xFF)定義為位變量序號特殊功能寄存器名稱符號字節(jié)地址位地址sbit型

1)sbit

bit_name=

位地址常數(shù);

將位于SFR字節(jié)地址內(nèi)的絕對位地址定義為位變量名。例如,sbitCY=0xD7;

序號特殊功能寄存器名稱符號字節(jié)地址位地址2)sbitbit_name=sfr_name^位位置;

將已有定義的SFR的0~7位定義為位變量名。

例如:sfrPSW=0xD0;sbitCY=PSW^7;

序號特殊功能寄存器名稱符號字節(jié)地址位地址3)sbitbit_name=sfr字節(jié)地址

^位位置;

將SFR字節(jié)地址的相對位地址定義為位變量名。

例如:sbitCY=0xD0^7;

序號特殊功能寄存器名稱符號字節(jié)地址位地址C51編譯器在頭文件“reg51.h”中定義了全部sfr/sfr16和sbit變量。用一條預(yù)處理命令#include<reg51.h>把這個頭文件包含到C51程序中,無需重定義即可直接使用它們的名稱。3.C51對存貯器和外接I/O口的絕對地址訪問和定義①對存貯器的絕對地址訪問利用絕對地址訪問的頭文件absacc.h可對不同的存貯區(qū)進(jìn)行訪問。該頭文件的函數(shù)有:

CBYTE(訪問code區(qū)字符型)DBYTE(訪問data區(qū)字符型)PBYTE(訪問pdata或I/O區(qū)字符型)XBYTE(訪問xdata或I/O區(qū)字符型)

還有CWORD、DWORD、PWORD和XWORD四個函數(shù),它們的訪問區(qū)域同上,只是訪問的類型為int型。例:#include<absacc.h>#definecomXBYTE[0x07ff]那么后面程序com變量出現(xiàn)的地方,就是對地址為07ffH的外部RAM或I/O口進(jìn)行訪問。

訪問絕對地址例:XWORD[0]=0x9988;即將9988H(int類型)送入外部RAM的0號和1號單元。

使用中要注意:absacc.h一定要包含進(jìn)程序,XWORD必須大寫。

②對外部I/O口的訪問

由于單片機(jī)的I/O口和外部RAM統(tǒng)一編址,因此對I/O口地址的訪問可用XBYTE(MOVX@DPTR)或PBYTE(MOVX@Ri)進(jìn)行。例:#include“absacc.h”

#definePAXBYTE[0xffec]//將PA定義為外部I/O口,地址0FFECH#defineNAMEDBYTE[0x40]//將NAME定義為片內(nèi)RAM,地址40H

voidmain(void){PA=0x3a;NAME=0x01;}③對絕對地址的定義定義變量時,使用_at_關(guān)鍵詞指定變量的絕對地址,格式為:

[存儲類型]數(shù)據(jù)類型變量名_at_絕對地址;例:dataunsignedcharx1_at_0x40;//在data區(qū)定義字節(jié)變量x1,它的地址為40Hxdataunsignedintx2_at_0x2000;//在xdata區(qū)定義字變量x2,它的地址為2000Hvoidmain(void){x1=0xff;x2=0x1234;}

應(yīng)用舉例:51系列單片機(jī)有三個邏輯存儲空間:【存儲種類】數(shù)據(jù)類型

【存儲類型】變量名片內(nèi)數(shù)據(jù)存儲器,片外數(shù)據(jù)存儲器和程序存儲器。存儲類型80HFFH8052data區(qū)xdata區(qū)code區(qū)bdata區(qū)建立C51存儲類型與存儲空間的對應(yīng)關(guān)系80HFFH8052idata區(qū)256B256B256B256B每一個256字節(jié)都是pdata區(qū)存儲區(qū)

描述data片內(nèi)RAM的低128字節(jié),可在一個周期內(nèi)直接尋址bdata片內(nèi)RAM可按位尋址區(qū)idata片內(nèi)RAM的高128字節(jié),必須采用間接尋址,使用Ri間接尋址pdata片外RAM及接口區(qū)(256B),使用Ri間接尋址xdata片外RAM及接口區(qū)(64KB),使用DPTR間接尋址code程序存儲區(qū)(64KB),使用DPTR尋址C51的存儲類型與存儲空間對應(yīng)關(guān)系表三種默認(rèn)存儲類型與編譯模式之間的關(guān)系: SMALL:參數(shù)及局部變量放入可直接尋址的片內(nèi)RAM區(qū),默認(rèn)類型是DATA。COMPACT:參數(shù)及局部變量放入分頁片外RAM區(qū)(最大256B),默認(rèn)類型是PDATA。LARGE:參數(shù)及局部變量放入片外RAM區(qū)(最大64KB)

,默認(rèn)類型是XDATA。C51編譯器指定了三種默認(rèn)存儲類型:【存儲種類】數(shù)據(jù)類型

【存儲類型】

變量名C51編譯器的三種編譯模式:小編譯模式(SMALL)緊湊編譯模式(COMPACT)大編譯模式(LARGE)變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度隨編譯系統(tǒng)而定。變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量。強(qiáng)調(diào):頭文件中定義的變量都是大寫的【存儲種類】數(shù)據(jù)類型【存儲類型】

變量名C51擴(kuò)展的若干關(guān)鍵字一覽表

變量名不得使用標(biāo)準(zhǔn)C語言和C51語言的關(guān)鍵字。unsignedchardatasystem_status=0;

//定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。數(shù)據(jù)結(jié)構(gòu)定義舉例變量名為system_status位于片內(nèi)RAM區(qū)無符號字符型自動型初值為零unsignedcharbdatastatus_byte;

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

staticcharm,n;

//定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū)//定義unit_id[2]為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個位于data區(qū)中的有符號字符型靜態(tài)變量。7.1C51的程序結(jié)構(gòu)

7.2C51的數(shù)據(jù)結(jié)構(gòu)7.3MCS-51內(nèi)部資源使用的C語言編程7.4C51與匯編語言的混合編程

1.在C51中調(diào)用匯編程序

2.C51中嵌入?yún)R編代碼7.5C51仿真開發(fā)環(huán)境7.6C51初步應(yīng)用編程7.3MCS-51內(nèi)部資源使用的C語言編程7.3MCS-51內(nèi)部資源使用的C語言編程7.3.1中斷應(yīng)用的C語言編程

C51編譯器支持在C源程序中直接開發(fā)中斷程序。中斷服務(wù)程序是通過按規(guī)定語法格式定義的一個函數(shù)。中斷服務(wù)程序的函數(shù)定義的語法格式如下:

返回值函數(shù)名([參數(shù)])interruptm[usingn]{

}…MCS-51中斷源編號編號中斷源入口地址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷0023H

usingn

選項用于實現(xiàn)工作寄存器組的切換,n是中斷服務(wù)子程序中選用的工作寄存器組號(0~3)。在許多情況下,響應(yīng)中斷時需保護(hù)有關(guān)現(xiàn)場信息,以便中斷返回后,能使中斷前的源程序從斷點(diǎn)處繼續(xù)正確地執(zhí)行下去。這在MCS-51單片機(jī)中,能很方便地利用工作寄存器組的切換來實現(xiàn)。即在進(jìn)入中斷服務(wù)程序前的程序中使用一組工作寄存器,進(jìn)入中斷服務(wù)程序后,由"usingn"切換到另一組寄存器,中斷返回后又恢復(fù)到原寄存器組。這樣互相切換的兩組寄存器中的內(nèi)容彼此都沒有被破壞。圖7.5擴(kuò)展多個中斷源

例3

圖7.5所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)8051的一個外部中斷INT1上擴(kuò)展多個中斷源的原理電路圖。圖中是以開關(guān)閉合來模擬中斷請求信號。當(dāng)有任一中斷源產(chǎn)生中斷請求,能給8051的INT1引腳送一個有效中斷信號,由P1的低3位可得對應(yīng)中斷源的中斷號。

在中斷服務(wù)程序中僅設(shè)置標(biāo)志,并保存I/O口輸入狀態(tài)。FranklinC51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h。C51程序如下:#include<reg51.h>unsignedcharstatus;

bitflag;

voidservice_int1()interrupt2using2 /*INT1中斷服務(wù)程序,使用第2組工 作寄存器*/{flag=1; /*設(shè)置標(biāo)志*/status=p1; /*存輸入口狀態(tài)*/}voidmain(void){IP=0x04; /*置INT1為高優(yōu)先級中斷*/IE=0x84; /*INT1開中斷,CPU開中斷*/for(;;){if(flag) /*有中斷*/{switch(status) /*根據(jù)中斷源分支*/{case0:break; /*處理IN0*/case1:break; /*處理IN1*/case2:break; /*處理IN2*/case3:break; /*處理IN3*/default:;

}flag=0; /*處理完成清標(biāo)志*/}}}7.3.2定時器/計數(shù)器(T/C)應(yīng)用的C語言編程

例4

設(shè)單片機(jī)的fosc=12MHz晶振,要求在P1.0腳上輸出周期為2ms的方波。周期為2ms的方波要求定時時間隔1ms,每次時間到P1.0取反。機(jī)器周期=12/fosc=1μs

需計數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000

由于計數(shù)器是加1計數(shù),為得到1000個計數(shù)之后的定時器溢出,必須給定時器置初值為65536-1000。(1)用定時器0的方式1編程,采用查詢方式,程序如下:

#include<reg51.h>sbitP1_0=P1^0;

voidmain(void){TMOD=0x01; /*設(shè)置定時器1為非門控制方式1*/TR0=1; /*啟動T/C0*/while(1){TH0=(64536/256); /*裝載計數(shù)器初值*/TL0=(64536%256);

do{}while(!TF0); /*查詢等待TF0置位*/P1_0=!P1_0; /*定時時間到P1.0反相*/TF0=0; /*軟件清TF0*/}}(2)用定時器0的方式1編程,采用中斷方式。程序如下:

#include<reg51.h>sbitP1_0=P1^0;

voidtime(void)interrupt1using1/*T/C0中斷服務(wù)程序入口*/{P1_0=!P1_0; /*P1.0取反*/TH0=(64536/256); /*重新裝載計數(shù)初值*/

TL0=(64536%256);

}voidmain(void){TMOD=0x01; /*T/C0工作在定時器非門控制方式1*/P1_0=0;

TH0=(64536/256); /*預(yù)置計數(shù)初值*/TL0=(64536%256);

ET0=1; /*T/C0中斷開放*/EA=1; /*CPU中斷開放*/TR0=1; /*啟動T/C0開始定時*/do{}while(1); /*等待中斷*/}

例5

采用10MHz晶振,在P1.0腳上輸出周期為2.5s,占空比20%的脈沖信號。

10MHz晶振,使用定時器最大定時幾十毫秒。取10ms定時,周期2.5s需250次中斷,占空比20%,高電平應(yīng)為50次中斷。

10ms定時,晶振fosc=10MHz。需定時器計數(shù)次數(shù)=10×103×10/12=8333#include<reg51.h>#defineucharunsignedcharucharperiod=250;ucharhigh=50;uchartime=0;

timer0()interrupt1using1 /*T/C0中斷服務(wù)程序*/{TH0=57203/256; /*重置計數(shù)值*/TL0=57203%256;if(++time==high)P1=0; /*高電平時間到變低*/elseif(time==period) /*周期時間到變高*/{time=0;P1=1;

}}main(){TMOD=0x01; /*定時器0方式1*/TH0=57203/256; /*預(yù)置計數(shù)初值*/TL0=57203%256;

ET0=1; /*開T/C0中斷*/EA=1; /*開CPU中斷*/TR0=1; /*啟動T/C0*/do{}while(1);

}圖7.6中斷服務(wù)程序流程圖7.1C51的程序結(jié)構(gòu)

7.2C51的數(shù)據(jù)結(jié)構(gòu)7.3MCS-51內(nèi)部資源使用的C語言編程7.4C51與匯編語言的混合編程

1.在C51中調(diào)用匯編程序

2.C51中嵌入?yún)R編代碼7.5C51仿真開發(fā)環(huán)境7.6C51初步應(yīng)用編程7.4C51與匯編語言的混合編程舉例:在兩個數(shù)據(jù)中選出較大的數(shù)據(jù),并賦值給變量c。1.在C51中調(diào)用匯編函數(shù)//以下代碼在main.c文件中實現(xiàn)charmax(chara,charb);//由匯編語言實現(xiàn)main(){chara=30,b=40,c;c=max(a,b);};以下代碼在匯編語言文件max.asm中實現(xiàn)

PUBLIC

_MAX

DE SEGMENTCODE

RSEG DE_MAX:

MOV A,R7 ;取第一個參數(shù) MOV 30H,R5;取第二個參數(shù) CJNE A,30H,TAG SJMP EXITTAG:

JNC EXIT

MOV R7,30HEXIT:

RET END 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)用匯編語言,需要解決三個問題:通過在匯編文件中定義同名的“函數(shù)”來實現(xiàn)。

1)程序的尋址問題c

溫馨提示

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

最新文檔

評論

0/150

提交評論