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

📄 contol_interrupt.c

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

//***************************************************
// Created by sheriflee
// Edited by Jihengzhang 
// Created time: Jun 24th,2004
//**************************************************
#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
//******************************************
	 en=0;					// 禁止电机动作
	 rst=0;					// 复位
	 cw=0;					// 正转
	 v_ref=1;				// 参考电压为5V
	 half=0;				// 半步
	 ctrl=1;				// 相位调脉宽
	 clk=1;					// 准备发脉冲
			

//******************************************
//			测试
//******************************************
		send_byte(CMD_TEST); 		//发送测试指令
			delay10ms(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位显示下划线'_'
		
		
		do{
//***********************************************
//接收键盘数据
		//***************************************
//			if (keyin_cnter>2)
//					keyin_cnter  =0x00;		
			
			led0_show( &angle);



 			} while (1);



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


//**********************************************
//        interrupt0 service function
//**********************************************
	void int0_serv( void ) interrupt 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;
//				keyin_cnter++;
				break;
			case KEY_2:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x02;
//				keyin_cnter++;
				break;
			case KEY_3:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x03;
//				keyin_cnter++;
				break;
			case KEY_4:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x04;
//				keyin_cnter++;
				break;
			case KEY_5:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x05;
//				keyin_cnter++;
				break;
			case KEY_6:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x06;
//				keyin_cnter++;
				break;
			case KEY_7:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x07;
//				keyin_cnter++;
				break;
			case KEY_8:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x08;
//				keyin_cnter++;
				break;
			case KEY_9:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x09;
//				keyin_cnter++;
				break;
			case KEY_0:	
				data_shift(keyin_data,3);
				keyin_data[0]=0x00;			//输入零				
//				keyin_cnter++;
				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;
					keyin_cnter  =0x00;
				}
				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];
				angle=keyin_angle;
					
				break;}
		

					
			led1_show( );					//调用显示函数
		}

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());
}
//***********************************************
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;
}
//*************************************************
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);
}

//**************************************************
void led0_show(int *p ){
	unsigned char i,j,k;
	i= *p /100;
	j= (*p - i*100)/10;
	k=*p - (i*100)-(j*10);
	write7279(DECODE0+6,i);
	write7279(DECODE0+5,j);
	write7279(DECODE0+4,k);
}
//**************************************************
	
//**************************************************
void led1_show(void){
	unsigned char i;
	if (flag_sign)
		write7279(UNDECODE+3,0x01);
	else
		write7279(UNDECODE+3,0x00);
	for(i=0;i<3;i++)
		write7279(DECODE0+i,keyin_data[i]);
}
//**************************************************	
//**************************************************	
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++);
}
// ********************* n*10ms **********************
void delay10ms(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*********************
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 --;}
	}

⌨️ 快捷键说明

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