第七章內(nèi)部資源C編程_第1頁
第七章內(nèi)部資源C編程_第2頁
第七章內(nèi)部資源C編程_第3頁
第七章內(nèi)部資源C編程_第4頁
第七章內(nèi)部資源C編程_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第七章內(nèi)部資源第七章內(nèi)部資源C編程編程一、中斷應(yīng)用的一、中斷應(yīng)用的C C語言編程語言編程 C51 C51編譯器支持在編譯器支持在C C源程序中直接開發(fā)中斷程序。中斷服務(wù)源程序中直接開發(fā)中斷程序。中斷服務(wù)程序是通過按規(guī)定語法格式定義的一個(gè)函數(shù)。程序是通過按規(guī)定語法格式定義的一個(gè)函數(shù)。 中斷服務(wù)程序的函數(shù)定義的語法格式如下:中斷服務(wù)程序的函數(shù)定義的語法格式如下: 返回值返回值 函數(shù)名函數(shù)名(參數(shù)參數(shù)) ) 模式模式重入重入 interrupt m using n interrupt m using n nterrupt m nterrupt m 其中其中m m是中斷號(hào)是中斷號(hào)(0(0到到31)31

2、),中斷號(hào)告訴編譯器中,中斷號(hào)告訴編譯器中斷程序的入口地址,中斷號(hào)對(duì)應(yīng)著斷程序的入口地址,中斷號(hào)對(duì)應(yīng)著IEIE寄存器中的使能位。寄存器中的使能位。下表給出了對(duì)應(yīng)關(guān)系下表給出了對(duì)應(yīng)關(guān)系 IE 寄存器中的使能位和寄存器中的使能位和C 中的中斷號(hào)中的中斷號(hào)中斷源中斷源入口地址入口地址0 外部中斷外部中斷00003H1 定時(shí)器定時(shí)器0 溢出溢出000BH2 外部中斷外部中斷10013H 3 定時(shí)器定時(shí)器1 溢出溢出001BH4 串行口中斷串行口中斷0023H5 定時(shí)器定時(shí)器2 溢出溢出002BH 在進(jìn)入中斷服務(wù)程序前的程序中使用一組工作寄存器,進(jìn)在進(jìn)入中斷服務(wù)程序前的程序中使用一組工作寄存器,進(jìn)入中斷

3、服務(wù)程序后,由入中斷服務(wù)程序后,由“using n”切換到另一組寄存器,中斷返切換到另一組寄存器,中斷返回后又恢復(fù)到原寄存器組。這樣互相切換的兩組寄存器中的內(nèi)回后又恢復(fù)到原寄存器組。這樣互相切換的兩組寄存器中的內(nèi)容彼此都沒有被破壞。容彼此都沒有被破壞。 為中斷程序指定工作寄存器組的缺點(diǎn)是為中斷程序指定工作寄存器組的缺點(diǎn)是:所有被中斷調(diào)用的所有被中斷調(diào)用的過程都必須使用同一個(gè)寄存器組過程都必須使用同一個(gè)寄存器組,否則參數(shù)傳遞會(huì)發(fā)生錯(cuò)誤。否則參數(shù)傳遞會(huì)發(fā)生錯(cuò)誤。 中斷不允許用于外部函數(shù),它對(duì)函數(shù)目標(biāo)代碼影響如下:中斷不允許用于外部函數(shù),它對(duì)函數(shù)目標(biāo)代碼影響如下: 當(dāng)調(diào)用函數(shù)時(shí),當(dāng)調(diào)用函數(shù)時(shí),SFR

4、中的中的ACC,B,DPH,DPL和和PSW入入棧。如果不使用寄存器組切換,則甚至中斷函數(shù)所需要的所有棧。如果不使用寄存器組切換,則甚至中斷函數(shù)所需要的所有工作寄存器都入棧。工作寄存器都入棧。 函數(shù)退出前,所有的寄存器內(nèi)容出棧;函數(shù)退出前,所有的寄存器內(nèi)容出棧; 函數(shù)由函數(shù)由8051的指令的指令RETI終止。終止。 例:如圖所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)例:如圖所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)80318031的一的一個(gè)外部中斷個(gè)外部中斷INT1INT1上擴(kuò)展多個(gè)中斷源的原理電路圖。圖中是以開上擴(kuò)展多個(gè)中斷源的原理電路圖。圖中是以開關(guān)閉合來模擬中斷請(qǐng)求信號(hào)。當(dāng)有任一中斷源產(chǎn)生中斷請(qǐng)求,關(guān)閉

5、合來模擬中斷請(qǐng)求信號(hào)。當(dāng)有任一中斷源產(chǎn)生中斷請(qǐng)求,能給能給80318031的的INT1INT1引腳送一個(gè)有效中斷信號(hào),由引腳送一個(gè)有效中斷信號(hào),由P1P1的低的低3 3位可得對(duì)位可得對(duì)應(yīng)中斷源的中斷號(hào)。多個(gè)中斷源的處理。應(yīng)中斷源的中斷號(hào)。多個(gè)中斷源的處理。 在中斷服務(wù)程序中僅設(shè)置標(biāo)志,并保存在中斷服務(wù)程序中僅設(shè)置標(biāo)志,并保存I/OI/O口輸入狀態(tài)??谳斎霠顟B(tài)。 C51C51編譯器提供定義特定編譯器提供定義特定80C5180C51系列成員的寄存器頭文件。系列成員的寄存器頭文件。 80C5180C51頭文件為頭文件為reg51.hreg51.h。 C51C51程序如下:程序如下:主程序主程序初始化

6、INT1清標(biāo)志清標(biāo)志處理處理標(biāo)志設(shè)置?標(biāo)志設(shè)置?YN返返回回設(shè)置標(biāo)志設(shè)置標(biāo)志存狀態(tài)存狀態(tài)外中斷外中斷1 # include unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中斷服務(wù)程序,用第中斷服務(wù)程序,用第2組工作寄存器組工作寄存器 */ flag=1; /* 設(shè)置標(biāo)志設(shè)置標(biāo)志 */ status=p1; /* 存輸入口狀態(tài)存輸入口狀態(tài) */ void main(void) IP=0 x04 ; /* 置置INT1為高優(yōu)先級(jí)中斷為高優(yōu)先級(jí)中斷 */ IE=0 x84 ; /* IN

7、T1開中斷,開中斷,CPU開中斷開中斷 */ for(; ;) if(flag) /* 有中斷有中斷 */ switch(status) /* 根據(jù)中斷源分支根據(jù)中斷源分支 */ case 0 : break ; /* 處理處理IN0 */ case 1 : break ; /* 處理處理IN1 */ case 2 : break; /* 處理處理IN2 */ case 3 : break; /* 處理處理IN3 */ default : ; flag=0 ; /* 處理完成清標(biāo)志處理完成清標(biāo)志 */ 例例1 1:在:在XTALXTAL頻率是頻率是12MHZ12MHZ的標(biāo)準(zhǔn)的標(biāo)準(zhǔn)8051805

8、1器件上,用器件上,用TIME1TIME1(定(定時(shí)器時(shí)器/ /計(jì)數(shù)器計(jì)數(shù)器1 1)產(chǎn)生)產(chǎn)生10KHz10KHz定時(shí)器滴答中斷。定時(shí)器滴答中斷。 分析:采用分析:采用TIME1TIME1的工作模式的工作模式2 2,則:,則: TMOD=20HTMOD=20H, 機(jī)器周期機(jī)器周期=12/fosc=12/fosc=,T=1/10KHZ= 100 s T=1/10KHZ= 100 s (256 -256 -次數(shù))次數(shù))* *1 s=100 s 1 s=100 s TH1=TL1=256-100 TH1=TL1=256-100 采用中斷方式:采用中斷方式:EA=1EA=1,ET1=1ET1=1二、定

9、時(shí)器二、定時(shí)器/ /計(jì)數(shù)器應(yīng)用的計(jì)數(shù)器應(yīng)用的C C語言編程語言編程#include #include static unsigned long overflowcount=0;static unsigned long overflowcount=0;void time1(void) interrupt 3 void time1(void) interrupt 3 overflowcount+; / overflowcount+; /溢出計(jì)數(shù)器加溢出計(jì)數(shù)器加1 1 void main(void) void main(void) TMOD=(TMOD&0 x0F)|0 x20; TMOD=

10、(TMOD&0 x0F)|0 x20; TH1=256-100; TH1=256-100; TL1=TH1; TL1=TH1; ET1=1; ET1=1; EA=1;TR1=1; EA=1;TR1=1; while(1); while(1); (1) (1) 用定時(shí)器用定時(shí)器0 0的方式的方式1 1編程,采用查詢方式,程序如下:編程,采用查詢方式,程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; void main(void)void main(void) TMOD=0 x01 TMOD=0 x01 ; / /* * 設(shè)置定時(shí)器

11、設(shè)置定時(shí)器1 1為控制方式為控制方式1 1* */ / TR0=1 TR0=1 ; / /* * 啟動(dòng)啟動(dòng) T/C0 T/C0 * */ / for( for( ; ;) ) TH0= ( TH0= ( -1000 ) /256 -1000 ) /256 ; / /* * 裝載計(jì)數(shù)器初值裝載計(jì)數(shù)器初值 * */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 ; do while (!TF0) do while (!TF0) ; / /* * 查詢等待查詢等待TF0TF0置位置位 * */ / P1_0=!P1_0 P1_0=!P1_0; / /* * 定時(shí)

12、時(shí)間到定時(shí)時(shí)間到P1.0P1.0反相反相 * */ / TF0=0 TF0=0; / /* * 軟件清軟件清 TF0 TF0 * */ / (2) (2) 用定時(shí)器用定時(shí)器0 0的方式的方式1 1編程,采用中斷方式。程序如下:編程,采用中斷方式。程序如下: #include #include sbit P1_0=P10 sbit P1_0=P10 ; void time (void) interrupt 1 using 1 void time (void) interrupt 1 using 1 P1_0=!P1_0 P1_0=!P1_0 ; / /* * P1.0 P1.0取反取反 * */

13、 / TH0= ( TH0= ( -1000 ) /256 -1000 ) /256 ; * * 重新裝載計(jì)數(shù)初值重新裝載計(jì)數(shù)初值 * */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 void main( void ) void main( void ) TMOD=0 x01 TMOD=0 x01 ; / /* * T/C0 T/C0工作在定時(shí)器非門控制方式工作在定時(shí)器非門控制方式1 1 * */ / P1_0=0 P1_0=0; TH0= (TH0= ( -1000 ) /256 -1000 ) /256 ; / /* * 預(yù)置計(jì)數(shù)初值預(yù)置計(jì)數(shù)初值

14、* */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 ; EA=1 EA=1 ; / /* * CPU CPU中斷開放中斷開放 * */ / ET0= 1 ET0= 1 ; / /* * T/C0 T/C0中斷開放中斷開放 * */ / TR0=1 TR0=1 ; / /* * 啟動(dòng)啟動(dòng)T/C0T/C0開始定時(shí)開始定時(shí) * */ / do while(1) do while(1) ; / /* * 等待中斷等待中斷 * */ / 例例3:采用:采用10 MHz晶振,在晶振,在P1.0腳上輸出周期為腳上輸出周期為2.5 s,占空,占空比比20%的脈沖信號(hào)。

15、的脈沖信號(hào)。 分析:分析: 10 MHz晶振,使用定時(shí)器最大定時(shí)幾十毫秒。取晶振,使用定時(shí)器最大定時(shí)幾十毫秒。取10 ms定時(shí),定時(shí),周期周期2.5 s需需250次中斷,占空比次中斷,占空比20%,高電平應(yīng)為,高電平應(yīng)為50次中斷。次中斷。 10 ms定時(shí),晶振定時(shí),晶振fosc=10 MHz。 需定時(shí)器計(jì)數(shù)次數(shù)需定時(shí)器計(jì)數(shù)次數(shù)=1010310/12=8333# include # include # define uchar unsigned char# define uchar unsigned charuchar period=250uchar period=250;uchar high

16、=50uchar high=50;timer0( )interrupt 1 using 1 /timer0( )interrupt 1 using 1 /* * T/C0 T/C0中斷服務(wù)程序中斷服務(wù)程序 * */ / TH0= ( TH0= ( 8333 8333)/256 /256 ; / /* * 重置計(jì)數(shù)值重置計(jì)數(shù)值 * */ / TL0= ( TL0= ( 8333 8333)%256 %256 ; if(+time=high)P1=0; /* 高電平時(shí)間到變低高電平時(shí)間到變低 */ else if (time=period) /* 周期時(shí)間到變高周期時(shí)間到變高 */ time=0

17、; P1=1 ; main( )main( ) TMOD=0 x01 TMOD=0 x01 ; / /* * 定時(shí)器定時(shí)器0 0方式方式1 1 * */ / TH0= ( TH0= ( 8333 8333) /256 /256 ; TL0= (TL0= ( 8333 8333) %256 %256 ; EA=1EA=1; / /* * 開開CPUCPU中斷中斷 * */ / ET0=1 ET0=1 ; / /* * 開開T/C0T/C0中斷中斷 * */ / TR0=1 TR0=1 ; / /* * 啟動(dòng)啟動(dòng)T/C0 T/C0 * */ / do while(1) do while(1) ;

18、TL1=0 xfd; TH1=TL1; TL1=0 xfd; TH1=TL1; SCON=0 xd8;PCON=0 x00; SCON=0 xd8;PCON=0 x00; TR1=1; TR1=1; while(1) while(1) i=0; i=0; while(trdatai!=0 x00) while(trdatai!=0 x00) SBUF= trdatai; SBUF= trdatai; while(TI=0); while(TI=0); TI=0; TI=0; i+; i+; for(j=0;j12500;j+); for(j=0;j12500;j+); 單片機(jī)串行口發(fā)送單片機(jī)串行口發(fā)送/ /接收程序,每接收到字節(jié)即刻發(fā)送出去;接收程序,每接收到字節(jié)即刻發(fā)送出

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論