51单片机28BYJ-48驱动步进电机程序

/*=============================================================*/
//主文件
//时间:2019-10-18
//编写者:pandy
/*==============================================================*/
#include "motor.h"
#include "stanhard.h"

void main()
{
	uchar num;
	init();
	while(1)
	{
		if(k1==0)
		{
			buzzer();
		    for(num=0;num<512;num++)
			{
				if(k3==0)
				{
					buzzer();
					break;
				}	
				cw_motor();
			}
		}
		if(k2==0)
		{
			buzzer();
			for(num=0;num<64;num++)
			{
				if(k3==0)
				{
					buzzer();
					break;
				}	
				ccw_motor();
			}
		 }
	    MotorContrlPort=0;
	}
}

步进驱动源文件
motor.c

/*=============================================================*/
//步进电机控制源文件
//时间:2019-10-18
//编写者:pandy
/*==============================================================*/
#include "stanhard.h"
#include "motor.h"


uchar ccw[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //反转
uchar cw[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正传
uchar code ducode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义段码
uchar code wecode[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//定位段码

uchar tempdata[8],speed=10;

void delay(uchar z) //延时1ms
{
	uchar i,j;
	for(i=z;i>0;i--)
	for(j=110;j>0;j--);
}

void delay500us(void) //延时500us
{
  int i;
  for(i=0;i<58;i++);
}

void buzzer()  //产生报警音
{
	uchar t;
    for(t=0;t<100;t++)
    {
	 	 delay500us();
	 	 alarm=!alarm;   //产生脉冲
    }
    alarm=1;    //关闭蜂鸣器
}

void ccw_motor()//反转子程序
{
	uchar i;
	for(i=0;i<8;i++)//旋转一周   内部旋转一周
	{
		for(i=0;i<8;i++)
		{
			MotorContrlPort=ccw[i];
			delay(speed);
		}
	}
}

void cw_motor()//正转子程序
{
	uchar i;
	for(i=0;i<8;i++)//旋转一周   内部旋转一周
	{
		for(i=0;i<8;i++)
		{
			MotorContrlPort=cw[i];
			delay(speed);
		}
	}
}

void diaplay(uchar first,uchar num) //LED 显示函数
{
	static uchar i;

	P0=0xff;
	wela=1;
	wela=0;
	
	P0=wecode[i+first];
	wela=1;
	wela=0;	
	
	P0=tempdata[i];
	dula=1;
	dula=0;
	
	i++;
	if(i==num)
	{
		i=0;
	}		
}

void init()//定时器1、2初始化函数
{
	TMOD|=0X11;
	TH0=(65536-2000)/256;
	TL0=(65536-2000)%256;
	TH1=(65536-1000)/256;
	TL1=(65536-1000)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	PT0=1; //边沿触发  如不设置 LED显示时会跳动
}



void timer0() interrupt 1//定时器1
{	
	TH0=(65536-2000)/256; //延时2ms
	TL0=(65536-2000)%256;
	tempdata[0]=ducode[speed%10];
	tempdata[1]=ducode[speed/10];
	diaplay(0,2);	
}

void timer1() interrupt 3//定时器2
{	
	TH1=(65536-1000)/256; //延时1ms
	TL1=(65536-1000)%256;
	if(k4==0)
    {
   		delay(5);
		if(k4==0)
		speed++;	
    }
    while(k4==0);

    if(k5==0)
    {
   		delay(5);
		if(k5==0)
		{
			if(speed>2)
			speed--;
		}	
    }
    while(k5==0);
}

驱动头文件
motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__
#include
#include
#include "stanhard.h"

#define MotorContrlPort  P1  //定义控制步进电机口

sbit k1=P2^0;//正转键
sbit k2=P2^1;//反转键
sbit k3=P2^2;//停止按键
sbit k4=P2^3;//加按键
sbit k5=P2^4;//减按键
sbit dula=P2^5;//定义段码位
sbit wela=P2^6;//定位段码位
sbit alarm=P2^7;//定义蜂鸣器位

/*--------------------function-----------------------------*/
void delay(uchar z); //延时1ms
void delay500us(void); //延时500us
void buzzer();  //产生报警音
void ccw_motor();//反转子程序
void cw_motor();//正转子程序
void diaplay(uchar first,uchar num); //LED 显示函数
void init();//定时器1、2初始化函数
#endif

定义标准数据类型
stanhard.h

#ifndef __STANHARD__H_
#define __STANHARD__H_
#define uchar unsigned char
#define uint unsigned int
#endif

你可能感兴趣的:(51单片机,51单片机)