我用的是永磁式步进电机,不知道你用的是什么样的,我使用的这种,步进角比较大,步进电机都是一步步转的,转快了就看不出步进电机是一步步转了
而当是步进电机正转是按这样的顺序发送信号,abcd,反转是dcba
转多少圈,就是循环给步进电机发送信号,使用程序控制发送信号的次数,至于怎么控制只要知道接口函数什么的还是不难的。
如果还是不大明白,我倒是可以帮你看看程序
中断2,启动-停止切换(通过切换flag_status),显示状态。do-while是延时。中断1,计数器count增1,如果达到预设的数值tab[sp],计数器归零,标志flag置1。这个好像与速度有关。通过调整延时时间来调整速度。
中断0,读键盘。没有scan_key()的源代码,不知道里面有些什么操作。
while(1){...}循环是电机运转,flag_status是状态,1转动,0停止。
没有看到与正转反转有关的代码。也许在motor_cw_ccw()函数里面,这个就是电机动一下的函数。
原程序不完整,没有相应函数、变量的定义及意义说明。难以确切理解。
#include <reg52.h>sbit P0_0=P0^0
sbit P0_1=P0^1
unsigned char codes[2][8]={{0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}, //9,18,36,45,54,63,72,81度 顺时针
{0x0b,0x09,0x0d,0x0c,0x0e,0x06,0x07,0x03}} //9,18,36,45,54,63,72,81度 逆时针
unsigned char counts,flag,t
//度数,正/反转,速度控制
delay(unsigned char x) //延时
{
unsigned char i
for( i=0i<xi++)
}
main()
{
TMOD=0x01 //定时器初始化
TH0=(65536-5000)/256
TL0=(65536-5000)%256
EA=1
ET0=1
TR0=1
while(1)
{
if(P0_0==0) //判断正转按键是否按下
{
delay(5)
if(P0_0==0) flag=0 //判断是否真正按下
}
if(P0_1==0) //判断反转按键是否按下
{
delay(5)
if(P0_1==0) flag=1 //判断是否真正按下
}
}
}
void motor() interrupt 1
{
t++ //控制速度
if(t==8)
{
t=0
P1=codes[flag][counts] //转动
counts++
if (counts==8) counts=0 //角度重置
}
TF0=0 //重新计时
TH0=(65536-5000)/256
TL0=(65536-5000)%256
}