STC15W408AS單片機6按鍵控制2步進電機采用TB6600驅動源程式
程式源碼來源于:51黑電子論壇
- 程式設計環境keil,自行建立項目,添加main.c,将代碼拷貝進去即可
- *主要晶片:
STC15W408AS
- 程式源碼:
#include<reg52.h>
//電機1控制引腳 ******晶片:STC15W408AS*****
sbit CLK = P1^0;
sbit ENA = P1^1;
sbit DIR = P1^2;
//電機2控制引腳
sbit CLK1 = P1^3;
sbit ENA1 = P1^4;
sbit DIR1 = P1^5;
//按鍵控制端
sbit UP = P3^2; //電機1正轉
sbit DWN = P3^3; //電機1反轉
sbit LFT = P3^4; //電機2正轉
sbit RHT = P3^5; //電機2反正
sbit SET = P3^6; //加速
sbit RST = P3^7; //減速
unsigned int Tspeed[10]={30,40,60,80,100,200,400,600,800,1000}; //調速等級表
bit CY_status=0;
unsigned int CYCLE=20;
unsigned int cy_count=0;
unsigned PWM_count=0;
void Init_time();
void Key_scan();
void main()
{
ENA=0;
CLK=0;
DIR=0;
ENA1=0;
CLK1=0;
DIR1=0; //初始化電機
Init_time(); //初始化定時器
while(1)
{
Key_scan();
}
}
void Init_time() //初始化定時器
{
TMOD |= 0x01;
TH0=(65536-CYCLE)/256; //給time0裝初值
TL0=(65536-CYCLE)%256;
IE = 0x82; //使得time1的優先級高于time0
TR0=1; //打開中斷
}
void Enter_Timer0() interrupt 1 //進入定時器中斷
{
TH0=(65536-CYCLE)/256;
TL0=(65536-CYCLE)%256;
CLK=~CLK;
CLK1=~CLK1;
PWM_count++;
if(PWM_count==(2*cy_count)&&CY_status)
{
PWM_count=0;
TR0=0;
ENA=0;
ENA1=0;
}
}
/************************按鍵掃描程式************************
功能:讀取各按鍵值,判斷是否按下,再處理相應事件
注:按鍵控制程式,由于按鍵中斷優先級高,且每個按鍵都設計
為彈起有效, 是以長時間按住不放會導緻電機減速甚至停
止直至放開按鍵
*************************************************************/
void Key_scan()
{
static char i=0;
if(UP==0) //電機1正反轉切換
{
if(UP==0)
{
DIR=1;
ENA=1; //啟動電機
TR0=1; //開啟中斷産生脈沖信号
while(!UP); //按鍵按下直到放開
ENA=0; //關閉電機
TR0=0; //關閉中斷停止脈沖信号
CY_status=0; //重新整理步進标志位
}
}
if(DWN==0)
{
if(DWN==0)
{
DIR=0;
ENA=1; //啟動電機
TR0=1; //開啟中斷産生脈沖信号
while(!DWN); //按鍵按下直到放開
ENA=0; //關閉電機
TR0=0; //關閉中斷停止脈沖信号
CY_status=0; //重新整理步進标志位
}
}
if(LFT==0) //電機2正反轉切換
{
if(LFT==0)
{
DIR1=1;
ENA1=1; //啟動電機
TR0=1; //開啟中斷産生脈沖信号
while(!LFT);
ENA1=0; //關閉電機
TR0=0; //關閉中斷停止脈沖信号
CY_status=0; //重新整理步進标志位
}
}
if(RHT==0)
{
if(RHT==0)
{
DIR1=0;
ENA1=1; //啟動電機
TR0=1; //開啟中斷産生脈沖信号
while(!RHT);
ENA1=0; //關閉電機
TR0=0; //關閉中斷停止脈沖信号
CY_status=0; //重新整理步進标志位
}
}
if(SET==0) //加速
{
if(SET==0)
{
while(!SET);
i--;
if(i<1)
i=0;
CYCLE=Tspeed[i];
}
}
if(RST==0) //減速
{
if(RST==0)
{
while(!RST);
i++;
if(i>10)
i=10;
CYCLE=Tspeed[i];
}
}
}