版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第8章 單片機的C語言應用程序設計 8.1 C語言與MCS-518.3 C51數據類型及在MCS-51中的存儲方式8.4 MCS-51內部資源使用的C語言編程8.5 MCS-51片外擴展的C語言編程8.1 C語言與語言與MCS51 C C語言編寫單片機應用程序特點:語言編寫單片機應用程序特點:1 1)只需初步了解單片機存儲結構及內部資源;)只需初步了解單片機存儲結構及內部資源;2 2)C C語言能管理內部寄存器分配、不同存儲器尋址和數據類型等語言能管理內部寄存器分配、不同存儲器尋址和數據類型等細節(jié)問題;在小程序中代碼量大,在較大程序中效率高;細節(jié)問題;在小程序中代碼量大,在較大程序中效率高;2
2、 2)定義的數據類型和變量、語法規(guī)定、程序結構及程序設計方)定義的數據類型和變量、語法規(guī)定、程序結構及程序設計方法都與標準的法都與標準的C C語言程序設計相同,具有語言程序設計相同,具有C C語言程序設計的特點。語言程序設計的特點。 用用C C語言編寫應用程序步驟:語言編寫應用程序步驟:編輯源程序,編譯生成單片機可執(zhí)行的代碼,調試,寫入單片機。 MCS51MCS51系列單片機的系列單片機的C C語言編譯器語言編譯器:主要有KEIL C51編譯器、Franklin C51編譯器。8.3 C51數據類型及在數據類型及在MCS-51中的存儲方式中的存儲方式8.3.1 C51的數據類型C51編譯器支持
3、C語言所有標準的數據類型:char,unsigned char,int, unsigned int,long, unsigned long,float等。加入了專門訪問8051單片機硬件的數據類型: bit:聲明位變量,其值為1或0; sbit:聲明可尋址的位變量或SFR中的某個位變量,其值為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; 右邊的表達式定義特殊位在寄存器中的位置,值必須在右邊的表達式定義特殊位在寄存器中的位置,值必須在07.8.3.2 C51變量的存儲類型變量的存儲類型C51C51每個變量可以使用下表所列的存儲器類型明確分配到指每個變量可以使用下表所列的存儲器類型明確分配到指定的存儲空間。定的存儲空間。存儲類型與
5、存儲空間的對應關系 data 直接尋址片內數據存儲區(qū),訪問速度快(128字節(jié)) bdata 可位尋址片內數據存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié)) idata 間接尋址片內數據存儲區(qū),可訪問片內全部RAM地址空間(256字節(jié)) pdata 分頁尋址片外數據存儲區(qū)(256字節(jié))由MOV Ri訪問(i=0,1) xdata 片外數據存儲區(qū)(64 KB)由MOVX DPTR訪問 code 程序存儲器64 KB空間,由MOVC DPTR訪問帶存儲類型的變量的定義舉例:unsigned char data var1;/聲明一個內部直接尋址的無符號字節(jié)變量bit bdata flags;/在可位尋址片內
6、數據存儲區(qū)定義一個位變量char xdata var2;/在外部數據存儲區(qū)定義一個字符變量unsigned char code=“Welcome to Beijing”;/在程序存儲區(qū)定義字符串8.3.3 8.3.3 存儲模式存儲模式確定用于函數自變量、自動變量和無明確存儲類型的變量的確定用于函數自變量、自動變量和無明確存儲類型的變量的默認存儲器類型默認存儲器類型存儲模式說 明SMALL默認的存儲類型是data,參數及局部變量放入可直接尋址片內RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內RAM。存取速度快,盡量使用此模式。COMPACT默認的存儲類型是pdata
7、,參數及局部變量放入分頁的外部數據存儲區(qū),通過R0或R1間接訪問,棧空間位于片內數據存儲區(qū)中LARGE默認的存儲類型是xdata,參數及局部變量直接放入片外數據存儲區(qū),使用數據指針DPTR來進行尋址。用此數據指針進行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數據類型的訪問機制直接影響代碼的長度 對于片外擴展I/O口,則根據硬件譯碼地址,將其視作為片外數據存儲器的一個單元,使用#define語句進行定義。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中絕對地址訪問函數的頭文件,將PORTA定義為外部I/O口,地址為 FFC0H,長度為8
8、位。 Franklin C51編譯器提供 的MCS51常用的頭文件:reg51.h: MCS-51系列內部特殊功能寄存器stdio.h:標準輸入輸出函數的說明absacc.h:絕對地址訪問8.4 MCS-51內部資源的內部資源的C語言編程語言編程8.4 MCS-51內部資源的內部資源的C語言編程語言編程8.4.1 中斷應用的中斷應用的C語言編程語言編程 C51編譯器支持在C源程序中直接開發(fā)中斷程序。 中斷服務程序的函數定義的語法格式如下: 返回值 函數名(參數) interrupt m using n 中斷編號:m=0:外部中斷0m=1:定時器/計數器0m=2:外部中斷1m=3:定時器/計數器
9、1m=4:串行口中斷用于實現工作寄存器組的切換。n:是中斷服務子程序中選用的工作寄存器組號(0 3)。定時器定時器/計數器計數器(T/C)應用的應用的C語言編程語言編程 例例 設單片機的設單片機的fosc=12 MHz晶振,要求在晶振,要求在P1.0腳上輸出周期腳上輸出周期為為2 ms的方波。的方波。 周期為2 ms的方波要求定時時間隔1 ms,每次時間到P1.0取反。 機器周期=12/fosc=1 s 需計數次數=1000/(12/fosc)=1000/1=1000 由于計數器是加1計數,為得到1000個計數之后的定時器溢出,必須給定時器置初值為-1000(即1000的補數)。(1) 用定時
10、器用定時器0的方式的方式1編程,采用查詢方式,程序如下:編程,采用查詢方式,程序如下: # include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 設置定時器設置定時器1為非門控制方式為非門控制方式1*/ TR0=1 ; /* 啟動啟動 T/C0 */ for( ; ;) TH0= -(1000/256); /* 裝載計數器初值裝載計數器初值 */ TL0= -(1000%256) ; do while (!TF0) ;/* 查詢等待查詢等待TF0置位置位 */ P1_0=!P1_0;/* 定時時間到定時時間到P1.0反相反相 */ TF
11、0=0; /* 軟件清軟件清 TF0 */ /*Franklin C51編譯器提供定義特定MCS-51系列成員的寄存器頭文件。MCS-51頭文件為reg51.h*/(2) 用定時器用定時器0的方式的方式1編程,采用中斷方式。程序如下:編程,采用中斷方式。程序如下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 /* T/C0中斷服務程序入口 */ P1_0=!P1_0 ; /* P1.0取反 */ TH0= -(1000/256); / * 重新裝載計數初值 */ TL0= -(1000%256) ; void m
12、ain( void ) TMOD=0 x01 ; /* T/C0工作在定時器非門控制方式1 */ P1_0=0; TH0= -(1000/256 ); /* 預置計數初值 */ TL0= -(1000%256) ; EA=1 ; /* CPU中斷開放 */ ET0= 1 ; /* T/C0中斷開放 */ TR0=1 ; /* 啟動T/C0開始定時 */ do while(1) ;/* 等待中斷 */ 例例8.8 ADC0809與8031接口的數據采集程序舉例。圖8-22 8031與ADC0808/0809轉換器接口電路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片外擴展的片外擴展的C語言編程語言編程程序如下: # include # include # define uchar unsigned char # define
15、uint unsigned int / 設置設置AD0809的通道的通道7地址地址 # define ad_in7 XBYTE 0 x7fff / 設置設置AD0809的通道的通道7地址地址 # define res DBYTE 0 x7f # define NUM 8 /采樣次數采樣次數=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; /啟動啟動A/D轉換轉換 while (iNUM) ; if (ad_over) /等待轉換結束等待轉換結束 ad_over=0; ai=ad_in7; sum=sum+ai; i=i+1; ad_in7=i; /啟動啟動A/D轉換轉換 res=(uchar)sum/NUM; goto L1; 8.5.2 MCS-51輸出控制的輸出控制的C語言編程語言編程例例11 8031與DAC0832雙緩沖接口的數據轉換程序舉例。圖4.10 DAC 0832的雙緩沖接口電路將data1和data2數據同時轉換為模擬量的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 ; /* 送數據到一片0832 */ INPUTR2 = data2 ; /* 送數據到另一片0832 */ DACR= 0 ; /* 啟動兩路D/A 同時轉換 * /例例12 8031與DAC0832
18、單緩沖區(qū)接口的數據轉換舉例。圖4.11 DAC0832與8031 的單緩沖接口 按片選線確定FFFEH為DAC0832的端口地址。使運行輸出端輸出一個鋸齒波電壓信號的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轉換輸出 */ 8.5.3 頻率量測量的頻率量測量的C語言編程語言編程1. 計數法計數法 測量頻率法的最簡單的接口電路,可將頻率脈沖直接連接到MCS-51的T1端,將8031的T/C0用作定時器,T/C1用作計數器。在T/C0定時時間里,對頻率脈沖進行計數。T/C1的計數值便是單位定時時間里的脈沖個數。定時輸入脈沖 T圖4.13測量頻率中的脈沖丟失圖4.16 頻率與周期波 2. 測量周期法測量周期法圖4.22 8031與行列式鍵盤的接口 8.5.4 鍵盤和數碼顯示人機交互的鍵盤和數碼顯示人機交互的C語言編程語言編程行掃描輸行掃描輸出口出口P1.0 P1.3列回掃輸入口列回掃輸入口P1.4 P1.7掃描函數的返回值為鍵特征碼,若無鍵按下,返回值為0。程序如下:# include #
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子承包合同范本
- 風濕病的藥物治療如何正確的使用藥物
- 農戶借款合同范本
- 承包合同生效日期
- 問領導合同最簡單三個步驟
- 養(yǎng)老機構安全保障義務的泛化及重塑
- 2025年瀘州道路運輸從業(yè)資格考試下載
- 財務顧問協(xié)議三篇
- 數據中心冷卻通道導流裝置特性的模擬研究
- 2025年粵教版選修一歷史下冊階段測試試卷
- 耳穴壓豆課件
- 2023年江蘇省南京市中考化學真題(原卷版)
- 2023年湖北省襄陽市中考數學真題(原卷版)
- (2024版)小學六年級數學考試命題趨勢分析
- 變電站現場運行通用規(guī)程考試試題及答案
- 湖南高速鐵路職業(yè)技術學院單招職業(yè)技能測試參考試題庫(含答案)
- 中醫(yī)護理查房制度
- 母嬰護理員題庫
- 老年人預防及控制養(yǎng)老機構院內感染院內感染基本知識
- SWITCH暗黑破壞神3超級金手指修改 版本號:2.7.6.90885
- 2023高考語文全國甲卷詩歌閱讀題晁補之《臨江仙 身外閑愁空滿眼》講評課件
評論
0/150
提交評論