标题: 这个单片机程序为什么按键按了没反应?有什么问题吗 [打印本页]

作者: 淡忘一世    时间: 2022-6-30 11:47
标题: 这个单片机程序为什么按键按了没反应?有什么问题吗
#include "main.h"


u8 t=50;

void anjian_add() //电机减速
{
        if(key_add==0)
        {
                if(key_add==0)
                {
                        t+=5; //每按一次加速按键占空比减1
                        if(t>=255) //限定占空比下限
                        {
                                t=255;
                        }
                }
        while(!key_add);
        }
}


void anjian_dec()//电机加速
{
        if(key_dec==0)
        {
                if(key_dec==0)
                {
                        t-=5; //每按一次按键占空比加1
                        if(t<=0) //限定占空比上限
                        {
                                t=0                                ;
                        }
                }
                while(!key_dec);
        }
}

void PWM_shuchu()
{  
                CCON = 0x00;  
                CMOD = 0x08; //PCA时钟为系统时钟  
                CL = 0x00;
          CH = 0x00;
          CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
                PCA_PWM2 = 0x00; //PCA模块2输出8位PWM  
                CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]  
                CCAP2H = t;
           CR = 1; //启动PCA计时器   
}


作者: 刺头少年    时间: 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢
作者: xiaoyuxinke    时间: 2022-6-30 13:58
想向别人求助解答,还怕别人看你的程序?
作者: haiyang201    时间: 2022-6-30 14:01
刺头少年 发表于 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢

while(!key_dec);有消抖
作者: hb_lhw    时间: 2022-6-30 17:07
while(!key_dec);有消抖
作者: hb_lhw    时间: 2022-6-30 17:08
这个不是消抖,是等待按键释放。
作者: 淡忘一世    时间: 2022-6-30 17:10
xiaoyuxinke 发表于 2022-6-30 13:58
想向别人求助解答,还怕别人看你的程序?

#include <stc8.h>
#include <intrins.h>

#define u8  unsigned char
#define u16  unsigned int
#define u32  unsigned long

sbit key_add=P5^3;
sbit key_dec=P4^4;
u8 t=50;

void anjian_add() //电机减速
{
        if(key_add==0)
        {
                if(key_add==0)
                {
                        t+=5; //每按一次加速按键占空比减1
                        if(t>=255) //限定占空比下限
                        {
                                t=255;
                        }
                }
        while(!key_add);
        }
}


void anjian_dec()//电机加速
{
        if(key_dec==0)
        {
                if(key_dec==0)
                {
                        t-=5; //每按一次按键占空比加1
                        if(t<=0) //限定占空比上限
                        {
                                t=0                                ;
                        }
                }
                while(!key_dec);
        }
}

void PWM_shuchu()
{  
                CCON = 0x00;  
                CMOD = 0x08; //PCA时钟为系统时钟  
                CL = 0x00;
          CH = 0x00;
          CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
                PCA_PWM2 = 0x00; //PCA模块2输出8位PWM                  P1^5;
                CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]  
                CCAP2H = t;
           CR = 1; //启动PCA计时器   
}

void main()
{
        anjian_add();
        anjian_dec();
        PWM_shuchu();
        while(1)
        {
               
        }
}
作者: hb_lhw    时间: 2022-6-30 17:10
        if(key_dec==0)
        {
                Delay_ms(10);  //延时10ms
                if(key_dec==0)
                {
                        t-=5; //每按一次按键占空比加1
                        if(t<=0) //限定占空比上限
                        {
                                t=0                                ;
                        }
                }
                while(!key_dec);
作者: 淡忘一世    时间: 2022-6-30 17:12
刺头少年 发表于 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢

#include <stc8.h>
#include <intrins.h>

#define u8  unsigned char
#define u16  unsigned int
#define u32  unsigned long

sbit key_add=P5^3;
sbit key_dec=P4^4;
u8 t=50;

void Delay(unsigned int xms) // 毫秒级延时
{
        unsigned int i, j;
        for(i=xms;i>0;i--)
        {
                for(j=921;j>0;j--);
        }
}

void anjian_add() //电机减速
{
        if(key_add==0)
        {
                Delay(1);
                if(key_add==0)
                {
                        t+=5; //每按一次加速按键占空比减1
                        if(t>=255) //限定占空比下限
                        {
                                t=255;
                        }
                }
        while(!key_add);
        }
}


void anjian_dec()//电机加速
{
        if(key_dec==0)
        {
                Delay(1);
                if(key_dec==0)
                {
                        t-=5; //每按一次按键占空比加1
                        if(t<=0) //限定占空比上限
                        {
                                t=0                                ;
                        }
                }
                while(!key_dec);
        }
}

void PWM_shuchu()
{  
                CCON = 0x00;  
                CMOD = 0x08; //PCA时钟为系统时钟  
                CL = 0x00;
          CH = 0x00;
          CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
                PCA_PWM2 = 0x00; //PCA模块2输出8位PWM                  P1^5;
                CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]  
                CCAP2H = t;
           CR = 1; //启动PCA计时器   
}

void main()
{
        anjian_add();
        anjian_dec();
        PWM_shuchu();
        while(1)
        {
               
        }
}
作者: 淡忘一世    时间: 2022-6-30 17:13
hb_lhw 发表于 2022-6-30 17:10
if(key_dec==0)
        {
                Delay_ms(10);  //延时10ms

加了还是搞不了

作者: hb_lhw    时间: 2022-6-30 17:18
主程序要一直检测按键。
void main()
{
        anjian_add();
        anjian_dec();

        PWM_shuchu();
        while(1)
        {
               
        }
}
作者: 淡忘一世    时间: 2022-6-30 17:19
刺头少年 发表于 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢

这样还是不行
#include <stc8.h>
#include <intrins.h>

#define u8  unsigned char
#define u16  unsigned int
#define u32  unsigned long

sbit key_add=P5^3;
sbit key_dec=P4^4;
u8 t=50;

void anjian_add() //电机减速
{
        if(key_add==0)
        {
                if(key_add==0)
                {
                        t+=5; //每按一次加速按键占空比减1
                        if(t>=255) //限定占空比下限
                        {
                                t=255;
                        }
                }
        while(!key_add);
        }
}


void anjian_dec()//电机加速
{
        if(key_dec==0)
        {
                if(key_dec==0)
                {
                        t-=5; //每按一次按键占空比加1
                        if(t<=0) //限定占空比上限
                        {
                                t=0                                ;
                        }
                }
                while(!key_dec);
        }
}

void PWM_shuchu()
{  
                CCON = 0x00;  
                CMOD = 0x08; //PCA时钟为系统时钟  
                CL = 0x00;
          CH = 0x00;
          CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
                PCA_PWM2 = 0x00; //PCA模块2输出8位PWM                  P1^5;
                CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]  
                CCAP2H = t;
           CR = 1; //启动PCA计时器   
}

void main()
{
        anjian_add();
        anjian_dec();
        PWM_shuchu();
        while(1)
        {
               
        }
}
作者: hb_lhw    时间: 2022-6-30 17:20
你的程序上电就执行一次检测按键。
作者: 淡忘一世    时间: 2022-6-30 17:22
hb_lhw 发表于 2022-6-30 17:18
主程序要一直检测按键。
void main()
{

试过了,搞不好
作者: 淡忘一世    时间: 2022-6-30 17:23
hb_lhw 发表于 2022-6-30 17:20
你的程序上电就执行一次检测按键。

之前放循环里也搞不好
作者: hb_lhw    时间: 2022-6-30 17:30
我对PWM不熟,不知道相关寄存器设置的是否正确。
可以在检测到有效按键里增加调试命令,把按键打出来,看看是按键检测的问题还是PWM输出的问题。
作者: 淡忘一世    时间: 2022-6-30 17:33
hb_lhw 发表于 2022-6-30 17:30
我对PWM不熟,不知道相关寄存器设置的是否正确。
可以在检测到有效按键里增加调试命令,把按键打出来,看 ...

但改我设置的初始值他PWM都改变了
作者: wulin    时间: 2022-6-30 21:33
本帖最后由 wulin 于 2022-7-1 06:30 编辑
淡忘一世 发表于 2022-6-30 17:10
#include
#include
  1. #include <stc8.h>
  2. #include <intrins.h>

  3. #define u8  unsigned char
  4. #define u16  unsigned int
  5. #define u32  unsigned long

  6. sbit key_add=P5^3;
  7. sbit key_dec=P4^4;
  8. u8 t=50;

  9. void PWM_shuchu()
  10. {  
  11.         CCON = 0x00;  
  12.         CMOD = 0x08; //PCA时钟为系统时钟  
  13.         CL = 0x00;
  14.         CH = 0x00;
  15.         CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
  16.         PCA_PWM2 = 0x00; //PCA模块2输出8位PWM  P1^5;
  17.         CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]  
  18.         CCAP2H = t;
  19.         CR = 1; //启动PCA计时器   
  20. }

  21. void anjian() //电机加/减速
  22. {
  23.         static u16 count=0;
  24.         static bit sign=0;
  25.         if(!key_add || !key_dec)
  26.         {
  27.                 if(++count>=500 && sign==0)
  28.                 {
  29.                         sign=1;
  30.                         if(!key_add)
  31.                         {
  32.                                 if(t<255)t+=5;
  33.                                 CCAP2L = t;
  34.                                 CCAP2H = t;
  35.                         }
  36.                         if(!key_dec)
  37.                         {
  38.                                 if(t>0)t-=5;
  39.                                 CCAP2L = t;
  40.                                 CCAP2H = t;
  41.                         }
  42.                 }
  43.         }
  44.         else
  45.         {
  46.                 count=0;
  47.                 sign=0;
  48.         }
  49. }

  50. void main()
  51. {
  52.         P0M0 = 0x00;
  53.         P0M1 = 0x00;
  54.         P1M0 = 0x20;//设置PWM输出端为推挽模式(P1.5)
  55.         P1M1 = 0x00;
  56.         P2M0 = 0x00;
  57.         P2M1 = 0x00;
  58.         P3M0 = 0x00;
  59.         P3M1 = 0x00;
  60.         P4M0 = 0x00;
  61.         P4M1 = 0x00;
  62.         P5M0 = 0x00;
  63.         P5M1 = 0x00;
  64.         P6M0 = 0x00;
  65.         P6M1 = 0x00;
  66.         P7M0 = 0x00;
  67.         P7M1 = 0x00;
  68.         PWM_shuchu();
  69.         while(1)
  70.         {
  71.                 anjian();
  72.         }
  73. }
复制代码



作者: lkc8210    时间: 2022-6-30 21:42
本帖最后由 lkc8210 于 2022-6-30 23:21 编辑
  1. #include <stc8.h>
  2. #include <intrins.h>

  3. #define u8  unsigned char
  4. #define u16  unsigned int
  5. #define u32  unsigned long

  6. sbit key_add=P5^3;
  7. sbit key_dec=P4^4;
  8. u8 t=50;

  9. void Delay(unsigned int xms) // 毫秒级延时
  10. {
  11.         unsigned int i, j;
  12.         for(i=xms; i>0; i--)
  13.         {
  14.                 for(j=921; j>0; j--);
  15.         }
  16. }
  17. void anjian_add() //电机减速
  18. {
  19.         static u8 Delay_XD = 0;
  20.         if(key_add==0)
  21.         {
  22.                 if(Delay_XD<0xFF)
  23.                 {
  24.                         Delay_XD++;
  25.                         Delay(1);
  26.                 }
  27.                 if(Delay_XD==20)
  28.                 {
  29.                         t+=5; //每按一次加速按键占空比减1
  30.                         if(t>=255) //限定占空比下限
  31.                         {
  32.                                 t=255;
  33.                         }
  34.                         CR = 0;
  35.                         CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]
  36.                         CCAP2H = t;
  37.                         CR = 1; //启动PCA计时器
  38.                 }
  39.         }
  40.         else
  41.         {
  42.                 Delay_XD = 0;
  43.         }
  44. }
  45. void anjian_dec()//电机加速
  46. {
  47.         static u8 Delay_XD = 0;
  48.         if(key_dec==0)
  49.         {
  50.                 if(Delay_XD<0xFF)
  51.                 {
  52.                         Delay_XD++;
  53.                         Delay(1);
  54.                 }
  55.                 if(Delay_XD==20)
  56.                 {
  57.                         t-=5; //每按一次按键占空比加1
  58.                         if(t<=0) //限定占空比上限
  59.                         {
  60.                                 t=0                                ;
  61.                         }
  62.                         CR = 0;
  63.                         CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]
  64.                         CCAP2H = t;
  65.                         CR = 1; //启动PCA计时器
  66.                 }
  67.         }
  68.         else
  69.         {
  70.                 Delay_XD = 0;
  71.         }
  72. }
  73. void PWM_shuchu()
  74. {
  75.         CCON = 0x00;
  76.         CMOD = 0x08; //PCA时钟为系统时钟
  77.         CL = 0x00;
  78.         CH = 0x00;
  79.         CCAPM2 = 0x42; //PCA模块2为PWM工作模式
  80.         PCA_PWM2 = 0x00; //PCA模块2输出8位PWM                  P1^5;
  81.         CCAP2L = t; //PWM占空比为81%[(100H-20H)/100H]
  82.         CCAP2H = t;
  83.         CR = 1; //启动PCA计时器
  84. }
  85. void main()
  86. {
  87.         PWM_shuchu();
  88.         while(1)
  89.         {
  90.                 anjian_add();
  91.                 anjian_dec();
  92.         }
  93. }
复制代码

作者: zjswuyunbo    时间: 2022-7-1 11:02
楼主的main函数问题吧,仅初始化时检查了按键,需要改成如下的:(这个程序问题很多,还有其他很多地方需要优化)
void main()
{
        while(1)
        {
         anjian_add();
        anjian_dec();
        PWM_shuchu();  
        }
}
作者: lkc8210    时间: 2022-7-1 14:00
zjswuyunbo 发表于 2022-7-1 11:02
楼主的main函数问题吧,仅初始化时检查了按键,需要改成如下的:(这个程序问题很多,还有其他很多地方需要优 ...

PWM_shuchu()不能放在循环中
不然CL/CH一直被清零,PWM就不能工作了
作者: 淡忘一世    时间: 2022-7-1 15:30
wulin 发表于 2022-6-30 21:33

谢谢大佬
作者: 淡忘一世    时间: 2022-7-1 15:31
lkc8210 发表于 2022-6-30 21:42

谢谢大佬

作者: 17337161031    时间: 2022-7-1 19:34
程序加上按键消除抖动试试
作者: 淡忘一世    时间: 2022-7-1 20:19
wulin 发表于 2022-6-30 21:33

大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改
作者: 淡忘一世    时间: 2022-7-1 20:38
lkc8210 发表于 2022-7-1 14:00
PWM_shuchu()不能放在循环中
不然CL/CH一直被清零,PWM就不能工作了

大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改
作者: wulin    时间: 2022-7-1 21:46
淡忘一世 发表于 2022-7-1 20:19
大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改

通常设计单片机按键电路不宜采用不按时为低电平,按下为高电平。如因某种需求不得已怎么做,端口要接下拉电阻,软件方面只要把识别按键的逻辑关系取反即可。
作者: 淡忘一世    时间: 2022-7-1 22:20
wulin 发表于 2022-7-1 21:46
通常设计单片机按键电路不宜采用不按时为低电平,按下为高电平。如因某种需求不得已怎么做,端口要接下拉 ...

好的,

作者: lkc8210    时间: 2022-7-9 22:58
淡忘一世 发表于 2022-7-1 20:38
大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改

改为if(key_XXX == 1)即可
XXX=add/dec
作者: 淡忘一世    时间: 2022-7-12 12:02
17337161031 发表于 2022-7-1 19:34
程序加上按键消除抖动试试

解决了





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1