㈠ 單片機 C語言 中斷
主程序和中斷沒關系的,主程序是個死循環,一直執行。中斷是打斷主程序進入中斷子程序,中斷完成後繼續執行主程序。中斷標志要在進入中斷後清除,如果不清除,下次不會再觸發。主程序繼續執行無影響。
TR0是啟動定時器,啟動以後不要再改寫就好每到定時時間進入中斷。進入中斷後要清除中斷使能標志,不是叫你關閉定時器。這兩種不是一個概念。定時器控制寄存器裡面有一個中斷標志A,為1的時候代表進入中斷,進入中斷後A要清零,之後才會繼續查看A是否再次為1,為1即進中斷,在中斷寫零,如此循環進行。
關閉或者重新開啟TR0,標志A都是硬體自動重新裝載(初始化)0,以使中斷執行。所以也能達到效果,但是每次執行都重新設置定時器會比較耗費資源,其實只需要清零標志位就ok了。
㈡ c語言怎麼編寫單片機的中斷
標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
解決方案:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的東西。
3、強大的vc
vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。
㈢ 單片機c語言寫兩個中斷,兩個中斷怎麼寫
//任務6 顯示按鍵按下的次數(中斷方式)
//任務6 顯示按鍵按下的次數(中斷方式)
#include <reg51.h> //1 包含特殊功能寄存器定義頭文件reg51.h
#define ledport P2 //2 宏定義:ledport代表P2(發光二極體接P2口)
#define uchar unsigned char //3 宏定義:uchar代表unsigned char
#define ulong unsigned int //3 宏定義:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定雀和義變數m:m用來保存顯示控制數據,初值為0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引腳定義
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
void fun1_int() interrupt 0 using 1//5 定義中斷服務函數:中斷號為0,用第1組寄存器組
{
while(1) //while循環(永遠為真,死循環)
{ //循環睜凳體開始
led1=~led1; //發光二級管的顯示狀態取反
led2=~led2;
led3=~led3;
led4=~led4;
for(j=0;j<12500;j++); //for循環,循環體為空,耗時 //延時500ms
}
} //循環體結束
void fun2_int() interrupt 1 using 2//5 定義中斷服務函數:中斷號為0,用第1組寄存器組
{
while(1) //7 while循環,條件表達式為1,永遠為真,死循環
{ //8 while循環體開始
P1=m; //9 P1口輸出當前顯示控制數據
m=(m<<1)|(m>>7); //10 顯示數據m向左循環移1位,為下次顯示輸出作準備
for(i=0;i<60000;i++); //11 for循環實現1s延時,循環體為空語句
} //12 while循環體結束
}
//8 中斷服務函數結束
void main(void) //9 main函數
{
EA=1;
EX0=0; //12 開外部中斷0
EX1=0;
IT1=1;
IT0=1; //11 設置外部中斷0的觸發方式:下降沿觸發。見代碼說明
while(1)
; //14 死循環,循環體為空頃早盯語句
} //15 main函數結束
//任務1 控制1隻發光二極體閃爍顯示上面的注釋可以省略不看,
這個需要設置不同的寄存器,注意依稀俺這里就可以了的,然後查一下數據手冊。
㈣ 單片機中斷C語言
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}
㈤ 求單片機(c51)外部中斷實驗的c語言代碼或者思路,要求在補充
#include<reg51.h>
#defineucharunsignedchar
voiddelay(void)
{
uchari,j;
for(i=0;i<200;i++)
for(j=0;j<120;j++);
}
voidext0()interrupt0
{
uchari;
for(i=0;i<8;i++)
{
P2=0x00;
delay();
P2=0xff;
delay();
}
}
main()
{
uchari;
EX0=1;
IT0=1;
EA=1;
while(1)
{
P2=~(1<<i);
delay();
i++;
i%=8;
}
}