找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2019|回复: 29
打印 上一主题 下一主题
收起左侧

这个单片机程序为什么按键按了没反应?有什么问题吗

[复制链接]
跳转到指定楼层
楼主
ID:1008383 发表于 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计时器   
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

来自 2#
ID:213173 发表于 2022-6-30 21:33 | 只看该作者
本帖最后由 wulin 于 2022-7-1 06:30 编辑
  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. }
复制代码


回复

使用道具 举报

来自 3#
ID:161164 发表于 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. }
复制代码
回复

使用道具 举报

地板
ID:296704 发表于 2022-6-30 13:50 | 只看该作者
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢
回复

使用道具 举报

5#
ID:61140 发表于 2022-6-30 13:58 | 只看该作者
想向别人求助解答,还怕别人看你的程序?
回复

使用道具 举报

6#
ID:1023753 发表于 2022-6-30 14:01 | 只看该作者
刺头少年 发表于 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按键的定义,原理图那些都没有,而且你的按键程序是不是应该加一个消抖呢

while(!key_dec);有消抖
回复

使用道具 举报

7#
ID:1006814 发表于 2022-6-30 17:07 | 只看该作者
while(!key_dec);有消抖
回复

使用道具 举报

8#
ID:1006814 发表于 2022-6-30 17:08 | 只看该作者
这个不是消抖,是等待按键释放。
回复

使用道具 举报

9#
ID:1008383 发表于 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)
        {
               
        }
}
回复

使用道具 举报

10#
ID:1006814 发表于 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);
回复

使用道具 举报

11#
ID:1008383 发表于 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)
        {
               
        }
}
回复

使用道具 举报

12#
ID:1008383 发表于 2022-6-30 17:13 | 只看该作者
hb_lhw 发表于 2022-6-30 17:10
if(key_dec==0)
        {
                Delay_ms(10);  //延时10ms

加了还是搞不了
回复

使用道具 举报

13#
ID:1006814 发表于 2022-6-30 17:18 | 只看该作者
主程序要一直检测按键。
void main()
{
        anjian_add();
        anjian_dec();

        PWM_shuchu();
        while(1)
        {
               
        }
}
回复

使用道具 举报

14#
ID:1008383 发表于 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)
        {
               
        }
}
回复

使用道具 举报

15#
ID:1006814 发表于 2022-6-30 17:20 | 只看该作者
你的程序上电就执行一次检测按键。
回复

使用道具 举报

16#
ID:1008383 发表于 2022-6-30 17:22 | 只看该作者
hb_lhw 发表于 2022-6-30 17:18
主程序要一直检测按键。
void main()
{

试过了,搞不好
回复

使用道具 举报

17#
ID:1008383 发表于 2022-6-30 17:23 | 只看该作者
hb_lhw 发表于 2022-6-30 17:20
你的程序上电就执行一次检测按键。

之前放循环里也搞不好
回复

使用道具 举报

18#
ID:1006814 发表于 2022-6-30 17:30 | 只看该作者
我对PWM不熟,不知道相关寄存器设置的是否正确。
可以在检测到有效按键里增加调试命令,把按键打出来,看看是按键检测的问题还是PWM输出的问题。
回复

使用道具 举报

19#
ID:1008383 发表于 2022-6-30 17:33 | 只看该作者
hb_lhw 发表于 2022-6-30 17:30
我对PWM不熟,不知道相关寄存器设置的是否正确。
可以在检测到有效按键里增加调试命令,把按键打出来,看 ...

但改我设置的初始值他PWM都改变了
回复

使用道具 举报

20#
ID:1037856 发表于 2022-7-1 11:02 | 只看该作者
楼主的main函数问题吧,仅初始化时检查了按键,需要改成如下的:(这个程序问题很多,还有其他很多地方需要优化)
void main()
{
        while(1)
        {
         anjian_add();
        anjian_dec();
        PWM_shuchu();  
        }
}
回复

使用道具 举报

21#
ID:161164 发表于 2022-7-1 14:00 | 只看该作者
zjswuyunbo 发表于 2022-7-1 11:02
楼主的main函数问题吧,仅初始化时检查了按键,需要改成如下的:(这个程序问题很多,还有其他很多地方需要优 ...

PWM_shuchu()不能放在循环中
不然CL/CH一直被清零,PWM就不能工作了
回复

使用道具 举报

22#
ID:1008383 发表于 2022-7-1 15:30 | 只看该作者
回复

使用道具 举报

23#
ID:1008383 发表于 2022-7-1 15:31 | 只看该作者
回复

使用道具 举报

24#
ID:329625 发表于 2022-7-1 19:34 | 只看该作者
程序加上按键消除抖动试试
回复

使用道具 举报

25#
ID:1008383 发表于 2022-7-1 20:19 | 只看该作者

大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改
回复

使用道具 举报

26#
ID:1008383 发表于 2022-7-1 20:38 | 只看该作者
lkc8210 发表于 2022-7-1 14:00
PWM_shuchu()不能放在循环中
不然CL/CH一直被清零,PWM就不能工作了

大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改
回复

使用道具 举报

27#
ID:213173 发表于 2022-7-1 21:46 | 只看该作者
淡忘一世 发表于 2022-7-1 20:19
大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改

通常设计单片机按键电路不宜采用不按时为低电平,按下为高电平。如因某种需求不得已怎么做,端口要接下拉电阻,软件方面只要把识别按键的逻辑关系取反即可。
回复

使用道具 举报

28#
ID:1008383 发表于 2022-7-1 22:20 | 只看该作者
wulin 发表于 2022-7-1 21:46
通常设计单片机按键电路不宜采用不按时为低电平,按下为高电平。如因某种需求不得已怎么做,端口要接下拉 ...

好的,
回复

使用道具 举报

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

改为if(key_XXX == 1)即可
XXX=add/dec
回复

使用道具 举报

30#
ID:1008383 发表于 2022-7-12 12:02 | 只看该作者
17337161031 发表于 2022-7-1 19:34
程序加上按键消除抖动试试

解决了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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