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

📄 contol.c

📁 步进电机控制程序
💻 C
字号:

//***************************************************
// Created by sheriflee
// Edited by Jihengzhang 
// Created time: Jun 24th,2004
// 计算时将数值都乘以10,即假定每一步走9度而非0.9度
//**************************************************
#include <reg51.h>
#include <math.h>
#include <head.h>

//*** 主程序 **
main()
{	
	for (tmr=0;tmr<0x2000;tmr++); 	//上电延时
		send_byte(CMD_RESET); 		//复位HD7279A
			
//******************************************
//				initialize cpu
//******************************************
//	SCON = 0x52;    	//SCON 串行口设置
//	TMOD = 0x20;    	//* TMOD 时钟模式设置
	IE   = 0x81;		//允许外部中断int0
	TCON = 0x01;    	//* TCON 定时器控制 int0边沿触发


//******************************************
//				initialize L279
//******************************************
	 l297_en=0;					// 禁止电机动作
	 l297_rst=0;				// 复位
	 l297_ref=1;				// 参考电压为5V
	 l297_half=1;				// 半步
	 l297_ctrl=1;				// 相位调脉宽
	 l297_clk=1;				// 准备发脉冲
			

//******************************************
//			测试
//******************************************
		send_byte(CMD_TEST); 		//发送测试指令
			delay5p5ms(50);
		send_byte(CMD_RESET); 			//清除显示
		
		
//**********************************************
//			闪烁等待键盘输入
//**********************************************
//		wait_cnter=0;
		key_number=0xff;
		keyin_data[0]=0x0f;
		keyin_data[1]=0x0f;
		keyin_data[2]=0x0f;
		angle =0;
		write7279(BLINKCTL,0xf8);	//第1、2、3 位设置为闪烁显示
		write7279(UNDECODE,0X08); 	//在第1位显示下划线'_'
		write7279(UNDECODE+1,0x08);	//在第2位显示下划线'_'
		write7279(UNDECODE+2,0x08); //在第3位显示下划线'_'
		

//**********************************************
//			电机控制相关的初始化
//**********************************************
		angle =0;
		keyin_angle =0;
				
		
		do{
			if (flag_run)								//允许运转
			{
				if(real_angle >=9)						//还够转一步
				{
					real_angle=real_angle-9;			// 转过一步
					if (flag_sign)
						angle=angle - 9;
					else
						angle=angle + 9;	
					if (real_angle <= keyin_angle/8)
					{	if (delay < NNN)
							delay= delay +3;				
					}
					else if (real_angle >=(keyin_angle/8)*7)
					{	if (delay >3)
							delay= delay -3;				
					}
					l297_cw	=flag_sign;				// clockwise/counterclockwise
					stepping(delay);
				}
				else
					flag_run=0;
				
			led1_show(real_angle);
			}
			led0_show(angle);
					
 			} while (1);



}

//*********** The end of main function ************


//**********************************************
//        interrupt0 service function
//**********************************************
void int0_serv( void ) interrupt 0 using 1
	{
			IE =0;						// 禁止中断
			write7279(BLINKCTL,0xff);	//第1、2、3 位设置为闪烁显示
			key_number=read7279(CMD_READ);		//读出按键
			switch(key_number){
			case KEY_1:
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x01;
 
				break;
			case KEY_2:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x02;

				break;
			case KEY_3:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x03;
 
				break;
			case KEY_4:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x04;
 
				break;
			case KEY_5:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x05;
 
				break;
			case KEY_6:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x06;
 
				break;
			case KEY_7:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x07;
 
				break;
			case KEY_8:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x08;
 
				break;
			case KEY_9:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x09;
 
				break;
			case KEY_0:	
				flag_run=0;					// 停止转动
				data_shift(keyin_data,3);
				keyin_data[0]=0x00;			//输入零		
				break;
						
			case KEY_A:						//正向微调
				flag_run=0;
				angle=angle-9;
				l297_cw		=0;				// clockwise/counterclockwise
				stepping(NNN); 
				break;
			case KEY_B:						//正向微调
				flag_run=0;
				angle=angle+9;
				l297_cw	=1;				// clockwise/counterclockwise
				stepping(NNN); 
				break;
			case KEY_C:						//输入值正负切换
				flag_run=0;					// 停止转动
				flag_sign=!flag_sign;							
				break;
			case KEY_D:						//急停
				flag_run =!flag_run;
				if(flag_run)
					write7279(BLINKCTL,0xf8);	//闪烁显示
				else
					write7279(BLINKCTL,0xff);	//闪烁显示
					
				break;
			case KEY_E:						//清除输入值
				flag_run=0;					// 停止转动
				{
					keyin_data[0]=0x0f;
					keyin_data[1]=0x0f;
					keyin_data[2]=0x0f;
					angle		 =0;
					
				}
				break;
				
			case KEY_F:	
				write7279(BLINKCTL,0xf8);	//闪烁显示
				if (keyin_data[0]>9)
					keyin_angle=0;
				else if (keyin_data[1]>9)
					keyin_angle = keyin_data[0];
				else if (keyin_data[2]>9)
					keyin_angle = 10*keyin_data[1]+keyin_data[0];
				else
					keyin_angle = 100*keyin_data[2]+10*keyin_data[1]+keyin_data[0];

				keyin_angle	=keyin_angle*10;	// 输入角度值×10便于计算
				real_angle	=keyin_angle;		// 转动过程中数值随着变化
				delay		=NNN;				// 装入延时的初始值

				keyin_data[0]=0x0f;			// 保存输入值缓冲区清零
				keyin_data[1]=0x0f;
				keyin_data[2]=0x0f;
				flag_run=1;					// 开始转动
					
				break;}
		

					
			led1_show( real_angle );					//调用显示函数
			led0_show(angle);

			IE =0x81;						// 开启中断

		}


void write7279(unsigned char cmd, unsigned char dta){
	send_byte (cmd);
	send_byte (dta);
}

unsigned char read7279(unsigned char command){
	send_byte(command);
	return(receive_byte());
}

//******************************************
//				send_byte function
//******************************************
void send_byte( unsigned char out_byte){
	unsigned char i;
	cs=0;
	long_delay();
	for (i=0;i<8;i++){
		if (out_byte&0x80)
			dat=1;
		else
			dat=0;

		clk=1;
		short_delay();
		clk=0;
		short_delay();
		out_byte=out_byte*2;
	}
	dat=0;
}

//******************************************
//				receiv_byte function
//******************************************
unsigned char receive_byte(void){
	unsigned char i, in_byte;
	dat=1; //
	long_delay();
	for (i=0;i<8;i++){
		clk=1;
		short_delay();
		in_byte=in_byte*2;
		if (dat)
			in_byte=in_byte|0x01;
		clk=0;
		short_delay();
	}
	dat=0;
	return (in_byte);
}

//******************************************
//				led0_show function
//******************************************
void led0_show(int dis){
	unsigned char i,j,k,l;
	i= abs(dis) /1000;
	j= (abs(dis) - i*1000)/100;
	k=(abs(dis) - (i*1000)-(j*100))/10;
	l=abs(dis) - (i*1000)-(j*100)-(k*10);
	k=k|0x80;							//加小数点位
	write7279(DECODE0+7,i);
	write7279(DECODE0+6,j);
	write7279(DECODE0+5,k);
	write7279(DECODE0+4,l);
}


//******************************************
//				led1_show function
//******************************************
void led1_show(unsigned int dis){			//下边的LED,
	unsigned char i,j,k;
	if (flag_sign)
		write7279(UNDECODE+3,0x01);
	else
		write7279(UNDECODE+3,0x00);
	if (flag_run)
	{
		i= dis /1000;
		j= (dis - i*1000)/100;
		k=(dis - (i*1000)-(j*100))/10;
		write7279(DECODE0+2,i);
		write7279(DECODE0+1,j);
		write7279(DECODE0,k);
	}
	else
	{
		for(i=0;i<3;i++)			
			write7279(DECODE0+i,keyin_data[i]);
	}
		
			
}


//******************************************
//				long_delay function
//******************************************
void long_delay(void){
	unsigned char i;
	for (i=0;i<0x30;i++);
}
void short_delay(void){
	unsigned char i;
	for (i=0;i<8;i++);
}


//******************************************
//				delay5p5ms function
//******************************************
void delay5p5ms(unsigned char time){
	unsigned char i;
	unsigned int j;

	for (i=0;i<time;i++)
		
		for(j=0;j<0x390;j++);
			
//			if (!key)				??????????????
//				key_int();			??????????????	
}

//******************************************
//				data_shift function
//******************************************
void data_shift(unsigned char *p,unsigned char n)
	{
		unsigned char i;
		p = p + n-1;
		for(i=0;i<n-1;i++){
		*p = *(p -1);
		p --;}
	}
	
	
//******************************************
//				data_shift function
//******************************************
	

	void stepping(unsigned char delay_n )
	{
			
				l297_clk=1;
				delay5p5ms(delay_n);			//20: 对应11ms
				l297_clk=0;

	}

⌨️ 快捷键说明

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