中斷大概是這樣的。。。如果有點(diǎn)錯(cuò)誤不要怪我。。。我以前作過(guò)鼠標(biāo)中斷的東西?!,F(xiàn)在有些想不起來(lái)了。。。所以。。。呵呵呵。。。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括永嘉網(wǎng)站建設(shè)、永嘉網(wǎng)站制作、永嘉網(wǎng)頁(yè)制作以及永嘉網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,永嘉網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到永嘉省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
當(dāng)程序運(yùn)行到中斷條件的時(shí)候,會(huì)向CPU發(fā)信號(hào)改變優(yōu)先級(jí)(原先運(yùn)行的東西會(huì)放進(jìn)哪個(gè)特定的地方的,作保存),以發(fā)出中斷的那段程序作為最高優(yōu)先,執(zhí)行完成后再由執(zhí)行另外的。。。建議你去看看匯編。。。哈哈哈。。。我沒(méi)學(xué)過(guò)的。。。
C中實(shí)現(xiàn)中斷是用了一個(gè)函數(shù):geninterrupt(...) 這個(gè)“...”是個(gè)16進(jìn)制的數(shù)字,是中斷號(hào),像鼠標(biāo)中斷號(hào)就是0x33
還要用到類似匯編里寄存器模樣的變量:如_AX,_BX,_CX,_DX...不同的值功能不同。。。哎呀,我都忘完了。。。建議去查下geninterrupt()的用法就OK了。。。
1.void(中斷函數(shù)返回類型(空型)) Time1 (中斷函數(shù)名)(void(參數(shù)類型) interrupt 3 (中斷號(hào))
2: 中斷條件發(fā)生時(shí)執(zhí)行中斷,比如void Time1(void) interrupt 3 是定時(shí)器1定時(shí)時(shí)間到發(fā)生中斷,中斷函數(shù)放在那里無(wú)所謂
3:void PxInt0(void) interrupt 0 中斷名為PxInt0的0號(hào)中斷
void PxInt1(void) interrupt 2 中斷名為PxInt1的2號(hào)中斷
void time0_int(void) interrupt 1 中斷名為time0_int的1號(hào)中斷
void time1_int(void) interrupt 3 中斷名為time1_int的3號(hào)中斷
4:中斷的代碼是你想中斷執(zhí)行的工作,中斷的代碼是根據(jù)任務(wù),需要你自己寫(xiě)的
標(biāo)準(zhǔn)c語(yǔ)言沒(méi)有中斷調(diào)用機(jī)制,但是不同編譯器都有相應(yīng)的中斷處理方式,可以使用戶實(shí)現(xiàn)中斷功能。
解決方案:
1、采取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤(pán)請(qǐng)求,總的來(lái)說(shuō),這樣基本上可以解決問(wèn)題,而且簡(jiǎn)單易行,但每10毫秒都要檢查,系統(tǒng)消耗太大。
2、采取中斷的方式:
(1)用高級(jí)語(yǔ)言調(diào)用中斷來(lái)處理問(wèn)題。中斷是cpu響應(yīng)一個(gè)中斷外圍設(shè)備8259A的一個(gè)過(guò)程,當(dāng)鍵盤(pán)敲擊,cpu保存斷點(diǎn)暫停執(zhí)行并且跳到相應(yīng)的中斷處理程序繼續(xù)執(zhí)行,結(jié)束后根據(jù)斷點(diǎn)再跳回來(lái)。通過(guò)這種方式可以輕松+愉快地解決這個(gè)問(wèn)題。但是需要用到高級(jí)語(yǔ)言調(diào)用匯編,根據(jù)編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個(gè)線程專門(mén)響應(yīng)鍵盤(pán)的敲擊,如果有敲擊則打斷主線程。這樣做實(shí)現(xiàn)起來(lái)很復(fù)雜,而且涉及到不少?gòu)?fù)雜的關(guān)鍵技術(shù),比如信號(hào)量之類的東西。
3、強(qiáng)大的vc
vc采取了消息映射的機(jī)制來(lái)處理外部設(shè)備的請(qǐng)求,比如時(shí)鐘中斷、鍵盤(pán)中斷等等。通過(guò)此可以灰?;页H菀椎奶幚硗獠恐袛?。
c51中斷函數(shù)的介紹
C51編譯器允許用c51創(chuàng)建中斷服務(wù)程序,大家僅僅需要關(guān)心中斷號(hào)和寄存器組的選擇就可以了。編譯器自動(dòng)產(chǎn)生中斷向量和程序的入棧及出棧代碼。在函數(shù)聲明時(shí)包括interrupt,將把所聲明的函數(shù)定義為一個(gè)中斷服務(wù)程序。另外,可以用using定義此中斷服務(wù)程序所使用的寄存器組。
一、中斷函數(shù)的定義
1、中斷函數(shù)定義的格式為:
函數(shù)類型 函數(shù)名 interrupt n using n
其中:
Interrupt后面的n是中斷號(hào)。
關(guān)鍵字using后面的n是所選擇的寄存器組,取值范圍是0-3.
定義中斷函數(shù)時(shí),using是一個(gè)選項(xiàng),可以省略不用。如果不用則由編譯器選擇一個(gè)寄存器組作為絕對(duì)寄存器組。
2、8051的中斷過(guò)程通過(guò)使用interrupt關(guān)鍵字和中斷號(hào)來(lái)實(shí)現(xiàn),中斷號(hào)告訴編譯器中斷程序的入口地址。中斷號(hào)對(duì)應(yīng)著IE寄存器中的使能位,換句話說(shuō),IE寄存器中的0位對(duì)應(yīng)著外部中斷0,相應(yīng)的外部中斷0的中斷號(hào)是0.
IE寄存器中的使能位與外部中斷對(duì)應(yīng)關(guān)系:
中斷號(hào) 中斷源
0 外部中斷0
1 定時(shí)器0
2 外部中斷1
3 定時(shí)器1中斷
4 串行口中斷
5 定時(shí)器2中斷
二、使用中斷函數(shù)時(shí)要注意的問(wèn)題:
1. 在設(shè)計(jì)中斷時(shí),要注意的是哪些功能應(yīng)該放在中斷程序中,哪些功能應(yīng)該放在主程序中。一般來(lái)說(shuō)中斷服務(wù)程序應(yīng)該做最少量的工作,這樣做有很多好處。首先系統(tǒng)對(duì)中斷的反應(yīng)面更寬了,有些系統(tǒng)如果丟失中斷或?qū)χ袛喾磻?yīng)太慢將產(chǎn)生十分嚴(yán)重的后果,這時(shí)有充足的時(shí)間等待中斷是十分重要的。其次它可使中斷服務(wù)程序的結(jié)構(gòu)簡(jiǎn)單,不容易出錯(cuò)。
中斷程序中放入的東西越多,他們之間越容易起沖突。簡(jiǎn)化中斷服務(wù)程序意味著軟件中將有更多的代碼段,但可把這些都放入主程序中。中斷服務(wù)程序的設(shè)計(jì)對(duì)系統(tǒng)的成敗有至關(guān)重要的作用,要仔細(xì)考慮各中斷之間的關(guān)系和每個(gè)中斷執(zhí)行的時(shí)間,特別要注意那些對(duì)同一個(gè)數(shù)據(jù)進(jìn)行操作的ISR.
2. 中斷函數(shù)不能傳遞參數(shù)。
3. 中斷函數(shù)沒(méi)有返回值。
4. 中斷函數(shù)調(diào)用其他函數(shù),則要保證使用相同的寄存器組,否則出錯(cuò)。
5. 中斷函數(shù)使用浮點(diǎn)運(yùn)算要保存浮點(diǎn)寄存器的狀態(tài)。
首先你要寫(xiě)中斷函數(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++;
}
樓主指的是interrupt嗎?
如果是的話一般定義中斷函數(shù)如下
void interrupt ISR(void)
{
......
}
有的單片機(jī)有中斷入口地址的.比如地址是0x1A
void ISR(void) interrupt 0x1A
{
....
}