




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章單片機C51基礎7.1C51的程序結構7.2C51的數據結構7.3C51與匯編語言的混合編程7.4C51仿真開發環境7.5C51初步應用編程51匯編語言能直接操作單片機的系統硬件,指令執行速度快。但其程序可讀性差,且編寫、移植困難。
匯編語言的問題C51是為51系列單片機設計的一種C語言,其特點:C51語言已成為51系列單片機程序開發的主流軟件方法。結構化語言,代碼緊湊——效率可與匯編語言媲美接近真實語言,程序可讀性強——易于調試、維護庫函數豐富,編程工作量小——產品開發周期短機器級控制能力,功能很強——適合于嵌入式系統開發與匯編指令無關,易于掌握——在單片機基礎上上手快C51的好處相同之處:語法規則、程序結構、編程方法差異之處:數據類型、存儲模式、中斷處理教學安排:①
介紹C51語言的數據結構及C51編程手段;②
介紹單片機I/O口的初步應用及C51編程方法。C51與標準C語言對比7.1C51的程序結構7.2C51的數據結構7.3MCS-51內部資源使用的C語言編程7.4C51與匯編語言的混合編程
1.在C51中調用匯編程序
2.C51中嵌入匯編代碼7.5C51仿真開發環境7.6C51初步應用編程
7.1C51的程序結構Project(可包含若干程序文件)C51(庫函數)LIB(庫函數)(頭文件)KeilC51(μVionsion3)Main(函數)File_1(*.c)Func_k(函數)…….………File_n(*.*)Func_1(函數)Func_n(函數)…….用戶編程編譯系統C51單片機軟件系統結構①程序由函數組成(一個主函數,或一個主函數和若干自定義函數);②利用預處理命令對變量或函數進行集中定義或說明;③函數和變量都需遵循先定義后使用的基本原則;④主函數中的所有語句執行完畢,則程序結束。C51與標準C程序結構完全相同程序結構舉例:LED閃爍控制功能預處理命令---------函數說明------------全局變量定義------
主函數------------調用函數------------局部變量定義---------
程序體
程序體------C51程序代碼7.1C51的程序結構7.2C51的數據結構7.3MCS-51內部資源使用的C語言編程7.4C51與匯編語言的混合編程
1.在C51中調用匯編程序
2.C51中嵌入匯編代碼7.5C51仿真開發環境7.6C51初步應用編程7.2C51的數據結構在程序執行過程中,數值可以發生改變的量稱為變量。變量名與存儲單元地址相對應,變量值與存儲單元的內容相對應。例如在哈佛結構的存儲空間中如何建立變量概念?1.C51的變量【存儲種類】數據類型【存儲類型】變量名存儲地址(標準C)作用范圍(標準C)*方括號項——可以缺省存儲空間(C51特有)數據格式(C51擴充)C51變量定義的四個要素:
①自動變量(auto)——在函數內部定義的變量,退出函數后,分配給該變量的存儲單元即自行消失(局部變量)。【存儲種類】
數據類型【存儲類型】變量名②外部變量(extern)——在函數外部定義的變量,可始終保持變量的數值(全局變量)。
【強調】一個外部變量只能被定義一次,在定義文件之外的地方使用時需用extern進行聲明。③靜態變量(static)——靜態局部變量/靜態全局變量④寄存器變量(register)——以寄存器為存儲空間的變量*若省略存儲種類選項,則變量默認為自動變量
存儲種類舉例:自動變量與外部變量的差異數據的不同格式叫做數據類型*有符號數類型可以忽略signed標識符標準C語言的數據類型【存儲種類】
數據類型
【存儲類型】變量名數據類型bit型用bit定義一個位變量,語法規則如下:bitbit_name
[=常數0~1];例如:bitdoor=0;//定義一個叫door的變量且初值為0注意:利用bit可以定義一個位變量或位函數,但不能定義位指針,也不能定義位數組。例如:
bitgate=0;
C51擴充數據類型:bit、sfr或sfr16、sbit
sfr定義特殊功能寄存器SFR,語法規則如下:
sfr
或
sfr16sfr_name=字節地址常數;Sfr或sfr16型例如,sfrP0=0x80;//定義P0口地址80H
sfrPCON=0x87;//定義PCON地址87H
sfr16DPTR=0x82;//定義DPTR的低端地址82H將SFR范圍內的位地址(0x80~0xFF)定義為位變量序號特殊功能寄存器名稱符號字節地址位地址sbit型
1)sbit
bit_name=
位地址常數;
將位于SFR字節地址內的絕對位地址定義為位變量名。例如,sbitCY=0xD7;
序號特殊功能寄存器名稱符號字節地址位地址2)sbitbit_name=sfr_name^位位置;
將已有定義的SFR的0~7位定義為位變量名。
例如:sfrPSW=0xD0;sbitCY=PSW^7;
序號特殊功能寄存器名稱符號字節地址位地址3)sbitbit_name=sfr字節地址
^位位置;
將SFR字節地址的相對位地址定義為位變量名。
例如:sbitCY=0xD0^7;
序號特殊功能寄存器名稱符號字節地址位地址C51編譯器在頭文件“reg51.h”中定義了全部sfr/sfr16和sbit變量。用一條預處理命令#include<reg51.h>把這個頭文件包含到C51程序中,無需重定義即可直接使用它們的名稱。3.C51對存貯器和外接I/O口的絕對地址訪問和定義①對存貯器的絕對地址訪問利用絕對地址訪問的頭文件absacc.h可對不同的存貯區進行訪問。該頭文件的函數有:
CBYTE(訪問code區字符型)DBYTE(訪問data區字符型)PBYTE(訪問pdata或I/O區字符型)XBYTE(訪問xdata或I/O區字符型)
還有CWORD、DWORD、PWORD和XWORD四個函數,它們的訪問區域同上,只是訪問的類型為int型。例:#include<absacc.h>#definecomXBYTE[0x07ff]那么后面程序com變量出現的地方,就是對地址為07ffH的外部RAM或I/O口進行訪問。
訪問絕對地址例:XWORD[0]=0x9988;即將9988H(int類型)送入外部RAM的0號和1號單元。
使用中要注意:absacc.h一定要包含進程序,XWORD必須大寫。
②對外部I/O口的訪問
由于單片機的I/O口和外部RAM統一編址,因此對I/O口地址的訪問可用XBYTE(MOVX@DPTR)或PBYTE(MOVX@Ri)進行。例:#include“absacc.h”
#definePAXBYTE[0xffec]//將PA定義為外部I/O口,地址0FFECH#defineNAMEDBYTE[0x40]//將NAME定義為片內RAM,地址40H
voidmain(void){PA=0x3a;NAME=0x01;}③對絕對地址的定義定義變量時,使用_at_關鍵詞指定變量的絕對地址,格式為:
[存儲類型]數據類型變量名_at_絕對地址;例:dataunsignedcharx1_at_0x40;//在data區定義字節變量x1,它的地址為40Hxdataunsignedintx2_at_0x2000;//在xdata區定義字變量x2,它的地址為2000Hvoidmain(void){x1=0xff;x2=0x1234;}
應用舉例:51系列單片機有三個邏輯存儲空間:【存儲種類】數據類型
【存儲類型】變量名片內數據存儲器,片外數據存儲器和程序存儲器。存儲類型80HFFH8052data區xdata區code區bdata區建立C51存儲類型與存儲空間的對應關系80HFFH8052idata區256B256B256B256B每一個256字節都是pdata區存儲區
描述data片內RAM的低128字節,可在一個周期內直接尋址bdata片內RAM可按位尋址區idata片內RAM的高128字節,必須采用間接尋址,使用Ri間接尋址pdata片外RAM及接口區(256B),使用Ri間接尋址xdata片外RAM及接口區(64KB),使用DPTR間接尋址code程序存儲區(64KB),使用DPTR尋址C51的存儲類型與存儲空間對應關系表三種默認存儲類型與編譯模式之間的關系: SMALL:參數及局部變量放入可直接尋址的片內RAM區,默認類型是DATA。COMPACT:參數及局部變量放入分頁片外RAM區(最大256B),默認類型是PDATA。LARGE:參數及局部變量放入片外RAM區(最大64KB)
,默認類型是XDATA。C51編譯器指定了三種默認存儲類型:【存儲種類】數據類型
【存儲類型】
變量名C51編譯器的三種編譯模式:小編譯模式(SMALL)緊湊編譯模式(COMPACT)大編譯模式(LARGE)變量名可以由字母、數字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度隨編譯系統而定。變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量。強調:頭文件中定義的變量都是大寫的【存儲種類】數據類型【存儲類型】
變量名C51擴展的若干關鍵字一覽表
變量名不得使用標準C語言和C51語言的關鍵字。unsignedchardatasystem_status=0;
//定義system_status為無符號字符型自動變量,該變量位于data區中且初值為0。數據結構定義舉例變量名為system_status位于片內RAM區無符號字符型自動型初值為零unsignedcharbdatastatus_byte;
unsignedintcodeunit_id[2]={0x1234,0x89ab};
staticcharm,n;
//定義status_byte為無符號字符型自動變量,該變量位于bdata區//定義unit_id[2]為無符號整型自動變量,該變量位于code區中,是長度為2的數組,且初值為0x1234和0x89ab。//定義m和n為2個位于data區中的有符號字符型靜態變量。7.1C51的程序結構
7.2C51的數據結構7.3MCS-51內部資源使用的C語言編程7.4C51與匯編語言的混合編程
1.在C51中調用匯編程序
2.C51中嵌入匯編代碼7.5C51仿真開發環境7.6C51初步應用編程7.3MCS-51內部資源使用的C語言編程7.3MCS-51內部資源使用的C語言編程7.3.1中斷應用的C語言編程
C51編譯器支持在C源程序中直接開發中斷程序。中斷服務程序是通過按規定語法格式定義的一個函數。中斷服務程序的函數定義的語法格式如下:
返回值函數名([參數])interruptm[usingn]{
}…MCS-51中斷源編號編號中斷源入口地址0外部中斷00003H1定時器/計數器0000BH2外部中斷10013H3定時器/計數器1001BH4串行口中斷0023H
usingn
選項用于實現工作寄存器組的切換,n是中斷服務子程序中選用的工作寄存器組號(0~3)。在許多情況下,響應中斷時需保護有關現場信息,以便中斷返回后,能使中斷前的源程序從斷點處繼續正確地執行下去。這在MCS-51單片機中,能很方便地利用工作寄存器組的切換來實現。即在進入中斷服務程序前的程序中使用一組工作寄存器,進入中斷服務程序后,由"usingn"切換到另一組寄存器,中斷返回后又恢復到原寄存器組。這樣互相切換的兩組寄存器中的內容彼此都沒有被破壞。圖7.5擴展多個中斷源
例3
圖7.5所示是利用優先權解碼芯片,在單片機8051的一個外部中斷INT1上擴展多個中斷源的原理電路圖。圖中是以開關閉合來模擬中斷請求信號。當有任一中斷源產生中斷請求,能給8051的INT1引腳送一個有效中斷信號,由P1的低3位可得對應中斷源的中斷號。
在中斷服務程序中僅設置標志,并保存I/O口輸入狀態。FranklinC51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h。C51程序如下:#include<reg51.h>unsignedcharstatus;
bitflag;
voidservice_int1()interrupt2using2 /*INT1中斷服務程序,使用第2組工 作寄存器*/{flag=1; /*設置標志*/status=p1; /*存輸入口狀態*/}voidmain(void){IP=0x04; /*置INT1為高優先級中斷*/IE=0x84; /*INT1開中斷,CPU開中斷*/for(;;){if(flag) /*有中斷*/{switch(status) /*根據中斷源分支*/{case0:break; /*處理IN0*/case1:break; /*處理IN1*/case2:break; /*處理IN2*/case3:break; /*處理IN3*/default:;
}flag=0; /*處理完成清標志*/}}}7.3.2定時器/計數器(T/C)應用的C語言編程
例4
設單片機的fosc=12MHz晶振,要求在P1.0腳上輸出周期為2ms的方波。周期為2ms的方波要求定時時間隔1ms,每次時間到P1.0取反。機器周期=12/fosc=1μs
需計數次數=1000/(12/fosc)=1000/1=1000
由于計數器是加1計數,為得到1000個計數之后的定時器溢出,必須給定時器置初值為65536-1000。(1)用定時器0的方式1編程,采用查詢方式,程序如下:
#include<reg51.h>sbitP1_0=P1^0;
voidmain(void){TMOD=0x01; /*設置定時器1為非門控制方式1*/TR0=1; /*啟動T/C0*/while(1){TH0=(64536/256); /*裝載計數器初值*/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中斷服務程序入口*/{P1_0=!P1_0; /*P1.0取反*/TH0=(64536/256); /*重新裝載計數初值*/
TL0=(64536%256);
}voidmain(void){TMOD=0x01; /*T/C0工作在定時器非門控制方式1*/P1_0=0;
TH0=(64536/256); /*預置計數初值*/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%,高電平應為50次中斷。
10ms定時,晶振fosc=10MHz。需定時器計數次數=10×103×10/12=8333#include<reg51.h>#defineucharunsignedcharucharperiod=250;ucharhigh=50;uchartime=0;
timer0()interrupt1using1 /*T/C0中斷服務程序*/{TH0=57203/256; /*重置計數值*/TL0=57203%256;if(++time==high)P1=0; /*高電平時間到變低*/elseif(time==period) /*周期時間到變高*/{time=0;P1=1;
}}main(){TMOD=0x01; /*定時器0方式1*/TH0=57203/256; /*預置計數初值*/TL0=57203%256;
ET0=1; /*開T/C0中斷*/EA=1; /*開CPU中斷*/TR0=1; /*啟動T/C0*/do{}while(1);
}圖7.6中斷服務程序流程圖7.1C51的程序結構
7.2C51的數據結構7.3MCS-51內部資源使用的C語言編程7.4C51與匯編語言的混合編程
1.在C51中調用匯編程序
2.C51中嵌入匯編代碼7.5C51仿真開發環境7.6C51初步應用編程7.4C51與匯編語言的混合編程舉例:在兩個數據中選出較大的數據,并賦值給變量c。1.在C51中調用匯編函數//以下代碼在main.c文件中實現charmax(chara,charb);//由匯編語言實現main(){chara=30,b=40,c;c=max(a,b);};以下代碼在匯編語言文件max.asm中實現
PUBLIC
_MAX
DE SEGMENTCODE
RSEG DE_MAX:
MOV A,R7 ;取第一個參數 MOV 30H,R5;取第二個參數 CJNE A,30H,TAG SJMP EXITTAG:
JNC EXIT
MOV R7,30HEXIT:
RET END 1)程序的尋址,main.c中調用的max函數,如何與匯編文件中的相應代碼對應起來;2)參數傳遞,main.c中傳遞給max()函數的參數a和b,存放在何處可使匯編程序能夠獲取到它們的值;3)返回值傳遞,匯編語言計算得到的結果,存放在何處可使C語言程序能夠獲取到。C51程序中調用匯編語言,需要解決三個問題:通過在匯編文件中定義同名的“函數”來實現。
1)程序的尋址問題c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖南省長沙市中考招生考試數學真題試卷(真題+答案)
- 預防肺炎主題班會課件
- 預防疾病安全課件
- 靜脈治療護士教育培訓體系
- 《電子產品裝配與測試》課件-任務2 儀器的使用
- 預防兒童近視課件
- 預防傳染保健康課件
- 學校輔導員(班導師)管理及考評辦法
- 城市污水管網建設項目節能評估報告(參考模板)
- 2025年年云服務項目合作計劃書
- 2025新公安輔警招聘知識考試題庫及答案
- 2025年中小學公開選拔校長筆試模擬試卷
- 中文版兒童睡眠習慣問卷CSHQ 含評分維度
- 2025新譯林版英語八上單詞單(先鳥版)BD
- 小孩辦身份證的委托書范本
- MSOP(測量標準作業規范)測量SOP
- 鋼筋混凝土框架結構設計講義
- 《材料成型裝備及自動化》課程大綱
- 保溫材料進場質量檢驗表
- DG-TJ 08-2122-2021 保溫裝飾復合板墻體保溫系統應用技術標準
- GB∕T 23937-2020 工業硫氫化鈉
評論
0/150
提交評論