欧美极品高清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