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