首先你要寫中斷函數(shù)
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供石棉網(wǎng)站建設、石棉做網(wǎng)站、石棉網(wǎng)站設計、石棉網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、石棉企業(yè)網(wǎng)站模板建站服務,十年石棉做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
然后在主程序中像調(diào)用子函數(shù)一樣調(diào)用就可以了
舉個例子吧
#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++;
}
51的C語言中斷是函數(shù),那這個中斷是否可以調(diào)用?如果能,怎么調(diào)用?
只從計算機原理來講,是可以的。
理論上,中斷函數(shù)也是一個程序的入口,只要把程序指令指針指向這個中斷的入口地址,
就可以執(zhí)行相應的代碼,從這個角度來講,是可操作的。
但在實際問題處理中,通常不行,因為中斷是提供給系統(tǒng)處理應急事件的,
并非設計來作為常規(guī)函數(shù)呼叫。
如果只是想要使用中斷處理中的某些功能,可把那些功能封裝為獨立的函數(shù),
供給中斷處理和一般流程來調(diào)用。
應用程序直接調(diào)用中斷,是有違中斷設計的初衷的,
不建議這樣使用,易導致原本正常的流程的莫名異常,
因為調(diào)用中斷處理,會占用中斷的相關資源,導致正常的中斷無法執(zhí)行,出現(xiàn)異常。
1.void(中斷函數(shù)返回類型(空型)) Time1 (中斷函數(shù)名)(void(參數(shù)類型) interrupt 3 (中斷號)
2: 中斷條件發(fā)生時執(zhí)行中斷,比如void Time1(void) interrupt 3 是定時器1定時時間到發(fā)生中斷,中斷函數(shù)放在那里無所謂
3:void PxInt0(void) interrupt 0 中斷名為PxInt0的0號中斷
void PxInt1(void) interrupt 2 中斷名為PxInt1的2號中斷
void time0_int(void) interrupt 1 中斷名為time0_int的1號中斷
void time1_int(void) interrupt 3 中斷名為time1_int的3號中斷
4:中斷的代碼是你想中斷執(zhí)行的工作,中斷的代碼是根據(jù)任務,需要你自己寫的
不是C語言中要調(diào)用函數(shù),是任何語言都要做的.
函數(shù)是對問題描述的最基本的分解方式,最簡單的它可以使問題逐層簡化,使工作可以分工協(xié)作.
的確某些非常簡單的操作是沒必要再細化成函數(shù),但并不是說該編譯系統(tǒng)就只處理非常簡單的操作,它還考慮到更復雜情況,所以加上強制使用函數(shù)方式編程也是合情合理的。
我現(xiàn)在也在迷惑這個問題,看單片機的程序里,中斷程序明明沒有被主程序調(diào)用,然而中斷程序卻可以運行……按照C語言的規(guī)則,子函數(shù)必須要被主函數(shù)調(diào)用才能發(fā)揮作用,然而在52單片機里,主函數(shù)并沒有調(diào)用中斷函數(shù)
…………然后我查到了這個:
程序中斷和調(diào)用子程序有何區(qū)別:
1.子程序調(diào)用是預先安排好的,程序中斷是隨機發(fā)生的;
2.調(diào)用子程序,是為主程序服務的,而中斷程序與主程序的程序毫無關系;
3.子程序是由調(diào)用指令給出目標地址,中斷是通過隱指令獲得中斷服務程序的入口地址
看到這個,大概意思應該是:
中斷程序不同于子程序,不需要主函數(shù)main調(diào)用就能執(zhí)行。
中斷服務程序只需要滿足一定條件即可執(zhí)行,比如定時器/計數(shù)器(在寫入定時器中斷服務程序的前提下)只需要計數(shù)“計滿”即可觸發(fā)中斷服務程序;外部中斷(在寫入外部中斷的服務程序的前提下)只需要觸發(fā)外部中斷引腳即可自動執(zhí)行,不需要主函數(shù)調(diào)用。
子程序完全為主程序服務的,兩者屬于主從關系,主程序需要子程序時就去調(diào)用子程序,并把調(diào)用結果帶回主程序繼續(xù)執(zhí)行。而中斷服務程序與主程序兩者一般是無關的,不存在誰為誰服務的問題,兩者是平行關系
這大概是單片機的特殊之處吧?正常的C語言程序沒有這樣的吧?我C語言也算新手,這是我的理解
單片機有個中斷入口地址,產(chǎn)生中斷后CPU自動從中斷向量取得入口地址,然后從這個地址執(zhí)行程序 。如果你用匯編寫代碼,你會發(fā)現(xiàn)main函數(shù)其實也是一個中斷函數(shù),是個復位中斷,和其它中斷不同處是main沒有返回。要執(zhí)行中斷里面的代碼必須讓程序指針指到中斷里的代碼,一是通過觸發(fā)中斷,二是手動改變PC指針(匯編直接用jmp指令跳轉.C由于編譯器的限制比較難實現(xiàn),可以嵌入?yún)R編實現(xiàn))
(void)interrupt n(using m)函數(shù)是個中斷函數(shù),當這個中斷產(chǎn)生后,CPU就會通過中斷向量找到這個函數(shù)的地址(中斷入口),然后執(zhí)行此函數(shù),結束后返回主函數(shù)