版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章C51語(yǔ)言程序設(shè)計(jì)
教學(xué)目的:了解C51語(yǔ)言與通用C語(yǔ)言的不同處(擴(kuò)展特點(diǎn))和應(yīng)用于單片機(jī)編程時(shí)的主要特點(diǎn)及使用注意事項(xiàng)教學(xué)重點(diǎn):1.C51支持的數(shù)據(jù)類型
2.C51數(shù)據(jù)的存儲(chǔ)類型
教學(xué)難點(diǎn):C51語(yǔ)言對(duì)單片機(jī)硬件的訪問(wèn)
9.1單片機(jī)的C51語(yǔ)言概述
9.1.1C51語(yǔ)言的主要優(yōu)點(diǎn)1.不要求對(duì)單片機(jī)的指令系統(tǒng)十分熟悉2.易于表達(dá),使用方便3.C51語(yǔ)言程序容易移植4.具有豐富的庫(kù)函數(shù)5.源代碼可讀性較強(qiáng),容易理解和編程
9.1.2C51語(yǔ)言的運(yùn)算符及表達(dá)式運(yùn)算符或表達(dá)式是構(gòu)成C51程序的各種語(yǔ)句,因而這是C51的基礎(chǔ)知識(shí)。9.1.3C51語(yǔ)言的程序結(jié)構(gòu)
9.1.4C51語(yǔ)言的流程控制語(yǔ)句1.選擇結(jié)構(gòu)在C51中實(shí)現(xiàn)選擇的語(yǔ)句主要是:if,switch/case。2.循環(huán)結(jié)構(gòu)在C51中可實(shí)現(xiàn)循環(huán)的語(yǔ)句為:while,do?while,for9.2C51語(yǔ)言對(duì)通用C語(yǔ)言的擴(kuò)展
9.2.1數(shù)據(jù)的存儲(chǔ)類型C51編譯器支持80C51的存儲(chǔ)器結(jié)構(gòu),能夠訪問(wèn)80C51的所有存儲(chǔ)器空間。針對(duì)80C51存儲(chǔ)空間的多樣性,制定了修飾存儲(chǔ)空間的修飾符,用以指明所定義的變量應(yīng)分配在什么樣的存儲(chǔ)空間。1.程序存儲(chǔ)區(qū)程序(CODE)存儲(chǔ)區(qū)是只讀的,不能寫(xiě)入。硬件決定最多只能有64KB的程序存儲(chǔ)區(qū)。定義舉例:charcodetext[]="ENTER";/*在代碼段定義了一個(gè)字符型數(shù)組*/2.內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)是可讀、可寫(xiě)的。80C51系列最多可有256字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)。內(nèi)部數(shù)據(jù)區(qū)可以分成三個(gè)不同的存儲(chǔ)類型data、idata
和bdata。
定義舉例:chardatavr
;/*定義字符變量vr在data存儲(chǔ)區(qū)*/floatidatax,y;/*定義浮點(diǎn)變量x,y在idata存儲(chǔ)區(qū)*/bitbdataflags;/*定義位變量flags在bdata存儲(chǔ)區(qū)*/。3.外部數(shù)據(jù)存儲(chǔ)區(qū)外部數(shù)據(jù)存儲(chǔ)區(qū)是可讀、可寫(xiě)的??赏ㄟ^(guò)一個(gè)數(shù)據(jù)指針加載一個(gè)地址間接訪問(wèn)外部數(shù)據(jù)區(qū)。因此,訪問(wèn)外部數(shù)據(jù)存儲(chǔ)區(qū)的速度比訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)慢。定義舉例:unsignedlongxdataarray[100];/*定義無(wú)符號(hào)長(zhǎng)整型數(shù)組array[100]在片外數(shù)據(jù)存儲(chǔ)區(qū)*/unsignedint
pdatadimension;/*定義無(wú)符號(hào)整型數(shù)dimension在一頁(yè)范圍內(nèi)的片外數(shù)據(jù)存儲(chǔ)區(qū)*/unsignedcharxdatavector[10][4][4];/*定義無(wú)符號(hào)字符型三維數(shù)組變量vector[10][4][4]在片外數(shù)據(jù)存儲(chǔ)區(qū)*/charbdataflags;/*定義字符型變量flags位于片內(nèi)位尋址區(qū)*/4.存儲(chǔ)模式在C51編譯器中,可以用控制命令SMALL,COMPACT和LARGE定義存儲(chǔ)模式,用以指明所定義變量的默認(rèn)存儲(chǔ)器類型。在定義變量時(shí),如果已經(jīng)指定存儲(chǔ)器類型,就不必加上述存儲(chǔ)模式命令。9.2.2數(shù)據(jù)類型在C51程序中用到的變量一定要先定義數(shù)據(jù)類型,定義之后C51編譯器才能在內(nèi)存中按數(shù)據(jù)類型長(zhǎng)度給該變量分配空間,C51支持的各種規(guī)格的數(shù)據(jù)類型列于表9?2。除了這些數(shù)據(jù)類型以外,變量可以組合成結(jié)構(gòu)、聯(lián)合及數(shù)組。在用C51語(yǔ)言編寫(xiě)單片機(jī)程序時(shí),需要根據(jù)單片機(jī)的存儲(chǔ)器結(jié)構(gòu)和內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量。1.bit
類型bit數(shù)據(jù)類型可以定義一個(gè)位變量,可能在變量聲明參數(shù)列表和函數(shù)返回值中有用。例如bitbdataag1; /*定義ag1為位變量*/2.sbit、sfr和sfr16數(shù)據(jù)類型
80C51系列單片機(jī)用特殊功能寄存器SFR來(lái)控制計(jì)時(shí)器、計(jì)數(shù)器、串口、并口和外圍設(shè)備。它們可以用位、字節(jié)和字訪問(wèn)。與此對(duì)應(yīng),編譯器提供sbit、sfrs和sfr16數(shù)據(jù)類型訪問(wèn)SFR。1)sfr
類型sfr和C的其他變量一樣聲明。例如:
sfrP0=0x80; /*定義80C51的P0口,地址為80h*/2)sfr16類型編譯器提供sfr16數(shù)據(jù)類型,將兩個(gè)8位的SFR作為一個(gè)16位的SFR來(lái)訪問(wèn)。訪問(wèn)該16位的SFR只能是低字節(jié)跟著高字節(jié),即將低字節(jié)的地址用作sfr16聲明的地址。例如:sfr16DPTR=0x82;/*定義數(shù)據(jù)指針DPL的地址為082H,DPH的地址為083H*/3)sbit
類型編譯器用sbit數(shù)據(jù)類型訪問(wèn)可位尋址的SFR中的位。例如:
sbitEA=0xAF;/*定義EA位的地址為0AFH*/9.2.3指針指針用于間接訪問(wèn)變量,正確使用指針,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),直接處理內(nèi)存地址,并可以有效方便地使用數(shù)組。1.指針的概念變量的指針?????在C語(yǔ)言中變量的指針是該變量的地址。指針變量??????用于存放“變量的指針”的變量稱為指針變量。
2.指針變量的定義C語(yǔ)言規(guī)定所有的變量在使用前必須定義,以確定其類型。指針定義的一般形式為:類型識(shí)別符[存儲(chǔ)器類型]*指針變量名(*表示該變量為指針變量)char*s; /*定義一個(gè)指向字符串變量的指針變量s*/
3.存儲(chǔ)器指針 基于存儲(chǔ)器的指針在定義時(shí)要包含一個(gè)存儲(chǔ)器類型說(shuō)明,在編譯時(shí)才被確定。例如:chardata*str;/*在data區(qū)域中定義一個(gè)指向字符串變量的指針變量str,指針為1字節(jié)長(zhǎng)*/
4.指針變量的引用 在對(duì)變量、指針變量定義之后,就可以用指針進(jìn)行間接訪問(wèn)了。下面舉例說(shuō)明。
intx;/*定義整型變量x*/
inta;/*定義整型變量a*/a=10;/*給整型變量a賦值為10*/int*sp;/*定義指針變量sp*/sp=&a;/*通過(guò)取地址運(yùn)算符&使sp指向變量a的地址*/x=*sp;/*整型變量a的值10通過(guò)間接尋址的方法賦給x*/在對(duì)變量、指針變量定義之后,C編譯器會(huì)自動(dòng)給它們?cè)趦?nèi)存中安排相應(yīng)的內(nèi)存單元。在此,特別要注意“*”在不同的場(chǎng)合所代表的含義是不同的,例如:int*sp; 此時(shí)的*為指針變量說(shuō)明符。x=*sp;此時(shí)的*為指針變量sp的運(yùn)算符,即把sp所指向的變量值賦給x。
9.2.4函數(shù)
C語(yǔ)言程序是由函數(shù)構(gòu)成的,函數(shù)是C語(yǔ)言程序中的基本模塊,C51函數(shù)分為2類,一類是庫(kù)函數(shù),一類是用戶定義函數(shù)。C51中函數(shù)的定義、參數(shù)和函數(shù)值及函數(shù)調(diào)用等內(nèi)容與標(biāo)準(zhǔn)C語(yǔ)言基本相同,下面僅說(shuō)明幾個(gè)不同點(diǎn)。1.寄存器組的切換(using修飾符的應(yīng)用)void函數(shù)標(biāo)識(shí)符(形參表) usingn2.中斷服務(wù)程序(interrupt修飾符的應(yīng)用)void函數(shù)標(biāo)識(shí)符(void) interruptm[usingn]9.2.5C51語(yǔ)言對(duì)單片機(jī)硬件的訪問(wèn)
1.訪問(wèn)特殊功能寄存器
在C51中定義了一個(gè)頭文件:reg51.h(對(duì)于52系列,如AT89S52是reg52.h),它定義了80C51的所有功能寄存器和中斷,在C51語(yǔ)言的源程序中采用#include<reg51.h>就可包含這個(gè)文件,在包含了這個(gè)文件后,程序就可以識(shí)別這些寄存器以及可位尋址的寄存器位的符號(hào)。例如:
#include<reg51.h>/*包含寄存器頭文件*/2.訪問(wèn)存儲(chǔ)器 在C51中可以通過(guò)變量的形式訪問(wèn)存儲(chǔ)器,也可以通過(guò)絕對(duì)地址訪問(wèn)存儲(chǔ)器。對(duì)絕對(duì)地址的訪問(wèn)主要有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ò)指針訪問(wèn)采用指針可以不關(guān)心具體地址指針,但也可以實(shí)現(xiàn)對(duì)任意指定存儲(chǔ)單元的訪問(wèn)。例如:uchardatavar1;uchardata*dp1;/*定義一個(gè)data區(qū)中指針dp1*/uint
xdata*dp2;/*定義一個(gè)xdata區(qū)中指針dp2*/uchar
pdata*dp3;/*定義一個(gè)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)采用擴(kuò)展關(guān)鍵字_at_采用擴(kuò)展關(guān)鍵字_at_訪問(wèn)存儲(chǔ)器絕對(duì)地址的一般格式如下:
[存儲(chǔ)器類型]數(shù)據(jù)類型說(shuō)明符變量名_at_地址常數(shù) 例如:
dataucharx1_at_0x20;/*在data區(qū)中定義字符變量的地址為20h*/
xdata
uintx2_at_0x2000;/*在xdata區(qū)中定義整數(shù)變量的地址為2000h*/ 3.訪問(wèn)外圍接口器件地址 采用擴(kuò)展外設(shè)的方法,擴(kuò)展的I/O口采取與數(shù)據(jù)存儲(chǔ)器相同的尋址方法,與片外數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址,可以采取上述尋址方法的任何一種。例如假設(shè)一塊8255A芯片的命令口地址確定為ffadh,A口地址確定為ffaah,那么在程序中可以如下編制:
#definePD8255XBYTE[0xffad]/*定義命令口地址在片外RAM的ffadh*/#definePA8255XBYTE[0xffaa]/*定義A口地址在片外RAM的ffaah*/ PD8255=0X80;/*給命令口賦值*/PA8255=0XFF; /*給A口賦值*/
9.3C51語(yǔ)言編程舉例
例1采用7.4.2的例1,該題用C51語(yǔ)言編程如下:#include<REG51.H>/*包含SFR的頭文件*/#include<stdio.h>/*包含標(biāo)準(zhǔn)I/O功能的頭文件*/sbitOUT=P1^0;/*定義OUT為P1.0位*/voidmain(void){TMOD=0x01;
TL0=0xf0;
TH0=0xD8;//置10mS定時(shí)初值
IE=0x82;//CPU,T0開(kāi)中斷
TR0=1; //啟動(dòng)定時(shí)器T0while(1){};//循環(huán)等待定時(shí)到
}//中斷服務(wù)程序void timer0int() interrupt1{TL0+=0xf0;
TH0=0xD8;//置10mS定時(shí)初值
OUT=~OUT;//P1.0位取反
}例2.采用7.4.2的例2,該題用C51語(yǔ)言編程如下:#include<REG51.H>/*包含SFR的頭文件*/#include<stdio.h>/*包含標(biāo)準(zhǔn)I/O功能的頭文件*/unsignedchardatacount_at_0x50;sbitOUT1=P1^2;/*定義OUT1為P1.2位*/sbitOUT2=P1^4;/*定義OUT2為P1.4位*/voidmain(void){TL0=0x9C;//置T0計(jì)數(shù)100的初值
TH0=0xFF;TL1=0xf0;//置T110ms初值
TH1=0xD8;
TMOD=0x15;//設(shè)置T1為方式1定時(shí),T0為方式1計(jì)數(shù)
TCON=0x50;//啟動(dòng)定時(shí)器T0,定時(shí)器T1 count=0;//計(jì)數(shù)單元清0 OUT1=1;//P1.2置為高
IE=0x82;//CPU,T0開(kāi)中斷
while(1){};}//T0中斷服務(wù)程序void timer0int() interrupt1 { TL0+=0x9C;
TH0=0xFF;//置10mS定時(shí)初值
count++;
if(count>=100) { OUT1=0;//計(jì)數(shù)到,P1.2腳輸出低電平
IE=0x88;//關(guān)T0中斷,開(kāi)T1中斷
TR0=0;
} }//T1中斷服務(wù)程序void timer1int() interrupt3/*定義函數(shù)名為timer1的定時(shí)器1中斷3服務(wù)函數(shù)*/{TL1+=0xf0;
TH1=0xD8;//置10mS定時(shí)初值
OUT2=~OUT2;//P1.4取反
}源程序如下:
ORG 0000HLJMP MAIN …..ORG 000BH;T0中斷入口
LJMP SUB1;轉(zhuǎn)T0中斷服務(wù)程序入口
例3.采用7.4.2的例3,該題用C51語(yǔ)言編程如下:/*------甲機(jī)發(fā)送程序--------*/#include<REG51.H>#include<stdio.h>#definesize16unsignedchardatasenddata[size]_at_0x50;/*發(fā)送數(shù)據(jù)首地址為50H*/unsignedcharcount;voidmain(void){TMOD=0x20;//定時(shí)器1設(shè)置為方式2 TL1=0xf4;//置T1初值
TH1=0xf4;EA=1;
ES=0;//串行口關(guān)中斷TR1=1; //啟動(dòng)定時(shí)器T0 TI=0;
SCON=0x40;//串行口置工作方式1count=0;
ES=1;//串行口開(kāi)中斷
SBUF=size;//發(fā)送第一個(gè)字節(jié)
while(1);//等待發(fā)送
}/****串行口數(shù)據(jù)中斷處理程序****/void UARTint()interrupt4using1/*定義函數(shù)名為UART的串行中斷4服務(wù)函數(shù),使用第1組寄存器*/ { if(TI) {SBUF=senddata[count];//啟動(dòng)發(fā)送
count++;
if(count>=16)ES=0;//發(fā)送完16個(gè)數(shù)據(jù)后,關(guān)串行口中斷
TI=0;
}elseRI=0;
}/*------乙機(jī)接收程序--------*/#include<REG51.H>#include<stdio.h>#definesize16unsignedchardatarececivedata[size]_at_0x60;/*接收數(shù)據(jù)首地址為60H*/
unsignedcharcount,i;voidmain(void){TMOD=0x20;//定時(shí)器1設(shè)置為方式2 TL1=0xf4;
TH1=0xf4;//置T1初值
EA=1;
ES=0;
TR1=1; //啟動(dòng)定時(shí)器T1 TI=0;//清發(fā)送中斷標(biāo)志
SCON=0x40;
i=0; //接收計(jì)數(shù)器清0 F0=0;ES=1;
while(1);}
/******串行口數(shù)據(jù)中斷處理程序*****/void UARTint()interrupt4using1 { if(RI) {if(F0==0){ count=SBUF;/*數(shù)據(jù)長(zhǎng)度送計(jì)數(shù)單元*/ F0=1;
}else { rececivedata[i]=SBUF;/*接收數(shù)據(jù)*/ i++;
if(i>=count)ES=0;/*沒(méi)有接收完數(shù)據(jù)則繼續(xù),接收完則關(guān)串口中斷*/ } RI=0;/*RI清0*/}elseTI=0;/*清發(fā)送中斷標(biāo)志*/ }9.4C51語(yǔ)言與匯編語(yǔ)言的混合編程9.4.1函數(shù)名的轉(zhuǎn)換規(guī)則
9.4.2函數(shù)調(diào)用1.參數(shù)傳遞規(guī)則C51編譯器利用CPU
溫馨提示
- 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àn)代化辦公室租賃場(chǎng)地合同樣本3篇
- 二零二五版精制粉原料供應(yīng)鏈風(fēng)險(xiǎn)管理合同3篇
- 二零二五版地震監(jiān)測(cè)基站場(chǎng)地租賃與應(yīng)急救援合同3篇
- 2025年度醫(yī)療健康產(chǎn)業(yè)園區(qū)承包經(jīng)營(yíng)合同范本3篇
- 二零二五版溫泉度假酒店SPA服務(wù)人員勞動(dòng)合同3篇
- 二零二五年度離婚經(jīng)濟(jì)補(bǔ)償協(xié)議范本及調(diào)解服務(wù)合同3篇
- 二零二五年度能源項(xiàng)目合作開(kāi)發(fā)PPP模式合同范本3篇
- 物業(yè)管理公司2025年度招投標(biāo)代理合同3篇
- 二零二五年度車位租賃合同:住宅小區(qū)車位使用權(quán)協(xié)議2篇
- 2025廠房買賣合同模板:高端裝備制造廠房交易3篇
- 扣款通知單 采購(gòu)部
- 湖北教育出版社三年級(jí)下冊(cè)信息技術(shù)教案
- 鐵路工程主要建材碳排放因子、常用施工機(jī)械臺(tái)班能源用量、類運(yùn)輸方式、能源碳排放因子、不同植栽方式綠化固碳量
- 設(shè)計(jì)基礎(chǔ)全套教學(xué)課件
- 藥品養(yǎng)護(hù)記錄表
- IATF16949包裝方案評(píng)審表
- 食堂服務(wù)外包投標(biāo)方案(技術(shù)標(biāo))
- 綠建評(píng)分報(bào)告模板
- 1 運(yùn)行方案說(shuō)明
- 大骨節(jié)病專業(yè)知識(shí)講座課件
- PHILIPS HeartStart XL+操作培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論