單片機(jī)第8章單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)_第1頁(yè)
單片機(jī)第8章單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)_第2頁(yè)
單片機(jī)第8章單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)_第3頁(yè)
單片機(jī)第8章單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)_第4頁(yè)
單片機(jī)第8章單片機(jī)C語(yǔ)言應(yīng)用程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)8.1C語(yǔ)言與MCS-518.3C51數(shù)據(jù)類型及在MCS-51中的存儲(chǔ)方式

8.4MCS-51內(nèi)部資源使用的C語(yǔ)言編程8.5MCS-51片外擴(kuò)展的C語(yǔ)言編程下頁(yè)8.1C語(yǔ)言與MCS–51C語(yǔ)言編寫單片機(jī)應(yīng)用程序特點(diǎn):1)只需初步了解單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源;2)C語(yǔ)言能管理內(nèi)部寄存器分配、不同存儲(chǔ)器尋址和數(shù)據(jù)類型等細(xì)節(jié)問(wèn)題;在小程序中代碼量大,在較大程序中效率高;2)定義的數(shù)據(jù)類型和變量、語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同,具有C語(yǔ)言程序設(shè)計(jì)的特點(diǎn)。上頁(yè)下頁(yè)回目錄

用C語(yǔ)言編寫應(yīng)用程序步驟: 編輯源程序,編譯生成單片機(jī)可執(zhí)行的代碼,調(diào)試,寫入單片機(jī)。

MCS–51系列單片機(jī)的C語(yǔ)言編譯器: 主要有KEILC51編譯器、FranklinC51編譯器。上頁(yè)下頁(yè)回目錄8.3C51數(shù)據(jù)類型及在MCS-51中的存儲(chǔ)方式8.3.1C51的數(shù)據(jù)類型●C51編譯器支持C語(yǔ)言所有標(biāo)準(zhǔn)的數(shù)據(jù)類型:char,unsignedchar,int,unsignedint,long,unsignedlong,float等?!窦尤肓藢iT訪問(wèn)8051單片機(jī)硬件的數(shù)據(jù)類型:

◆bit:聲明位變量,其值為1或0;

sbit:聲明可尋址的位變量或SFR中的某個(gè)位變量,其值為1或0;

sfr:聲明特殊功能寄存器,地址范圍0~255

sfr16:聲明特殊功能寄存器,地址范圍0~65535上頁(yè)下頁(yè)回目錄如:sfrSCON=0x98;//聲明SCON為串口控制器,地址98HsfrP0=0x80;sfrPSW=0xD0;●sfr之后的寄存器名必須大寫,定義之后可以直接對(duì)這些寄存器賦值。如P0=0X11;sbitCY=PSW^7;sbitCY=0xD0^7;sbitCY=0xD7;●右邊的表達(dá)式定義特殊位在寄存器中的位置,值必須在0~7.8.3.2C51變量的存儲(chǔ)類型C51每個(gè)變量可以使用下表所列的存儲(chǔ)器類型明確分配到指定的存儲(chǔ)空間。存儲(chǔ)類型與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系data直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問(wèn)速度快(128字節(jié))bdata可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(wèn)(16字節(jié))idata間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪問(wèn)片內(nèi)全部RAM地址空間(256字節(jié))pdata分頁(yè)尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié))由MOV@Ri訪問(wèn)(i=0,1)xdata片外數(shù)據(jù)存儲(chǔ)區(qū)(64KB)由MOVX@DPTR訪問(wèn)code程序存儲(chǔ)器64KB空間,由MOVC@DPTR訪問(wèn)上頁(yè)下頁(yè)回目錄帶存儲(chǔ)類型的變量的定義舉例:unsignedchardatavar1;//聲明一個(gè)內(nèi)部直接尋址的無(wú)符號(hào)字節(jié)變量bitbdataflags;//在可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)定義一個(gè)位變量charxdatavar2;//在外部數(shù)據(jù)存儲(chǔ)區(qū)定義一個(gè)字符變量unsignedcharcode[]=“WelcometoBeijing”;//在程序存儲(chǔ)區(qū)定義字符串上頁(yè)下頁(yè)回目錄8.3.3存儲(chǔ)模式確定用于函數(shù)自變量、自動(dòng)變量和無(wú)明確存儲(chǔ)類型的變量的默認(rèn)存儲(chǔ)器類型存儲(chǔ)模式說(shuō)明SMALL默認(rèn)的存儲(chǔ)類型是data,參數(shù)及局部變量放入可直接尋址片內(nèi)RAM的用戶區(qū)中(最大128字節(jié))。另外所有對(duì)象(包括堆棧),都必須嵌入片內(nèi)RAM。存取速度快,盡量使用此模式。COMPACT默認(rèn)的存儲(chǔ)類型是pdata,參數(shù)及局部變量放入分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū),通過(guò)@R0或@R1間接訪問(wèn),??臻g位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中LARGE默認(rèn)的存儲(chǔ)類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)區(qū),使用數(shù)據(jù)指針DPTR來(lái)進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問(wèn)效率較低,尤其對(duì)兩個(gè)或多個(gè)字節(jié)的變量,這種數(shù)據(jù)類型的訪問(wèn)機(jī)制直接影響代碼的長(zhǎng)度上頁(yè)下頁(yè)回目錄對(duì)于片外擴(kuò)展I/O口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,使用#define語(yǔ)句進(jìn)行定義。例如#include<absacc.h>#definePORTAXBYTE[0xFFC0]absacc.h是C51中絕對(duì)地址訪問(wèn)函數(shù)的頭文件,將PORTA定義為外部I/O口,地址為FFC0H,長(zhǎng)度為8位。上頁(yè)下頁(yè)回目錄FranklinC51編譯器提供的MCS51常用的頭文件:reg51.h:MCS-51系列內(nèi)部特殊功能寄存器stdio.h:標(biāo)準(zhǔn)輸入輸出函數(shù)的說(shuō)明absacc.h:絕對(duì)地址訪問(wèn)上頁(yè)下頁(yè)回目錄8.4MCS-51內(nèi)部資源的C語(yǔ)言編程8.4MCS-51內(nèi)部資源的C語(yǔ)言編程8.4.1中斷應(yīng)用的C語(yǔ)言編程C51編譯器支持在C源程序中直接開(kāi)發(fā)中斷程序。中斷服務(wù)程序的函數(shù)定義的語(yǔ)法格式如下:

返回值函數(shù)名([參數(shù)])interruptm[usingn]{}上頁(yè)下頁(yè)回目錄中斷編號(hào):m=0:外部中斷0m=1:定時(shí)器/計(jì)數(shù)器0m=2:外部中斷1m=3:定時(shí)器/計(jì)數(shù)器1m=4:串行口中斷用于實(shí)現(xiàn)工作寄存器組的切換。n:是中斷服務(wù)子程序中選用的工作寄存器組號(hào)(0~3)。定時(shí)器/計(jì)數(shù)器(T/C)應(yīng)用的C語(yǔ)言編程例

設(shè)單片機(jī)的fosc=12MHz晶振,要求在P1.0腳上輸出周期為2ms的方波。周期為2ms的方波要求定時(shí)時(shí)間隔1ms,每次時(shí)間到P1.0取反。機(jī)器周期=12/fosc=1μs需計(jì)數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000由于計(jì)數(shù)器是加1計(jì)數(shù),為得到1000個(gè)計(jì)數(shù)之后的定時(shí)器溢出,必須給定時(shí)器置初值為-1000(即1000的補(bǔ)數(shù))。上頁(yè)下頁(yè)回目錄(1)用定時(shí)器0的方式1編程,采用查詢方式,程序如下:

#include<reg51.h>sbitP1_0=P1^0;voidmain(void){TMOD=0x01;/*設(shè)置定時(shí)器1為非門控制方式1*/TR0=1;/*啟動(dòng)T/C0*/for(;;){TH0=-(1000/256);/*裝載計(jì)數(shù)器初值*/TL0=-(1000%256);do{}while(!TF0);/*查詢等待TF0置位*/P1_0=!P1_0;/*定時(shí)時(shí)間到P1.0反相*/TF0=0;/*軟件清TF0*/}}上頁(yè)下頁(yè)回目錄/*FranklinC51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h*/(2)用定時(shí)器0的方式1編程,采用中斷方式。程序如下:#include<reg51.h>sbitP1_0=P1^0;voidtime(void)interrupt1using1/*T/C0中斷服務(wù)程序入口*/{P1_0=!P1_0;/*P1.0取反*/TH0=-(1000/256);/*重新裝載計(jì)數(shù)初值*/

TL0=-(1000%256);}voidmain(void){TMOD=0x01;/*T/C0工作在定時(shí)器非門控制方式1*/P1_0=0;TH0=-(1000/256);/*預(yù)置計(jì)數(shù)初值*/TL0=-(1000%256);EA=1;/*CPU中斷開(kāi)放*/ET0=1;/*T/C0中斷開(kāi)放*/TR0=1;/*啟動(dòng)T/C0開(kāi)始定時(shí)*/do{}while(1);/*等待中斷*/}上頁(yè)下頁(yè)回目錄例8.8ADC0809與8031接口的數(shù)據(jù)采集程序舉例。上頁(yè)下頁(yè)回目錄8.5MCS-51片外擴(kuò)展的C語(yǔ)言編程程序如下:#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint

//設(shè)置AD0809的通道7地址#definead_in7XBYTE[0x7fff]

//設(shè)置AD0809的通道7地址#defineresDBYTE[0x7f]#defineNUM8//采樣次數(shù)=8bitad_over;//即EOC狀態(tài)//采樣中斷voidint0_service()interrupt0using1{ad_over=1;}上頁(yè)下頁(yè)回目錄voidmain(void){inti;uintsum;uchardataa[num];ad_over=0;EX0=1;IT0=1;EA=1;L1:i=0;sum=0;ad_in7=0;//啟動(dòng)A/D轉(zhuǎn)換while(i<NUM);{if(ad_over)//等待轉(zhuǎn)換結(jié)束 {ad_over=0; a[i]=ad_in7; sum=sum+a[i]; i=i+1; ad_in7=i;//啟動(dòng)A/D轉(zhuǎn)換}}res=(uchar)sum/NUM;gotoL1;}8.5.2MCS-51輸出控制的C語(yǔ)言編程例118031與DAC0832雙緩沖接口的數(shù)據(jù)轉(zhuǎn)換程序舉例。圖4.10DAC0832的雙緩沖接口電路上頁(yè)下頁(yè)回目錄將data1和data2數(shù)據(jù)同時(shí)轉(zhuǎn)換為模擬量的C51程序如下:#include<absacc.h>#include<reg51.h>#defineINPUTR1XBYTE[0x8fff]#defineINPUTR2XBYTE[0xa7ff]#defineDACRXBYTE[0x2fff]#defineucharunsignedcharvoiddac2b(data1,data2)uchardata1,data2;{INPUTR1=data1; /*送數(shù)據(jù)到一片0832*/INPUTR2=data2; /*送數(shù)據(jù)到另一片0832*/DACR=0; /*啟動(dòng)兩路D/A同時(shí)轉(zhuǎn)換*/}上頁(yè)下頁(yè)回目錄例128031與DAC0832單緩沖區(qū)接口的數(shù)據(jù)轉(zhuǎn)換舉例。圖4.11DAC0832與8031的單緩沖接口上頁(yè)下頁(yè)回目錄按片選線確定FFFEH為DAC0832的端口地址。使運(yùn)行輸出端輸出一個(gè)鋸齒波電壓信號(hào)的C51程序如下:#include<absacc.h>#include<reg51.h>#defineDA0832XBYTE[0xfffe]#defineucharunsignedchar#defineuintunsignedintvoidstair(void){uchari;while(1){for(i=0;i<=255;i=I++) /*形成鋸齒波輸出值,最大值為255*/{DA0832=i; /*D/A轉(zhuǎn)換輸出*/}}}上頁(yè)下頁(yè)回目錄8.5.3頻率量測(cè)量的C語(yǔ)言編程1.計(jì)數(shù)法測(cè)量頻率法的最簡(jiǎn)單的接口電路,可將頻率脈沖直接連接到MCS-51的T1端,將8031的T/C0用作定時(shí)器,T/C1用作計(jì)數(shù)器。在T/C0定時(shí)時(shí)間里,對(duì)頻率脈沖進(jìn)行計(jì)數(shù)。T/C1的計(jì)數(shù)值便是單位定時(shí)時(shí)間里的脈沖個(gè)數(shù)。上頁(yè)下頁(yè)回目錄定時(shí)輸入脈沖<T圖4.13測(cè)量頻率中的脈沖丟失上頁(yè)下頁(yè)回目錄圖4.16頻率與周期波上頁(yè)下頁(yè)回目錄2.測(cè)量周期法圖4.228031與行列式鍵盤的接口上頁(yè)下頁(yè)回目錄8.5.4鍵盤和數(shù)碼顯示人機(jī)交互的C語(yǔ)言編程行掃描輸出口P1.0~P1.3列回掃輸入口P1.4~P1.7掃描函數(shù)的返回值為鍵特征碼,若無(wú)鍵按下,返回值為0。程序如下:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintvoiddlms(void)voidkbscan(void);voidmain(void){ucharkey;while(1){key

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論