找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
楼主
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:161164 发表于 2022-7-1 14:00 | 显示全部楼层
zjswuyunbo 发表于 2022-7-1 11:02
楼主的main函数问题吧,仅初始化时检查了按键,需要改成如下的:(这个程序问题很多,还有其他很多地方需要优 ...

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

使用道具 举报

板凳
ID:161164 发表于 2022-7-9 22:58 | 显示全部楼层
淡忘一世 发表于 2022-7-1 20:38
大佬,如果按键不按时为低电平,按下为高电平,程序怎么修改

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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