概述
之前在大学实验课上做过的一个设计题目,使用单片机AT89S52 / AT89C51控制直流电机进行高/低速正/反转,另有红、黄、绿LED灯指示电机状态,具体实现功能如下:
打开电源1s后:
电机高速正传5s,
暂停1s,
电机高速反转5s,
暂停1s
电机低速正传10s,
暂停1s,
电机低速反转10s,
暂停1s
电机高速正传5s,
暂停1s,
电机高速反转5s,
电机停转,搅拌结束。
思路与元器件选用
- 使用AT89S52最小系统,通过keil编写C语言代码,3个端口控制指示灯,1个端口控制电机开/关,1个端口控制电机正/反转
- 接入三极管放大电流,达到驱动电机的目的
- 采用继电器实现H桥控制,完成开/关和正/反转
- PWM调速,实现高/低速运转
电路图
使用proteus绘制,如图
代码实现
```c
//声明:未使用太多的子函数,直接码在主函数上了
#include <reg51.h> //导入8051特殊功能寄存器定义及其可寻址位定义sbit led_green = P1^0; //定义 变量led_green 控制P1.0引脚
sbit led_yellow = P1^1; //定义 变量led_yellow 控制P1.1引脚
sbit led_red = P1^2; //定义 变量led_red 控制P1.2引脚
sbit Direction = P1^3; //定义 变量Direction (电机正/反转)控制P1.3引脚
sbit OnOff = P1^4; //定义 变量OnOff(电机开/关)控制P1.4引脚
unsigned int i,j;
/*
ms级延时函数 delayMS,12MHz晶振,用于等待
参数:ms,i,j 返回值:无
*/
void delayMS(unsigned int ms)
{unsigned int i,j;for(i=0;i<ms;i++) for(j=0;j<150;j++);
}/*
电机低速函数 LowSpeed
参数: 返回值:无
*/
void LowSpeed()
{OnOff = 1;delayMS(100); //方波信号,占空比50%,周期200msOnOff = 0;delayMS(100);
}void LowSpeedL() //低速正转10s
{led_red = 1;led_yellow = 1;for(j=0;j<5;j++){led_green = 0; for(i=0;i<5;i++){LowSpeed();}led_green = 1;for(i=0;i<5;i++){LowSpeed();}}
}void LowSpeedR() //低速反转10s
{led_green = 1;led_yellow = 1;for(j=0;j<5;j++){led_red = 0; for(i=0;i<5;i++){LowSpeed();}led_red = 1;for(i=0;i<5;i++){LowSpeed();}}
}/*
暂停灯效函数 PauseLight ,1s 4下闪烁
参数: 返回值:无
*/
void PauseLight()
{led_green = 1; led_red = 1;led_yellow = 0;delayMS(250);led_yellow = 1;delayMS(250); led_yellow = 0;delayMS(250);led_yellow = 1;delayMS(250);
}/*
主函数,调用其他子函数实现功能
*/
void main()
{led_green = 0; //绿灯亮led_yellow = 0;//黄灯亮led_red = 0; //红灯亮OnOff = 0;delayMS(1000); //打开电源1s后:OnOff = 1; //接通电机,高速Direction = 0; //正转led_green = 0; //仅绿灯亮led_yellow = 1;led_red = 1; delayMS(5000); //电机高速正转5sOnOff = 0; //中断电机PauseLight(); //暂停1sOnOff = 1; //接通电机,高速Direction = 1; //反转led_green = 1; //仅红灯亮led_yellow = 1;led_red = 0;delayMS(5000); //电机高速反转5sOnOff = 0; //中断电机PauseLight(); //暂停1sDirection = 0; //正转LowSpeedL(); //低速正转10sOnOff = 0; //中断电机PauseLight(); //暂停1sDirection = 1; //反转LowSpeedR(); //低速反转10sOnOff = 0; //中断电机PauseLight(); //暂停1sOnOff = 1; //接通电机,高速Direction = 0; //正转led_green = 0; //仅绿灯亮led_yellow = 1;led_red = 1; delayMS(5000); //电机高速正转5sOnOff = 0; //中断电机PauseLight(); //暂停1sOnOff = 1; //接通电机,高速Direction = 1; //反转led_green = 1; //仅红灯亮led_yellow = 1;led_red = 0;delayMS(5000); //电机高速反转5sOnOff = 0;Direction = 0; //停转
}
结语
本文或有瑕疵,见谅