版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 單片機的C語言應(yīng)用程序設(shè)計 1 C51數(shù)據(jù)類型及在51中的存儲方式2 C51數(shù)據(jù)的存儲類型與51存儲結(jié)構(gòu)3 51特殊功能存放器(SFR)的C51定義4 51并行接口的C51定義5 位變量的C51定義6 中斷應(yīng)用的C語言編程7 定時器/計數(shù)器的應(yīng)用編程8 51片外擴展的C語言編程9 51機串行通信的C語言編程10 鍵盤和數(shù)碼顯示人機交互的C語言編程1. C51數(shù)據(jù)類型及在51中的存儲方式1.1 C51的數(shù)據(jù)類型 C51編譯器具體支持的數(shù)據(jù)類型有:位型(bit)、無符號字符(unsigned char)、有符號字符(singed char)、無符號整型(unsigned int )、有符號整型(
2、signed int )、無符號長整型(unsigned long )、有符號長整型(signed long )、浮點型(float)和指針類型等。C51的數(shù)據(jù)類型數(shù)據(jù)類型長度(bit)長度(byte)值域bit110,1unsigned char810255signed char81128127unsigned int 162065535signed int 1623276832767unsigned long32404294967295signed long 32421474836482147483647float 3241.176E383.40E+38(6位數(shù)字)double6481.1
3、76E383.40E+38(10位數(shù)字)一般指針243存儲空間0655351.2 C51數(shù)據(jù)的存儲類型與51存儲結(jié)構(gòu)C51存儲類型與MCS-51存儲空間的對應(yīng)關(guān)系存儲類型與存儲空間的對應(yīng)關(guān)系 data 直接尋址片內(nèi)數(shù)據(jù)存儲區(qū),訪問速度快(128字節(jié)) bdata 可位尋址片內(nèi)數(shù)據(jù)存儲區(qū),允許位與字節(jié)混合訪問(16字節(jié)) idata 間接尋址片內(nèi)數(shù)據(jù)存儲區(qū),可訪問片內(nèi)全部RAM地址空間(256字節(jié)) pdata 分頁尋址片外數(shù)據(jù)存儲區(qū)(256字節(jié))由MOV Ri訪問(i=0,1) xdata 片外數(shù)據(jù)存儲區(qū)(64 KB)由MOVX DPTR訪問 code 程序存儲器64 KB空間,由MOVC D
4、PTR訪問C51存儲類型及其數(shù)據(jù)長度和值域存儲類型長度(bit)長度(byte)值域范圍data810255idata810255pdata810255xdata162065 535code162065 535帶存儲類型的變量的定義的一般格式為 數(shù)據(jù)類型 存儲類型 變量名帶存儲類型的變量定義舉例:char data var1;bit bdata flags;float idata x,y,z;unsigned int pdata var2;unsigned char vector34;1.3 51特殊功能存放器(SFR)的C51定義 MCS-51單片機中,除了程序計數(shù)器PC和4組工作存放器組外
5、,其它所有的存放器均為特殊功能存放器(SFR),分散在片內(nèi)RAM區(qū)的高128字節(jié)中,地址范圍為80H0FFH。SFR中有11個存放器具有位尋址能力,它們的字節(jié)地址都能被8整除,即字節(jié)地址是以8或0為尾數(shù)的。 為了能直接訪問這些SFR, C51提供了一種自主形式的定義方法,這種定義方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對MCS-51系列單片機進行C語言編程。特殊功能存放器C51定義的一般語法格式如下:sfr sfr-name = int constant; sfr是定義語句的關(guān)鍵字,其后必須跟一個MSC-51單片機真實存在的特殊功能存放器名,=后面必須是一個整型常數(shù),不允許帶有運算符的表達式,是特殊功
6、能存放器sfr-name的字節(jié)地址,這個常數(shù)值的范圍必須在SFR地址范圍內(nèi),位于0 x800 xFF。例如:sfr SCON=0 x98; /* 串口控制存放器地址98H */sfr TMOD=0 x89;/* 定時器/計數(shù)器方式控制存放器地址89H */ 對于位尋址的SFR中的位,C51的擴充功能支持特殊位的定義,像SFR一樣不與標(biāo)準(zhǔn)C兼容,使用“sbit來定義位尋址單元。 有三種表達方式 第一種格式: sbit bit-name = sfr-nameint constant; sbit是定義語句的關(guān)鍵字,后跟一個尋址位符號名(該位符號名必須是MCS-51單片機中規(guī)定的位名稱),=后的sfr
7、-name必須是已定義過的SFR的名字,后的整常數(shù)是尋址位在特殊功能存放器sfr-name中的位號,必須是07范圍中的數(shù)。例如: sfr PSW=0 xD0 ; /* 定義PSW存放器地址為D0H */ sbit OV=PSW2 ; /* 定義OV位為PSW.2,地址為D2H */ sbit CY=PSW7 ; /* 定義CY位為PSW.7,地址為D7H */ 第二種格式:sbit bit-name = int constantint constant; =后的int constant為尋址地址位所在的特殊功能存放器的字節(jié)地址,符號后的int constant為尋址位在特殊功能存放器中的位號。
8、例如: sbit OV=0XD02 ;/* 定義OV位地址是D0H字節(jié)中的第2位 */ sbit CY=0XD07 ;/* 定義CY位地址是D0H字節(jié)中的第7位 */ 第三種格式:sbit bit-name = int constant; =后的int constant為尋址位的絕對位地址。例如: sbit OV=0XD2 ;/* 定義OV位地址為D2H */ sbit CY=0XD7 ;/* 定義CY位地址為D7H */ 特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換。1.4 51并行接口的C51定義 MCS-51系列單片機并行I/O接口除了芯片上的4個I/O口(P0 P3)外
9、,還可以在片外擴展I/O口。MCS-51單片機I/O口與數(shù)據(jù)存儲器統(tǒng)一編址,即把一個I/O口當(dāng)作數(shù)據(jù)存儲器中的一個單元來看待。 對于MCS-51片內(nèi)I/O口按特殊功能存放器方法定義。例如:sfr P0=0 x80 ; /* 定義P0口,地址為80H */sfr P1=0 x90 ; /* 定義P1口,地址為90H */ 對于片外擴展I/O口,那么根據(jù)硬件譯碼地址,將其視作為片外數(shù)據(jù)存儲器的一個單元,使用#define語句進行定義。例如#include #define PORTA XBYTE 0 xFFC0 absacc.h是C51中絕對地址訪問函數(shù)的頭文件,將PORTA定義為外部I/O口,地址
10、為 FFC0H,長度為8位。 一旦在頭文件或程序中對這些片外I/O口進行定義后,在程序中就可以自由使用變量名與其實際地址的聯(lián)系,以便使程序員能用軟件模擬51的硬件操作。1.5 51內(nèi)部資源使用的C語言編程 1 中斷應(yīng)用的C語言編程 C51編譯器支持在C源程序中直接開發(fā)中斷程序。中斷效勞程序是通過按規(guī)定語法格式定義的一個函數(shù)。 中斷效勞程序的函數(shù)定義的語法格式如下: 返回值 函數(shù)名(參數(shù)) interrupt m using n MCS-51中斷源編號編 號中 斷 源入 口 地 址0外部中斷00003H1定時器/計數(shù)器0000BH2外部中斷10013H3定時器/計數(shù)器1001BH4串行口中斷00
11、23H using n 選項用于實現(xiàn)工作存放器組的切換,n是中斷效勞子程序中選用的工作存放器組號(0 3)。在許多情況下,響應(yīng)中斷時需保護有關(guān)現(xiàn)場信息,以便中斷返回后,能使中斷前的源程序從斷點處繼續(xù)正確地執(zhí)行下去。這在MCS-51單片機中,能很方便地利用工作存放器組的切換來實現(xiàn)。即在進入中斷效勞程序前的程序中使用一組工作存放器,進入中斷效勞程序后,由using n切換到另一組存放器,中斷返回后又恢復(fù)到原存放器組。這樣互相切換的兩組存放器中的內(nèi)容彼此都沒有被破壞。擴展多個中斷源 例 下圖示是利用優(yōu)先權(quán)解碼芯片,在單片機8031的一個外部中斷INT1上擴展多個中斷源的原理電路圖。圖中是以開關(guān)閉合來
12、模擬中斷請求信號。當(dāng)有任一中斷源產(chǎn)生中斷請求,能給8031的INT1引腳送一個有效中斷信號,由P1的低3位可得對應(yīng)中斷源的中斷號。 在中斷效勞程序中僅設(shè)置標(biāo)志,并保存I/O口輸入狀態(tài)。C51編譯器提供定義特定MCS-51系列成員的存放器頭文件。MCS-51頭文件為reg51.h。C51程序如下: # include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中斷效勞程序,使用第2組工作存放器 */ flag=1; /* 設(shè)置標(biāo)志 */ status=p1; /* 存輸入口狀態(tài)
13、*/ void main(void) IP=0 x04 ; /* 置INT1為高優(yōu)先級中斷 */ IE=0 x84 ; /* INT1開中斷,CPU開中斷 */for(; ;) if(flag) /* 有中斷 */ switch(status) /* 根據(jù)中斷源分支 */ case 0 : break ; /* 處理IN0 */ case 1 : break ; /* 處理IN1 */ case 2 : break; /* 處理IN2 */ case 3 : break; /* 處理IN3 */ default : ; flag=0 ; /* 處理完成清標(biāo)志 */ 1.6 定時器/計數(shù)器(T/
14、C)應(yīng)用的C語言編程 例 設(shè)單片機的fosc=12 MHz晶振,要求在P1.0腳上輸出周期為2 ms的方波。 周期為2 ms的方波要求定時時間隔1 ms,每次時間到P1.0取反。 機器周期=12/fosc=1 s 需計數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000 由于計數(shù)器是加1計數(shù),為得到1000個計數(shù)之后的定時器溢出,必須給定時器置初值為-1000(即1000的補數(shù))。(1) 用定時器0的方式1編程,采用查詢方式,程序如下: # include sbit P1_0=P10 ; void main(void) TMOD=0 x01 ; /* 設(shè)置定時器1為非門控制方式1*/
15、TR0=1 ; /* 啟動 T/C0 */ for( ; ;) TH0= -(1000/256) ; /* 裝載計數(shù)器初值 */ TL0= -(1000%256) ; while (!TF0) ; /* 查詢等待TF0置位 */ P1_0=!P1_0; /* 定時時間到P1.0反相 */ TF0=0; /* 軟件清 TF0 */ (2) 用定時器0的方式1編程,采用中斷方式。程序如下: # include sbit P1_0=P10 ; void time (void) interrupt 1 using 1 /* T/C0中斷效勞程序入口 */ P1_0=!P1_0 ; /* P1.0取反
16、*/ TH0= -(1000/256); TL0= -(1000%256) ; / * 重新裝載計數(shù)初值 */ void main( void ) TMOD=0 x01 ; /* T/C0工作在定時器非門控制方式1 */ P1_0=0; TH0= -(1000/256 ); /* 預(yù)置計數(shù)初值 */ TL0= -(1000%256) ; EA=1 ; /* CPU中斷開放 */ ET0= 1 ; /* T/C0中斷開放 */ TR0=1 ; /* 啟動T/C0開始定時 */ do while(1) ; /* 等待中斷 */ 例 采用10 MHz晶振,在P1.0腳上輸出周期為2.5 s,占空比2
17、0%的脈沖信號。 10 MHz晶振,使用定時器最大定時幾十毫秒。取10 ms定時,周期2.5 s需250次中斷,占空比20%,高電平應(yīng)為50次中斷。 10 ms定時,晶振fosc=10 MHz。 需定時器計數(shù)次數(shù)=1010310/12=8333# include # define uchar unsigned charuchar period=250;uchar high=50;timer0( )interrupt 1 using 1 /* T/C0中斷效勞程序 */TH0= - 8333/256 ; /* 重置計數(shù)值 */TL0= - 8333%256 ; if(+time=high)P1=
18、0; /* 高電平時間到變低 */else if (time=period) /* 周期時間到變高 */time=0 ;P1=1 ; main( ) TMOD=0 x01 ; /* 定時器0方式1 */ TH0= - 8333/256 ;/* 預(yù)置計數(shù)初值 */ TL0= - 8333%256 ; EA=1; /* 開CPU中斷 */ ET0=1 ; /* 開T/C0中斷 */ TR0=1 ; /* 啟動T/C0 */ P1=1; do while(1) ; 中斷效勞程序流程圖 1.7 51數(shù)據(jù)采集的C語言編程例 ADC0809與8031接口的數(shù)據(jù)采集程序舉例。程序如下: # include
19、# include # define uchar unsigned char # define IN0 XBYTE 0 x7ff8 /* 設(shè)置AD0809的通道0地址 */ sbit ad_busy =P33 ; /* 即EOC狀態(tài) */ void ad0809 ( uchar idata *x ) /* 采樣結(jié)果放指針中的A/D采集函數(shù) */ uchar i ; uchar xdata *ad_adr ; ad_adr= & IN0 ; for ( i=0 ; i8 ;i+ ) /* 處理8通道 */ *ad_adr=0 ; /* 啟動轉(zhuǎn)換 */ i=i ; /* 延時等待EOC變低 */
20、i=i ; while (ad_busy = =0 ) ; /* 查詢等待轉(zhuǎn)換結(jié)束 */ xi = * ad_adr ; /* 存轉(zhuǎn)換結(jié)果 */ ad_adr + ; /* 下一通道 */ void main ( void ) static uchar idata ad 10 ; ad0809 ( ad ) ; /* 采樣AD0809通道的值 */ 1.8 51輸出控制的C語言編程例 8031與DAC0832雙緩沖接口的數(shù)據(jù)轉(zhuǎn)換程序舉例。將data1和data2數(shù)據(jù)同時轉(zhuǎn)換為模擬量的C51程序如下:# include # include # define INPUTR1 XBYTE 0 x8f
21、ff # 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/A 同時轉(zhuǎn)換 * /例 8031與DAC0832單緩沖區(qū)接口的數(shù)據(jù)轉(zhuǎn)換舉例。 按片選線確定FFFEH為DAC0832的端口地址。使運行輸出端輸出
22、一個鋸齒波電壓信號的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+ ) /* 形成鋸齒波輸出值,最大值為255 */ DA0832 = i ; /* D/A轉(zhuǎn)換輸出 */ 1.9 51機間通信的C語言編程點對點的串行異步通信1通信雙方的硬件連接 圖 7.17 8031間RS232C電平信號的傳
23、 2通信雙方的約定 3. 點對點通信編程 點對點通信雙方根本等同,只是人為規(guī)定一個為發(fā)送,一個為接收。要求兩機串行口的波特率相同,因而發(fā)送和接收方串行口的初始化相同??删幹坪谐跏蓟瘮?shù)、發(fā)送函數(shù)接收函數(shù)的程序,在主函數(shù)中根據(jù)程序的發(fā)送、接收設(shè)置TR,采用條件判別決定使用發(fā)送函數(shù)還是接收函數(shù)。這樣點對點通信的雙方都可運行此程序,只需在程序運行之前人為設(shè)置選擇TR,一個令TR=0,一個令TR=1,然后分別編譯,在兩機上分別裝入,同時運行。點對點通信的程序如下:#include#define uchar unsigned char#define TR 1 /*發(fā)送接收差異值TR=0發(fā)送*/ucha
24、r idata buf10;uchar pf;void init(void) /*串行口初始化*/ TMOD=0 x20; /*設(shè)T/C1為定時方式2*/ TH1=0 xe8; /*設(shè)定波特率*/ TL1=0 xe8; PCON=0 x00; TR1=1; /*啟動T/C1*/ SCON=0 x50; /*串行口工作在方式1*/ void send(uchar idata *d) uchar i; do SBUF=0 xaa; /*發(fā)送聯(lián)絡(luò)信號*/ while(TI= =0); /*等待發(fā)送出去*/ TI=0; while(RI= =0); /*等待B機答復(fù)*/ RI=0; while(SBU
25、F0 xbb)!=0); /*B機未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)*/ do pf=0; /*清校驗和*/ for ( i=0;i16;i+) SBUF=di; /*發(fā)送一個數(shù)據(jù)*/ pf+ =di; /*求校驗和*/ while(TI= =0);TI=0; SBUF=pf; /*發(fā)送校驗和*/ while(TI= =0);TI=0; while(RI= =0);RI=0; /*等待B機答復(fù)*/ while(SBUF!=0); /*答復(fù)出錯,那么重發(fā)*/ void receive (uchar idata *d) uchar i; do while (RI= =0); RI=0; while (SBUF0
26、xaa)! =0); /*判A機請求否*/ SBUF=0 xbb; /*發(fā)應(yīng)答信號*/while (TI= =0); TI=0; while (1) pf=0; /*清校驗和*/ for ( i=0;i16;i+) while (RI= =0); RI=0; d i =SBUF; /*接收一個數(shù)據(jù)*/ pf+ =di; /*求校驗和*/ while (RI= =0); RI=0; /*接收A機校驗和*/ if (SBUF pf) = =0) /*比較校驗和*/ SBUF=0 x00; break; /*校驗和相同發(fā)00*/ else SBUF=0 xff; /*出錯發(fā)FF,重新接收*/ whi
27、le(TI= =0); TI=0; void main (void) init ( ); if(TR= =0) send(buf); else receive(buf); 1.10 鍵盤和數(shù)碼顯示人機交互的C語言編程1 行列式鍵盤與8031的接口 鍵盤輸入信息的主要過程是: (1) 單片機判斷是否有鍵按下。 (2) 確定按下的是哪一個鍵。 (3) 把此步驟代表的信息翻譯成計算機所能識別的代碼,如ASCII或其它特征碼。8031與行列式鍵盤的接口 例17 44鍵盤的掃描程序。 掃描程序查詢的內(nèi)容為: (1) 查詢是否有鍵按下。首先單片機向行掃描P1.0 P1.3輸出全為0掃描碼F0H,然后從列檢
28、查口P1.4 P1.7輸入列掃描信號,只要有一列信號不為1,即P1口不為F0H,那么表示有鍵按下。接著要查出按下鍵所在的行、列位置。 (2) 查詢按下鍵所在的行列位置。單片機將得到的信號取反,P1.4P1.7中的為1的位便是鍵所在的列。接下來要確定鍵所在的行,需要進行逐行掃描。單片機首先使P1.0為0,P1.1P1.7為1,即向P1口發(fā)送掃描碼FEH,接著輸入列檢查信號,假設(shè)全為1,表示不在第一行。接著使P1.1接地,其余為1,再讀入列信號這樣逐行發(fā)0掃描碼,直到找到按下鍵所在的行,將該行掃描碼取反保存。當(dāng)各行都掃描以后仍沒有找到,那么放棄掃描,認為是鍵的誤動作。 (3) 對得到的行號和列號譯碼,得到鍵值。 (4) 鍵的抖動處理。當(dāng)用手按下一個鍵時,往往會出現(xiàn)所按鍵在閉合位置和斷開位置之間跳幾下才穩(wěn)定到閉合狀態(tài)的情況。在釋放一個鍵時,也會出現(xiàn)類似的情況,這就是鍵抖動,抖動的持續(xù)時間不一,通常不會大于10 ms,假設(shè)抖動問題不解決,就會引起對閉合鍵的屢次讀入,對于鍵抖動最方便的解決方法就是當(dāng)發(fā)現(xiàn)有鍵按下后,不是立即進行逐行掃
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同范例科普
- 快遞保管合同范例
- 切割支撐合同范例
- 電表供電合同范例
- 家居安裝合同范例
- 學(xué)校教室施工合同范例
- 《認識中括號》(教學(xué)實錄)-2024-2025學(xué)年五年級上冊數(shù)學(xué)冀教版
- 廠區(qū)垃圾運輸合同范例
- 布料面料采購合同范例
- 唐山學(xué)院《社區(qū)發(fā)展與住房規(guī)劃》2023-2024學(xué)年第一學(xué)期期末試卷
- 遼寧省撫順市清原縣2024屆九年級上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含解析)
- 安徽省蚌埠市聯(lián)考2024-2025學(xué)年七年級上學(xué)期12月期末考試英語試題(無答案)
- 2024-2025年第一學(xué)期小學(xué)德育工作總結(jié):點亮德育燈塔引領(lǐng)小學(xué)生全面成長的逐夢之旅
- 《SYT6848-2023地下儲氣庫設(shè)計規(guī)范》
- 2024至2030年中國甲醚化氨基樹脂行業(yè)投資前景及策略咨詢研究報告
- 行政案例分析-第二次形成性考核-國開(SC)-參考資料
- 2024-2025學(xué)年人教版八年級上學(xué)期數(shù)學(xué)期末復(fù)習(xí)試題(含答案)
- 【MOOC】中級財務(wù)會計-北京交通大學(xué) 中國大學(xué)慕課MOOC答案
- “感恩老師”教師節(jié)主題班會教案【三篇】
- 《園林政策與法規(guī)》課件
- 揚塵防治(治理)監(jiān)理實施細則(范本)
評論
0/150
提交評論