?文章來源地址http://www.zghlxwxcb.cn/news/detail-518351.html
一、設(shè)計(jì)目標(biāo)
? ? 設(shè)計(jì)程序?qū)崿F(xiàn)按鍵控制步進(jìn)電機(jī)啟動(dòng)、停機(jī)、正反轉(zhuǎn)、加減速、轉(zhuǎn)速及轉(zhuǎn)向顯示。
二、主要功能
? ? 功能1:步進(jìn)電機(jī)的啟動(dòng)、重啟、停機(jī);
? ? 功能2:步進(jìn)電機(jī)正反裝;
? ? 功能3:靜態(tài)數(shù)碼管顯示速度等級(jí);
? ? 功能4:步進(jìn)電機(jī)的加減速;
三、硬件部分
? ? 51單片機(jī),導(dǎo)線,5161BS靜態(tài)數(shù)碼管,獨(dú)立按鍵,四線雙極性步進(jìn)電機(jī)。
?文章來源:http://www.zghlxwxcb.cn/news/detail-518351.html
圖1
???圖2
圖3
圖4
圖5
?
?圖6
?
? ? 圖1為單片機(jī)接線圖;
? ? 圖2為靜態(tài)數(shù)碼管的內(nèi)部電路圖;
? ? 圖3為控制步進(jìn)電機(jī)的部分的內(nèi)部電路圖;
? ? 圖4為獨(dú)立按鍵設(shè)置;
? ? 圖5為四線雙極性步進(jìn)電機(jī)內(nèi)部原理圖;
? ? 圖6為步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的原理圖:
? ? ①A加正極,A-加負(fù)極,B加負(fù)極,B-加負(fù)極(電機(jī)狀態(tài),N極朝上)。
? ? ②A加負(fù)極,A-加負(fù)極,B加正極,B-加負(fù)極(電機(jī)狀態(tài),N極朝右,旋轉(zhuǎn)90度)。
? ? ③A加負(fù)極,A-加正極,B加負(fù)極,B-加負(fù)極(電機(jī)狀態(tài),N極朝下)。
? ? ④A加負(fù)極,A-加負(fù)極,B加負(fù)極,B-加正極(電機(jī)狀態(tài),N極朝左)。
? ? 只要依次給相應(yīng)引腳相應(yīng)的電平就可以使得電機(jī)轉(zhuǎn)動(dòng),轉(zhuǎn)動(dòng)的最小角度為90度。為了實(shí)現(xiàn)更加小角度的供電,本次設(shè)計(jì)中的供電順序:A、AB、B、BA-、A-、A-B-、B-、B-A,轉(zhuǎn)動(dòng)的最小角度為45°。
?
四、程序框圖
?
?
五、代碼說明
? ? 代碼由延時(shí)函數(shù)、按鍵掃描函數(shù)、模式判斷函數(shù)、中斷初始化函數(shù)、調(diào)速函數(shù)、主函數(shù)組成。
? ? 延時(shí)函數(shù)用于調(diào)節(jié)給電機(jī)供電的時(shí)間,從而實(shí)現(xiàn)調(diào)速。
? ? 按鍵掃描函數(shù)用來判斷哪個(gè)鍵被按下,從而實(shí)現(xiàn)對應(yīng)功能。
? ? 模式判斷函數(shù)根據(jù)按鍵掃描的返回值執(zhí)行相應(yīng)功能。
? ? 中斷初始化函數(shù)定義了兩個(gè)中斷。
? ? 調(diào)速函數(shù)通過兩個(gè)中斷函數(shù)實(shí)現(xiàn)電機(jī)轉(zhuǎn)動(dòng)的加減速。
? ? 主函數(shù)調(diào)用并執(zhí)行子函數(shù)。 ???
1.主函數(shù)
? ? 主函數(shù)聲明兩個(gè)中斷函數(shù),并進(jìn)入子程序的循環(huán),即先按鍵掃描,返回值再進(jìn)入模式判斷函數(shù)。?
?
/****************************主函數(shù)**********************************/
void main(void)
{
Int0Init();//聲明加速的中斷
Int1Init();//聲明減速的中斷
while(1)
{
mode(key());//先按鍵掃描,后選擇模式
}
}
聲明部分。定義順時(shí)針和逆時(shí)針轉(zhuǎn)動(dòng)時(shí)供電的順序,分別放到兩個(gè)數(shù)組里;定義數(shù)碼管顯示的供電;定義全局變量V用來調(diào)節(jié)轉(zhuǎn)速、全局變量D用來調(diào)節(jié)顯示的速度檔。
#include <REGX51.H>
unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//順時(shí)針數(shù)組
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆時(shí)針數(shù)組
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于顯示檔速
int V=500,D=1;//V在延時(shí)函數(shù)中,用于調(diào)速;D用來控制數(shù)碼管顯示的數(shù)字
int i=4;//先使電機(jī)處于停機(jī)狀態(tài)
int n=0;//用于循環(huán)給電機(jī)通電
?
2.子函數(shù)1
????延時(shí)函數(shù)用于調(diào)節(jié)給電機(jī)供電的時(shí)間,從而實(shí)現(xiàn)調(diào)速。
/***************************延時(shí)函數(shù)*******************************/
void delay(unsigned int t)//調(diào)節(jié)給電機(jī)供電的時(shí)間,從而調(diào)速
{
while(t--);
}
?
3.子函數(shù)2
? ? 按鍵掃描函數(shù)用來判斷哪個(gè)鍵被按下,從而實(shí)現(xiàn)對應(yīng)功能。
/***************************按鍵掃描***************************************/
int key()
{
if(P0_0==0) i=1;//順時(shí)針
if(P0_1==0) i=2;//逆時(shí)針
if(P0_2==0) i=3;//啟動(dòng)/回到初速度
if(P0_3==0) i=4;//停機(jī)
return i;
}
?
4.子函數(shù)3
? ? 模式判斷函數(shù)根據(jù)按鍵掃描的返回值執(zhí)行相應(yīng)功能。停機(jī)即不給電機(jī)供電并使數(shù)碼管顯示0。啟動(dòng)會(huì)首先給全局變量V賦值500保證一定的延時(shí),達(dá)到一定的轉(zhuǎn)速,并且速度檔先為1。正轉(zhuǎn)使用順時(shí)針數(shù)組內(nèi)規(guī)則供電,反轉(zhuǎn)使用逆時(shí)針數(shù)組內(nèi)規(guī)則供電,并根據(jù)全局變量D的值顯示速度檔。
/****************************模式判斷**************************************/
void mode(int i)//由按鍵掃描返回值判斷
{
switch(i)
{
/****************停機(jī)****************/
case 4:
P2=0X00;//不給電機(jī)供電
P1=~smg[0];//數(shù)碼管顯示0
break;
/****************啟動(dòng)/重啟****************/
case 3:
V=500;//啟動(dòng)的速度/初速度
D=1;//速度1檔,自動(dòng)進(jìn)入模式1
/****************模式1 正轉(zhuǎn)****************/
case 1:
while(1)
{
for(n=0;n<8;n++)//循環(huán)供電
{
P2=SSZ[n];//供電
delay(V);//延時(shí)
P1=~smg[D];//顯示速度檔
}
break;
}
break;
/****************模式2 反轉(zhuǎn)****************/
case 2:
while(1)
{
for(n=0;n<8;n++)//循環(huán)供電
{
P2=NSZ[n];//供電
delay(V);//延時(shí)
P1=~smg[D];//顯示速度檔
}
break;
}
break;
}
}
?
5.子函數(shù)4
? ? 中斷初始化函數(shù)定義兩個(gè)外部中斷從而實(shí)現(xiàn)控制電機(jī)的加速和減速。
/*************************中斷初始化*****************************/
void Int0Init()//加速
{
IT0=1;
EX0=1;
EA=1;
}
void Int1Init()//減速
{
IT1=1;
EX1=1;
EA=1;
}
?
6.子函數(shù)5
? ? 調(diào)速函數(shù)的實(shí)質(zhì)是兩個(gè)中斷函數(shù)。如果對應(yīng)按鍵按下,會(huì)使全局變量V加或減相應(yīng)值實(shí)現(xiàn)轉(zhuǎn)速的改變,同時(shí)全局變量D也會(huì)加或減1,從而改變數(shù)碼管顯示的速度檔。
/*************************調(diào)速函數(shù)****************************/
void Int0() interrupt 0 //加速
{
if(P3_2==0)//判斷加速鍵是否被按下
{
delay(2000);//消抖
if(P3_2==0)//消抖后再次判斷
{
V=V-50;//延時(shí)時(shí)間減少,所以速度增加
D=D+1;//速度檔加1
}
}
}
void Int1() interrupt 2 //減速
{
if(P3_3==0)//判斷減速鍵是否被按下
{
delay(2000);//消抖
if(P3_3==0)//消抖后再次判斷
{
V=V+50;//延時(shí)時(shí)間增加,所以速度減少
D=D-1;//速度檔減1
}
}
}
?六、結(jié)束語
? ? 本函數(shù)實(shí)現(xiàn)了步進(jìn)電機(jī)的基本控制,但是可拓展的地方還有很多,比如使用動(dòng)態(tài)數(shù)碼管顯示,使用LCD1602液晶顯示屏顯示均可。還可以通過計(jì)算延時(shí)函數(shù)的長短,計(jì)算出電機(jī)轉(zhuǎn)一圈的時(shí)間,從而計(jì)算轉(zhuǎn)速。另外還可以使用計(jì)數(shù)器來計(jì)算電機(jī)1s內(nèi)轉(zhuǎn)了多少圈,也可以用來計(jì)算轉(zhuǎn)速。留待后期開發(fā),還有很多可以探索的功能。
七、演示視頻
步進(jìn)電機(jī)視頻
八、源代碼
#include <REGX51.H>
unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//順時(shí)針數(shù)組
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆時(shí)針數(shù)組
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于顯示檔速
int V=500,D=1;//V在延時(shí)函數(shù)中,用于調(diào)速;D用來控制數(shù)碼管顯示的數(shù)字
int i=4;//先使電機(jī)處于停機(jī)狀態(tài)
int n=0;//用于循環(huán)給電機(jī)通電
/***************************延時(shí)函數(shù)*******************************/
void delay(unsigned int t)//調(diào)節(jié)給電機(jī)供電的時(shí)間,從而調(diào)速
{
while(t--);
}
/***************************按鍵掃描***************************************/
int key()
{
if(P0_0==0) i=1;//順時(shí)針
if(P0_1==0) i=2;//逆時(shí)針
if(P0_2==0) i=3;//啟動(dòng)/回到初速度
if(P0_3==0) i=4;//停機(jī)
return i;
}
/****************************模式判斷**************************************/
void mode(int i)//由按鍵掃描返回值判斷
{
switch(i)
{
/****************停機(jī)****************/
case 4:
P2=0X00;//不給電機(jī)供電
P1=~smg[0];//數(shù)碼管顯示0
break;
/****************啟動(dòng)/重啟****************/
case 3:
V=500;//啟動(dòng)的速度/初速度
D=1;//速度1檔,自動(dòng)進(jìn)入模式1
/****************模式1 正轉(zhuǎn)****************/
case 1:
while(1)
{
for(n=0;n<8;n++)//循環(huán)供電
{
P2=SSZ[n];//供電
delay(V);//延時(shí)
P1=~smg[D];//顯示速度檔
}
break;
}
break;
/****************模式2 反轉(zhuǎn)****************/
case 2:
while(1)
{
for(n=0;n<8;n++)//循環(huán)供電
{
P2=NSZ[n];//供電
delay(V);//延時(shí)
P1=~smg[D];//顯示速度檔
}
break;
}
break;
}
}
/*************************中斷初始化*****************************/
void Int0Init()//加速
{
IT0=1;
EX0=1;
EA=1;
}
void Int1Init()//減速
{
IT1=1;
EX1=1;
EA=1;
}
/*************************調(diào)速函數(shù)****************************/
void Int0() interrupt 0 //加速
{
if(P3_2==0)//判斷加速鍵是否被按下
{
delay(2000);//消抖
if(P3_2==0)//消抖后再次判斷
{
V=V-50;//延時(shí)時(shí)間減少,所以速度增加
D=D+1;//速度檔加1
}
}
}
void Int1() interrupt 2 //減速
{
if(P3_3==0)//判斷減速鍵是否被按下
{
delay(2000);//消抖
if(P3_3==0)//消抖后再次判斷
{
V=V+50;//延時(shí)時(shí)間增加,所以速度減少
D=D-1;//速度檔減1
}
}
}
/****************************主函數(shù)**********************************/
void main(void)
{
Int0Init();//聲明加速的中斷
Int1Init();//聲明減速的中斷
while(1)
{
mode(key());//先按鍵掃描,后選擇模式
}
}
?
?
?
?
?
到了這里,關(guān)于51單片機(jī)步進(jìn)電機(jī)全套資料(啟停+正反轉(zhuǎn)+加減速+顯示速度+中斷)【源程序+流程圖+接線圖+視頻+答辯報(bào)告】綜合設(shè)計(jì)首選的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!