版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章C51語言程序設(shè)計
教學(xué)目的:了解C51語言與通用C語言的不同處(擴展特點)和應(yīng)用于單片機編程時的主要特點及使用注意事項教學(xué)重點:1.C51支持的數(shù)據(jù)類型
2.C51數(shù)據(jù)的存儲類型
教學(xué)難點:C51語言對單片機硬件的訪問
9.1單片機的C51語言概述
9.1.1C51語言的主要優(yōu)點1.不要求對單片機的指令系統(tǒng)十分熟悉2.易于表達,使用方便3.C51語言程序容易移植4.具有豐富的庫函數(shù)5.源代碼可讀性較強,容易理解和編程
9.1.2C51語言的運算符及表達式運算符或表達式是構(gòu)成C51程序的各種語句,因而這是C51的基礎(chǔ)知識。9.1.3C51語言的程序結(jié)構(gòu)
9.1.4C51語言的流程控制語句1.選擇結(jié)構(gòu)在C51中實現(xiàn)選擇的語句主要是:if,switch/case。2.循環(huán)結(jié)構(gòu)在C51中可實現(xiàn)循環(huán)的語句為:while,do?while,for9.2C51語言對通用C語言的擴展
9.2.1數(shù)據(jù)的存儲類型C51編譯器支持80C51的存儲器結(jié)構(gòu),能夠訪問80C51的所有存儲器空間。針對80C51存儲空間的多樣性,制定了修飾存儲空間的修飾符,用以指明所定義的變量應(yīng)分配在什么樣的存儲空間。1.程序存儲區(qū)程序(CODE)存儲區(qū)是只讀的,不能寫入。硬件決定最多只能有64KB的程序存儲區(qū)。定義舉例:charcodetext[]="ENTER";/*在代碼段定義了一個字符型數(shù)組*/2.內(nèi)部數(shù)據(jù)存儲區(qū)內(nèi)部數(shù)據(jù)存儲區(qū)是可讀、可寫的。80C51系列最多可有256字節(jié)的內(nèi)部數(shù)據(jù)存儲區(qū)。內(nèi)部數(shù)據(jù)區(qū)可以分成三個不同的存儲類型data、idata
和bdata。
定義舉例:chardatavr
;/*定義字符變量vr在data存儲區(qū)*/floatidatax,y;/*定義浮點變量x,y在idata存儲區(qū)*/bitbdataflags;/*定義位變量flags在bdata存儲區(qū)*/。3.外部數(shù)據(jù)存儲區(qū)外部數(shù)據(jù)存儲區(qū)是可讀、可寫的??赏ㄟ^一個數(shù)據(jù)指針加載一個地址間接訪問外部數(shù)據(jù)區(qū)。因此,訪問外部數(shù)據(jù)存儲區(qū)的速度比訪問內(nèi)部數(shù)據(jù)存儲區(qū)慢。定義舉例:unsignedlongxdataarray[100];/*定義無符號長整型數(shù)組array[100]在片外數(shù)據(jù)存儲區(qū)*/unsignedint
pdatadimension;/*定義無符號整型數(shù)dimension在一頁范圍內(nèi)的片外數(shù)據(jù)存儲區(qū)*/unsignedcharxdatavector[10][4][4];/*定義無符號字符型三維數(shù)組變量vector[10][4][4]在片外數(shù)據(jù)存儲區(qū)*/charbdataflags;/*定義字符型變量flags位于片內(nèi)位尋址區(qū)*/4.存儲模式在C51編譯器中,可以用控制命令SMALL,COMPACT和LARGE定義存儲模式,用以指明所定義變量的默認存儲器類型。在定義變量時,如果已經(jīng)指定存儲器類型,就不必加上述存儲模式命令。9.2.2數(shù)據(jù)類型在C51程序中用到的變量一定要先定義數(shù)據(jù)類型,定義之后C51編譯器才能在內(nèi)存中按數(shù)據(jù)類型長度給該變量分配空間,C51支持的各種規(guī)格的數(shù)據(jù)類型列于表9?2。除了這些數(shù)據(jù)類型以外,變量可以組合成結(jié)構(gòu)、聯(lián)合及數(shù)組。在用C51語言編寫單片機程序時,需要根據(jù)單片機的存儲器結(jié)構(gòu)和內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量。1.bit
類型bit數(shù)據(jù)類型可以定義一個位變量,可能在變量聲明參數(shù)列表和函數(shù)返回值中有用。例如bitbdataag1; /*定義ag1為位變量*/2.sbit、sfr和sfr16數(shù)據(jù)類型
80C51系列單片機用特殊功能寄存器SFR來控制計時器、計數(shù)器、串口、并口和外圍設(shè)備。它們可以用位、字節(jié)和字訪問。與此對應(yīng),編譯器提供sbit、sfrs和sfr16數(shù)據(jù)類型訪問SFR。1)sfr
類型sfr和C的其他變量一樣聲明。例如:
sfrP0=0x80; /*定義80C51的P0口,地址為80h*/2)sfr16類型編譯器提供sfr16數(shù)據(jù)類型,將兩個8位的SFR作為一個16位的SFR來訪問。訪問該16位的SFR只能是低字節(jié)跟著高字節(jié),即將低字節(jié)的地址用作sfr16聲明的地址。例如:sfr16DPTR=0x82;/*定義數(shù)據(jù)指針DPL的地址為082H,DPH的地址為083H*/3)sbit
類型編譯器用sbit數(shù)據(jù)類型訪問可位尋址的SFR中的位。例如:
sbitEA=0xAF;/*定義EA位的地址為0AFH*/9.2.3指針指針用于間接訪問變量,正確使用指針,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),直接處理內(nèi)存地址,并可以有效方便地使用數(shù)組。1.指針的概念變量的指針?????在C語言中變量的指針是該變量的地址。指針變量??????用于存放“變量的指針”的變量稱為指針變量。
2.指針變量的定義C語言規(guī)定所有的變量在使用前必須定義,以確定其類型。指針定義的一般形式為:類型識別符[存儲器類型]*指針變量名(*表示該變量為指針變量)char*s; /*定義一個指向字符串變量的指針變量s*/
3.存儲器指針 基于存儲器的指針在定義時要包含一個存儲器類型說明,在編譯時才被確定。例如:chardata*str;/*在data區(qū)域中定義一個指向字符串變量的指針變量str,指針為1字節(jié)長*/
4.指針變量的引用 在對變量、指針變量定義之后,就可以用指針進行間接訪問了。下面舉例說明。
intx;/*定義整型變量x*/
inta;/*定義整型變量a*/a=10;/*給整型變量a賦值為10*/int*sp;/*定義指針變量sp*/sp=&a;/*通過取地址運算符&使sp指向變量a的地址*/x=*sp;/*整型變量a的值10通過間接尋址的方法賦給x*/在對變量、指針變量定義之后,C編譯器會自動給它們在內(nèi)存中安排相應(yīng)的內(nèi)存單元。在此,特別要注意“*”在不同的場合所代表的含義是不同的,例如:int*sp; 此時的*為指針變量說明符。x=*sp;此時的*為指針變量sp的運算符,即把sp所指向的變量值賦給x。
9.2.4函數(shù)
C語言程序是由函數(shù)構(gòu)成的,函數(shù)是C語言程序中的基本模塊,C51函數(shù)分為2類,一類是庫函數(shù),一類是用戶定義函數(shù)。C51中函數(shù)的定義、參數(shù)和函數(shù)值及函數(shù)調(diào)用等內(nèi)容與標(biāo)準C語言基本相同,下面僅說明幾個不同點。1.寄存器組的切換(using修飾符的應(yīng)用)void函數(shù)標(biāo)識符(形參表) usingn2.中斷服務(wù)程序(interrupt修飾符的應(yīng)用)void函數(shù)標(biāo)識符(void) interruptm[usingn]9.2.5C51語言對單片機硬件的訪問
1.訪問特殊功能寄存器
在C51中定義了一個頭文件:reg51.h(對于52系列,如AT89S52是reg52.h),它定義了80C51的所有功能寄存器和中斷,在C51語言的源程序中采用#include<reg51.h>就可包含這個文件,在包含了這個文件后,程序就可以識別這些寄存器以及可位尋址的寄存器位的符號。例如:
#include<reg51.h>/*包含寄存器頭文件*/2.訪問存儲器 在C51中可以通過變量的形式訪問存儲器,也可以通過絕對地址訪問存儲器。對絕對地址的訪問主要有3種形式。1)采用C51中的預(yù)定義宏#defineCBYTE((unsignedcharvolatilecode*)0)#defineDBYTE((unsignedcharvolatiledata*)0)…………#defineXWORD((unsignedintvolatilexdata*)0)例如ucharvar1;
uintvar2;
var1=DBYTE[0x30];/*把data區(qū)中30h地址單元中的數(shù)賦給var1*/ var2=XBYTE[0x1000];/*把xdata區(qū)中1000h地址單元中的數(shù)賦給var2*/ …….2)通過指針訪問采用指針可以不關(guān)心具體地址指針,但也可以實現(xiàn)對任意指定存儲單元的訪問。例如:uchardatavar1;uchardata*dp1;/*定義一個data區(qū)中指針dp1*/uint
xdata*dp2;/*定義一個xdata區(qū)中指針dp2*/uchar
pdata*dp3;/*定義一個pdata區(qū)中指針dp3*/dp1=&var1;/*取data區(qū)中變量var1的指針*/*dp1=0xa0; /*給變量var1賦值a0h*/dp2=0x2000;/*dp2指針賦值,指向xdata區(qū)的2000h*/*dp2=0x16;/*將數(shù)據(jù)16h送到片外RAM區(qū)的2000h單元*/ dp3=0x20; /*dp3指針賦值,指向pdata區(qū)的20h*/ *dp3=0x80; /*將數(shù)據(jù)80h送到pdata區(qū)的20h單元*/3)采用擴展關(guān)鍵字_at_采用擴展關(guān)鍵字_at_訪問存儲器絕對地址的一般格式如下:
[存儲器類型]數(shù)據(jù)類型說明符變量名_at_地址常數(shù) 例如:
dataucharx1_at_0x20;/*在data區(qū)中定義字符變量的地址為20h*/
xdata
uintx2_at_0x2000;/*在xdata區(qū)中定義整數(shù)變量的地址為2000h*/ 3.訪問外圍接口器件地址 采用擴展外設(shè)的方法,擴展的I/O口采取與數(shù)據(jù)存儲器相同的尋址方法,與片外數(shù)據(jù)存儲器統(tǒng)一編址,可以采取上述尋址方法的任何一種。例如假設(shè)一塊8255A芯片的命令口地址確定為ffadh,A口地址確定為ffaah,那么在程序中可以如下編制:
#definePD8255XBYTE[0xffad]/*定義命令口地址在片外RAM的ffadh*/#definePA8255XBYTE[0xffaa]/*定義A口地址在片外RAM的ffaah*/ PD8255=0X80;/*給命令口賦值*/PA8255=0XFF; /*給A口賦值*/
9.3C51語言編程舉例
例1采用7.4.2的例1,該題用C51語言編程如下:#include<REG51.H>/*包含SFR的頭文件*/#include<stdio.h>/*包含標(biāo)準I/O功能的頭文件*/sbitOUT=P1^0;/*定義OUT為P1.0位*/voidmain(void){TMOD=0x01;
TL0=0xf0;
TH0=0xD8;//置10mS定時初值
IE=0x82;//CPU,T0開中斷
TR0=1; //啟動定時器T0while(1){};//循環(huán)等待定時到
}//中斷服務(wù)程序void timer0int() interrupt1{TL0+=0xf0;
TH0=0xD8;//置10mS定時初值
OUT=~OUT;//P1.0位取反
}例2.采用7.4.2的例2,該題用C51語言編程如下:#include<REG51.H>/*包含SFR的頭文件*/#include<stdio.h>/*包含標(biāo)準I/O功能的頭文件*/unsignedchardatacount_at_0x50;sbitOUT1=P1^2;/*定義OUT1為P1.2位*/sbitOUT2=P1^4;/*定義OUT2為P1.4位*/voidmain(void){TL0=0x9C;//置T0計數(shù)100的初值
TH0=0xFF;TL1=0xf0;//置T110ms初值
TH1=0xD8;
TMOD=0x15;//設(shè)置T1為方式1定時,T0為方式1計數(shù)
TCON=0x50;//啟動定時器T0,定時器T1 count=0;//計數(shù)單元清0 OUT1=1;//P1.2置為高
IE=0x82;//CPU,T0開中斷
while(1){};}//T0中斷服務(wù)程序void timer0int() interrupt1 { TL0+=0x9C;
TH0=0xFF;//置10mS定時初值
count++;
if(count>=100) { OUT1=0;//計數(shù)到,P1.2腳輸出低電平
IE=0x88;//關(guān)T0中斷,開T1中斷
TR0=0;
} }//T1中斷服務(wù)程序void timer1int() interrupt3/*定義函數(shù)名為timer1的定時器1中斷3服務(wù)函數(shù)*/{TL1+=0xf0;
TH1=0xD8;//置10mS定時初值
OUT2=~OUT2;//P1.4取反
}源程序如下:
ORG 0000HLJMP MAIN …..ORG 000BH;T0中斷入口
LJMP SUB1;轉(zhuǎn)T0中斷服務(wù)程序入口
例3.采用7.4.2的例3,該題用C51語言編程如下:/*------甲機發(fā)送程序--------*/#include<REG51.H>#include<stdio.h>#definesize16unsignedchardatasenddata[size]_at_0x50;/*發(fā)送數(shù)據(jù)首地址為50H*/unsignedcharcount;voidmain(void){TMOD=0x20;//定時器1設(shè)置為方式2 TL1=0xf4;//置T1初值
TH1=0xf4;EA=1;
ES=0;//串行口關(guān)中斷TR1=1; //啟動定時器T0 TI=0;
SCON=0x40;//串行口置工作方式1count=0;
ES=1;//串行口開中斷
SBUF=size;//發(fā)送第一個字節(jié)
while(1);//等待發(fā)送
}/****串行口數(shù)據(jù)中斷處理程序****/void UARTint()interrupt4using1/*定義函數(shù)名為UART的串行中斷4服務(wù)函數(shù),使用第1組寄存器*/ { if(TI) {SBUF=senddata[count];//啟動發(fā)送
count++;
if(count>=16)ES=0;//發(fā)送完16個數(shù)據(jù)后,關(guān)串行口中斷
TI=0;
}elseRI=0;
}/*------乙機接收程序--------*/#include<REG51.H>#include<stdio.h>#definesize16unsignedchardatarececivedata[size]_at_0x60;/*接收數(shù)據(jù)首地址為60H*/
unsignedcharcount,i;voidmain(void){TMOD=0x20;//定時器1設(shè)置為方式2 TL1=0xf4;
TH1=0xf4;//置T1初值
EA=1;
ES=0;
TR1=1; //啟動定時器T1 TI=0;//清發(fā)送中斷標(biāo)志
SCON=0x40;
i=0; //接收計數(shù)器清0 F0=0;ES=1;
while(1);}
/******串行口數(shù)據(jù)中斷處理程序*****/void UARTint()interrupt4using1 { if(RI) {if(F0==0){ count=SBUF;/*數(shù)據(jù)長度送計數(shù)單元*/ F0=1;
}else { rececivedata[i]=SBUF;/*接收數(shù)據(jù)*/ i++;
if(i>=count)ES=0;/*沒有接收完數(shù)據(jù)則繼續(xù),接收完則關(guān)串口中斷*/ } RI=0;/*RI清0*/}elseTI=0;/*清發(fā)送中斷標(biāo)志*/ }9.4C51語言與匯編語言的混合編程9.4.1函數(shù)名的轉(zhuǎn)換規(guī)則
9.4.2函數(shù)調(diào)用1.參數(shù)傳遞規(guī)則C51編譯器利用CPU
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高端住宅小區(qū)物業(yè)保安勞務(wù)服務(wù)合同范本
- 2025年度購房貸款個人信息保護合同
- 2025年度游樂園項目場地使用權(quán)及設(shè)施維護合作協(xié)議
- 2025年度水田承包與農(nóng)業(yè)品牌建設(shè)合作協(xié)議
- 二零二五年度白蟻防治服務(wù)合同-城市綠化帶白蟻防治
- 二零二五年度游艇俱樂部船舶租賃代理合同
- 二零二五年度餐飲企業(yè)員工勞動合同法律服務(wù)與保障
- 2025年度互聯(lián)網(wǎng)簽訂方協(xié)議詳細流程與網(wǎng)絡(luò)安全責(zé)任追究協(xié)議
- 二零二五年度二手電腦及配件交易合同
- 二零二五年度綠色能源股份轉(zhuǎn)讓合同
- 2024年人教版小學(xué)三年級信息技術(shù)(下冊)期末試卷附答案
- TB 10012-2019 鐵路工程地質(zhì)勘察規(guī)范
- 新蘇教版三年級下冊科學(xué)全冊知識點(背誦用)
- 鄉(xiāng)鎮(zhèn)風(fēng)控維穩(wěn)應(yīng)急預(yù)案演練
- 腦梗死合并癲癇病人的護理查房
- 蘇教版四年級上冊脫式計算300題及答案
- 犯罪現(xiàn)場保護培訓(xùn)課件
- 扣款通知單 采購部
- 電除顫操作流程圖
- 湖北教育出版社三年級下冊信息技術(shù)教案
- 設(shè)計基礎(chǔ)全套教學(xué)課件
評論
0/150
提交評論