第9章-步进电机与蜂鸣器(上:步进电机)
总结:外面步进电机转1圈,对应单片机发4096次信号
把转几圈的度数转换成单片机发几次信号,逆时针转对应那个数组从0-7依次发
顺时针转对应那个数组从7-0依次发
发送频率是500,2ms发一次,发太快可能不转.
一个引脚的输出有2种情况
输出0(拉地)+输出高阻(旁观),,,或者,,,,输出0(拉地)+输出1(电源)






课后第4题,
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef signed char i8;
typedef signed int i16;
typedef signed long i32;
i32 beats = 0;
code u8 BeatCode[8] = {0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};
i32 anyAngle=180;
//正角度是逆时针转,负角度是顺时针转
void StartMotor(i32 angle)
{
EA=0;
beats=(angle*4096)/360;
EA=1;
}
void StopMotor()
{
EA=0;
beats=0;
EA=1;
}
void TrunMotor()
{
static u8 index=0;
u8 tmp;
if(beats)
{
if(beats>0)
{
beats--;
index++;
index&=0x07;
}else
{
beats++;
index--;
index&=0x07;
}
tmp=P1;
tmp&=0xF0;
tmp|=BeatCode[index];
P1=tmp;
}else
{
P1|=0x0F;
}
}
void main(void)
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
ET0 = EA = TR0 = 1;
StartMotor(anyAngle);
while (1)
{
;
}
}
void Timer0_ISR()interrupt 1
{
TH0=0xFC;
TL0=0x66;
TrunMotor();
}

