完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大神帮我看看程序哪里出了问题,想用状态机搞一个PWM的电机调速,并且用一个按键设置做两种功能,1S内短按则打开或者关闭电机,长按PWM调速,1~6S内PWM是一直加速,6~11S是减速,大于五秒则PWM为0
#include #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 //定义按键动作时的状态4 ***it Key_Input=P1^0; ***it 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 { 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 1:PWM=~PWM;break; case 2:break; case 3:Pwm_Vlaue++;break; //PWM占空比自减 case 4:Pwm_Vlaue--;break; //PWM占空比自减 default:break; } } |
|
相关推荐
1个回答
|
|
正好用到这个,楼主,可以交流下吗
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:25 , Processed in 0.605153 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号