基于51单片机的步进电机(顺时针、逆时针、加速、减速旋转)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的步进电机(原理图+代码+仿真)
完成步进电机的驱动顺时针旋转设计,并通过led指示
扩展:能够通过按键完成顺时针、逆时针、加速、减速旋转设计
并显示转速(LED显示)
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit AA=P2^4;//步进电机
sbit BB=P2^5;
sbit CC=P2^6;
sbit DD=P2^7;
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 smg1=P2^0;//数码管引脚
sbit smg2=P2^1;
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar flag=0,fang=0;//方向控制
uchar speed=0,time=0;//速度控制0-9
uchar start=0;//启动
uchar sec=0;
//延时
void delay(uint i)
{
while(i--);
}
//主函数
void main()
{
uchar k=0;
P3=0xfe;
TMOD|=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//按键检测
if(!k1)//启动
{
start=1;
}
if(!k2)//停止
{
start=0;
}
if(!k3)//正转
{
fang=0;
}
if(!k4)//反转
{
fang=1;
}
if(!k5 &&(k!=5))//加速
{
if(speed<10)
speed++;
k=5;
}
if(!k6 &&(k!=6))//减速
{
if(speed>0)
speed--;
k=6;
}
if(k5 && k6)
k=0;
//显示
P0=smgduan0[speed/10];smg1=0;delay(100);smg1=1;
P0=smgduan0[speed%10];smg2=0;delay(100);smg2=1;
}
}
//定时器中断
void Timer0() interrupt 1
{
if(start==1)//启动
{
if(time<10-speed)//速度0-9
{
time++;
}
else
{
time=0;
if(fang==0) //正转
{
switch(flag)
{
case 0:BB=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:BB=0;break;
case 4:DD=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:DD=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
P3=_cror_(P3,1);//led右移
}
}
else //反转
{
switch(flag)
{
case 0:DD=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:DD=0;break;
case 4:BB=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:BB=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
P3=_crol_(P3,1);//led左移
}
}
}
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}