久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機外部中斷,按鍵無法循環 附程序 [打印本頁]

作者: 木示    時間: 2023-2-15 17:43
標題: 單片機外部中斷,按鍵無法循環 附程序
一開機時,可以從mode1至model4之間逐一切換led燈的效果,但之后就只能在mode1和mode4之間切換了,無法切換到mode2,mode3,不知道是什么原因?請各位大神,指教一下。如果把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;}  //??????,?????,????
  
   }
  }



作者: tyrl800    時間: 2023-2-15 20:34
if(flag<4)flag++; 改成if(flag<=4)flag++;
作者: 188610329    時間: 2023-2-15 21:06
問題不在中斷,在你的模式4,(雖然你的中斷問題也很大)

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;}  //??????,?????,????
  
   }
  }
有這個while(1) 在,你進入 led_mode4() 之后,就再也出不來了。 所以,進入模式4就已經沒有后來了。
你所謂的只能  模式1,模式4,應該是錯覺。

作者: coody_sz    時間: 2023-2-15 22:06
按鍵不要用中斷,因為喲抖動,按一下幾十次中斷就進去了。
建議用定時掃描。
作者: 木示    時間: 2023-2-15 22:26
188610329 發表于 2023-2-15 21:06
問題不在中斷,在你的模式4,(雖然你的中斷問題也很大)

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

感謝指點,請教一下中斷存在哪些問題?
作者: 188610329    時間: 2023-2-16 00:17
void main()
{
        IT0 = 1;//?????
        EX0 = 1;//??INT0??
        EA = 1;//?????  
你這里,IT0 = 1;  表示 P3.2 為下降沿中斷,即P3.2 從1變0時觸發中斷,從0變1是不會觸發的。

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才執行 里面的內容,為0 就直接跳出中斷了。
從 P3.2  從1變0  到進入中斷,最慢的51都只需要 2us 的時間,而這個時候,按鍵必須得放手,讓P3.2重新變回1才能執行if里面的代碼,這得多快的速度才能  切合這個邏輯的按動需要? 說難聽點,你的按鍵如果沒有機械抖動,你這中斷里面的程序壓根沒有機會執行。

作者: xianfajushi    時間: 2023-2-16 07:50
又是把中斷當作獨立按鍵使用的,根本就不知道中斷為何物!
作者: wys91203    時間: 2023-2-16 09:30
xianfajushi 發表于 2023-2-16 07:50
又是把中斷當作獨立按鍵使用的,根本就不知道中斷為何物!

這個程序里中斷只是改FLAG的數值,沒有執行程序,所以不存在中斷嵌套,所以MODE4模式也屬于主程序,不是中斷程序。MODE4子程序中PWM()程序里面沒有實參,FLASH1里的T沒有字義和賦值。先把這些規范了再說。另外IT0=1是下降沒有效,按鍵在未按時是1的話,按下后進中斷,可中斷掃行指令時條件是KEY==1,有矛盾。中斷只在下降沿進入,中斷程序不用條件,直接加數就行。
作者: wys91203    時間: 2023-2-16 09:37
也可以不用中斷,每個子程序里加個按鍵子程序。
作者: xldz    時間: 2023-2-17 18:04
按鍵中斷就是配置好以后,按下就會進入中斷服務函數,并不需要在中斷里面再去判斷按鍵狀態。中斷服務進來,首先設置一個標志位,鎖定。在主函數里面flag判斷完畢,就清掉中斷里面的標志,就是實現了鎖定和解鎖。完全不需要擔心抖動。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美精品一区二区在线观看 | 日韩电影一区 | 亚洲精品日韩在线 | 日韩三级在线观看 | 国产一区高清 | 亚洲伊人精品酒店 | 日韩欧美亚洲综合 | 日韩精品久久久久久 | 国产精品视频久久久 | 亚洲成人一区二区 | www.中文字幕.com | 在线视频日韩 | 就操在线 | 日韩av免费在线电影 | 久久99精品视频 | 日韩精品成人 | 国产精品国产三级国产a | 国产99精品| 最新中文字幕在线 | 夜久久| 亚洲欧美中文日韩在线v日本 | 亚洲精品久久久久久久久久久 | 久草在线 | 欧洲毛片 | 精品国产乱码久久久久久丨区2区 | 日韩一级在线 | 欧美日韩一区二区三区四区 | 精品福利在线 | 日韩不卡一区二区三区 | 欧美理论片在线 | 97超碰人人 | 瑟瑟视频在线看 | av黄色国产 | 亚洲二区在线 | 手机av在线| 日韩在线不卡 | 日韩毛片在线观看 | 四虎永久免费地址 | 欧美一区二区三区在线观看视频 | 亚洲午夜网 | 久草在线在线精品观看 |