14-基于单片机的电动阀门步进电机控制器设计(串口控制、手动控制,多角度控制、正转、反转、加速、减速、故障检测)proteus、原理图、源代码、仿真工程、物料清单
功能描述:
使用STC89C52实现电动门、步进电机的多功能控制。两种控制方式:方式一:模式1直接控制,通过串口或者按键控制步进电机的速度、启动或停止。方式二:多角度控制,输入M切换至模式2,按下Y-P等字符控制不同角度然后输入Q启动开始旋转控制。
1、速度控制
2、正转、反转、加速、减速、启动、停止
3、串口控制转速与状态
4、故障检测、报警
5、按键控制人机交互设置系统的各项功能参数
有哪些资料:
1、源代码KEIL4
2、仿真工程文件
3、原理图工程文件
4、物料清单EXCEL
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0; //1602数据/命令选择引脚 H:数据 L:命令
sbit rw=P2^1; //1602读写引脚 H:数据寄存器 L:指令寄存器
sbit e =P2^2; //1602使能引脚 下降沿触发
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit led = P3^6;
sbit beep=P3^7;//蜂鸣器
sbit AA=P2^3;//步进电机
sbit BB=P2^4;
sbit CC=P2^5;
sbit DD=P2^6;
uchar hang[]="speed:00 Ang:000";//速度
uchar speed=45;//速度
uchar time=0,flag=0,fang=0,start=0;//电机控制
uchar sec=0;//显示定时
uint step=80,step_set=80;
uint angle = 0,realangle = 0,moshi1jishu=0;
uchar moshi=1;
uchar xststep;
void delay_uint(uint i)
{
while(i--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(20);
e=1;
delay_uint(20);
e=0;
}
/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/********************************************************************
* 名称 : init_1602()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void init_1602()
{
write_com(0x38); //数据总线为8位,显示2行,5x7点阵
write_com(0x0e); //开显示,有光标,光标闪烁
write_com(0x06); //光标自动右移
delay_uint(1000); //等待设置完成
}
void com_fa(uchar *p)//发送
{
ES=0;
while(*p!='\0')
{
SBUF=*p;
while(!TI);
TI=0;
p++;
}
RI=0;
ES=1;
}
void main()
{
init_1602();
SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器工作方式2
TH1=0XFD; //9600
TL1=0XFD;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
TH0=0XD8;
TL0=0XF0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{