久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3537|回復: 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計時器   
}

回復

使用道具 舉報

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. }
復制代碼


回復

使用道具 舉報

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 | 顯示全部樓層
看了一下,你的程序不是很完整吧,按鍵的定義,原理圖那些都沒有,而且你的按鍵程序是不是應該加一個消抖呢
回復

使用道具 舉報

ID:61140 發表于 2022-6-30 13:58 | 顯示全部樓層
想向別人求助解答,還怕別人看你的程序?
回復

使用道具 舉報

ID:1023753 發表于 2022-6-30 14:01 | 顯示全部樓層
刺頭少年 發表于 2022-6-30 13:50
看了一下,你的程序不是很完整吧,按鍵的定義,原理圖那些都沒有,而且你的按鍵程序是不是應該加一個消抖呢

while(!key_dec);有消抖
回復

使用道具 舉報

ID:1006814 發表于 2022-6-30 17:07 | 顯示全部樓層
while(!key_dec);有消抖
回復

使用道具 舉報

ID:1006814 發表于 2022-6-30 17:08 | 顯示全部樓層
這個不是消抖,是等待按鍵釋放。
回復

使用道具 舉報

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)
        {
               
        }
}
回復

使用道具 舉報

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);
回復

使用道具 舉報

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)
        {
               
        }
}
回復

使用道具 舉報

ID:1008383 發表于 2022-6-30 17:13 | 顯示全部樓層
hb_lhw 發表于 2022-6-30 17:10
if(key_dec==0)
        {
                Delay_ms(10);  //延時10ms

加了還是搞不了
回復

使用道具 舉報

ID:1006814 發表于 2022-6-30 17:18 | 顯示全部樓層
主程序要一直檢測按鍵。
void main()
{
        anjian_add();
        anjian_dec();

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

使用道具 舉報

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)
        {
               
        }
}
回復

使用道具 舉報

ID:1006814 發表于 2022-6-30 17:20 | 顯示全部樓層
你的程序上電就執行一次檢測按鍵。
回復

使用道具 舉報

ID:1008383 發表于 2022-6-30 17:22 | 顯示全部樓層
hb_lhw 發表于 2022-6-30 17:18
主程序要一直檢測按鍵。
void main()
{

試過了,搞不好
回復

使用道具 舉報

ID:1008383 發表于 2022-6-30 17:23 | 顯示全部樓層
hb_lhw 發表于 2022-6-30 17:20
你的程序上電就執行一次檢測按鍵。

之前放循環里也搞不好
回復

使用道具 舉報

ID:1006814 發表于 2022-6-30 17:30 | 顯示全部樓層
我對PWM不熟,不知道相關寄存器設置的是否正確。
可以在檢測到有效按鍵里增加調試命令,把按鍵打出來,看看是按鍵檢測的問題還是PWM輸出的問題。
回復

使用道具 舉報

ID:1008383 發表于 2022-6-30 17:33 | 顯示全部樓層
hb_lhw 發表于 2022-6-30 17:30
我對PWM不熟,不知道相關寄存器設置的是否正確。
可以在檢測到有效按鍵里增加調試命令,把按鍵打出來,看 ...

但改我設置的初始值他PWM都改變了
回復

使用道具 舉報

ID:1037856 發表于 2022-7-1 11:02 | 顯示全部樓層
樓主的main函數問題吧,僅初始化時檢查了按鍵,需要改成如下的:(這個程序問題很多,還有其他很多地方需要優化)
void main()
{
        while(1)
        {
         anjian_add();
        anjian_dec();
        PWM_shuchu();  
        }
}
回復

使用道具 舉報

ID:161164 發表于 2022-7-1 14:00 | 顯示全部樓層
zjswuyunbo 發表于 2022-7-1 11:02
樓主的main函數問題吧,僅初始化時檢查了按鍵,需要改成如下的:(這個程序問題很多,還有其他很多地方需要優 ...

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

使用道具 舉報

ID:1008383 發表于 2022-7-1 15:30 | 顯示全部樓層
回復

使用道具 舉報

ID:1008383 發表于 2022-7-1 15:31 | 顯示全部樓層
回復

使用道具 舉報

ID:329625 發表于 2022-7-1 19:34 | 顯示全部樓層
程序加上按鍵消除抖動試試
回復

使用道具 舉報

ID:1008383 發表于 2022-7-1 20:19 | 顯示全部樓層

大佬,如果按鍵不按時為低電平,按下為高電平,程序怎么修改
回復

使用道具 舉報

ID:1008383 發表于 2022-7-1 20:38 | 顯示全部樓層
lkc8210 發表于 2022-7-1 14:00
PWM_shuchu()不能放在循環中
不然CL/CH一直被清零,PWM就不能工作了

大佬,如果按鍵不按時為低電平,按下為高電平,程序怎么修改
回復

使用道具 舉報

ID:213173 發表于 2022-7-1 21:46 | 顯示全部樓層
淡忘一世 發表于 2022-7-1 20:19
大佬,如果按鍵不按時為低電平,按下為高電平,程序怎么修改

通常設計單片機按鍵電路不宜采用不按時為低電平,按下為高電平。如因某種需求不得已怎么做,端口要接下拉電阻,軟件方面只要把識別按鍵的邏輯關系取反即可。
回復

使用道具 舉報

ID:1008383 發表于 2022-7-1 22:20 | 顯示全部樓層
wulin 發表于 2022-7-1 21:46
通常設計單片機按鍵電路不宜采用不按時為低電平,按下為高電平。如因某種需求不得已怎么做,端口要接下拉 ...

好的,
回復

使用道具 舉報

ID:161164 發表于 2022-7-9 22:58 | 顯示全部樓層
淡忘一世 發表于 2022-7-1 20:38
大佬,如果按鍵不按時為低電平,按下為高電平,程序怎么修改

改為if(key_XXX == 1)即可
XXX=add/dec
回復

使用道具 舉報

ID:1008383 發表于 2022-7-12 12:02 | 顯示全部樓層
17337161031 發表于 2022-7-1 19:34
程序加上按鍵消除抖動試試

解決了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品美女一区二区 | 99re视频在线观看 | 久久精品中文字幕 | 国产在线视频一区二区董小宛性色 | 最新av在线播放 | 一区二区免费 | 999观看免费高清www | 午夜精品久久久久久久久久久久久 | 国产美女一区二区三区 | 国产99热精品 | 欧美日韩亚洲在线 | 久久精品黄色 | 国产精品久久精品 | 久久久久国产一区二区三区 | 久久久精品一区 | 性欧美xxxx | 久久av一区二区三区 | 日本一道本视频 | 色欧美片视频在线观看 | 国产成人精品视频 | 中文字幕在线电影观看 | 欧美性大战xxxxx久久久 | 久久精品无码一区二区三区 | 狠狠躁躁夜夜躁波多野结依 | 欧美日韩精品在线免费观看 | 国产精品免费播放 | 久久精品毛片 | 国产久 | a级片播放| www.玖玖玖| h片在线看 | 久久久性色精品国产免费观看 | 欧美三区 | 亚洲精品电影网在线观看 | 精品不卡 | 91久久精品日日躁夜夜躁欧美 | 亚洲免费婷婷 | 国产成人网 | 亚洲v区| 一区二区三区中文字幕 | 国产欧美精品在线 |