標(biāo)題: 51單片機中INT0中斷程序請教大家 [打印本頁]

作者: 秋風(fēng)涼    時間: 2020-1-9 21:05
標(biāo)題: 51單片機中INT0中斷程序請教大家
之前的一個按鍵控制兩個狀態(tài)。 我想把按鍵中斷最優(yōu)先。
程序移植到中斷后,不能運行。但是中斷還是有的。
這兩天學(xué)習(xí)中斷,請大家給些指點。

#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit key=P3^2;               
sbit LED1=P3^0;                        
sbit LED2=P3^1;                        
                                
bit key_flag = 0;//按鍵有效標(biāo)志位變量
uchar count = 0;//中斷計數(shù)變量

void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=1150;j>0;j--);//1T單片機
}

void Int0Init()
{
        TMOD= 0x01;                //設(shè)置定時器模式
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        TR0 = 0;                        //定時器0關(guān)閉
        ET0 = 1;                        //開定時器0中斷
            IT0 = 1;        //設(shè)置外部中斷的觸發(fā)方式為下降沿觸發(fā)。
             EX0 = 1;        //開啟外部中斷0
             EA = 1;                //中斷總開關(guān)
}

void main()
{        
        Int0Init();              
        while(1);
}

void Int0() interrupt 0
{
  if(key == 0)//判斷鍵按下
                {
                        delayms(10);//延時10ms防抖
                        if(key == 0)//確認(rèn)鍵按下
                        {
                                key_flag = 1; //有效標(biāo)志位置1
                                TR0 = 1;                        //開定時器
                                while(!key);        //等待松手
                                TR0 = 0;                        //關(guān)定時器
                        }
                }
                if(key_flag)                        //判斷按鍵有效
                {
                        if(count>=100)        //超過1秒算長按
                        {
                                LED1=~LED1;        //LED1取反
                        }
                        else                                //小于1秒算短按
                        {
                                LED2=~LED2;        //LED2取反
                        }
                }
                count=0;                                //中斷計數(shù)變量清0
                key_flag = 0;                //按鍵有效標(biāo)志位清0
   
                              LED2=~LED2;          //測試中斷反應(yīng)
   }



//定時器0 中斷服務(wù)函數(shù)
void Timer0Interrupt(void) interrupt 1
{
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        if(count<250)        //防止溢出
                count++;                //中斷計數(shù)變量自+1
}
作者: 秋風(fēng)涼    時間: 2020-1-9 21:18
#include <STC15Wxx.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit key        =P1^7;               
sbit LED1=P3^0;                        
sbit LED2=P3^1;                        
                                
bit key_flag = 0;//按鍵有效標(biāo)志位變量
uchar count = 0;//中斷計數(shù)變量
/*
void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);//12T單片機
}*/
void delayms(uint xms) //添加延時
{
        uint i, j;
        for(i=xms;i>0;i--)
                for(j=1150;j>0;j--);//1T單片機
}

void main()
{        
        //初始化定時器0
        TMOD= 0x01;                //設(shè)置定時器模式
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        TR0 = 0;                        //定時器0關(guān)閉
        ET0 = 1;                        //開定時器0中斷
        EA  = 1;                        //開總中斷
        while(1)
        {
                if(key == 0)//判斷鍵按下
                {
                        delayms(10);//延時10ms防抖
                        if(key == 0)//確認(rèn)鍵按下
                        {
                                key_flag = 1; //有效標(biāo)志位置1
                                TR0 = 1;                        //開定時器
                                while(!key);        //等待松手
                                TR0 = 0;                        //關(guān)定時器
                        }
                }
                if(key_flag)                        //判斷按鍵有效
                {
                        if(count>=100)        //超過1秒算長按
                        {
                                LED1=~LED1;        //LED1取反
                        }
                        else                                //小于1秒算短按
                        {
                                LED2=~LED2;        //LED2取反
                        }
                }
                count=0;                                //中斷計數(shù)變量清0
                key_flag = 0;                //按鍵有效標(biāo)志位清0
        }
}
//定時器0 中斷服務(wù)函數(shù)
void Timer0Interrupt(void) interrupt 1
{
        TH0 = 0xDC;                //10毫秒@11.0592MHz
        TL0 = 0x00;                //10毫秒@11.0592MHz
        if(count<250)        //防止溢出
                count++;                //中斷計數(shù)變量自+1
}

這個是高手寫的原程序
作者: 秋風(fēng)涼    時間: 2020-1-9 21:24
這個主要是模糊在   1要計時  2要判斷     網(wǎng)上的教程大都是直接執(zhí)行一個指令
作者: hantu    時間: 2020-1-10 01:11
第二份代碼,那是在主循環(huán)中用輪詢的方法來檢測按鍵。

你的代碼是想在外部中斷中判斷按鍵,這種通常是使用接在MCU的INT0和INT1引腳上的按鍵才行,只要按下相應(yīng)的鍵,就會產(chǎn)生外部中斷,所以在中斷服務(wù)程序中不用象輪詢那樣兩次判斷if(key==0),因為只要進(jìn)中斷,就說明已經(jīng)是按鍵被按下、產(chǎn)生外部中斷了,只需保留確認(rèn)按下的那個if就行了。而且中斷服務(wù)最好要盡快執(zhí)行完了馬上中斷返回,不要用while去等待按鍵放開,這是中斷法不一樣的地方。
作者: 笨笨兔    時間: 2020-1-10 09:34
1要計時  2要判斷
------
這個首先是你模糊了: 你程序里面有中斷嵌套, 程序必死無疑!
作者: Y_G_G    時間: 2020-1-10 11:02
P3.2為外部中斷INT0,優(yōu)先等級默認(rèn)為最高等級,只要你不去設(shè)定中斷的優(yōu)先等級,你這按鍵就是最高等級:按鍵默認(rèn)為最優(yōu)先等級.
作者: 秋風(fēng)涼    時間: 2020-1-10 15:09
hantu 發(fā)表于 2020-1-10 01:11
第二份代碼,那是在主循環(huán)中用輪詢的方法來檢測按鍵。

你的代碼是想在外部中斷中判斷按鍵,這種通常是使 ...

怎么計時呢
作者: 笨笨兔    時間: 2020-1-13 10:26
秋風(fēng)涼 發(fā)表于 2020-1-10 15:09
怎么計時呢

按鍵這么慢的設(shè)備,你為什么一定要 把按鍵中斷最優(yōu)先 呢?
  你的程序,想計時,只能軟延時計時,或者查詢定時器標(biāo)志計時,總之,就是什么也不干,只是等待;一般產(chǎn)品不會這么做的.




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