51单片机资源吧 关注:46贴子:236
  • 0回复贴,共1

步进电机(正反,停止,速度,4数码管,矩阵键盘)

只看楼主收藏回复

步进电机控制系统设计,proteus与keil
1、硬件包含正转、反转、停止控制;
2、用矩阵键盘设定电机目标转速及旋转方向,范围100~200转/分;
3、测量、显示电机实际转速和方向(正转显示“S”,反转显示“N”)

#include "reg51.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 smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
uchar code smgduan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar flag=0,fang=0;//方向控制
uint speed=100,time=0,set=0;//速度控制
uchar start=0;//启动
uchar sec=0;
uchar key=0;
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
switch(P1)//检测行
{
case 0x0e:i=3;break;
case 0x0d:i=2;break;
case 0x0b:i=1;break;
case 0x07:i=0;
}
P1=0xf0;
switch(P1)//检测列
{
case 0xe0:j=13;break;
case 0xd0:j=9;break;
case 0xb0:j=5;break;
case 0x70:j=1;break;
default:i=0;j=0;
}
}
if(key!=i+j)
{
key=i+j;
return key;
}
else
return 0;
}
//延时
void delay(uint i)
{
while(i--);
}
//计算
void jisuan()
{
set=60000/8/speed;
}
//主函数
void main()
{
uchar i=0;
TMOD|=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
jisuan();
while(1)
{
//显示
if(fang==0)
P0=0x12;
else
P0=0x2b;
smg1=1;delay(100);smg1=0;
P0=smgduan[speed/100];
smg2=1;delay(100);smg2=0;
P0=smgduan[speed%100/10];
smg3=1;delay(100);smg3=0;
P0=smgduan[speed%10];
smg4=1;delay(100);smg4=0;
//按键检测
i=key_scan();
if(i==11)//启动
{
start=1;
if(speed>200)
speed=200;
if(speed<100)
speed=100;
jisuan();
}
if(i==12)//停止
{
start=0;
}
if(i==13)//正转
{
fang=0;
}
if(i==14)//反转
{
fang=1;
}
if(start==0)
{
if((i>0)&&(i<11))
{
speed=speed%100*10+i-1;
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(start==1)//启动
{
if(time<set)//速度
{
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;
}
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;
}
}
}
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}


IP属地:湖北1楼2026-01-07 12:06回复