標(biāo)題: 使用51單片機(jī)的中斷功能。ń^對(duì)很簡(jiǎn)單的教程) [打印本頁(yè)]

作者: 51hei社區(qū)    時(shí)間: 2016-1-11 01:54
標(biāo)題: 使用51單片機(jī)的中斷功能。ń^對(duì)很簡(jiǎn)單的教程)
大家好,我是電子設(shè)計(jì)小楊,上次,小編給大家寫(xiě)了一個(gè)液晶顯示1602的程序,其實(shí)那個(gè)程序看起來(lái)雖然很長(zhǎng),但是本身是不難的,只要理解了數(shù)據(jù)手冊(cè)中的內(nèi)容,按照數(shù)據(jù)手冊(cè)上的時(shí)序圖還有要求照著寫(xiě)下來(lái),很快可以寫(xiě)出來(lái),不過(guò)那僅僅是一個(gè)靜態(tài)顯示而已,如果要寫(xiě)一個(gè)動(dòng)態(tài)顯示的,方法和數(shù)碼管的寫(xiě)法基本相似,大家可以模仿寫(xiě)數(shù)碼管動(dòng)態(tài)顯示的方法去寫(xiě)。

好了,廢話(huà)不多說(shuō),今天小編給大家講講如何來(lái)寫(xiě)51單片機(jī)的中斷功能,51單片機(jī)中斷源有5個(gè),分別是外部中斷0,外部中斷1,定時(shí)器0,定時(shí)器1,串行口中斷。
   不管是大學(xué)里上課的書(shū)本,還是參考書(shū)也好,在單片機(jī)的書(shū)里面都是寫(xiě)了一系列密密麻麻的知識(shí)點(diǎn),最后就敲個(gè)代碼,然后很多初學(xué)者從頭學(xué)到尾,好像知道怎么寫(xiě),但是又不會(huì)寫(xiě)。進(jìn)來(lái)看這篇文章的同伴們,不管您會(huì)也好,不會(huì)也罷,小編把我當(dāng)時(shí)怎么學(xué)中斷的經(jīng)驗(yàn)分享給大家,好讓更多的同伴們?cè)缛彰撾x書(shū)本,開(kāi)啟自寫(xiě)編程時(shí)代!。


好了,我們進(jìn)入正題,到底什么是中斷??中斷這個(gè)過(guò)程我們程序員需要去做什么??我們帶著這兩個(gè)問(wèn)題來(lái)查找我們當(dāng)時(shí)為什么不會(huì)中斷的原因。首先:

1、你想使用的中斷是哪個(gè)?選擇相應(yīng)的序號(hào);
2、你所希望觸發(fā)的條件是什么?
3、你希望在中斷之后干什么?

中斷是什么?說(shuō)白一點(diǎn)就是,比如你正在家里看電視,然后準(zhǔn)備用電磁爐煮水來(lái)喝茶。水還沒(méi)有開(kāi)的時(shí)候當(dāng)然你還在看電視對(duì)不對(duì),等到水開(kāi)了,當(dāng)然一般水開(kāi)了都會(huì)有個(gè)信號(hào)讓你知道,那么你就要想著要關(guān)掉電磁爐。這個(gè)關(guān)掉電磁爐的動(dòng)作就是所謂的中斷。而關(guān)掉電磁爐之后你進(jìn)而就要喝茶,然后在看電視或者做其它事情,那么中斷以后的這個(gè)過(guò)程就是我們上面問(wèn)題的第三點(diǎn):你希望在中斷之后干什么?
好了,大家也大概明白了什么是中斷了吧?我們不要像書(shū)本寫(xiě)的內(nèi)容那么復(fù)雜,我們來(lái)說(shuō),怎么樣來(lái)讓51單片機(jī)執(zhí)行中斷,然后,有需要的我們?cè)偃ゲ闀?shū)本。
那么,我們?nèi)绾蝸?lái)寫(xiě)一個(gè)51單片機(jī)的中斷呢??
首先,我們?cè)谥骱瘮?shù)中要有以下代碼:
以外部中斷0為例子:
void main()
{
  EA=1;      //打開(kāi)中斷總開(kāi)關(guān),等于1表示打開(kāi),等于0表示關(guān)閉
  EX0=1;    //打開(kāi)外部中斷0,如果是外部中斷1則為EX1=1;
  IT0=0;    //選擇觸發(fā)方式,0是表示電平觸發(fā),1表示下降沿觸發(fā)
  //如果是外部中斷1則為IT1=?
}
接著寫(xiě)中斷服務(wù)函數(shù)
void interrupt_0()interrupt 0   //這后面的中斷序號(hào)千萬(wàn)別寫(xiě)錯(cuò)
{
      ........................
}
大概就是以上的兩個(gè)步驟!
接下來(lái)我們來(lái)看一個(gè)程序代碼:感受一下中斷的魅力!

#include<reg51.h>
#define uchar unsigned char    //宏定義
#define uint unsigned int   
sbit led=P1^0;                         //
void Delay(uint del)    //10毫秒帶參量延時(shí)函數(shù)   
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++);
}

void interrupt_0()interrupt 0   //外部中斷0的序號(hào)是0
{
  led=~led;                 //將led的狀態(tài)取反                 
  delay(10);                //延時(shí)10X10=100ms
}
//現(xiàn)在你試試,按一下P3^2的按鍵,看看led有沒(méi)有閃一下,注意噢,這是用外部中斷來(lái)實(shí)現(xiàn)led燈亮滅的噢,雖然也是用按鍵,但是開(kāi)頭我沒(méi)有對(duì)任何一個(gè)按鍵KEY進(jìn)行定義噢。
void main()
{
  EA=1;                   //打開(kāi)總中斷
  EX0=1;                 //打開(kāi)外部中斷0
  IT0=0;                  //讓外部中斷0用電平觸發(fā)方式
while(1);               //讓程序就停在這兒
}

好了,我們這一講就到此結(jié)束吧,你們可以把我的程序拷貝回去改一改變成自己想要的中斷操作模式,要是有不懂的地方多翻翻書(shū)本,如果還不理解的話(huà)可以加小編的微信提問(wèn)。




作者: zqy181818    時(shí)間: 2017-10-17 19:11
delay(10);    跟這  void Delay(uint del)     “delay”與“Delay”要相同才對(duì)。注意大小寫(xiě)。
作者: simple799    時(shí)間: 2018-4-27 11:48
樓主想問(wèn)一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時(shí)器的初值或是工作方式啥的
作者: jiror    時(shí)間: 2018-4-29 19:13
如果共陰控制一列小燈,需求是按下按鍵進(jìn)入中斷服務(wù)函數(shù)以后所有燈都亮,再次按下恢復(fù)原狀,那應(yīng)該怎么處理中斷函數(shù)呢
作者: 歐陽(yáng)威    時(shí)間: 2018-7-2 21:27
學(xué)習(xí)一個(gè)
作者: dsf232    時(shí)間: 2018-7-8 20:15
simple799 發(fā)表于 2018-4-27 11:48
樓主想問(wèn)一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時(shí)器的初值或是工作方式啥的

要設(shè)置的,因?yàn)榇谥袛嘈枰〞r(shí)器來(lái)產(chǎn)生一個(gè)時(shí)鐘,來(lái)產(chǎn)生波特率
作者: 七九六    時(shí)間: 2018-7-19 09:40
為啥一定要是P3^2
作者: 七九六    時(shí)間: 2018-7-19 09:42
不是要滿(mǎn)足一個(gè)條件才能進(jìn)入中斷的嗎,為什么樓主歷程中沒(méi)有給出就可以》?
作者: ahandsomeboy    時(shí)間: 2018-8-24 08:23
中斷服務(wù)函數(shù)要放在主函數(shù)后面,在前面是大忌
作者: keneng    時(shí)間: 2018-8-24 09:40
學(xué)習(xí)一下
作者: sxhwdz    時(shí)間: 2018-8-25 07:31
七九六 發(fā)表于 2018-7-19 09:40
為啥一定要是P3^2

因?yàn)镻3^2是外部中斷0的輸入腳,只有這個(gè)引腳變化才能產(chǎn)生外部中斷0
作者: sxhwdz    時(shí)間: 2018-8-25 07:38
七九六 發(fā)表于 2018-7-19 09:42
不是要滿(mǎn)足一個(gè)條件才能進(jìn)入中斷的嗎,為什么樓主歷程中沒(méi)有給出就可以》?

外部中斷進(jìn)入中斷需要滿(mǎn)足的條件,就是相應(yīng)的外部中斷引腳電平發(fā)生變化,在這里使用的是外部中斷0,相對(duì)應(yīng)的引腳是P3.2,當(dāng)連接在這個(gè)引腳的按鍵被按下時(shí),引腳電平發(fā)生變化,因而觸發(fā)進(jìn)入中斷服務(wù)程序
作者: sxhwdz    時(shí)間: 2018-8-25 07:41
jiror 發(fā)表于 2018-4-29 19:13
如果共陰控制一列小燈,需求是按下按鍵進(jìn)入中斷服務(wù)函數(shù)以后所有燈都亮,再次按下恢復(fù)原狀,那應(yīng)該怎么處理 ...

可以設(shè)置一個(gè)亮燈標(biāo)志,在按下按鍵進(jìn)入中斷服務(wù)程序后,反轉(zhuǎn)標(biāo)志,再根據(jù)標(biāo)志亮燈或者熄燈。
作者: oplink    時(shí)間: 2018-8-25 10:30
樓主,我做了一個(gè)51單片機(jī)電子時(shí)鐘,里面加入了音樂(lè),每當(dāng)鬧鐘響起時(shí)單片機(jī)開(kāi)時(shí)唱歌,但顯示屏上的時(shí)鐘就停止了,鬧鐘結(jié)束時(shí)鐘又開(kāi)始正常走時(shí),請(qǐng)問(wèn)有什么辦法解決邊放音樂(lè)和時(shí)鐘顯示正常,謝謝!
作者: 1650599047    時(shí)間: 2018-9-10 23:26
oplink 發(fā)表于 2018-8-25 10:30
樓主,我做了一個(gè)51單片機(jī)電子時(shí)鐘,里面加入了音樂(lè),每當(dāng)鬧鐘響起時(shí)單片機(jī)開(kāi)時(shí)唱歌,但顯示屏上的時(shí)鐘就停 ...

我也做過(guò)類(lèi)似的,播放音樂(lè)的同時(shí)1602進(jìn)行動(dòng)態(tài)顯示,可我用的是while里加了一個(gè)for循環(huán)就可以了,不知你是用什么方法解決的。

作者: XMJ.    時(shí)間: 2019-12-31 15:23
主函數(shù)和中斷函數(shù)中寫(xiě)的有TH0=....和TL0=....這是什么意思誒
作者: XMJ.    時(shí)間: 2019-12-31 15:27
1650599047 發(fā)表于 2018-9-10 23:26
我也做過(guò)類(lèi)似的,播放音樂(lè)的同時(shí)1602進(jìn)行動(dòng)態(tài)顯示,可我用的是while里加了一個(gè)for循環(huán)就可以了,不知你是 ...

中斷函數(shù)和主函數(shù)不是運(yùn)行的時(shí)候不是只能有其中一個(gè)正在運(yùn)行嗎
作者: yyzf998    時(shí)間: 2020-7-3 06:41
好好學(xué)習(xí),天天向上!
作者: 15260509552    時(shí)間: 2021-7-15 13:34
樓主 能不能寫(xiě)個(gè)單片機(jī)語(yǔ)言給我 P1.0按下執(zhí)行p2.0輸出半個(gè)小時(shí)關(guān)掉 P1.2按下執(zhí)行p2.1輸出1個(gè)小時(shí)關(guān)掉    p1.3按下執(zhí)行P2.2輸出 P1.4按下關(guān)掉所有程序 輸出為高電平
作者: 15260509552    時(shí)間: 2021-7-15 13:35
樓主 能不能寫(xiě)個(gè)單片機(jī)語(yǔ)言給我 P1.0按下執(zhí)行p2.0輸出半個(gè)小時(shí)關(guān)掉 P1.2按下執(zhí)行p2.1輸出1個(gè)小時(shí)關(guān)掉    p1.3按下執(zhí)行P2.2輸出 P1.4按下關(guān)掉所有程序 輸出為高電平
作者: gain    時(shí)間: 2021-7-16 11:25
simple799 發(fā)表于 2018-4-27 11:48
樓主想問(wèn)一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時(shí)器的初值或是工作方式啥的

需要設(shè)置波特率




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1