找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3022|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC12C5A60S2片內(nèi)PWM按鍵控制直流電機(jī)正轉(zhuǎn)、反轉(zhuǎn)、加減速源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:785043 發(fā)表于 2020-11-24 09:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STC12C5A60S2單片機(jī)控制直流電機(jī),可以進(jìn)行正轉(zhuǎn)、反轉(zhuǎn)和相應(yīng)的加減速,親測(cè)有效。
程序源碼如下:
#include "STC12C5A60S2.h"

#define uint unsigned int
#define uchar unsigned char  


sbit forward_up=P3^5; //正轉(zhuǎn)加速
sbit forward_down=P3^4; //正轉(zhuǎn)減速
sbit reversal_up=P3^3;//反轉(zhuǎn)加速
sbit reversal_down=P3^2;//反轉(zhuǎn)減速
sbit In1=P0^0;
sbit In2=P0^1;
sbit In3=P0^2;
sbit In4=P0^3;

void DelayMs(uchar ms);  
void init_PWM(); //PWM 初始化
void PWM0_change(uchar type,uchar change);//PWM調(diào)整函數(shù)
void PWM0_set(uchar empty);//直接賦PWM的值
void turnback();//反轉(zhuǎn)
void run();//正轉(zhuǎn)
void stop();//停止
//stc10f系列 單周期指令的ms級(jí)延時(shí)
void DelayMs(uchar ms) //這個(gè)延時(shí)可能不對(duì),非關(guān)鍵部分,可自己修改
{        
        uint i;  while(ms--)  
        {     
                for(i = 0; i < 850; i++);
         }
}
void init_PWM()
{     
        CCON=0X00;   
         CH=0;   
         CL=0;
//時(shí)鐘分頻也就是輸出的頻率。 0X00:以系統(tǒng)時(shí)鐘/12 為時(shí)鐘源,0X02:系統(tǒng)時(shí)鐘/2,0x08:系統(tǒng)時(shí)鐘     
        CMOD=0X02;      
//起始占空比,0XC0:占空比為25%,0X80:占空比為50%,0X40:占空比為75%   
        PWM0_set(0XC0); // (與CL比較,當(dāng)CL<CCAP0L時(shí)輸出低電平,反之高電平)
        PCA_PWM1=0x00;
        PCA_PWM0=0x00; //控制占空比的第九位為0   
//0X42:8位PWM P1.3輸出, P1.4輸出,無(wú)中斷;0X53:8位PWM輸出,下降沿產(chǎn)生中斷;
//0X63:上升沿產(chǎn)生中斷;0X73:跳變沿產(chǎn)生中斷
        CCAPM0=0X42;  
        CCAPM1=0X42;
         CR=1;          //計(jì)時(shí)器開(kāi)始工作
}
void PWM0_set(uchar empty)  //直接設(shè)置占空比
{      
        CCAP0L=empty;   
        CCAP0H=empty;
        CCAP1L=empty;   
        CCAP1H=empty;
}
//占空比調(diào)節(jié)函數(shù)
void PWM0_change(uchar type,uchar change) //type=0減占空比,1增加占空比         
//change: 0X0C 約5%,0X05約2%
{         
        if(type==0)   
         {      
                 if(CCAP0L<0XE6)   //<90%   
                {      
                         CCAP0L+=change;     
                          CCAP0H+=change;  
                        CCAP1L+=change;     
                          CCAP1H+=change;
                  }           
         }   
else   
{   
          if(CCAP0L>0X19)  //>10%      
        {      
                 CCAP0L-=change;     
                  CCAP0H-=change;  
                CCAP1L-=change;     
                  CCAP1H-=change;
         }         
}

}

void main()
{   
         init_PWM();      //初始化,PWM輸出  
          while(1)   
          {  

          if(forward_up==0) //按鍵加PWM占空比
                  {   
                            DelayMs(500);  //按鍵消抖   
                           while(forward_up==0); //按鍵釋放才跳出執(zhí)行下一步   
                         PWM0_change(1,0X0c); //change: 0X0C 約5%,0X05約2%
                         run();                              
                  }   
                  if(forward_down==0)//按鍵減PWM占空比
                  {   
                           DelayMs(500);  
                     while(forward_down==0);   
                         PWM0_change(0,0X0c); //change: 0X0C 約5%,0X05約2%  
                         run();
                  }
                  if(reversal_up==0) //按鍵加PWM占空比
                  {   
                            DelayMs(500);  //按鍵消抖   
                           while(reversal_up==0); //按鍵釋放才跳出執(zhí)行下一步   
                         PWM0_change(1,0X0c); //change: 0X0C 約5%,0X05約2%
                         turnback();                              
                  }   
                  if(reversal_down==0)//按鍵減PWM占空比
                  {   
                           DelayMs(500);  
                     while(reversal_down==0);   
                         PWM0_change(0,0X0c); //change: 0X0C 約5%,0X05約2%  
                         turnback();                                                                        
                   }                                                                                
           }
}



void turnback()   
{

     In1=0;In2=1;In3=0;In4=1;   
}

void run()   
{

     In1=1;In2=0;In3=1;In4=0;   
}

void stop()   
{
     In1=1;In2=1;In3=1;In4=1;   
}

全部程序51hei下載地址:
PWM直流電機(jī)調(diào)速.rar (28.62 KB, 下載次數(shù): 63)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表