欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
狀態(tài)機(jī)PWM的電機(jī)調(diào)速單片機(jī)程序哪里出了問題?
[打印本頁]
作者:
求學(xué)長(zhǎng)
時(shí)間:
2020-5-10 17:21
標(biāo)題:
狀態(tài)機(jī)PWM的電機(jī)調(diào)速單片機(jī)程序哪里出了問題?
本帖最后由 求學(xué)長(zhǎng) 于 2020-5-10 20:07 編輯
想用狀態(tài)機(jī)搞一個(gè)PWM的電機(jī)調(diào)速,并且用一個(gè)按鍵設(shè)置做兩種功能,1S內(nèi)短按則打開或者關(guān)閉電機(jī),長(zhǎng)按PWM調(diào)速,1~6S內(nèi)PWM是一直加速,6~11S是減速,大于11秒則PWM為0
#include <reg52.h>
#define Key_State_0 0 //定義按鍵動(dòng)作時(shí)的狀態(tài)0
#define Key_State_1 1 //定義按鍵動(dòng)作時(shí)的狀態(tài)1
#define Key_State_2 2 //定義按鍵動(dòng)作時(shí)的狀態(tài)2
#define Key_State_3 3 //定義按鍵動(dòng)作時(shí)的狀態(tài)3
#define Key_State_4 4 //定義按鍵動(dòng)作時(shí)的狀態(tài)4
sbit 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進(jìn)入中斷的次數(shù)
static unsigned char Pwm_Vlaue=50; //定義PWM占空比的值
char Key_Return;
/*----------------------------------------------
主函數(shù)
------------------------------------------------*/
void main()
{
Init_Timer0(); //初始化定時(shí)器0
while(1)
{
Key_Scan();
}
}
/*------------------------------------------------
定時(shí)器初始化函數(shù)
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
TH0=0xff; //給定初值,這里使用定時(shí)器最大值從0開始計(jì)數(shù)一直到65535溢出
TL0=0xa4;
EA=1; //總中斷打開
ET0=1; //定時(shí)器中斷打開
TR0=1; //定時(shí)器開關(guān)打開
}
/*------------------------------------------------
定時(shí)器中斷函數(shù)
------------------------------------------------*/
void PWM_Timer0() interrupt 1 using 1
{
TH0=0xff; //重新賦值
TL0=0xa4;
Pwm_Count++; //PWM進(jìn)入中斷的次數(shù)自加1
IF(Pwm_Count==100) //如果PWM進(jìn)入中斷的次數(shù)=100
{
Pwm_Count=0; //次數(shù)歸0
Read_Key(); //按鍵函數(shù)10ms掃描一次
}
if(Pwm_Count<Pwm_Vlaue) //改變Pwm_Vlaue可以改變占空比的值
{
PWM=1; //電機(jī)打開
}
else
{
PWM=0; //電機(jī)關(guān)閉
}
}
/*------------------------------------------------
讀按鍵狀態(tài)函數(shù)
------------------------------------------------*/
char Read_Key() //按鍵狀態(tài)處理函數(shù)
{
static char Key_State=0,Key_Time=0; //按鍵狀態(tài)值Key_State初始化為0,按鍵按下的時(shí)間Key_Time初始化為0
unsigned char Key_Press; //Key_Press為按鍵狀態(tài)儲(chǔ)存值,Key_Return為按鍵的狀態(tài)返回值
Key_Press=Key_Input; //讀按鍵I/O口的電平
switch(Key_State)
{
case 0: //按鍵的初始狀態(tài)0
if(Key_Press!=1) //按鍵按下
{
Key_State=Key_State_1; //狀態(tài)切換到確認(rèn)態(tài)1
Key_Return=1; //按鍵的狀態(tài)返回值輸出“1”
}
break;
case 1: //按鍵的確認(rèn)狀態(tài)1
if(Key_Press!=1) //按鍵仍然按下
{
Key_State=Key_State_2; //狀態(tài)切換到計(jì)時(shí)狀態(tài)2
Key_Time=0; //按鍵時(shí)間計(jì)數(shù)器清0
}
else //按鍵已經(jīng)松開
{
Key_State=Key_State_0; //狀態(tài)切換到初始狀態(tài)0
}
break;
case 2: //按鍵的計(jì)時(shí)狀態(tài)2
if(Key_Press) //按鍵已經(jīng)松開 --短按
{
Key_State=Key_State_0; //狀態(tài)切換到初始狀態(tài)0
Key_Return=1; //按鍵的狀態(tài)返回值輸出“1”
}
else if(Key_Time>=100) //按鍵按下的時(shí)間計(jì)數(shù) --長(zhǎng)按
{
Key_State=Key_State_3; //按鍵按下的時(shí)間大于1S,狀態(tài)切換到計(jì)時(shí)狀態(tài)3
Key_Time=0; //按鍵時(shí)間計(jì)數(shù)器清0
Key_Return=2; //按鍵的狀態(tài)返回值輸出“2”
}
break;
case 3: //按鍵的計(jì)時(shí)狀態(tài)3
if(Key_Press) //按鍵已經(jīng)松開
{
Key_State=Key_State_0; //狀態(tài)切換到初始狀態(tài)0
}
else
{
Key_Time++;
if(Key_Time>=0&&Key_Time<500) //按鍵按下的時(shí)間計(jì)數(shù)
{
Key_State=Key_State_4; //按鍵按下的時(shí)間大于6S,狀態(tài)切換到計(jì)時(shí)狀態(tài)4
Key_Time=0;
Key_Return=3; //按鍵的狀態(tài)返回值輸出“3”
}
}
break;
case 4: //按鍵的計(jì)時(shí)狀態(tài)3
if(Key_Press) //按鍵已經(jīng)松開
{
Key_State=Key_State_0; //狀態(tài)切換到初始狀態(tài)0
}
else
{
Key_Time++;
if(++Key_Time>=100&&++Key_Time<500) //按鍵按下的時(shí)間計(jì)數(shù)
{
Key_State=Key_State_4; //按鍵按下的時(shí)間大于6S,狀態(tài)切換到計(jì)時(shí)狀態(tài)4
Key_Time=0;
Key_Return=4; //按鍵的狀態(tài)返回值輸出“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;
}
}
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1