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

📄 motor.c

📁 一个单片机控制步进电机的经典例子,KEIL下直接编译,用PROTEUS仿真,欢迎大家下载!
💻 C
字号:
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char	   //用uchar代替unsigned char
#define uint unsigned int	   //uint代替unsigned int
#define MotPort P1
#define TH0VAL -64608/256
#define TL0VAL -64608%256	 	//定时初始

uchar code Mot1Code[]={0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0xf1,0xf3};	//M1步码表
uchar code Mot2Code[]={0x2f,0x6f,0x4f,0xcf,0x8f,0x9f,0x1f,0x3f};	//M2步码表
uchar code SpeedTab[]={45,38,30,23,17,12,8,5,3,2};					//10级速度表

/*马达状态字定义
---------------------------------------------
MotorWorkMode | D3 | D2 | D1 | D0 | 16进制值
---------------------------------------------
M1停止M2正转  |	0  | 1  | x  | 0  |0x4或0x6
---------------------------------------------
M1停止M2反转  |	1  | 1	| x	 | 0  |0xc或0xe
---------------------------------------------
M1正转M2停止  |	x  | 0	| 0	 | 1  |0x1或0x9
---------------------------------------------
M1反转M2停止  |	x  | 0	| 1	 | 1  |0x3或0xb
---------------------------------------------
M1正转M2正转  |	0  | 1	| 0	 | 1  |0x5
---------------------------------------------
M1反转M2正转  |	0  | 1	| 1	 | 1  |0x7
---------------------------------------------
M1正转M2反转  |	1  | 1	| 0	 | 1  |0xd
---------------------------------------------
M1反转M2反转  |	1  | 1	| 1	 | 1  |0xf
---------------------------------------------
*/
uchar bdata MotorWorkMode=0;	     //马达工作状态寄存器
sbit B_M1StartStop=MotorWorkMode^0;	 //M2运动/停止(0:停止;1:运动)
sbit B_M1Face=MotorWorkMode^1;		 //M2方向(0:正转;1:反转)
sbit B_M2StartStop=MotorWorkMode^2;	 //M1运动/停止(0:停止;1:运动)
sbit B_M2Face=MotorWorkMode^3;		 //M1方向(0:正转;1:反转)

sbit K_M1StartStop=P0^0;			 //M1停止/运行
sbit K_M1Face=P0^1;					 //M1方向
sbit K_M2StartStop=P0^2;			 //M2停止/运行
sbit K_M2Face=P0^3;					 //M2方向
sbit K_SpeedAdd=P0^4;				 //速度加
sbit K_SpeedDec=P0^5;				 //速度减

sbit P_M1H=P3^0;					 //M1上限
sbit P_M1L=P3^1;					 //M1下限
sbit P_M2H=P3^2;					 //M2上限
sbit P_M2L=P3^3;					 //M2下限
uchar count=1;						 //计数器
uchar SpeedStep;			         //速度级0-9
//主函数
void main()			 
{							 
	TH0 = TH0VAL;
	TL0 = TL0VAL;				//定时器0初值
	TR0 = 1;					//定时器0开始计数
	ET0 = 1;					//开CTC0中断
	EA = 1; 				   	//开总中断
	P0=0xff;
	while(1)
	{

		if (!K_M1StartStop)
		{ 
			while(!K_M1StartStop);
			B_M1StartStop=!B_M1StartStop;
		}

	    if (!K_M1Face)
		{
			 while(!K_M1Face);
			 B_M1Face=!B_M1Face;
		}

		if (!K_M2StartStop)
		{ 
			while(!K_M2StartStop);
			B_M2StartStop=!B_M2StartStop;
		}

		if (!K_M2Face)
		{
			 while(!K_M2Face);
			 B_M2Face=!B_M2Face;
		}

		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,M2Index;  //步码索引
	TH0 = TH0VAL;
	TL0 = TL0VAL;				   //定时器0初值
	count--;
	if (count==0)
	{
		count=SpeedTab[SpeedStep];		 //根据速度级重装计数器,需要更快速度请更改定时器初值
	   	switch (MotorWorkMode)
		{
			case 0x4:{if (P_M2H==1) {M2Index++;} break;}	 //M2正转,M1停止
			case 0x6:{if (P_M2H==1) {M2Index++;} break;}	 //M2正转,M1停止

			case 0xc:{if (P_M2L==1) {M2Index--;} break;}	 //M2反转,M1停止
			case 0xe:{if (P_M2L==1) {M2Index--;} break;}

			case 0x1:{if (P_M1H==1) {M1Index++;} break;}	 //M1正转,M2停止
			case 0x9:{if (P_M1H==1) {M1Index++;} break;}

			case 0x3:{if (P_M1L==1) {M1Index--;} break;}	 //M1反转,M1停止
			case 0xb:{if (P_M1L==1) {M1Index--;} break;}

			case 0x5:{if (P_M1H==1) {M1Index++;} if (P_M2H==1) {M2Index++;} break;} //M1正转,M2正转
			case 0x7:{if (P_M1L==1) {M1Index--;} if (P_M2H==1) {M2Index++;} break;} //M1反转,M2正转
			case 0xd:{if (P_M1H==1) {M1Index++;} if (P_M2L==1) {M2Index--;} break;} //M1正转,M2反转
			case 0xf:{if (P_M1L==1) {M1Index--;} if (P_M2L==1) {M2Index--;} break;} //M1反转,M2反转
			default:break;
		}
		if (M1Index==8)
		{M1Index=0;}
		else
		{
			if (M1Index==255) {M1Index=7;}
		}
		if (M2Index==8)
		{M2Index=0;}
		else
		{
			if (M2Index==255) {M2Index=7;}
		}
		MotPort=Mot1Code[M1Index]&Mot2Code[M2Index];	 //输出M1和M2步码 ----驱动电机运动的代码
	}
}

⌨️ 快捷键说明

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