第9章-步進電機與蜂鳴器(上:步進電機)
總結:外面步進電機轉(zhuǎn)1圈,對應單片機發(fā)4096次信號
把轉(zhuǎn)幾圈的度數(shù)轉(zhuǎn)換成單片機發(fā)幾次信號,逆時針轉(zhuǎn)對應那個數(shù)組從0-7依次發(fā)
順時針轉(zhuǎn)對應那個數(shù)組從7-0依次發(fā)
發(fā)送頻率是500,2ms發(fā)一次,發(fā)太快可能不轉(zhuǎn).
一個引腳的輸出有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;
//正角度是逆時針轉(zhuǎn),負角度是順時針轉(zhuǎn)
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();
}