www.pudn.com > stepper_motor_controller.rar > contol.c


 
//*************************************************** 
// Created by sheriflee 
// Edited by Jihengzhang  
// Created time: Jun 24th,2004 
// 计算时将数值都乘以10,即假定每一步走9度而非0.9度 
//************************************************** 
#include  
#include  
#include  
 
//*** 主程序 ** 
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