執(zhí)行條件不同
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比云城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式云城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋云城地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
其它一樣。
普通函數(shù) 在編程的時(shí)候 就可以確定在何時(shí)調(diào)用
而中斷函數(shù) 是在外部中斷發(fā)生時(shí)調(diào)用。
單片機(jī)c語言中斷函數(shù)中可以定義形參,但一般不需要這樣做。
中斷函數(shù)的定義格式如下:
函數(shù)類型
函數(shù)名
(形參)
interrupt
N
using
n
我們平時(shí)用的大多是KEIL編譯器,對于KEIL編譯器來說,中斷函數(shù)不需要輸入,也不返回參數(shù),因此這里的函數(shù)類型和函數(shù)形參都應(yīng)該為
void
類型。
n
表示使用的寄存器組,為
0---3,using是一個(gè)選項(xiàng),可以省略,如果省略,有編譯器來選擇一個(gè)寄存器組作為絕對寄存器組。
N
表示中斷號(這個(gè)不能省略,而且比較重要),下列出來普通51單片機(jī)的中斷號和中斷源的對應(yīng)關(guān)系:
中斷號
中斷源
外部中斷0
1
定時(shí)器0中斷
2
外部中斷1
3
定時(shí)器1中斷
4
串行口中斷
5
定時(shí)器2中斷
總之,一般來說,中斷函數(shù)不需要定義形參。
首先你要寫中斷函數(shù)
然后在主程序中像調(diào)用子函數(shù)一樣調(diào)用就可以了
舉個(gè)例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
形式如下:
void 中斷名(void) inerrupt 中斷號 using 工作寄存器組
比如外部中斷0
void ext0(void) interrupt 0 using 1 //后面的using 1可以省略,缺省為0
定時(shí)器1
void t1isr() interrupt 3
擴(kuò)展資料:
單片機(jī)內(nèi)部結(jié)構(gòu)
1、CPU
它的名字沒有改,還是稱為CPU(Central Processing Unit)。它是單片機(jī)的核心部件,包括運(yùn)算器和控制器。
運(yùn)算器既是算術(shù)邏輯單元ALU(Arithmetic logic Unit),其功能是進(jìn)行算術(shù)運(yùn)算和邏輯運(yùn)算。
控制器一般由指令寄存器、指令譯碼器、時(shí)序電路和控制電路組成。其作用是完成取指令、將指令譯碼形成各種微操作并執(zhí)行指令,同時(shí)控制計(jì)算機(jī)的各個(gè)部件有條不紊地工作。
2、單片機(jī)內(nèi)部結(jié)構(gòu)之一ROM
“硬盤”,改了名字,稱為程序存儲器,也叫只讀存儲器。用ROM(Read only memery)表示。其作用和計(jì)算機(jī)的硬盤差不多,用來存放用戶編寫的程序。特點(diǎn)是:掉電后不會丟失數(shù)據(jù)(程序)。
外部中斷的常用功能
外部中斷經(jīng)常用來記錄外部脈沖的個(gè)數(shù),也就是當(dāng)我們使用外部中斷1時(shí),如果想記錄自身單片機(jī)的某個(gè)引腳的下降沿個(gè)數(shù),只需用杜邦線把這個(gè)引腳和P3.3連接即可。
比如P2.3引腳產(chǎn)生這樣的電平無規(guī)律跳轉(zhuǎn),則下降沿的個(gè)數(shù)為5
所以我們就用外部中斷1來實(shí)現(xiàn)記錄K4按鍵從按下到松手的抖動過程中經(jīng)歷了多少個(gè)下降沿,把下降沿的個(gè)數(shù)顯示在數(shù)碼管上。
2.程序思路
我們定義一個(gè)16位的全局變量pulse用來記錄P2.3下降沿的個(gè)數(shù),在中斷函數(shù)中的任務(wù)就是簡單的pulse自加,因?yàn)橐_遇到下降沿就會進(jìn)入中斷函數(shù)。
在主函數(shù)里就是負(fù)責(zé)數(shù)碼管顯示即可。
3.代碼#include?
#include?//詳見第六章第8講
u16?pulse=0;
void?main()
{
u16?x,PULSE_buf;
IT1?=?1;???//下降沿觸發(fā)模式
EX1?=?1;
EA??=?1;
LED_Init();//初始化LED硬件模塊
KEY_Init();//初始化按鍵功能模塊
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse數(shù)值更新了,所以數(shù)碼管緩存區(qū)也要更新pulse的數(shù)值以便顯示出來
x++;
if(x=50)//隔一段時(shí)間過來記錄此時(shí)的pulse數(shù)值
{
x=0;
PULSE_buf=pulse;
}
}
}
//請把P3.3和P2.3用杜邦線連接起來
void?EXTI1_IRQHandler()?interrupt?2
{
pulse++;
}
大家多按幾次K4,發(fā)現(xiàn)按下后松手的一個(gè)動作里有時(shí)pulse就自加了幾次,顯示在數(shù)碼管上的數(shù)加了好幾下。