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

📄 main.c

📁 用Keil C51写的步进电机驱动程序。
💻 C
字号:
#include <reg51.h>
#define XTAL 22118400
#define baudrate 9600
#define INLEN 6
#define LAMPSPEED 20    //控制CPU灯闪速度,每秒5次

sbit cpulamp=P3^7; 		//CPU灯控制
bit newnum;				//有新的数据标识
char is_aa;

bit key;				//调试用***
char lamp_speed;
char inbuf[INLEN];
char getbuf[INLEN];
char buf_sit;
char Timer_num;
int angel_gd;
int angel_fw;
int angel_gd_get;
int angel_fw_get;

/*串口接收程序*/
static void comm_get (void) interrupt 4 using 1	
{
	char i;
	char get_buf;
	get_buf=SBUF;
	RI=0;
	TI=0;
	if(inbuf[0]==is_aa)
	{
		inbuf[buf_sit]=get_buf;
		buf_sit++;
		if(buf_sit>=6)
		{
			for(i=0;i<INLEN;i++)getbuf[i]=inbuf[i];
			buf_sit=0;
			inbuf[0]=0;
			newnum=1;
		}
	}
	else
	{
		if(get_buf==is_aa) 
		{
			inbuf[0]=is_aa;
			buf_sit++;
		}
	}
}

/*初始化串行口*/
void ini_comm (void)
{
	buf_sit=0;
	newnum=0;
	is_aa=0xAA;

	PCON|=0x80;
	TMOD|=0x20;
	TH1=(unsigned char)(256-(XTAL/(16L*12L*baudrate)));
	TR1=1;
	SCON=0x50;
	ES=1;
}


/* 初始化定时器0*/
void ini_time(void)
{
	cpulamp=1;
	TMOD&=0xF0;
	TMOD|=0x01;
	TH0=0xB7;
	TL0=0xFd;
	ET0=1;
	TR0=1;
	Timer_num=0;
	lamp_speed=LAMPSPEED;
}

/*10ms定时器中断程序*/
time0() interrupt 1 using 2
{
	if(Timer_num>=lamp_speed)    //lamp_speed控制指示灯闪速
	{
		cpulamp=!cpulamp;
		Timer_num=0;
	}
	Timer_num++;
	TH0=0xB7;
	TL0=0xFD;
}

/****调试用外部中断****/
void ex0_int() interrupt 0 using 3
{
	if(key==0)
	{
		angel_gd=30;
		angel_fw=30;
	}
	else
	{
		angel_gd=-30;
		angel_fw=-30;	
	}
	key=!key;
}


/*主程序*/
main()
{
	char temp;
	char i;
	unsigned char p1_img;
	EA=1;
			/*调试用程序*/
			EX0=1;
	angel_gd=0;
	angel_fw=0;
	angel_gd_get=0;
	angel_fw_get=0;
	ini_time();
	ini_comm();
	p1_img=0x20;
	P1=p1_img;							//给电机解锁,初始化
	do
	{
		if(newnum)						//如果有新的接收数据
		{
			newnum=0;
			temp=0;
			for(i=0;i<INLEN-1;i++)		//求校验和
			{
				temp+=getbuf[i];
			}
			if(temp==getbuf[INLEN-1])	//如果校验正确,取出高低方位角
			{
				lamp_speed=2;			//加快灯闪速度
				angel_gd_get=getbuf[1];
				angel_gd_get=angel_gd_get<<8;
				angel_gd_get=angel_gd_get+getbuf[2];
				angel_fw_get=getbuf[3];
				angel_fw_get=angel_fw_get<<8;
				angel_fw_get=angel_fw_get+getbuf[4];
				if(angel_gd_get<0);
				{
					angel_gd_get&=0x7f;
					angel_gd_get=~angel_gd_get;
					angel_gd_get++;
				}
				if(angel_fw_get<0)
				{
					angel_fw_get&=0x7f;
					angel_fw_get=~angel_fw_get;
					angel_fw_get++;
				}
				angel_gd_get*=6;
				angel_fw_get*=6;
				angel_gd+=angel_gd_get;
				angel_fw+=angel_fw_get;
			}
		}
		if(angel_gd!=0||angel_fw!=0)	//驱动电机
		{
			p1_img&=0xde;				//打开电机开关;两电机同时打开
			P1=p1_img;
			if(angel_gd>0)
			{
				p1_img|=0x06;
				angel_gd--;
			}
			if(angel_gd<0)
			{
				p1_img&=0xfd;
				p1_img|=0x04;
				angel_gd++;
			}
			if(angel_fw>0)
			{
				p1_img|=0x18;
				angel_fw--;
			}
			if(angel_fw<0)
			{
				p1_img&=0xef;
				p1_img|=0x08;
				angel_gd++;
			}
			P1=p1_img;
			for(i=0;i<77;i++)			//延时,大约0.25ms;每一循环用时1.6275μs2个机器周期
			{;}
			for(i=0;i<77;i++)		
			{;}
			p1_img&=0xf3;
			P1=p1_img;
			for(i=0;i<93;i++)			//延时,大约0.15ms
			{;}
			p1_img&=0x21;
			P1=p1_img;					//关电机
		}
		else
		{
			lamp_speed=LAMPSPEED;
		}
	}while(1);
	
}

⌨️ 快捷键说明

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