找回密码
 注册
关于网站域名变更的通知
查看: 448|回复: 5
打印 上一主题 下一主题

各位大神帮我看看程序哪里出了问题???

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-12 17:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
想用状态机搞一个PWM的电机调速,并且用一个按键设置做两种功能,1S内短按则打开或者关闭电机,长按PWM调速,1~6S内PWM是一直加速,6~11S是减速,大于11S秒则PWM为0 #include <reg52.h>#define Key_State_0   0                                        //定义按键动作时的状态0#define Key_State_1   1                                        //定义按键动作时的状态1#define Key_State_2   2                                        //定义按键动作时的状态2#define Key_State_3   3                                        //定义按键动作时的状态3#define Key_State_4   4                                        //定义按键动作时的状态4sbit Key_Input=P1^0;sbit PWM=P2^0;char Read_Key();void Init_Timer0(void);void Key_Scan();static unsigned char Pwm_Count=0;                  //定义PWM进入中断的次数static unsigned char Pwm_Vlaue=80;                //定义PWM占空比的值char Key_Return;/*----------------------------------------------               主函数------------------------------------------------*/void main(){        Init_Timer0();                  //初始化定时器0        while(1)        {                        Key_Scan();                                }        }/*------------------------------------------------              定时器初始化函数------------------------------------------------*/void Init_Timer0(void){ TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                      TH0=0xff;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 TL0=0xa4; EA=1;            //总中断打开 ET0=1;           //定时器中断打开 TR0=1;           //定时器开关打开}/*------------------------------------------------              定时器中断函数------------------------------------------------*/void PWM_Timer0() interrupt 1 using 1{                TH0=0xff;                  //重新赋值        TL0=0xa4;        Pwm_Count++;                  //PWM进入中断的次数自加1        if(Pwm_Count==100)                                 //如果PWM进入中断的次数=100        {                Pwm_Count=0;                                //次数归0                Read_Key();                                   //按键函数10ms扫描一次                }        if(Pwm_Count<wm_Vlaue)                   //改变Pwm_Vlaue可以改变占空比的值        {                PWM=1;                                 //电机打开        }        else        {                PWM=0;                                 //电机关闭        }}/*------------------------------------------------              读按键状态函数------------------------------------------------*/ char Read_Key()                                  //按键状态处理函数{        static char Key_State=0,Key_Time=0;                  //按键状态值Key_State初始化为0,按键按下的时间Key_Time初始化为0        unsigned char Key_Press;                                  //Key_Press为按键状态储存值,Key_Return为按键的状态返回值        Key_Press=Key_Input;                                        //读按键I/O口的电平        switch(Key_State)        {                                        case 0:                           //按键的初始状态0                                if(Key_Press!=1)                                            //按键按下                                {                                        Key_State=Key_State_1;                  //状态切换到确认态1                                        Key_Return=1;                                //按键的状态返回值输出“1”                                                          }                                break;                                                case 1:                          //按键的确认状态1                                if(Key_Press!=1)                                          //按键仍然按下                                {                                        Key_State=Key_State_2;                 //状态切换到计时状态2                                        Key_Time=0;                                         //按键时间计数器清0                                }                                else                                           //按键已经松开                                {                                        Key_State=Key_State_0;                 //状态切换到初始状态0                                                                        }                                break;                case 2:                          //按键的计时状态2                                if(Key_Press)                                        //按键已经松开          --短按                                {                                        Key_State=Key_State_0;                //状态切换到初始状态0                                        Key_Return=1;                                //按键的状态返回值输出“1”                                        }                                else if(Key_Time>=100)                //按键按下的时间计数          --长按                                {                                        Key_State=Key_State_3;                   //按键按下的时间大于1S,状态切换到计时状态3                                        Key_Time=0;                                          //按键时间计数器清0                                        Key_Return=2;                                  //按键的状态返回值输出“2”                                                                                }                                 break;                                                case 3:                          //按键的计时状态3                                if(Key_Press)                                        //按键已经松开                                {                                        Key_State=Key_State_0;                //状态切换到初始状态0                                }                                else                                {                                        Key_Time++;                                        if(Key_Time>=0&&Key_Time<500)                         //按键按下的时间计数                                        {                                                Key_State=Key_State_4;                   //按键按下的时间大于6S,状态切换到计时状态4                                                Key_Time=0;                                                Key_Return=3;                                  //按键的状态返回值输出“3”                                        }                                }                                break;                case 4:                          //按键的计时状态3                                if(Key_Press)                                        //按键已经松开                                {                                        Key_State=Key_State_0;                //状态切换到初始状态0                                }                                else                                {                                        Key_Time++;                                        if(++Key_Time>=100&&++Key_Time<500)                         //按键按下的时间计数                                        {                                                Key_State=Key_State_4;                   //按键按下的时间大于6S,状态切换到计时状态4                                                Key_Time=0;                                                Key_Return=4;                                   //按键的状态返回值输出“4”                                        }                                }                                break;                default:Key_Time=0;        break;                                                                }        return Key_Return;}void Key_Scan(){        switch(Key_Return)        {                case 0:break;                case 1WM=~PWM;break;                case 2:break;                case 3wm_Vlaue++;break;                         //PWM占空比自减                case 4wm_Vlaue--;break;                         //PWM占空比自减                default:break;        }        }! {; W. t& W8 C

该用户从未签到

2#
发表于 2020-5-12 18:52 | 只看该作者
这代码还显示成表情,看起来好费劲啊
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2020-5-12 19:07 | 只看该作者
    程序可以模块化

    该用户从未签到

    4#
    发表于 2020-5-12 19:14 | 只看该作者
    本帖最后由 行者~ABC 于 2020-5-12 19:29 编辑
    ) g9 h; l6 Z5 y( T
    6 n( X# D1 a1 ^/ ^; e模块化很重要
    & u1 q5 o% N, U# v9 n9 g1 定时器模块  f" N# I, ?" i! D
    2 按键去抖动模块
    7 _* d/ u, j7 n! T$ r3 按键操作模块; z! d" X' N) m- u+ {' ~
    4 电机运动模块
    : s% F& X3 E' X- m4 s5  PWM变频模块

    该用户从未签到

    5#
    发表于 2020-5-12 19:46 | 只看该作者
    6 j: Y$ z" `+ n" h. d
    这是流程图,你参考一下
    ( x9 [9 E; D7 d
    - g& r( i* `0 |) t   @* V9 y$ F# k6 K  I9 N
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
    发表于 2020-5-13 13:46 | 只看该作者
    很完整嘛

    “来自电巢APP”

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

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-11 07:28 , Processed in 0.140625 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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