引言
在單片機開發中,外部中斷是一個非常重要的功能,它可以讓單片機在檢測到外部信號變化時立即做出響應。本文將詳細介紹如何在CT107D單片機綜合訓練平臺上使用外部中斷來控制LED燈的閃爍。我們將使用兩種不同的方式來實現這一功能:一種是在中斷服務函數中直接進行延時,另一種是在中斷服務函數中設置標志變量,在主循環中進行延時。
硬件連接
首先,我們需要將J5處的跳帽接到2~3引腳,這樣S5按鍵將連接到P32/INT0,S4按鍵將連接到P33/INT1。這樣,當按下S5按鍵時,P32引腳將產生一個下降沿信號,觸發外部中斷0。
代碼實現
1. 直接在中斷服務函數中延時
在這種方式中,我們將在中斷服務函數中直接進行延時操作。以下是完整的代碼實現:
#include <REGX52.H>
sbit L1 = P0^1; ?// 定義L1指示燈
sbit L8 = P0^7; ?// 定義L8指示燈
void SeletcHC573()
{
? ? P2 = (P2 & 0x1f) | 0x80; ?// 選擇HC573鎖存器
}
void Delay(unsigned int t)
{
? ? while(t--); ?// 簡單的延時函數
}
void working()
{
? ? SeletcHC573();
? ? L1 = 0; ?// 點亮L1
? ? Delay(60000); ?// 延時
? ? L1 = 1; ?// 熄滅L1
? ? Delay(60000); ?// 延時
}
void Init_INT0()
{
? ? IT0 = 1; ?// 設置INT0為下降沿觸發
? ? EX0 = 1; ?// 使能外部中斷0
? ? EA = 1; ? // 使能總中斷
}
void ServiceINT0() interrupt 0?
{
? ? L8 = 0; ?// 點亮L8
? ? Delay(60000); ?// 延時
? ? Delay(60000);
? ? Delay(60000);
? ? Delay(60000);
? ? Delay(60000);
? ? Delay(60000);
? ? L8 = 1; ?// 熄滅L8
}
void main()
{
? ? Init_INT0(); ?// 初始化外部中斷0
? ? while(1)
? ? {
? ? ? ? working(); ?// 主循環中不斷調用working函數
? ? }
}
2. 在中斷服務函數中設置標志變量,在主循環中延時
在這種方式中,我們將在中斷服務函數中設置一個標志變量,然后在主循環中根據這個標志變量來控制L8的亮滅。以下是完整的代碼實現:
#include <REGX52.H>
sbit L1 = P0^1; ?// 定義L1指示燈
sbit L8 = P0^7; ?// 定義L8指示燈
void SeletcHC573()
{
? ? P2 = (P2 & 0x1f) | 0x80; ?// 選擇HC573鎖存器
}
void Delay(unsigned int t)
{
? ? while(t--); ?// 簡單的延時函數
}
void working()
{
? ? SeletcHC573();
? ? L1 = 0; ?// 點亮L1
? ? Delay(60000); ?// 延時
? ? L1 = 1; ?// 熄滅L1
? ? Delay(60000); ?// 延時
}
void Init_INT0()
{
? ? IT0 = 1; ?// 設置INT0為下降沿觸發
? ? EX0 = 1; ?// 使能外部中斷0
? ? EA = 1; ? // 使能總中斷
}
unsigned char stat_int = 0; ?// 定義中斷標志變量
void ServiceINT0() interrupt 0?
{
? ? stat_int = 1; ?// 設置中斷標志變量
}
void LEDINT()
{
? ? if(stat_int == 1)
? ? {
? ? ? ? L8 = 0; ?// 點亮L8
? ? ? ? Delay(60000); ?// 延時
? ? ? ? Delay(60000);
? ? ? ? Delay(60000);
? ? ? ? Delay(60000);
? ? ? ? Delay(60000);
? ? ? ? Delay(60000);
? ? ? ? L8 = 1; ?// 熄滅L8
? ? }
? ? stat_int = 0; ?// 清除中斷標志變量
}
void main()
{
? ? Init_INT0(); ?// 初始化外部中斷0
? ? while(1)
? ? {
? ? ? ? working(); ?// 主循環中不斷調用working函數
? ? ? ? LEDINT(); ? // 檢查中斷標志變量并控制L8
? ? }
}
代碼解析
1. 直接在中斷服務函數中延時
-
SeletcHC573():選擇HC573鎖存器,確保P0口的輸出能夠控制LED。
-
Delay():一個簡單的延時函數,通過循環遞減來實現延時。
-
working():控制L1指示燈不斷閃爍。
-
Init_INT0():初始化外部中斷0,設置為下降沿觸發,并使能中斷。
-
ServiceINT0():中斷服務函數,當按下S5按鍵時,進入該函數,點亮L8并進行延時后熄滅。
2. 在中斷服務函數中設置標志變量,在主循環中延時
-
stat_int:定義一個全局變量作為中斷標志。
-
ServiceINT0():中斷服務函數,當按下S5按鍵時,設置
stat_int
為1。 -
LEDINT():在主循環中檢查
stat_int
,如果為1,則點亮L8并進行延時后熄滅,最后清除stat_int
。
總結
本文詳細介紹了如何在CT107D單片機綜合訓練平臺上使用外部中斷來控制LED燈的閃爍。我們通過兩種不同的方式實現了這一功能:一種是在中斷服務函數中直接進行延時,另一種是在中斷服務函數中設置標志變量,在主循環中進行延時。這兩種方式各有優缺點,第一種方式簡單直接,但可能會影響主循環的執行;第二種方式更加靈活,能夠更好地處理復雜的任務。