⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor.c

📁 基于单片机的步进电机设计(单片机开发板应用)
💻 C
字号:
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char	  
#define uint unsigned int	   
#define MotPort P1
#define TH0VAL -64608/256  //初值928,1ms
#define TL0VAL -64608%256	 	//定时初始

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ; 
sbit rs	= P2^0;	
sbit rw = P2^1;
sbit ep = P2^2;

BYTE code dis1[] = {"preset: level   "};
BYTE code dis2[] = {"wait for start.."};
BYTE code dis3[] = {"level:   running"};
BYTE code dis4[] = {"speed:       rpm"};
uchar code Mot1Code[]={0xf8,0xfa,0xf2,0xf6,0xf4,0xf5,0xf1,0xf9};//{0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1,0xf9};	//M1步码表
uchar code SpeedTab[]={50,38,30,25,15,12,8,5,3,2};					//10级速度表
uint code speed[]={3,4,5,6,10,13,19,30,50,75};//对应的速度码表
uchar bdata MotorWorkMode=0;	     //马达工作状态寄存器
sbit B_M1StartStop=MotorWorkMode^0;	 //M1运动/停止(0:停止;1:运动)
sbit B_M1Face=MotorWorkMode^1;		 //M1方向(0:正转;1:反转)


sbit K_M1StartStop=P2^4;			 //M1停止/运行
sbit K_M1Face=P2^5;					 //M1正向、反方向
sbit K_SpeedAdd=P2^6;				 //速度加
sbit K_SpeedDec=P2^7;				 //速度减

sbit P_M1H=P3^0;					 //M1上限
sbit P_M1L=P3^1;					 //M1下限

uchar count;						 //计数器
uchar SpeedStep;//速度级0-9
uchar disbuf[3];
uchar speedbuf[4];

void delay(BYTE ms);
BOOL lcd_bz(void);
void lcd_wcmd(BYTE cmd);
void lcd_pos(BYTE pos);
void lcd_wdat(BYTE dat);	
void lcd_init(void);

void main()			 
{	
BYTE i;						 
	TH0 = TH0VAL;
	TL0 = TL0VAL;				//定时器0初值
	TH1=(65536-50000)/256;
	TH1=(65536-50000)%256;
	TR0 = 1;				
	ET0 = 1;				
	TR1 = 1;				
	ET1 = 1;	
	EA = 1; 				   	//开总中断
	P0=0xff;
	lcd_init();
	delay(10);
	lcd_pos(0);	
	i = 0;
	while(dis1[i] != '\0')
	{				
		lcd_wdat(dis1[i]);
		i++;
	}	
	lcd_pos(0x40);		
	i = 0;
	while(dis2[i] != '\0')
	{					
		lcd_wdat(dis2[i]);
		i++;
	}	
	while(1)
	{
		if (!K_M1StartStop)  { while(!K_M1StartStop);B_M1StartStop=!B_M1StartStop;}
	    if (!K_M1Face)        { while(!K_M1Face);B_M1Face=!B_M1Face;}

		if (!K_SpeedAdd)	//速度加
		{
			while(!K_SpeedAdd);
			SpeedStep++;
			if (SpeedStep==10) {SpeedStep=9;}			 //最高速度
		}
		
		if (!K_SpeedDec)	//速度减
		{
			while(!K_SpeedDec);
			SpeedStep--;
			if (SpeedStep==255) {SpeedStep=0;}			  //最低速度
		}
	}

}

//定时器0中断
void Timer0(void) interrupt 1 using 2
{
	static uchar M1Index;  //步码索引
   uchar i;
	TH0 = TH0VAL;
	TL0 = TL0VAL;				   //定时器0初值
	count--;
	if (count==0)
	{
		count=SpeedTab[SpeedStep];		 //根据速度级重装计数器,需要更快速度请更改定时器初值
	   	switch (MotorWorkMode)
		{
			case 0x1:{if (P_M1H==1) 
				{M1Index++;	}			
			    break;}	 //M1正转
			case 0x3:{if (P_M1L==1) 
				{M1Index--;	}
				break;}	 //M1反转
			default:break;
		}
		
		if (M1Index==8)
		{M1Index=0;}
		else
		{
			if (M1Index==255) {M1Index=7;}
		}
		
		MotPort=Mot1Code[M1Index];	 //输出M1步码
	}
}
/********************************************************/
void Timer1(void) interrupt 3
{
uchar i,j;
TH1=(65536-50000)/256;
TH1=(65536-50000)%256;
j++;
disbuf[0]=SpeedStep/100;
disbuf[1]=SpeedStep%100/10;
disbuf[2]=SpeedStep%10;

speedbuf[0]=speed[SpeedStep]/1000;
speedbuf[1]=speed[SpeedStep]%1000/100;
speedbuf[2]=speed[SpeedStep]%1000%100/10;
speedbuf[3]=speed[SpeedStep]%10;
if(j==20)
	{
	j=0;
		if((MotorWorkMode&0x01)==0x00)
		{
			lcd_pos(0);	
			i = 0;
			while(dis1[i] != '\0')
			{				
				lcd_wdat(dis1[i]);
				i++;
			}	
			lcd_pos(0x40);		
			i = 0;
			while(dis2[i] != '\0')
			{					
				lcd_wdat(dis2[i]);
				i++;
			}	
		}
		else
		{
			lcd_pos(0);	
			i = 0;
			while(dis3[i] != '\0')
			{				
				lcd_wdat(dis3[i]);
				i++;
			}	
			lcd_pos(0x40);		
			i = 0;
			while(dis4[i] != '\0')
			{					
				lcd_wdat(dis4[i]);
				i++;
			}
		}
		switch(MotorWorkMode&0x3)
		{
		case 0x1: 
			{
			lcd_pos(0x46);
			lcd_wdat('+');
			lcd_pos(0x06);
			lcd_wdat(disbuf[0]+0x30);
			lcd_pos(0x07);
			lcd_wdat(disbuf[1]+0x30);
			lcd_pos(0x08);
			lcd_wdat(disbuf[2]+0x30);
			lcd_pos(0x47);
			lcd_wdat(speedbuf[0]+0x30);
			lcd_pos(0x48);
			lcd_wdat(speedbuf[1]+0x30);
			lcd_pos(0x49);
			lcd_wdat(speedbuf[2]+0x30);
			lcd_pos(0x4a);
			lcd_wdat(speedbuf[3]+0x30);
			break;
			}
		case 0x0:
			{
			lcd_pos(0x07);
			lcd_wdat('+');
			lcd_pos(0x0d);
			lcd_wdat(disbuf[0]+0x30);
			lcd_pos(0x0e);
			lcd_wdat(disbuf[1]+0x30);
			lcd_pos(0x0f);
			lcd_wdat(disbuf[2]+0x30);
			break;
			}
		case 0x3:
			{
			lcd_pos(0x46);
			lcd_wdat('-');
			lcd_pos(0x06);
			lcd_wdat(disbuf[0]+0x30);
			lcd_pos(0x07);
			lcd_wdat(disbuf[1]+0x30);
			lcd_pos(0x08);
			lcd_wdat(disbuf[2]+0x30);
			lcd_pos(0x47);
			lcd_wdat(speedbuf[0]+0x30);
			lcd_pos(0x48);
			lcd_wdat(speedbuf[1]+0x30);
			lcd_pos(0x49);
			lcd_wdat(speedbuf[2]+0x30);
			lcd_pos(0x4a);
			lcd_wdat(speedbuf[3]+0x30);
			break;
			}
		case 0x2:
			{
			lcd_pos(0x07);
			lcd_wdat('-');
			lcd_pos(0x0d);
			lcd_wdat(disbuf[0]+0x30);
			lcd_pos(0x0e);
			lcd_wdat(disbuf[1]+0x30);
			lcd_pos(0x0f);
			lcd_wdat(disbuf[2]+0x30);
			break;
			}
			default:break;
     }
	}
}
/***************************************************/
void delay(BYTE ms)
{							// 延时子程序
	BYTE i;
	while(ms--)
	{
		for(i = 0; i< 250; i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	rs = 0;
	rw = 1;
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);
	ep = 0;
	return result;	
}

void lcd_wcmd(BYTE cmd)
{							// 写入指令数据到LCD
	while(lcd_bz());
	rs = 0;
	rw = 0;
	ep = 0;
	_nop_();
	_nop_();	
	P0 = cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;		
}

void lcd_pos(BYTE pos)
{							//设定显示位置
	lcd_wcmd(pos | 0x80);
}

void lcd_wdat(BYTE dat)	
{							//写入字符显示数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	ep = 0;
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;	
}

void lcd_init()
{							//LCD初始化设定
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x0c);			//
	delay(1);
	lcd_wcmd(0x06);			//
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -