1. MCS-51單片機外部中斷的觸發方式如何設定和選擇
1、首先在Proteus軟體中添加元器件,如下圖所示。
2. 小弟新學的C51單片機,編了個電平觸發式中斷程序,不知道為什麼和跳變沿的一樣了,諸位大哥大姐幫忙看看
不會的,你這個程序中設置IT0=0,說明是低電平觸發,所以只要P3^2口一直是低電平那麼主程序停止,所以發光二極體點亮,如果P3^2口變為高電平,主程序繼續,發光二極體熄滅。另一種情況是當IT0=1的時候是負跳變觸發,就是當P3^2口檢測到一個又高電平到低電平的跳變後,觸發中斷,在中斷函數中點亮燈,立即出中斷,執行到d1=1時熄燈。看到的現象就是燈閃一下,直到又檢測到一個負跳變,燈又閃一下。兩種觸發方式的現象是不一樣的,如果你硬體沒問題的話。
3. 求一段51單片機的程序。要求外部中斷高電平觸發時,定時器0開始計數。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
char num,tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
TMOD=0x01;//設置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中?
ET0=1;//開定時器0終中斷
TR0=1;//啟動定時器0
wela=1;
P0=0xea;
wela=0;
la=1;
P0=0x3f;
la=0;
while(1)
{
if(tt==20)
{
tt=0;
num++;
if(num==16)
num=0;
d1=1;
la=1;
P0=table[num];
la=0;
delay(1000);//o xie le
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
4. 關於51單片機的中斷。
、中斷的概念
CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);
CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);
待CPU將事件B處理完畢後,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷
二、中斷源
在51單片機中有5個中斷源
中斷號 優先順序 中斷源 中斷入口地址
0 1(最高) 外部中斷0 0003H
1 2 定時器0 000BH
2 3 外部中斷1 0013H
3 4 定時器1 0018H
4 5 串口總段 0023H
三、中斷寄存器
單片機有10個寄存器主要與中斷程序的書寫控制有關
1.中斷允許控制寄存器IE
2.定時器控制寄存器TCON
3.串口控制寄存器SCON
4.中斷優先控制寄存器IP
5.定時器工作方式控制寄存器TMOD
6.定時器初值賦予寄存器(TH0/TH1,TL0/TL1)
寄存器詳細說明:http://blog.sina.com.cn/s/blog_a05b986d0101545c.html
四、寄存器功能與賦值說明
註:在用到中斷時,必須要開總中斷EA,即EA=1。 //開總中斷
1.中斷允許控制寄存器IE
EX0(EX1):外部中斷允許控制位
EX0=1 外部中斷0開關閉合 //開外部0中斷
EX0=0 外部中斷0開關斷開
ET0(ET1):定時中斷允許控制位
ET0=1 定時器中斷0開關閉合 //開內部中斷0
ET0=0 定時器中斷0開關斷開
ES: 串口中斷允許控制位
ES=1 串口中斷開關閉合 //開串口中斷
ES=0 串口中斷開關斷開
2.定時器控制寄存器 TCON //控制外部中斷和定時器中斷
外部中斷:
IE0(IE1):外部中斷請求標志位
當INT0(INT1)引腳出現有效的請求信號,此位由單片機自動置1,cpu開始響應,處理終端,而當入
中斷程序後由單片機自動置0.
//外部中斷,即外部中斷相應的引腳接入低電平或下降沿信號時,中斷開始響應。
IT0(IT1):外部中斷觸發方式控制位 //選擇有效信號
IT0(IT1)=1:脈沖觸發方式,下降沿有效。
IT0(IT1)=0:電平觸發方式,低電平有效。
內部中斷:
TF0(TF1):內部定時器/計數器溢出中斷標志位
當定時器、計數器計數溢出的時候,此位由單片機自動置1,cup開始響應,處理中斷,而當進入中
斷程序後由單片機自動置0.
//內部中斷實際上就是利用內部的計數器,只不過提供計數的脈沖來自單片機自身。
TRO(TR1):定時器/計數器啟動位 //啟動定時器
TRO(TR1)=1; 啟動定時器/計數器0
TR0(TR1)=0; 關閉定時器/計數器0
3.串口控制寄存器SCON
TI:串列口發送中斷標志位
當單片機串口發送完一幀數據後,此位由單片機自動置1,而當進入中斷服務程序後是不會自動清0的,
必須由用戶在中斷服務中用軟體清0.
RI:串列口接收中斷標志位
當單片機串口接收完一幀數據後,此位由單片機自動置1,而當進入中斷服務程序後是不會自動清0的,
必須由用戶在中斷服務軟體中用軟體清0.
(IP以後補上,TMOD,TL0/TH0 在定時器/計數器中講)
五、中斷結構圖:
六、定時器/計數器
1.計數的定義:
計數是指對外部事件進行計數,外部事件的發生以輸入脈沖的形式表示,因此計數功能的實質就是對外來
的脈沖進行計數,在單片機中對應引腳T0和T1,兩個脈沖輸入端。
外部輸入的脈沖在負跳變時有效(即外部脈沖由1變化到0),計數器加1.
2.定時器:
定時器是通過計數器的計數來實現的,不過此時的計數脈沖來自單片機的內部,因此定時器的實質是對內
部脈沖的計數,在單片機中,每個機器周期產生一次計數脈沖,計數器加1.
3.工作方式控制寄存器TMOD:
TMOD的低半位元組(D0,D1,D2,D3)用來控制定時器/計數器0
TMOD的高半位元組(D4,D5,D6,D7)用來控制定時器/計數器1
對TMOD中的內容說明:
GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
當INT0引腳為高電平時TR0置位,啟動定時器T0;
當INT1引腳為高電平時TR1置位,啟動定時器T1。
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T——功能選擇位
C/T=0時為定時功能,C/T=1時為計數功能。
M0、M1——方式選擇功能
由於有2位,因此有4種工作方式
4.根據單片機晶振,所選TMOD的的工作方式,所要定的時間,來確定THO和TLO所要賦予的初值
(以12M晶振,工作方式1,16位計數器為例,設所定時間為Xus(16為計數器最大數65536,即65536us,若所
定時間大於65535,則要用if語句控制,現假設X<65535))
1.時鍾周期的時間t=1/12M=1/12 us
2.機器周期的時間T=12*1/12=1 us
3.因為每經過一個機器周期計數器+1,所以,計數器+1,經過的時間為 1 us。
若所定時間為X,則要求經過Xus,中斷響應,又因為16為計數器要全部置1(即達到65535)+1後,中斷才會
響應,所以,初值=(65536-X)
4.將初值轉化為16進制碼,分別付給THO和TLO
eg:所定時間5ms
初值=(65536-5000)=60536=EC78
TH0=0XEC; TL0=0X78;
(當工作方式不同時,TH0/TL0的賦值也不同,個人覺得有了16位計數器了,其餘的沒什麼用,不介紹了)
5.寫程序時另一種THO/TLO賦值方法
TH0=(65536-20000)/256;
TL0=(65536-20000)%6;
這樣設置,每經過20ms,發生一次中斷,中斷時間一般以秒為單位,所以經過n次中斷即可。
5. 51單片機中斷程序怎麼寫
主函數:
EX0=1;
//外部中斷0
IT0=1;
//
1:下降沿觸發、0:低電平觸發
EA=1;
//開啟總中斷
中斷子程序:
void
inter0()
interrupt
0
{}
外部中斷1將0換成1。
6. 求一個51單片機簡單的中斷C語言程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^5;
uchar i;
uchar code table1[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,};
uchar code table[]= {
0x02 , 0x9F, 0x25, 0x0D , 0x99 ,
0x49 , 0x40, 0x1F, 0x00, 0x08,
0x10, 0xC0, 0x62, 0x84, 0X60, 0x70
} ;
uchar num;
uint m;
void delay(uint z);
void main()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
while(1)
{
// EA=1;
// EX0=1;
// IT0=1;
// EX1=1;
// IT1=1;
for(num=0;num<8;num++)
{
delay(50) ;
P2=0X00;
P0=table1[num];
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void enter0()interrupt 0 //第一個中斷無源蜂鳴器響,無源蜂鳴器響要給響,需要不停給高低電平。
{
while(1)
{ P0=0X11;
for(i=100;i>0;i--)
beep=~beep;
}
}
void enter1()interrupt 2 第二個中斷是數碼管從0到F閃爍。
{
while(1)
{
for(i=0;i<17;i++)
{
P2=0XFF;
P0=table[i] ;
delay(200) ;
}
}
}
注釋: P0是控制LED, P2控制數碼管。
7. MCS-51單片機中斷c語言或匯編編寫完整程序
ORG0000H
LJMPMAIN
ORG0003H
LJMPEXT0
ORG0030H
MAIN:
SETBEX0
SETBIT0
SETBEA
CLRP1.0
SJMP$
EXT0:
SETBP1.0
JNBP3.2,$
CLRP1.0
RETI
END
8. 51單片機中設置外部中斷0為下降沿觸發的語句怎麼寫啊
51單片機的外部中斷是有兩種觸發方式的,如外部中斷0: IT0(TCON.0) ,外部中斷 0觸發方式控制位。 當IT0=0時,為電平觸發方式。 當IT0=1時,為邊沿觸發方式(下降沿有效)。 51單片機中斷系統初始化: 開相應中斷源的中斷; (IE) 設定中斷優先順序;(IP) 若為外部中斷,設定外部中斷的觸發方式。 void Outside_Init(void) { EX0 = 1; //開外部中斷0 IT0 = 1; //負邊沿觸發 EA = 1; //開總中斷 } void Outside_Int(void) interrupt 0 //外部0中斷函數 { EX0 = 0; //關中斷 這里寫要實現的功能 EX0 = 1; //開中斷 }
9. 51單片機外部中斷的觸發方式
51單片機的外部中斷有兩種觸發方式可選:電平觸發和邊沿觸發。選擇電平觸發時,單片機在每個機器周期檢查中斷源口線,檢測到低電平,即置位中斷請求標志,向CPU請求中斷。選擇邊沿觸發方式時,單片機在上一個機器周期檢測到中斷源口線為高電平,下一個機器周期檢測到低電平,即置位中斷標志,請求中斷。
這個原理很好理解。但應用時需要特別注意的幾點:
1) 電平觸發方式時,中斷標志寄存器不鎖存中斷請求信號。也就是說,單片機把每個機器周期的S5P2采樣到的外部中斷源口線的電平邏輯直接賦值到中斷標志寄存器。標志寄存器對於請求信號來說是透明的。這樣當中斷請求被阻塞而沒有得到及時響應時,將被丟失。換句話說,要使電平觸發的中斷被CPU響應並執行,必須保證外部中斷源口線的低電平維持到中斷被執行為止。因此當CPU正在執行同級中斷或更高級中斷期間,產生的外部中斷源(產生低電平)如果在該中斷執行完畢之前撤銷(變為高電平)了,那麼將得不到響應,就如同沒發生一樣。同樣,當CPU在執行不可被中斷的指令(如RETI)時,產生的電平觸發中斷如果時間太短,也得不到執行。
2) 邊沿觸發方式時,中斷標志寄存器鎖存了中斷請求。中斷口線上一個從高到低的跳變將記錄在標志寄存器中,直到CPU響應並轉向該中斷服務程序時,由硬體自動清除。因此當CPU正在執行同級中斷(甚至是外部中斷本身)或高級中斷時,產生的外部中斷(負跳變)同樣將被記錄在中斷標志寄存器中。在該中斷退出後,將被響應執行。如果你不希望這樣,必須在中斷退出之前,手工清除外部中斷標志。
3) 中斷標志可以手工清除。一個中斷如果在沒有得到響應之前就已經被手工清除,則該中斷將被CPU忽略。就如同沒有發生一樣。
4) 選擇電平觸發還是邊沿觸發方式,TCON 控制寄存器
設置。應從系統使用外部中斷的目的上去考慮,而不是如許多資料上說的根據中斷源信號的特性來取捨。比如,有的書上說(《Keil C51使用技巧及實戰》),就有類似的觀點。
10. 51單片機的高級中斷無法打斷低級中斷里的循環,怎麼辦,具體程序如下
void guangdian() interrupt 2
{ TR0=1;//開啟定時器
flag=1;//標志位置1
while(flag==1)
{
fmq=1;//蜂鳴器響
}//使蜂鳴器不斷響
}
程序有兩個致命問題:
1、中斷裡面不要使用while,否則其他中斷就執行不了了,就是你描述的「高級中斷無法打斷低級中斷」
2、中斷裡面不要使用延時,中斷裡面的延時沒有執行完,又來中斷,導致程序執行效率低下,延時和while等操作盡量放到主程序里執行