|
以下是步進(jìn)電機的驅(qū)動原碼,實現(xiàn)正轉(zhuǎn)反轉(zhuǎn),根據(jù)按鍵控制圈數(shù)
#include <reg52.h>
sfr P4 = 0xE8;
void KeyDriver();
void KeyScan();
signed long beats = 0; //電機轉(zhuǎn)動節(jié)拍總數(shù)
/* 步進(jìn)電機啟動函數(shù), angle-需轉(zhuǎn)過的角度 */
void StartMotor(signed long angle)
{
//在計算前關(guān)閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤
EA = 0;
beats = (angle * 4076) / 360; //實測為 4076 拍轉(zhuǎn)動一圈
EA = 1;
}
/* 步進(jìn)電機停止函數(shù) */
void StopMotor()
{
EA = 0;
beats = 0;
EA = 1;
}
/* 電機轉(zhuǎn)動控制函數(shù) */
void TurnMotor()
{
unsigned char tmp; //臨時變量
static unsigned char index = 0; //節(jié)拍輸出索引
unsigned char code BeatCode[8] = { //步進(jìn)電機節(jié)拍對應(yīng)的 IO 控制代碼
0x6,0x7,0x3,0xb,0x9,0xd,0xc,0xe
};
if (beats != 0) //節(jié)拍數(shù)不為 0 則產(chǎn)生一個驅(qū)動節(jié)拍
{
if (beats > 0) //節(jié)拍數(shù)大于 0 時正轉(zhuǎn)
{
index++; //正轉(zhuǎn)時節(jié)拍輸出索引遞增
index = index & 0x07; //用&操作實現(xiàn)到 8 歸零
beats--; //正轉(zhuǎn)時節(jié)拍計數(shù)遞減
}
else //節(jié)拍數(shù)小于 0 時反轉(zhuǎn)
{
index--; //反轉(zhuǎn)時節(jié)拍輸出索引遞減
index = index & 0x07; //用&操作同樣可以實現(xiàn)到-1 時歸 7
beats++; //反轉(zhuǎn)時節(jié)拍計數(shù)遞增
}
tmp = P4; //用 tmp 把 P4 口當(dāng)前值暫存
tmp = tmp & 0xF0; //用&操作清零低 4 位
tmp = tmp | BeatCode[index]; //用|操作把節(jié)拍代碼寫到低 4 位
P4 = tmp; //把低 4 位的節(jié)拍代碼和高 4 位的原值送回 P1
}
else //節(jié)拍數(shù)為 0 則關(guān)閉電機所有的相
{
P4 = P4 | 0xff;
}
}
|
評分
-
查看全部評分
|