找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 62778|回復(fù): 20
打印 上一主題 下一主題
收起左側(cè)

使用51單片機的中斷功能。ń^對很簡單的教程)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102668 發(fā)表于 2016-1-11 01:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我是電子設(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é)束吧,你們可以把我的程序拷貝回去改一改變成自己想要的中斷操作模式,要是有不懂的地方多翻翻書本,如果還不理解的話可以加小編的微信提問。



評分

參與人數(shù) 1黑幣 +8 收起 理由
keneng + 8 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂5 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:130231 發(fā)表于 2017-10-17 19:11 | 只看該作者
delay(10);    跟這  void Delay(uint del)     “delay”與“Delay”要相同才對。注意大小寫。
回復(fù)

使用道具 舉報

板凳
ID:317676 發(fā)表于 2018-4-27 11:48 來自觸屏版 | 只看該作者
樓主想問一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時器的初值或是工作方式啥的
回復(fù)

使用道具 舉報

地板
ID:318909 發(fā)表于 2018-4-29 19:13 | 只看該作者
如果共陰控制一列小燈,需求是按下按鍵進入中斷服務(wù)函數(shù)以后所有燈都亮,再次按下恢復(fù)原狀,那應(yīng)該怎么處理中斷函數(shù)呢
回復(fù)

使用道具 舉報

5#
ID:302241 發(fā)表于 2018-7-2 21:27 | 只看該作者
學(xué)習(xí)一個
回復(fù)

使用道具 舉報

6#
ID:363696 發(fā)表于 2018-7-8 20:15 | 只看該作者
simple799 發(fā)表于 2018-4-27 11:48
樓主想問一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時器的初值或是工作方式啥的

要設(shè)置的,因為串口中斷需要定時器來產(chǎn)生一個時鐘,來產(chǎn)生波特率
回復(fù)

使用道具 舉報

7#
ID:374198 發(fā)表于 2018-7-19 09:40 | 只看該作者
為啥一定要是P3^2
回復(fù)

使用道具 舉報

8#
ID:374198 發(fā)表于 2018-7-19 09:42 | 只看該作者
不是要滿足一個條件才能進入中斷的嗎,為什么樓主歷程中沒有給出就可以》?
回復(fù)

使用道具 舉報

9#
ID:376237 發(fā)表于 2018-8-24 08:23 | 只看該作者
中斷服務(wù)函數(shù)要放在主函數(shù)后面,在前面是大忌
回復(fù)

使用道具 舉報

10#
ID:93625 發(fā)表于 2018-8-24 09:40 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報

11#
ID:387733 發(fā)表于 2018-8-25 07:31 | 只看該作者

因為P3^2是外部中斷0的輸入腳,只有這個引腳變化才能產(chǎn)生外部中斷0
回復(fù)

使用道具 舉報

12#
ID:387733 發(fā)表于 2018-8-25 07:38 | 只看該作者
七九六 發(fā)表于 2018-7-19 09:42
不是要滿足一個條件才能進入中斷的嗎,為什么樓主歷程中沒有給出就可以》?

外部中斷進入中斷需要滿足的條件,就是相應(yīng)的外部中斷引腳電平發(fā)生變化,在這里使用的是外部中斷0,相對應(yīng)的引腳是P3.2,當(dāng)連接在這個引腳的按鍵被按下時,引腳電平發(fā)生變化,因而觸發(fā)進入中斷服務(wù)程序
回復(fù)

使用道具 舉報

13#
ID:387733 發(fā)表于 2018-8-25 07:41 | 只看該作者
jiror 發(fā)表于 2018-4-29 19:13
如果共陰控制一列小燈,需求是按下按鍵進入中斷服務(wù)函數(shù)以后所有燈都亮,再次按下恢復(fù)原狀,那應(yīng)該怎么處理 ...

可以設(shè)置一個亮燈標(biāo)志,在按下按鍵進入中斷服務(wù)程序后,反轉(zhuǎn)標(biāo)志,再根據(jù)標(biāo)志亮燈或者熄燈。
回復(fù)

使用道具 舉報

14#
ID:56002 發(fā)表于 2018-8-25 10:30 | 只看該作者
樓主,我做了一個51單片機電子時鐘,里面加入了音樂,每當(dāng)鬧鐘響起時單片機開時唱歌,但顯示屏上的時鐘就停止了,鬧鐘結(jié)束時鐘又開始正常走時,請問有什么辦法解決邊放音樂和時鐘顯示正常,謝謝!
回復(fù)

使用道具 舉報

15#
ID:318629 發(fā)表于 2018-9-10 23:26 | 只看該作者
oplink 發(fā)表于 2018-8-25 10:30
樓主,我做了一個51單片機電子時鐘,里面加入了音樂,每當(dāng)鬧鐘響起時單片機開時唱歌,但顯示屏上的時鐘就停 ...

我也做過類似的,播放音樂的同時1602進行動態(tài)顯示,可我用的是while里加了一個for循環(huán)就可以了,不知你是用什么方法解決的。
回復(fù)

使用道具 舉報

16#
ID:406748 發(fā)表于 2019-12-31 15:23 | 只看該作者
主函數(shù)和中斷函數(shù)中寫的有TH0=....和TL0=....這是什么意思誒
回復(fù)

使用道具 舉報

17#
ID:406748 發(fā)表于 2019-12-31 15:27 | 只看該作者
1650599047 發(fā)表于 2018-9-10 23:26
我也做過類似的,播放音樂的同時1602進行動態(tài)顯示,可我用的是while里加了一個for循環(huán)就可以了,不知你是 ...

中斷函數(shù)和主函數(shù)不是運行的時候不是只能有其中一個正在運行嗎
回復(fù)

使用道具 舉報

18#
ID:688460 發(fā)表于 2020-7-3 06:41 | 只看該作者
好好學(xué)習(xí),天天向上!
回復(fù)

使用道具 舉報

19#
ID:953405 發(fā)表于 2021-7-15 13:34 來自觸屏版 | 只看該作者
樓主 能不能寫個單片機語言給我 P1.0按下執(zhí)行p2.0輸出半個小時關(guān)掉 P1.2按下執(zhí)行p2.1輸出1個小時關(guān)掉    p1.3按下執(zhí)行P2.2輸出 P1.4按下關(guān)掉所有程序 輸出為高電平
回復(fù)

使用道具 舉報

20#
ID:953405 發(fā)表于 2021-7-15 13:35 來自觸屏版 | 只看該作者
樓主 能不能寫個單片機語言給我 P1.0按下執(zhí)行p2.0輸出半個小時關(guān)掉 P1.2按下執(zhí)行p2.1輸出1個小時關(guān)掉    p1.3按下執(zhí)行P2.2輸出 P1.4按下關(guān)掉所有程序 輸出為高電平
回復(fù)

使用道具 舉報

21#
ID:950257 發(fā)表于 2021-7-16 11:25 來自觸屏版 | 只看該作者
simple799 發(fā)表于 2018-4-27 11:48
樓主想問一下,如果我只是想用串口中斷,是不是就不用設(shè)置定時器的初值或是工作方式啥的

需要設(shè)置波特率
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表