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

📄 contol.c

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

/
//***************************************************
// Created by sheriflee
// Edited by Jihengzhang 
// Created time: Jun 24th,2004
// 计算时将数值都乘以10,即假定每一步走9度而非0.9度
//**************************************************
#include <reg51.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;			// 转过一步
					angle		=angle + 9;
					if (real_angle < keyin_angle/8)
						delay 	=delay -2;
					if (real_angle >(keyin_angle/8)*7)
						delay 	=delay +2;
					l297_cw		=flag_sign;				// clockwise/counterclockwise
					stepping(delay);
				}
				else
					flag_run=0;
				
			}
					
			led0_show( &angle);
			led1_show( &real_angle);
 			} while (1);



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


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

				break;
			case KEY_3:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x03;
 
				break;
			case KEY_4:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x04;
 
				break;
			case KEY_5:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x05;
 
				break;
			case KEY_6:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x06;
 
				break;
			case KEY_7:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x07;
 
				break;
			case KEY_8:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x08;
 
				break;
			case KEY_9:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x09;
 
				break;
			case KEY_0:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x00;			//输入零				
 
				break;
			case KEY_C:						//输入值正负切换
				flag_sign=!flag_sign;							
				break;
			case KEY_D:						//急停
				write7279(BLINKCTL,0xff);	//闪烁显示
				break;
			case KEY_E:						//清除输入值
				{
					keyin_data[0]=0x0f;
					keyin_data[1]=0x0f;
					keyin_data[2]=0x0f;
				}
				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 = keyin_data[1]*10+keyin_data[0];
				else
					keyin_angle = keyin_data[2]*100+keyin_data[1]*10+keyin_data[0];

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

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

					
			led1_show( &real_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(unsigned int *p ){
	unsigned char i,j,k;
	i= *p /1000;
	j= (*p - i*100)/100;
	k=*p - (i*1000)-(j*100);
	write7279(DECODE0+6,i);
	write7279(DECODE0+5,j);
	write7279(DECODE0+4,k);
}


//******************************************
//				led1_show function
//******************************************
void led1_show(unsigned int *p){
	unsigned char i,j,k;
	if (flag_sign)
		write7279(UNDECODE+3,0x01);
	else
		write7279(UNDECODE+3,0x00);
	if (flag_run)
	{
		i= *p /1000;
		j= (*p - i*100)/100;
		k=*p - (i*1000)-(j*100);
		write7279(DECODE0+6,i);
		write7279(DECODE0+5,j);
		write7279(DECODE0+4,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 + -