程序消抖求解决哪位大神帮忙看下啊,急急,谢谢

2019-07-21 00:36发布

用拨码开关调频,下载好后可以用,不过几天后就有异常,高手能帮我看下吗?急急,异常是我没做拨码开关的消抖吗
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "timer.h"
#include "led.h"
#include "24cxx.h"
extern u16 f,w;               

void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        t++;       
                        if(t<w)
                        {
                                LED3=0;
                                LED4=0;
                        }       
                        else
                        {
                                LED3=1;
                                LED4=1;
                        }
                        if(t>=f)t=0;
                }
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志        
}

//按键初始化函数
void KEY_Init(void) //IO初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_9;//PB9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);//
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;//KEY0-KEY6
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
        GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE0,1,2,3
}

////////////
void KEY_Scan1()//拨码开关调频
{
        if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)//0
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=200;w=100;       
        }
        else if(KEY0==0&&KEY1==1&&KEY2==1&&KEY3==1)//1
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=140;w=70;
        }
        else if(KEY0==1&&KEY1==0&&KEY2==1&&KEY3==1)//2
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=100;w=50;
        }
        else if(KEY0==0&&KEY1==0&&KEY2==1&&KEY3==1)//3
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=70;w=35;
        }
        else if(KEY0==1&&KEY1==1&&KEY2==0&&KEY3==1)//4
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=50;w=25;
        }
        else if(KEY0==0&&KEY1==1&&KEY2==0&&KEY3==1)//5
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=40;w=20;
        }
        else if(KEY0==1&&KEY1==0&&KEY2==0&&KEY3==1)//6
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=30;w=15;
        }
        else if(KEY0==0&&KEY1==0&&KEY2==0&&KEY3==1)//7
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=16;w=8;
        }
        //
        else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)//8
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=10;w=5;
        }
        else if(KEY0==0&&KEY1==1&&KEY2==1&&KEY3==0)//9
        {
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                f=8;w=4;
        }
       
        else
        {
                  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE); //时钟使能
                        LED3=0;LED4=1;
        }
       
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
32条回答
edmund1234
1楼-- · 2019-07-23 23:35
 精彩回答 2  元偷偷看……
hlphzy123456
2楼-- · 2019-07-24 04:51
 精彩回答 2  元偷偷看……
hlphzy123456
3楼-- · 2019-07-24 07:38
大侠棒我最后看一下啊,示波器看下来还好,void TIM6_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //ê±&#214;óê1&#196;ü
       
        //&#182;¨ê±&#198;÷TIM33&#245;ê&#188;&#187;ˉ
        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#214;&#195;&#212;ú&#207;&#194;ò&#187;&#184;&#246;&#184;üD&#194;ê&#194;&#188;t×°è&#235;&#187;&#238;&#182;ˉμ&#196;×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#188;&#196;′&#230;&#198;÷&#214;ü&#198;úμ&#196;&#214;μ       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè&#214;&#195;ó&#195;à′×÷&#206;aTIMxê±&#214;ó&#198;μ&#194;ê3yêyμ&#196;&#212;¤·&#214;&#198;μ&#214;μ
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;

        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;TIM6&#214;D&#182;&#207;,&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;

        //&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;NVICéè&#214;&#195;
        NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;0&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óó&#197;&#207;è&#188;&#182;3&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±&#187;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);  //3&#245;ê&#188;&#187;ˉNVIC&#188;&#196;′&#230;&#198;÷

        TIM_Cmd(TIM6, ENABLE);  //ê1&#196;üTIMx                               
}       
       
void TIM6_IRQHandler(void)
{
  static u8 flag;
        u8 tem;
        tem =GPIOE->IDR&0x7F;
  if (GPIOB->IDR & 1<<9)
        tem +=0x80;
        if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //&#188;ì2éTIM6&#184;üD&#194;&#214;D&#182;&#207;·¢éúó&#235;·&#241;
        {
                        flag++;
                  if(flag==4)
                        {
                                if ((DipSwR ^ tem))//消抖
                                {
                                        DipSwR= tem; //消抖
                                }
                        }
      else
      {
                                flag=0;
                        }                               
        }
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);  //&#199;&#229;3yTIMx&#184;üD&#194;&#214;D&#182;&#207;±ê&#214;&#190;        
}       

u8 disp(void)
{
        tem =GPIOE->IDR&0x7F;
  if (GPIOB->IDR & 1<<9)
        tem +=0x80;
        DipSwR=tem;
        return(DipSwR);
}
void disp_scan(void)
{
        switch(disp())
        {
                //0-9
                case 0xFF:f=200;w=100;break;//0 0
                case 0x7F:f=140;w=70;break;//01
                case 0xFE:f=100;w=50;break;//02
                ........
        }
}
主函数中只要调取
disp_scan();其中DipSwR为全局变量,棒我看下哈,这样就实现消抖了吧
edmund1234
4楼-- · 2019-07-24 09:17
本帖最后由 edmund1234 于 2019-5-30 14:23 编辑
hlphzy123456 发表于 2019-5-30 13:53
大侠棒我最后看一下啊,示波器看下来还好,void TIM6_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTyp ...

void TIM6_IRQHandler(void)
{
  static u8 flag;
  u8 tem;
        if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //&#188;ì2éTIM6&#184;üD&#194;&#214;D&#182;&#207;·¢éúó&#235;·&#241;
        {
                        tem =GPIOE->IDR&0x7F;
                        if (GPIOB->IDR & 1<<9)
                                tem +=0x80;
               
            flag++;                                                                // 看不懂你这一块怎样能消抖
            if(flag==4)                                                               //               
            {                                                                               //        
                                if ((DipSwR ^ tem))//消抖                //  <<--- 没什么机会跳到这儿来的
                {                                                                       //        
                                        DipSwR= tem; //消抖                //
                                }                                                                //
                        }                                                                        //
                        else                                                                //
                        {                                                                        //
                                flag=0;                                                // <<--- 每一次都会执行这一句
            }                              
        }
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);  //&#199;&#229;3yTIMx&#184;üD&#194;&#214;D&#182;&#207;±ê&#214;&#190;        
}                        

另外, 其实不需要disp(),
switch(DipSwR) 就可以了, 因为DipSwR就是去抖后拨码开关的状态
hlphzy123456
5楼-- · 2019-07-24 10:22
为什么没有机会到这里来啊  if ((DipSwR ^ tem))//消抖
我开的是5ms一次中断TIM6_Int_Init(999,359);就是这个函数,在中断中设置一个flag,加一次就是5ms,加4次就是20ms,想20ms扫描一次,是根据51的思路写的,是不是我写错了啊
Akon
6楼-- · 2019-07-24 12:46
 精彩回答 2  元偷偷看……

一周热门 更多>