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

下載本文檔

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

文檔簡介

1、第8章 單片機(jī)的C語言應(yīng)用程序設(shè)計(jì) 8.1 C語言與MCS-518.3 C51數(shù)據(jù)類型及在MCS-51中的存儲(chǔ)方式8.4 MCS-51內(nèi)部資源使用的C語言編程8.5 MCS-51片外擴(kuò)展的C語言編程8.1 C語言與語言與MCS51 C C語言編寫單片機(jī)應(yīng)用程序特點(diǎn):語言編寫單片機(jī)應(yīng)用程序特點(diǎn):1 1)只需初步了解單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源;)只需初步了解單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源;2 2)C C語言能管理內(nèi)部寄存器分配、不同存儲(chǔ)器尋址和數(shù)據(jù)類型等語言能管理內(nèi)部寄存器分配、不同存儲(chǔ)器尋址和數(shù)據(jù)類型等細(xì)節(jié)問題;在小程序中代碼量大,在較大程序中效率高;細(xì)節(jié)問題;在小程序中代碼量大,在較大程序中效率高;2

2、 2)定義的數(shù)據(jù)類型和變量、語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方)定義的數(shù)據(jù)類型和變量、語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的法都與標(biāo)準(zhǔn)的C C語言程序設(shè)計(jì)相同,具有語言程序設(shè)計(jì)相同,具有C C語言程序設(shè)計(jì)的特點(diǎn)。語言程序設(shè)計(jì)的特點(diǎn)。 用用C C語言編寫應(yīng)用程序步驟:語言編寫應(yīng)用程序步驟:編輯源程序,編譯生成單片機(jī)可執(zhí)行的代碼,調(diào)試,寫入單片機(jī)。 MCS51MCS51系列單片機(jī)的系列單片機(jī)的C C語言編譯器語言編譯器:主要有KEIL C51編譯器、Franklin C51編譯器。8.3 C51數(shù)據(jù)類型及在數(shù)據(jù)類型及在MCS-51中的存儲(chǔ)方式中的存儲(chǔ)方式8.3.1 C51的數(shù)據(jù)類型C51編譯器支持

3、C語言所有標(biāo)準(zhǔn)的數(shù)據(jù)類型:char,unsigned char,int, unsigned int,long, unsigned long,float等。加入了專門訪問8051單片機(jī)硬件的數(shù)據(jù)類型: bit:聲明位變量,其值為1或0; sbit:聲明可尋址的位變量或SFR中的某個(gè)位變量,其值為1或0; sfr:聲明特殊功能寄存器,地址范圍0255 sfr16:聲明特殊功能寄存器,地址范圍065535如:如:sfr SCON=0 x98;/sfr SCON=0 x98;/聲明聲明SCONSCON為串口控制器,地址為串口控制器,地址98H98Hsfr P0=0 x80;sfr P0=0 x80;s

4、fr PSW=0 xD0;sfr PSW=0 xD0; sfrsfr之后的寄存器名必須大寫,定義之后可以直接對這些之后的寄存器名必須大寫,定義之后可以直接對這些寄存器賦值。如寄存器賦值。如P0=0X11;P0=0X11;sbit CY=PSW7;sbit CY=0 xD07;sbit CY=0 xD7; 右邊的表達(dá)式定義特殊位在寄存器中的位置,值必須在右邊的表達(dá)式定義特殊位在寄存器中的位置,值必須在07.8.3.2 C51變量的存儲(chǔ)類型變量的存儲(chǔ)類型C51C51每個(gè)變量可以使用下表所列的存儲(chǔ)器類型明確分配到指每個(gè)變量可以使用下表所列的存儲(chǔ)器類型明確分配到指定的存儲(chǔ)空間。定的存儲(chǔ)空間。存儲(chǔ)類型與

5、存儲(chǔ)空間的對應(yīng)關(guān)系 data 直接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),訪問速度快(128字節(jié)) bdata 可位尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),允許位與字節(jié)混合訪問(16字節(jié)) idata 間接尋址片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié)) pdata 分頁尋址片外數(shù)據(jù)存儲(chǔ)區(qū)(256字節(jié))由MOV Ri訪問(i=0,1) xdata 片外數(shù)據(jù)存儲(chǔ)區(qū)(64 KB)由MOVX DPTR訪問 code 程序存儲(chǔ)器64 KB空間,由MOVC DPTR訪問帶存儲(chǔ)類型的變量的定義舉例:unsigned char data var1;/聲明一個(gè)內(nèi)部直接尋址的無符號字節(jié)變量bit bdata flags;/在可位尋址片內(nèi)

6、數(shù)據(jù)存儲(chǔ)區(qū)定義一個(gè)位變量char xdata var2;/在外部數(shù)據(jù)存儲(chǔ)區(qū)定義一個(gè)字符變量unsigned char code=“Welcome to Beijing”;/在程序存儲(chǔ)區(qū)定義字符串8.3.3 8.3.3 存儲(chǔ)模式存儲(chǔ)模式確定用于函數(shù)自變量、自動(dòng)變量和無明確存儲(chǔ)類型的變量的確定用于函數(shù)自變量、自動(dòng)變量和無明確存儲(chǔ)類型的變量的默認(rèn)存儲(chǔ)器類型默認(rèn)存儲(chǔ)器類型存儲(chǔ)模式說 明SMALL默認(rèn)的存儲(chǔ)類型是data,參數(shù)及局部變量放入可直接尋址片內(nèi)RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內(nèi)RAM。存取速度快,盡量使用此模式。COMPACT默認(rèn)的存儲(chǔ)類型是pdata

7、,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲(chǔ)區(qū),通過R0或R1間接訪問,棧空間位于片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中LARGE默認(rèn)的存儲(chǔ)類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲(chǔ)區(qū),使用數(shù)據(jù)指針DPTR來進(jìn)行尋址。用此數(shù)據(jù)指針進(jìn)行訪問效率較低,尤其對兩個(gè)或多個(gè)字節(jié)的變量,這種數(shù)據(jù)類型的訪問機(jī)制直接影響代碼的長度 對于片外擴(kuò)展I/O口,則根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,使用#define語句進(jìn)行定義。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中絕對地址訪問函數(shù)的頭文件,將PORTA定義為外部I/O口,地址為 FFC0H,長度為8

8、位。 Franklin C51編譯器提供 的MCS51常用的頭文件:reg51.h: MCS-51系列內(nèi)部特殊功能寄存器stdio.h:標(biāo)準(zhǔn)輸入輸出函數(shù)的說明absacc.h:絕對地址訪問8.4 MCS-51內(nèi)部資源的內(nèi)部資源的C語言編程語言編程8.4 MCS-51內(nèi)部資源的內(nèi)部資源的C語言編程語言編程8.4.1 中斷應(yīng)用的中斷應(yīng)用的C語言編程語言編程 C51編譯器支持在C源程序中直接開發(fā)中斷程序。 中斷服務(wù)程序的函數(shù)定義的語法格式如下: 返回值 函數(shù)名(參數(shù)) interrupt m using n 中斷編號:m=0:外部中斷0m=1:定時(shí)器/計(jì)數(shù)器0m=2:外部中斷1m=3:定時(shí)器/計(jì)數(shù)器

9、1m=4:串行口中斷用于實(shí)現(xiàn)工作寄存器組的切換。n:是中斷服務(wù)子程序中選用的工作寄存器組號(0 3)。定時(shí)器定時(shí)器/計(jì)數(shù)器計(jì)數(shù)器(T/C)應(yīng)用的應(yīng)用的C語言編程語言編程 例例 設(shè)單片機(jī)的設(shè)單片機(jī)的fosc=12 MHz晶振,要求在晶振,要求在P1.0腳上輸出周期腳上輸出周期為為2 ms的方波。的方波。 周期為2 ms的方波要求定時(shí)時(shí)間隔1 ms,每次時(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ù))。(1) 用定時(shí)

10、器用定時(shí)器0的方式的方式1編程,采用查詢方式,程序如下:編程,采用查詢方式,程序如下: # include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 設(shè)置定時(shí)器設(shè)置定時(shí)器1為非門控制方式為非門控制方式1*/ TR0=1 ; /* 啟動(dòng)啟動(dòng) T/C0 */ for( ; ;) TH0= -(1000/256); /* 裝載計(jì)數(shù)器初值裝載計(jì)數(shù)器初值 */ TL0= -(1000%256) ; do while (!TF0) ;/* 查詢等待查詢等待TF0置位置位 */ P1_0=!P1_0;/* 定時(shí)時(shí)間到定時(shí)時(shí)間到P1.0反相反相 */ TF

11、0=0; /* 軟件清軟件清 TF0 */ /*Franklin C51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h*/(2) 用定時(shí)器用定時(shí)器0的方式的方式1編程,采用中斷方式。程序如下:編程,采用中斷方式。程序如下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 /* T/C0中斷服務(wù)程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新裝載計(jì)數(shù)初值 */ TL0= -(1000%256) ; void m

12、ain( void ) TMOD=0 x01 ; /* T/C0工作在定時(shí)器非門控制方式1 */ P1_0=0; TH0= -(1000/256 ); /* 預(yù)置計(jì)數(shù)初值 */ TL0= -(1000%256) ; EA=1 ; /* CPU中斷開放 */ ET0= 1 ; /* T/C0中斷開放 */ TR0=1 ; /* 啟動(dòng)T/C0開始定時(shí) */ do while(1) ;/* 等待中斷 */ 例例8.8 ADC0809與8031接口的數(shù)據(jù)采集程序舉例。圖8-22 8031與ADC0808/0809轉(zhuǎn)換器接口電路EA/VP31X119X218RESET9RD17WR16INT012INT

13、113T014T115P 1.01P 1.12P 1.23P 1.34P 1.45P 1.56P 1.67P 1.78P 0.039P 0.138P 0.237P 0.336P 0.435P 0.534P 0.633P 0.732P 2.021P 2.122P 2.223P 2.324P 2.425P 2.526P 2.627P 2.728PSEN29ALE/P30TXD11RXD10U18031AHD03Q02D14Q15D27Q26D38Q39D413Q412D514Q515D617Q616D718Q719E1G11U2SN74LS373 GND13VCC11IN026D721D620IN

14、127D519D418IN228D38D215IN31D114D017IN42EOC7IN53A25IN64B24C23IN75ALE22VREF(-)16OE9START6VREF(+)12CLK10U3ADC0809 VR(+5V)A0A1A2 123U4A7402456U4B7402D0D1D2D3D4D5D6D7D0D1D2D3D4D5D6D7VCCD0D1D2D3D4D5D6D712U5A74LS048.5 MCS-51片外擴(kuò)展的片外擴(kuò)展的C語言編程語言編程程序如下: # include # include # define uchar unsigned char # define

15、uint unsigned int / 設(shè)置設(shè)置AD0809的通道的通道7地址地址 # define ad_in7 XBYTE 0 x7fff / 設(shè)置設(shè)置AD0809的通道的通道7地址地址 # define res DBYTE 0 x7f # define NUM 8 /采樣次數(shù)采樣次數(shù)=8 bit ad_over ; / 即即EOC狀態(tài)狀態(tài) / 采樣中斷 void int0_service() interrupt 0 using 1 ad_over=1;void main(void) int i; uint sum; uchar data anum; ad_over=0;EX0=1;IT0

16、=1;EA=1;L1: i=0;sum=0; ad_in7=0; /啟動(dòng)啟動(dòng)A/D轉(zhuǎn)換轉(zhuǎn)換 while (iNUM) ; if (ad_over) /等待轉(zhuǎn)換結(jié)束等待轉(zhuǎn)換結(jié)束 ad_over=0; ai=ad_in7; sum=sum+ai; i=i+1; ad_in7=i; /啟動(dòng)啟動(dòng)A/D轉(zhuǎn)換轉(zhuǎn)換 res=(uchar)sum/NUM; goto L1; 8.5.2 MCS-51輸出控制的輸出控制的C語言編程語言編程例例11 8031與DAC0832雙緩沖接口的數(shù)據(jù)轉(zhuǎn)換程序舉例。圖4.10 DAC 0832的雙緩沖接口電路將data1和data2數(shù)據(jù)同時(shí)轉(zhuǎn)換為模擬量的C51程序如下:# i

17、nclude # include # define INPUTR1 XBYTE 0 x8fff # define INPUTR2 XBYTE 0 xa7ff# define DACR XBYTE 0 x2fff # define uchar unsigned char void dac2b (data1 ,data2 )uchar data1 , data2 ; INPUTR1 = data1 ; /* 送數(shù)據(jù)到一片0832 */ INPUTR2 = data2 ; /* 送數(shù)據(jù)到另一片0832 */ DACR= 0 ; /* 啟動(dòng)兩路D/A 同時(shí)轉(zhuǎn)換 * /例例12 8031與DAC0832

18、單緩沖區(qū)接口的數(shù)據(jù)轉(zhuǎn)換舉例。圖4.11 DAC0832與8031 的單緩沖接口 按片選線確定FFFEH為DAC0832的端口地址。使運(yùn)行輸出端輸出一個(gè)鋸齒波電壓信號的C51程序如下:# include # include # define DA0832 XBYTE 0 xfffe # define uchar unsigned char # define uint unsigned int void stair (void ) uchar i ; while ( 1 ) for ( i=0 ; i=255 ; i=I+ ) /* 形成鋸齒波輸出值,最大值為255 */ DA0832 = i ;

19、 /* D/A轉(zhuǎn)換輸出 */ 8.5.3 頻率量測量的頻率量測量的C語言編程語言編程1. 計(jì)數(shù)法計(jì)數(shù)法 測量頻率法的最簡單的接口電路,可將頻率脈沖直接連接到MCS-51的T1端,將8031的T/C0用作定時(shí)器,T/C1用作計(jì)數(shù)器。在T/C0定時(shí)時(shí)間里,對頻率脈沖進(jìn)行計(jì)數(shù)。T/C1的計(jì)數(shù)值便是單位定時(shí)時(shí)間里的脈沖個(gè)數(shù)。定時(shí)輸入脈沖 T圖4.13測量頻率中的脈沖丟失圖4.16 頻率與周期波 2. 測量周期法測量周期法圖4.22 8031與行列式鍵盤的接口 8.5.4 鍵盤和數(shù)碼顯示人機(jī)交互的鍵盤和數(shù)碼顯示人機(jī)交互的C語言編程語言編程行掃描輸行掃描輸出口出口P1.0 P1.3列回掃輸入口列回掃輸入口P1.4 P1.7掃描函數(shù)的返回值為鍵特征碼,若無鍵按下,返回值為0。程序如下:# include #

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論