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

📄 main0.c

📁 用Keil C51写的步进电机驱动程序。
💻 C
字号:
#include <reg51.h>
#define XTAL 22118400
#define baudrate 9600
#define INLEN 5

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

bit key;				//调试用***

char inbuf[INLEN];
char getbuf[INLEN];
char buf_sit;
int angel_gd;
int angel_fw;

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

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

	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;
	ET0=1;
	TR0=1;
}

/*定时器中断程序*/
time0() interrupt 1 using 2
{
	cpulamp=!cpulamp;
	TH0=0;
	TL0=0;
}

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

/*主程序*/
main()
{
	char temp;
	char i;
	unsigned char p1_img;
	EA=1;
			/*调试用程序*/
			EX0=1;
	angel_gd=0;
	angel_fw=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])	//如果校验正确,取出高低方位角
			{
				angel_gd=getbuf[0];
				angel_gd=angel_gd<<8;
				angel_gd=angel_gd+getbuf[1];
				angel_fw=getbuf[2];
				angel_fw=angel_fw<<8;
				angel_fw=angel_fw+getbuf[3];
				if(angel_gd<0);
				{
					angel_gd&=0x7f;
					angel_gd=~angel_gd;
					angel_gd++;
				}
				if(angel_fw<0)
				{
					angel_fw&=0x7f;
					angel_fw=~angel_fw;
					angel_fw++;
				}
				angel_gd*=6;
				angel_fw*=6;
			}
		}
		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<75;i++)			//延时,大约0.3ms
			{;}
			p1_img&=0xf3;
			P1=p1_img;
			for(i=0;i<30;i++)			//延时,大约0.12ms
			{;}
			p1_img&=0x21;
			P1=p1_img;					//关电机
		}
	}while(1);
	
}

⌨️ 快捷键说明

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