第七章內部資源C編程_第1頁
第七章內部資源C編程_第2頁
第七章內部資源C編程_第3頁
第七章內部資源C編程_第4頁
第七章內部資源C編程_第5頁
已閱讀5頁,還剩15頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、中的中的ACC,B,DPH,DPL和和PSW入入棧。如果不使用寄存器組切換,則甚至中斷函數所需要的所有棧。如果不使用寄存器組切換,則甚至中斷函數所需要的所有工作寄存器都入棧。工作寄存器都入棧。 函數退出前,所有的寄存器內容出棧;函數退出前,所有的寄存器內容出棧; 函數由函數由8051的指令的指令RETI終止。終止。 例:如圖所示是利用優先權解碼芯片,在單片機例:如圖所示是利用優先權解碼芯片,在單片機80318031的一的一個外部中斷個外部中斷INT1INT1上擴展多個中斷源的原理電路圖。圖中是以開上擴展多個中斷源的原理電路圖。圖中是以開關閉合來模擬中斷請求信號。當有任一中斷源產生中斷請求,關閉

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

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

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

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

9、時器二、定時器/ /計數器應用的計數器應用的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+; /溢出計數器加溢出計數器加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) 用定時器用定時器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 ; / /* * 設置定時器

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

12、時間到定時時間到P1.0P1.0反相反相 * */ / TF0=0 TF0=0; / /* * 軟件清軟件清 TF0 TF0 * */ / (2) (2) 用定時器用定時器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 ; * * 重新裝載計數初值重新裝載計數初值 * */ / TL0= ( TL0= ( -1000 ) %256 -1000 ) %256 void main( void ) void main( void ) TMOD=0 x01 TMOD=0 x01 ; / /* * T/C0 T/C0工作在定時器非門控制方式工作在定時器非門控制方式1 1 * */ / P1_0=0 P1_0=0; TH0= (TH0= ( -1000 ) /256 -1000 ) /256 ; / /* * 預置計數初值預置計數初值

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 ; / /* * 啟動啟動T/C0T/C0開始定時開始定時 * */ / do while(1) do while(1) ; / /* * 等待中斷等待中斷 * */ / 例例3:采用:采用10 MHz晶振,在晶振,在P1.0腳上輸出周期為腳上輸出周期為2.5 s,占空,占空比比20%的脈沖信號。

15、的脈沖信號。 分析:分析: 10 MHz晶振,使用定時器最大定時幾十毫秒。取晶振,使用定時器最大定時幾十毫秒。取10 ms定時,定時,周期周期2.5 s需需250次中斷,占空比次中斷,占空比20%,高電平應為,高電平應為50次中斷。次中斷。 10 ms定時,晶振定時,晶振fosc=10 MHz。 需定時器計數次數需定時器計數次數=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中斷服務程序中斷服務程序 * */ / TH0= ( TH0= ( 8333 8333)/256 /256 ; / /* * 重置計數值重置計數值 * */ / TL0= ( TL0= ( 8333 8333)%256 %256 ; if(+time=high)P1=0; /* 高電平時間到變低高電平時間到變低 */ else if (time=period) /* 周期時間到變高周期時間到變高 */ time=0

17、; P1=1 ; main( )main( ) TMOD=0 x01 TMOD=0 x01 ; / /* * 定時器定時器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 ; / /* * 啟動啟動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+); 單片機串行口發送單片機串行口發送/ /接收程序,每接收到字節即刻發送出去;接收程序,每接收到字節即刻發送出

溫馨提示

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

評論

0/150

提交評論