×
单片机 > 单片机程序设计 > 详情

51单片机-步进电机-舵机

发布时间:2020-08-21 发布时间:
|

1.文件

文件下载地址

https://download.csdn.net/download/weixin_43130546/12188429


2.电机分类

驱动类电机——如:四驱车马达

控制类电机

反应式步进电机——性能差,已被淘汰

永磁式步进电机——广泛用于消费产品

如: 28BYJ-48 (4相永磁式步进电机)

混合式步进电机——主要用于工业


3.电机工作模式

单四拍

双四拍

八拍


4.说明

P1_0-P1_4控制电机

按键上正转

按键下反转

按键1-9转相应的圈数

按键左反转90

案件右正转90

ESC暂停


5.代码

#include


sbit KEYOUT1 = P3^0;

sbit KEYOUT2 = P3^1;

sbit KEYOUT3 = P3^2;

sbit KEYOUT4 = P3^3;

sbit KEYIN1 = P3^4;

sbit KEYIN2 = P3^5;

sbit KEYIN3 = P3^6;

sbit KEYIN4 = P3^7;


unsigned char code KeyCodeMap[4][4] = 

{

{0x31,0x32,0x33,0x26},

{0x34,0x35,0x36,0x25},

{0x37,0x38,0x39,0x28},

{0x30,0x1B,0x0D,0x27}

};


unsigned char KeyStay[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};


long beats = 0;


void ConfigTimer0(void);

void KeyDriver(void);


void main(void)

{

ConfigTimer0();

while(1)

{

KeyDriver();

}

}


void ConfigTimer0(void)

{

TH0 = 0xFC;

TL0 = 0x67;

EA = 1;

ET0 = 1;

TMOD &= 0xF0;

TMOD |= 0x01;

TF0 = 0;

TR0 = 1;

}


void MotorStart(long angle)

{

EA = 0;

beats = (angle * 4076) / 360;

EA = 1;

}


void MotorStop(void)

{

EA = 0;

beats = 0;

EA = 1;

}


void KeyAction(unsigned char KeyCode)

{

static bit MotorDir = 0;


if((KeyCode>=0x30) && (KeyCode<=0x39))

{

if(0 == MotorDir)

{

MotorStart(360 * (KeyCode - 0x30));

}

else

{

MotorStart(-360 * (KeyCode - 0x30));

}

}

else if(0x26 == KeyCode)

{

MotorDir = 0;

}

else if(0x28 == KeyCode)

{

MotorDir = 1;

}

else if(0x25 == KeyCode)

{

MotorStart(90);

}

else if(0x27 == KeyCode)

{

MotorStart(-90);

}

else if(0x1B == KeyCode)

{

MotorStop();

}

}


void KeyDriver(void)

{

unsigned char i,j;

static unsigned char KeyBack[4][4] = 

{

{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}

};


for(i=0; i<4; i++)

{

for(j=0; j<4; j++)

{

if(KeyStay[i][j] != KeyBack[i][j])

{

if(0 == KeyBack[i][j])

{

KeyAction(KeyCodeMap[i][j]);

}

KeyBack[i][j] = KeyStay[i][j];

}

}

}

}


void KeyScan(void)

{

unsigned char i;

static unsigned char KeyOut = 0;

static unsigned char KeyBuff[4][4] = 

{

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF},

{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF}

};


KeyBuff[KeyOut][0] = (KeyBuff[KeyOut][0] <<1) | KEYIN1;

KeyBuff[KeyOut][1] = (KeyBuff[KeyOut][1] <<1) | KEYIN2;

KeyBuff[KeyOut][2] = (KeyBuff[KeyOut][2] <<1) | KEYIN3;

KeyBuff[KeyOut][3] = (KeyBuff[KeyOut][3] <<1) | KEYIN4;


for(i=0; i<4; i++)

{

if(0xF0 == KeyBuff[KeyOut][i])

{

KeyStay[KeyOut][i] = 0;

}

else if(0xFF == KeyBuff[KeyOut][i])

{

KeyStay[KeyOut][i] = 1;

}

}


KeyOut++;

KeyOut &= 0x3;


switch(KeyOut)

{

case 0 : KEYOUT4 = 1; KEYOUT1 = 0; break;

case 1 : KEYOUT1 = 1; KEYOUT2 = 0; break;

case 2 : KEYOUT2 = 1; KEYOUT3 = 0; break;

case 3 : KEYOUT3 = 1; KEYOUT4 = 0; break;

default : break;

}

}


void MotorTurn(void)

{

unsigned char tmp;

static unsigned char index = 0;  

unsigned char code MotorCode[8] = 

{

0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6

};


if(0 != beats)

{

if(beats > 0)

{

index++;

index &= 0x07;

beats--;

}

else

{

index--;

index &= 0x07; //????????????????????

beats++;

}

tmp = P1;

tmp &= 0xF0;

tmp |= MotorCode[index];

P1 = tmp;

}

else

{

P1 |= 0x0F;

}

}


void InterruptTimer0(void) interrupt 1

{

static bit div = 0;


TH0 = 0xFC;

TL0 = 0x67;


KeyScan();

div = ~div;

if(1 == div)

{

MotorTurn();

}

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单