版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度中小企業(yè)融資合同范本(融資培訓(xùn))3篇
- 二零二五年度建筑工程施工合同綠色環(huán)保要求與論文分析3篇
- 2024年網(wǎng)絡(luò)安全防護(hù)服務(wù)全面合作合同
- 金融機(jī)構(gòu)法律顧問服務(wù)合同解析
- 2025年度二零二五年度拖拉機(jī)機(jī)械租賃與農(nóng)村金融服務(wù)合同3篇
- 2025年度高級研發(fā)人員招聘合同模板3篇
- 2025年度摩托車位租賃、轉(zhuǎn)讓及停車場智能化合作合同3篇
- 2025年度公寓獨(dú)家代理租賃服務(wù)合同3篇
- 2025年度旅游設(shè)施建設(shè)承包合同解除書2篇
- 2025年度廉潔勞動合同:企業(yè)員工廉潔自律管理合同2篇
- 2024年中國機(jī)織濾布市場調(diào)查研究報告
- 《CIS企業(yè)形象策劃》課件
- 機(jī)器加盟協(xié)議合同范例
- 2024-2030年中國油田服務(wù)市場發(fā)展?jié)摿εc前景戰(zhàn)略規(guī)劃分析報告
- 黑龍江省哈爾濱市道里區(qū)2023-2024學(xué)年八年級上學(xué)期數(shù)學(xué)期末考試試卷
- 碼頭操作管理制度
- 全過程造價咨詢實施方案
- 2024年內(nèi)容創(chuàng)作者與平臺合作協(xié)議2篇
- DL-T5704-2014火力發(fā)電廠熱力設(shè)備及管道保溫防腐施工質(zhì)量驗收規(guī)程
- 貴州省黔東南州2022-2023學(xué)年八年級上學(xué)期期末文化水平測試數(shù)學(xué)試卷(含答案)
- MSOP(測量標(biāo)準(zhǔn)作業(yè)規(guī)范)測量SOP
評論
0/150
提交評論