单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)
ATMEAGl6L的中斷系統什么是“中斷”?顧名思義中斷就是中斷某一工作過程去處理一些與本工作過程無關或間接相關或臨時發生的事件,處理完后,則繼續原工作過程。比如:你在看書,電話響了,你在書上做個記號后去接電話,接完后在原記號處繼續往下看書。如有多個中斷發生,依優先法則,中斷還具有嵌套特性。又比如:看書時,電話響了,你在書上做個記號后去接電話,你拿起電話和對方通話,這時門鈴響了,你讓打電話的對方稍等一下,你去開門,并在門旁與來訪者交談,談話結束,關好門,回到電話機旁,拿起電話,繼續通話,通話完畢,掛上電話,從作記號的地方繼續往下看書。由于一個人不可能同時完成多項任務,因此只好采用中斷方法,一件一件地做。
類似的情況在單片機中也同樣存在,通常單片機中只有一個CPU,但卻要應付諸如運行程序、數據輸入輸出以及特殊情況處理等多項任務,為此也只能采用停下一個工作去處理另一個工作的中斷方法。在單片機中,“中斷”是一個很重要的概念。中斷技術的進步使單片機的發展和應用大大地推進了一步。所以,中斷功能的強弱已成為衡量單片機功能完善與否的重要指標。中斷系統的引入解決了微處理器和外設之間數據傳輸速率的問題,提高了微處理器的實時性和處理能力。
當微處理器處于中斷開放時,才能接受外部的中斷申請。一個完整的中斷處理過程包括中斷請求、中斷響應、中斷處理和中斷返回。
中斷請求是中斷源向微處理器發出的信號,要求微處理器暫停原來執行的程序并為之服務。中斷請求可以是電平信號或者脈沖信號。中斷請求信號一般保持到微處理器作出響應為止。微處理器在檢測到中斷請求信號之后,將中止當前正在執行的程序,并對斷點實行保護,即將斷點的地址(PC值)推入堆棧保護,以便在中斷結束時從堆棧彈出斷點地址,以便繼續執行中斷前的任務。然后,微處理器由中斷地址表獲取中斷入口地址,并將此地址送入程序計數器(PC),從而開始執行中斷服務程序。在中斷服務程序里一般需要完成現場保護、開關中斷、執行中斷服務程序、現場恢復和中斷返回等工作。
ATMEAG16L具有20個中斷源和1個復位中斷,在中斷源中處于低地址的中斷具有高的優先級。所有中斷源都有獨立的中斷使能位,當相應的使能位和全局中斷使能位(SREG寄存器的位I)都置1時,中斷才可以發生,相應的中斷服務程序才會執行。下表為ATMEAGl6L的中斷源。
向量號
程序地
中斷源
中斷足義
1
0x000
RESET
外部引腳電平引發的復位,上電復位,掉電檢測復位,看門狗復位,以及JTAGAVR復位
2
0x002
INT0
外部中斷請求0
3
0x004
INT1
外部中斷請求1
4
0x006
TIMER2COMP
定時器/計數器2比較匹配
5
0x008
TIMER2OVF
定時器/計數器2溢出
6
0x00A
TIMERlCAPT
定時器/計數器1事件捕捉
7
0x00C
TIMERlCOMPA
定時器/計數器1比較匹配A
8
0x00E
TIMER1COMPB
定時器/計數器1比較匹配B
9
0x010
TIMER1OVF
定時器/計數器1溢出
10
0x012
TIMER0OVF
定時器/計數器O溢出,
11
0x014
SPI.STC
SPI串行傳輸結束
12
0x016
USART.RXC
USART,Rx結束
13
0x018
USART.UDRE
USART數據寄存器空
14
0x01A
USART。TXC
USART,Tx結束
15
0x01C
ADC
ADC轉換結束
16
0x01E
EERDY
EEPROM就緒
17
0x020
ANACOMP
模擬比較器
18
0x022
TWI
兩線串行接口
19
0x024
INT2
外部中斷請求2
20
0x026
TIMER0COMP
定時器/計數器0比較匹配
21
0x028
SPMRDY
保存程序存儲器內容就緒
一個中斷產生后,SREG寄存器的全局中斷使能位I將被清零,后續中斷被屏蔽。
用戶可以在中斷服務程序里對I置位從而再次開放中斷。在中斷返回后,全局中斷位I將重新置位。當程序計數器指向中斷向量開始執行相應的串斷暇務程序時,對應中斷標志位將被硬件清零。當一個符合條件的中斷發生后,如果相應的中斷使能位為0,中斷標志位將掛起并一直保持到中斷執行或者被軟件清除。如果全局中斷標志I被清零,則所有的中斷都不會被執行直到I置位。然后,被掛起的各個中斷按中斷優先級依次被處理。
ATMEAG16L的外部中斷編程實踐ATMEAG16L具有多達20個中斷源,這里我們首先進行外部中斷的實驗,其它的等到介紹到相關內容時再進行實驗。
1.外部中斷0外部中斷0由引腳INT0(PIND2)觸發。如果INT0引腳按照MCUCR寄存器中的ISC01、ISC00設置的方式發生跳變,則不管是否INTO中斷使能,INTO中斷標志位INTFO都將置位。如果SREG寄存器的全局中斷位I和通用中斷控制寄存器GICR中的lNT0中斷使能位INTO置位,則開始執行中斷程序。在進入中斷服務程序時,INTF0被硬件清零。必須指出,不管INT0(PIND2)引腳方向位設置如何,只要INT0引腳發生規定的跳變,都會觸發中斷。中斷標志位INTF0只在滿足發生中斷的條件時置位,一旦條件變化,INTF0被硬件清零。向INTF0位寫“1”也會對其清零。
2.外部中斷1外部中斷1由引腳INTI(PIND3)觸發。如果INTl引腳按照MCUCR寄存器中的ISC11、ISC10設置的方式發生跳變,則不管是否INT1中斷使能,INT1中斷標志位INTF1都將置位。如果SREG寄存器的全局中斷位l和通用中斷控制寄存器GICR中的INTl中斷使能位INT1置位,則開始執行中斷程序。在進入中斷服務程序時,INTF1被硬件清零。必須指出,不管INT1(PIND3)引腳方向位設置如何,只要INT1引腳發生規定的跳變,都會觸發中斷。中斷標志位INTF1只在滿足發生中斷的條件時置位,一旦條件變化,INTF1被硬件清零。向INTF1位寫“1”,也會對其清零。
3.外部中斷2外部中斷2由引腳INT2(PINB2)觸發。如果INT2引腳按照MCUCR寄存器中的ISC2設置的方式發生跳變,則不管是否INT2中斷使能,INT2中斷標志位INTF2都將置位。如果SREG寄存器的全局中斷位I和通用中斷控制寄存器GICR中的INT2中斷使能位INT2置位,則開始執行中斷程序。在進入中斷服務程序時,INTF2被硬件清零。必須指出,不管INT2(PINB2)引腳方向位設置如何,只要INT2引腳發生規定的跳變,都會觸發中斷。中斷標志位INTF2只在滿足發生中斷的條件時置位,一旦條件變化,INTF2被硬件清零。向INTF1位寫“1”,也會對其清零。
INT1中斷實驗:平時8個LED閃爍,點亮/熄滅時間約500mS。一旦INT1觸發中斷后,蜂鳴器發出10秒的報警聲。
在我的文檔中新建一個ac6的文件夾。建立一個ac6.prj的工程項目,最后建立源程序文件ac6.C。輸入下面的程序(程序1):
編譯通過后,可在AVRStudio集成開發環境中進行INTO、INT1中斷嵌套實驗:平時8個LED閃爍,點亮/熄滅時間約500ms。INTl觸發中斷后,蜂鳴器發出1O秒的報警聲。在INT1的中斷服務子函數中,再置位總中斷使能位I,這樣INT1中斷服務子函數中,即可進行INT0中斷嵌套。當INT0觸發中斷時,進入INT0中斷服務子函數,將8個LED的一半熄滅。
在我的文檔中新建一個ac7的文件夾。建立一個JTAG在線仿真或進行軟件模擬仿真。仿真完成后,將ac6.hex文件下載到AVR單片機綜合試驗板上。注意,標示“LED”及“INT1”的雙排針應插上短路塊。我們看到,D1-D8發光管閃亮,間隔約0.5秒。按下INT1鍵后,單片機進入中斷,蜂鳴器發聲10秒。
ac7.prj的工程項目,最后建立源程序文件ac7.C。輸入下面的程序(程序2):
編譯通過后,可在AVRStudio集成開發環境中進行JTAG在線仿真或進行軟件模擬仿真。仿真完成后,將ac7.hex文件下載到AVR單片機綜合試驗板上進行實際的中斷操作。注意,標示“LED”、“BEEP”及“INT0”、“INT1”的雙排針應插上短路塊。
兩路防盜報警器實驗:平時一個數碼管熄滅。當盜情發生時自動顯示“1”或“2”,同時一個LED點亮(代表報警)。著兩路同時產生盜情,則數碼管每隔2秒輪流顯示“1”、“2”。直到值班人員按下復位按鈕后才解除報警。
在我的文檔中新建一個ac8的文件夾。建立一個ac8.pd的工程項目,最后建立源程序文件ac8.C。輸入下面的程序(程序3):
程序3)
#include? ? //包含頭文件
#define?uchar?unsigned?char? ∥變量類型的宏定
義
#define?uint?unsigned?int
uchar?const?SEG7f?[10]={0X3f,0x06.0x5b,∥共陰極數
碼管0-9的字形碼
0x4f,Ox66;Ox6d,0x7d,Ox07,0x7f,0x6f};
#define?ALM_ON(PORTB=PORTB&0xfe)//報警
器啟動
uchar?aim_flag1,alm_flag2;//第1、2路盜情標志
//**********************************
void?delay_ms(uint?k)//定義毫秒級的延時子函數
{
uint?i,j;
for(=O:i
{
for(j=0;j<1140;j++)
}
}
//========================
void?main(void)∥定義主函數
{? ? ∥主函數開始
DDRA=0xff;? ∥將PA端口設為輸出
DDRC=0xff;? ? ∥將PC端口設為輸出
PORTA=0x00;#PA端口初始化輸出00000000
PORTC=0xff;? //PC端口初始化輸出1?1?11?1?1?1?1
PORTB=0xff;?//PB端口初始化輸出11?11?1?1?1?1
DDRB=0xff:? //將PB端口設為輸出
PORTD=0xff;? #PD端口初始化輸出1?111111?1
DDRD=0xf3;? //將PIND2、3設為輸入
MCUCR=0x0A;//INT0、1為下降沿觸發
GICR:0xC0;//使能INT0、1中斷
SREG=0x80;//使能總中斷
while(1)? ? //無限循環
{? ? ∥無限循環語句開始
if(alm_flag1==1)//如果第1路產生盜情
{PORTA=SEG7[1];∥數碼管顯示為1
PORTC=Oxfe;//點亮最右的數碼管
ALM_ON://報警器啟動
delay_ms(2000);#延時2秒
}
if(alm_flag2==1)∥如果第2路產生盜情
{PORTA=SEG7[2];∥數碼管顯示為2
PORTC=0xfe;//點亮最右的數碼管
ALM_ON;//報警器啟動
delay_ms(2000);//延時2秒
}
}? ? ////無限循環語句結束
}? ? ////主函數結束
∥****************************************
*
#pragma?interrupt_handler?intO_isr:2#INTO中斷服
務子函數
void?intO_isr(void)
{
aim_flagl=1:? ? //置第1路盜情標志為
1
#pragma?interrupt_handler?int1_isr:3//INT1
務子函數
中斷服
void?int1_isr(void)
{
alm_flag2=1;? ? //置第2路盜情標志為1
}
}
//****************************************
編譯通過后,可將ac8.hex文件下載到AVR單片機綜合試驗板上進行實際的操作演示。注意,標示“LED”、“LEDMOD_DISP”、“LED-MOD_COM”及“INT0”、“INT1”的雙排針應插上短路塊。
總結
以上是生活随笔為你收集整理的单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中图片响应式怎么写,如何使用 H
- 下一篇: python123自定义幂函数_pyth