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