找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)外部中斷,按鍵無(wú)法循環(huán) 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:706724 發(fā)表于 2023-2-15 17:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一開(kāi)機(jī)時(shí),可以從mode1至model4之間逐一切換led燈的效果,但之后就只能在mode1和mode4之間切換了,無(wú)法切換到mode2,mode3,不知道是什么原因?請(qǐng)各位大神,指教一下。如果把mode4程序去掉,則可以在mode1,mode2,mode3之間隨意切換。

#include <reg52.h>
#include <intrins.h>                       
#define N 2 //?????
#define T 800 //PWM???

char flag=1;
sbit KEY=P3^2;
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;




void led_mode1();
void led_mode2();
void led_mode3();
void led_mode4();


void pwm();
void flash1();

void main()
{
        IT0 = 1;//?????
        EX0 = 1;//??INT0??
        EA = 1;//?????  
        while(1)
        {                        


                switch(flag)
                {
                                case 1:led_mode1();break;
                                case 2:led_mode2();break;
                                case 3:led_mode3();break;
                                                                                      case 4:led_mode4();break;
                }
                                                        
                                                        }
}




void int0_process() interrupt 0
{

        if (KEY==1)  //key=0,»á×Ô¶ˉÇD»»
    {  
               
       if(flag<4)flag++;
       else flag=1;
        
    }        
}


void led_mode1()
{
        led1=0;
        led2=0;
        led3=1;
        led4=1;
}
void led_mode2()
{
        led1=1;
        led2=1;
        led3=0;
        led4=0;
}
void led_mode3()
{
        led1=0;
        led2=0;
        led3=0;
        led4=0;
}
void led_mode4()
{
          led3=1;
          led4=1;
          pwm();                                                      
   flash1();                                             
}
        




void pwm(int x)
{
  while(x--);
}


void flash1(void)
         {
     int t = 0;
     char f = 0;
     int count = 5;  //5?,?????????
     while(1)
                          {
         led1=0;
                                 led2=0;
         pwm(t);         //Toff,????
                        //led0=1;
         led1=1;
                                 led2=1;
         pwm(T-t+100);   //Ton,????
        if(!f) t+=N+1;  //?????,????
        else t-=N;      //?????
        if(t>T) {f=1;t=T;}   //??????,?????,????
        if(t<0) {f=0;t=0;}  //??????,?????,????
  
   }
  }


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

使用道具 舉報(bào)

沙發(fā)
ID:275826 發(fā)表于 2023-2-15 20:34 | 只看該作者
if(flag<4)flag++; 改成if(flag<=4)flag++;
回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2023-2-15 21:06 | 只看該作者
問(wèn)題不在中斷,在你的模式4,(雖然你的中斷問(wèn)題也很大)

void flash1(void)
         {
     int t = 0;
     char f = 0;
     int count = 5;  //5?,?????????
     while(1)
                          {
         led1=0;
                                 led2=0;
         pwm(t);         //Toff,????
                        //led0=1;
         led1=1;
                                 led2=1;
         pwm(T-t+100);   //Ton,????
        if(!f) t+=N+1;  //?????,????
        else t-=N;      //?????
        if(t>T) {f=1;t=T;}   //??????,?????,????
        if(t<0) {f=0;t=0;}  //??????,?????,????
  
   }
  }
有這個(gè)while(1) 在,你進(jìn)入 led_mode4() 之后,就再也出不來(lái)了。 所以,進(jìn)入模式4就已經(jīng)沒(méi)有后來(lái)了。
你所謂的只能  模式1,模式4,應(yīng)該是錯(cuò)覺(jué)。
回復(fù)

使用道具 舉報(bào)

地板
ID:1034262 發(fā)表于 2023-2-15 22:06 | 只看該作者
按鍵不要用中斷,因?yàn)閱讯秳?dòng),按一下幾十次中斷就進(jìn)去了。
建議用定時(shí)掃描。
回復(fù)

使用道具 舉報(bào)

5#
ID:706724 發(fā)表于 2023-2-15 22:26 | 只看該作者
188610329 發(fā)表于 2023-2-15 21:06
問(wèn)題不在中斷,在你的模式4,(雖然你的中斷問(wèn)題也很大)

void flash1(void)
問(wèn)題不在中斷,在你的模式4,(雖然你的中斷問(wèn)題也很大)

感謝指點(diǎn),請(qǐng)教一下中斷存在哪些問(wèn)題?
回復(fù)

使用道具 舉報(bào)

6#
ID:624769 發(fā)表于 2023-2-16 00:17 | 只看該作者
void main()
{
        IT0 = 1;//?????
        EX0 = 1;//??INT0??
        EA = 1;//?????  
你這里,IT0 = 1;  表示 P3.2 為下降沿中斷,即P3.2 從1變0時(shí)觸發(fā)中斷,從0變1是不會(huì)觸發(fā)的。

void int0_process() interrupt 0
{

        if (KEY==1)  //key=0,»á×Ô¶ˉÇD»»
    {  
               
       if(flag<4)flag++;
       else flag=1;
        
    }        
}

你這里 if(KEY==1)  判斷  P3.2 是否為 1, 為1才執(zhí)行 里面的內(nèi)容,為0 就直接跳出中斷了。
從 P3.2  從1變0  到進(jìn)入中斷,最慢的51都只需要 2us 的時(shí)間,而這個(gè)時(shí)候,按鍵必須得放手,讓P3.2重新變回1才能執(zhí)行if里面的代碼,這得多快的速度才能  切合這個(gè)邏輯的按動(dòng)需要? 說(shuō)難聽(tīng)點(diǎn),你的按鍵如果沒(méi)有機(jī)械抖動(dòng),你這中斷里面的程序壓根沒(méi)有機(jī)會(huì)執(zhí)行。
回復(fù)

使用道具 舉報(bào)

7#
ID:332444 發(fā)表于 2023-2-16 07:50 | 只看該作者
又是把中斷當(dāng)作獨(dú)立按鍵使用的,根本就不知道中斷為何物!
回復(fù)

使用道具 舉報(bào)

8#
ID:116103 發(fā)表于 2023-2-16 09:30 | 只看該作者
xianfajushi 發(fā)表于 2023-2-16 07:50
又是把中斷當(dāng)作獨(dú)立按鍵使用的,根本就不知道中斷為何物!

這個(gè)程序里中斷只是改FLAG的數(shù)值,沒(méi)有執(zhí)行程序,所以不存在中斷嵌套,所以MODE4模式也屬于主程序,不是中斷程序。MODE4子程序中PWM()程序里面沒(méi)有實(shí)參,F(xiàn)LASH1里的T沒(méi)有字義和賦值。先把這些規(guī)范了再說(shuō)。另外IT0=1是下降沒(méi)有效,按鍵在未按時(shí)是1的話(huà),按下后進(jìn)中斷,可中斷掃行指令時(shí)條件是KEY==1,有矛盾。中斷只在下降沿進(jìn)入,中斷程序不用條件,直接加數(shù)就行。
回復(fù)

使用道具 舉報(bào)

9#
ID:116103 發(fā)表于 2023-2-16 09:37 | 只看該作者
也可以不用中斷,每個(gè)子程序里加個(gè)按鍵子程序。
回復(fù)

使用道具 舉報(bào)

10#
ID:584980 發(fā)表于 2023-2-17 18:04 | 只看該作者
按鍵中斷就是配置好以后,按下就會(huì)進(jìn)入中斷服務(wù)函數(shù),并不需要在中斷里面再去判斷按鍵狀態(tài)。中斷服務(wù)進(jìn)來(lái),首先設(shè)置一個(gè)標(biāo)志位,鎖定。在主函數(shù)里面flag判斷完畢,就清掉中斷里面的標(biāo)志,就是實(shí)現(xiàn)了鎖定和解鎖。完全不需要擔(dān)心抖動(dòng)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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