版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
0.原理图
1.稳压电路
输出4.75~5.25V电压,最大输出电流为1.5A,当输出电流较大时,7805应加散热板。
2.单片机电路
参考:传送门
3.电机驱动电路
采用L298驱动芯片和四个续流二极管控制电机转速和方向。
4.按键功能及LED电路
通过LED亮灭区别功能是否实现。
5.程序代码
#include<reg52.h>
#include"intrins.h"
sbit K1 = P1^5;
sbit K2 = P1^6;
sbit K3 = P1^7;
sbit K4 = P3^7;
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码
uchar code REV[8] = {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //四相八拍反相编码
uint count = 0;
uint Temp_Count;
uint i;
uint n = 0;
uchar K1_flag,K2_flag,K3_flag;
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0;k<125;k++);
}
}
void delay5us(uint n) //@12.000MHz
{
uint j;
for(j=0;j<n;j++)
{
_nop_();
_nop_();
}
}
/* 电机正转 */
void motor_forword(void)
{
for(i=0;i<4;i++)
for(Temp_Count=0;Temp_Count<8;Temp_Count++)
{
P1 = FFW[Temp_Count];
delay5us(n);
}
P1 = 0xf0;
}
/* 电机反转 */
void motor_back(void)
{
for(i=0;i<4;i++)
for(Temp_Count=0;Temp_Count<8;Temp_Count++)
{
P1 = REV[Temp_Count];
delay5us(n);
}
P1 = 0xf0;
}
/* 按键扫描 */
void Key_Scan(void)
{
if(K1==0)
{
K1_flag = 1;
K2_falg = K3_flag = 0;
n = 60;
}
if(K2==0)
{
K2_flag = 1;
K1_falg = K3_flag = 0;
n = 100;
}
if(K3==0)
{
K3_flag = 1;
K2_falg = K1_flag = 0;
n = 200;
}
}
/* 主函数 */
void main(void)
{
while(1)
{
Key_Scan();
motor_forword();
delay5us(1000);
motor_back();
}
}