找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1051|回复: 9
收起左侧

单片机外部中断,按键无法循环 附程序

[复制链接]
ID:706724 发表于 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;}  //??????,?????,????
  
   }
  }


回复

使用道具 举报

ID:275826 发表于 2023-2-15 20:34 | 显示全部楼层
if(flag<4)flag++; 改成if(flag<=4)flag++;
回复

使用道具 举报

ID:624769 发表于 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,应该是错觉。
回复

使用道具 举报

ID:1034262 发表于 2023-2-15 22:06 | 显示全部楼层
按键不要用中断,因为哟抖动,按一下几十次中断就进去了。
建议用定时扫描。
回复

使用道具 举报

ID:706724 发表于 2023-2-15 22:26 | 显示全部楼层
188610329 发表于 2023-2-15 21:06
问题不在中断,在你的模式4,(虽然你的中断问题也很大)

void flash1(void)
问题不在中断,在你的模式4,(虽然你的中断问题也很大)

感谢指点,请教一下中断存在哪些问题?
回复

使用道具 举报

ID:624769 发表于 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里面的代码,这得多快的速度才能  切合这个逻辑的按动需要? 说难听点,你的按键如果没有机械抖动,你这中断里面的程序压根没有机会执行。
回复

使用道具 举报

ID:332444 发表于 2023-2-16 07:50 | 显示全部楼层
又是把中断当作独立按键使用的,根本就不知道中断为何物!
回复

使用道具 举报

ID:116103 发表于 2023-2-16 09:30 | 显示全部楼层
xianfajushi 发表于 2023-2-16 07:50
又是把中断当作独立按键使用的,根本就不知道中断为何物!

这个程序里中断只是改FLAG的数值,没有执行程序,所以不存在中断嵌套,所以MODE4模式也属于主程序,不是中断程序。MODE4子程序中PWM()程序里面没有实参,FLASH1里的T没有字义和赋值。先把这些规范了再说。另外IT0=1是下降没有效,按键在未按时是1的话,按下后进中断,可中断扫行指令时条件是KEY==1,有矛盾。中断只在下降沿进入,中断程序不用条件,直接加数就行。
回复

使用道具 举报

ID:116103 发表于 2023-2-16 09:37 | 显示全部楼层
也可以不用中断,每个子程序里加个按键子程序。
回复

使用道具 举报

ID:584980 发表于 2023-2-17 18:04 | 显示全部楼层
按键中断就是配置好以后,按下就会进入中断服务函数,并不需要在中断里面再去判断按键状态。中断服务进来,首先设置一个标志位,锁定。在主函数里面flag判断完毕,就清掉中断里面的标志,就是实现了锁定和解锁。完全不需要担心抖动。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表