大家好,我是電子設(shè)計小楊,上次,小編給大家寫了一個液晶顯示1602的程序,其實那個程序看起來雖然很長,但是本身是不難的,只要理解了數(shù)據(jù)手冊中的內(nèi)容,按照數(shù)據(jù)手冊上的時序圖還有要求照著寫下來,很快可以寫出來,不過那僅僅是一個靜態(tài)顯示而已,如果要寫一個動態(tài)顯示的,方法和數(shù)碼管的寫法基本相似,大家可以模仿寫數(shù)碼管動態(tài)顯示的方法去寫。
好了,廢話不多說,今天小編給大家講講如何來寫51單片機的中斷功能,51單片機中斷源有5個,分別是外部中斷0,外部中斷1,定時器0,定時器1,串行口中斷。 不管是大學(xué)里上課的書本,還是參考書也好,在單片機的書里面都是寫了一系列密密麻麻的知識點,最后就敲個代碼,然后很多初學(xué)者從頭學(xué)到尾,好像知道怎么寫,但是又不會寫。進來看這篇文章的同伴們,不管您會也好,不會也罷,小編把我當(dāng)時怎么學(xué)中斷的經(jīng)驗分享給大家,好讓更多的同伴們早日脫離書本,開啟自寫編程時代。!
好了,我們進入正題,到底什么是中斷??中斷這個過程我們程序員需要去做什么??我們帶著這兩個問題來查找我們當(dāng)時為什么不會中斷的原因。首先:
1、你想使用的中斷是哪個?選擇相應(yīng)的序號; 2、你所希望觸發(fā)的條件是什么? 3、你希望在中斷之后干什么?
中斷是什么?說白一點就是,比如你正在家里看電視,然后準(zhǔn)備用電磁爐煮水來喝茶。水還沒有開的時候當(dāng)然你還在看電視對不對,等到水開了,當(dāng)然一般水開了都會有個信號讓你知道,那么你就要想著要關(guān)掉電磁爐。這個關(guān)掉電磁爐的動作就是所謂的中斷。而關(guān)掉電磁爐之后你進而就要喝茶,然后在看電視或者做其它事情,那么中斷以后的這個過程就是我們上面問題的第三點:你希望在中斷之后干什么?
好了,大家也大概明白了什么是中斷了吧?我們不要像書本寫的內(nèi)容那么復(fù)雜,我們來說,怎么樣來讓51單片機執(zhí)行中斷,然后,有需要的我們再去查書本。 那么,我們?nèi)绾蝸韺懸粋51單片機的中斷呢??
首先,我們在主函數(shù)中要有以下代碼: 以外部中斷0為例子: void main() { EA=1; //打開中斷總開關(guān),等于1表示打開,等于0表示關(guān)閉 EX0=1; //打開外部中斷0,如果是外部中斷1則為EX1=1; IT0=0; //選擇觸發(fā)方式,0是表示電平觸發(fā),1表示下降沿觸發(fā) //如果是外部中斷1則為IT1=? } 接著寫中斷服務(wù)函數(shù) void interrupt_0()interrupt 0 //這后面的中斷序號千萬別寫錯 { ........................ } 大概就是以上的兩個步驟! 接下來我們來看一個程序代碼:感受一下中斷的魅力!
#include<reg51.h>
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit led=P1^0; //
void Delay(uint del) //10毫秒帶參量延時函數(shù)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++);
}
void interrupt_0()interrupt 0 //外部中斷0的序號是0
{
led=~led; //將led的狀態(tài)取反
delay(10); //延時10X10=100ms
}
//現(xiàn)在你試試,按一下P3^2的按鍵,看看led有沒有閃一下,注意噢,這是用外部中斷來實現(xiàn)led燈亮滅的噢,雖然也是用按鍵,但是開頭我沒有對任何一個按鍵KEY進行定義噢。
void main()
{
EA=1; //打開總中斷
EX0=1; //打開外部中斷0
IT0=0; //讓外部中斷0用電平觸發(fā)方式
while(1); //讓程序就停在這兒
}
好了,我們這一講就到此結(jié)束吧,你們可以把我的程序拷貝回去改一改變成自己想要的中斷操作模式,要是有不懂的地方多翻翻書本,如果還不理解的話可以加小編的微信提問。
|