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

📄 main.c

📁 这是一个成熟的用于驱动步进马达的程序,我们用于调试螺钉的.
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#include "TypeDefines.h"
#include "1335c51.h"
#include "delay.h"
#include "ADS8364.h"
#include "Iap.h"
#include "STEP_MOTOR.h"
#include "Menu.h"
#include "ziku.h"


#define EEPROM_H 0x80
#define EEPROM_L 0x00

#define X1 0		//定义P1点坐标(单位:0.01mm)
#define Y1 (-180)
#define X2 0
#define Y2 180
#define X3 (-180)
#define Y3 0
#define X4 180
#define Y4 0
#define X5 (-245)
#define Y5 114
#define X6 (-245)
#define Y6 767
#define X7 230
#define Y7 135
#define X8 230
#define Y8 788
#define TT_AD 1	   		//定义TT面上4根传感器为1(用于调用READ_ADS8364()时作参数传递用。
#define POLE_AD 2		//定义导杆上4根传感器为2(用于调用READ_ADS8364()时作参数传递用。
#define CHECK_TIMES 5	//定义采样次数

#define UP 0				//马达运转方向
#define DOWN 1 

char ALLOW_UP=5;				//允许误差
char ALLOW_LOW=-5;

int data Data1[4];			//TT面上的4个点高度
int data Data2[4];			//导杆上的4个点高度
uint idata origin1[4];		//TT面上4个点的原点
uint idata origin2[4];		//导杆上4个点的原点
uint data para1[4]={7000,7000,7000,7000};    	//TT面上4个点的计算参数
uint data para2[4]={7000,7000,7000,7000};		//TT面上4个点的计算参数
uint idata step_run0;		//马达0运转的步数
uint idata step_run1;		//马达1运转的步数
uint idata step_run2;		//马达2运转的步数
uint idata step_run3;		//马达3运转的步数
int idata h5;		//P5点应该调整到的位移(目标值)
int idata h6;		//P6点应该调整到的位移(目标值)
int idata h7;		//P7点应该调整到的位移(目标值)
int idata h8;		//P8点应该调整到的位移(目标值)
int idata hight_limit;			//高度限制值
int idata sensitive_limit;		//精度限制值
int idata delay_value;			//延时值(ms)


extern uchar idata KeyFuncIndex;

void systeminit();
void zero();
void check();
void calculate();
void NormalDisp();
void disp_4point(uchar flag);
void disp_target();
uchar keyscan();
void adjustset();
void parasave();
void pararead();

main()
{
	delay_xms(200);
	systeminit();
	NormalDisp();
	while(1)
	{
		delay_xms(200);
		ADS8364_read(TT_AD,CHECK_TIMES);
		ADS8364_read(POLE_AD,CHECK_TIMES);
		disp_4point(TT_AD);
		disp_4point(POLE_AD);
		adjustset();
/*		
		if(keyscan()==KEY_START)
		{
			check();
		}
		*/
		if(keyscan()==KEY_ADJUST)
		{
			zero();
		}
		/*
		do
        {
            GetKeyInput();
			delay_xms(200);
        }while(KeyFuncIndex!=0);   */
	}	
}

uchar keyscan()
{
	if((STOP==0)&&(KEY_2==1)&&(START==1))
	{
		delay_xms(30);
		if((STOP==0)&&(KEY_2==1)&&(START==1))
		{
			return KEY_STOP;
		}
	}
	else if((START==0)&&(KEY_2==1)&&(STOP==1))
	{
		delay_xms(30);
		if((START==0)&&(KEY_2==1)&&(STOP==1))
		{
			return KEY_START;
		}
	}
	
	else if((KEY_2==0)&&(STOP==0)&&(START==0))
	{
		delay_xms(30);
		if((KEY_2==0)&&(STOP==0)&&(START==0))
		{
			return KEY_ADJUST;
		}
	}
}

void systeminit()		//系统初始化
{
	LcmInition();
	time_init();
	step_motor_init();
	pararead();
//	zero();
}
void zero()    //较零
{
	int tmp16[8];
	delay_xms(300);
	origin1[0]=0;
	origin1[1]=0;
	origin1[2]=0;
	origin1[3]=0;
	origin2[0]=0;
	origin2[1]=0;
	origin2[2]=0;
	origin2[3]=0;
	while(1)
	{

		ADS8364_read(TT_AD,CHECK_TIMES);
		ADS8364_read(POLE_AD,CHECK_TIMES);
		tmp16[0]=Data1[0];
		tmp16[1]=Data1[1];
		tmp16[2]=Data1[2];
		tmp16[3]=Data1[3];
		tmp16[4]=Data2[0];
		tmp16[5]=Data2[1];
		tmp16[6]=Data2[2];
		tmp16[7]=Data2[3];
		delay_xms(50);
		ADS8364_read(TT_AD,CHECK_TIMES);
		ADS8364_read(POLE_AD,CHECK_TIMES);
		/*
		if((tmp16[0]-Data1[0])>ALLOW_LOW && (tmp16[0]-Data1[0])<ALLOW_UP &&
		    (tmp16[1]-Data1[1])>ALLOW_LOW && (tmp16[1]-Data1[1])<ALLOW_UP &&
		    (tmp16[2]-Data1[2])>ALLOW_LOW && (tmp16[2]-Data1[2])<ALLOW_UP &&
		    (tmp16[3]-Data1[3])>ALLOW_LOW && (tmp16[3]-Data1[3])<ALLOW_UP &&
		    (tmp16[4]-Data2[0])>ALLOW_LOW && (tmp16[4]-Data2[0])<ALLOW_UP &&
		    (tmp16[5]-Data2[1])>ALLOW_LOW && (tmp16[5]-Data2[1])<ALLOW_UP &&
		    (tmp16[6]-Data2[2])>ALLOW_LOW && (tmp16[6]-Data2[2])<ALLOW_UP &&
		    (tmp16[7]-Data2[3])>ALLOW_LOW && (tmp16[7]-Data2[3])<ALLOW_UP)
		{	  */
			origin1[0]=Data1[0];
			origin1[1]=Data1[1];
			origin1[2]=Data1[2];
			origin1[3]=Data1[3];
			origin2[0]=Data2[0];
			origin2[1]=Data2[1];
			origin2[2]=Data2[2];
			origin2[3]=Data2[3];
			break;
	//	}
	}
	ADS8364_read(TT_AD,CHECK_TIMES);
	ADS8364_read(POLE_AD,CHECK_TIMES);
	disp_4point(TT_AD);
	disp_4point(POLE_AD);
}

void calculate()					//计算调整目标值
{
	int h51,h52,h61,h62,h71,h72,h81,h82;
	ADS8364_read(TT_AD, CHECK_TIMES);
	h51=(Y5-Y1)/(Y2-Y1)*(Data1[1]-Data1[0])+Data1[0];
	h52=Data1[2]-(X3-X5)/(X4-X3)*(Data1[3]-Data1[2]);
	h5=h51+h52;
	h61=(Y6-Y1)/(Y2-Y1)*(Data1[1]-Data1[0])+Data1[0];
	h62=Data1[2]-(X3-X6)/(X4-X3)*(Data1[3]-Data1[2]);
	h6=h61+h62;
	h71=(Y7-Y1)/(Y2-Y1)*(Data1[1]-Data1[0])+Data1[0];
	h72=Data1[3]+(X7-X4)/(X4-X3)*(Data1[3]-Data1[2]);
	h7=h71+h72;
	h81=(Y8-Y1)/(Y2-Y1)*(Data1[1]-Data1[0])+Data1[0];
	h82=Data1[3]+(X8-X4)/(X4-X3)*(Data1[3]-Data1[2]);
	h8=h81+h82;
	disp_target();
}


void check()
{
	calculate();
	TR1=1;
	while(1)
	{
		if(keyscan()==KEY_STOP)
		{
			TR1=0;
			EN=1;
			break;
		}
		
		TR1=1;
		EN=0;
		ADS8364_read(POLE_AD,CHECK_TIMES);
		disp_4point(POLE_AD);
		if(Data2[0]-h5>ALLOW_UP)
		{
			CR0=DOWN;
			step_run0=abs(Data2[0]-h5);
		}
		else if(Data2[0]-h5<ALLOW_LOW)
		{
			CR0=UP;
			step_run0=abs(Data2[0]-h5);
		}
		else
		{
			step_run0=0;
		}
		if(Data2[1]-h6>ALLOW_UP)
		{
			CR1=DOWN;
			step_run1=abs(Data2[1]-h6);
		}
		else if(Data2[1]-h6<ALLOW_LOW)
		{
			CR1=UP;
			step_run1=abs(Data2[1]-h6);
		}
		else
		{
			step_run1=0;
		}
		if(Data2[2]-h7>ALLOW_UP)
		{
			CR2=DOWN;
			step_run2=abs(Data2[2]-h7);
		}
		else if(Data2[2]-h7<ALLOW_LOW)
		{
			CR2=UP;
			step_run2=abs(Data2[2]-h7);
		}
		else
		{
			step_run2=0;
		}
		if(Data2[3]-h8>ALLOW_UP)
		{
			CR3=DOWN;
			step_run3=abs(Data2[3]-h8);
		}
		else if(Data2[3]-h8<ALLOW_LOW)
		{
			CR3=UP;
			step_run3=abs(Data2[3]-h8);
		}
		else
		{
			step_run3=0;
		}
		if((Data2[0]-h5)>ALLOW_LOW && (Data2[0]-h5<ALLOW_UP) &&
			(Data2[1]-h6)>ALLOW_LOW && (Data2[1]-h6<ALLOW_UP) &&
			(Data2[2]-h7)>ALLOW_LOW && (Data2[2]-h7<ALLOW_UP) &&
			(Data2[3]-h8)>ALLOW_LOW && (Data2[3]-h8<ALLOW_UP))
		{
			calculate();
			if((Data2[0]-h5)>ALLOW_LOW && (Data2[0]-h5<ALLOW_UP) &&
			(Data2[1]-h6)>ALLOW_LOW && (Data2[1]-h6<ALLOW_UP) &&
			(Data2[2]-h7)>ALLOW_LOW && (Data2[2]-h7<ALLOW_UP) &&
			(Data2[3]-h8)>ALLOW_LOW && (Data2[3]-h8<ALLOW_UP))
			{
				TR1=0;
				EN=1;
				step_run0=0;
				step_run1=0;
				step_run2=0;
				step_run3=0;
				break;
			}
		}
	}
}

void NormalDisp()
{	
	Linexy(L1_X0, L1_Y0, L1_X1, L1_Y1, 1);
	Linexy(L2_X0, L2_Y0, L2_X1, L2_Y1, 1);
	Linexy(L3_X0, L3_Y0, L3_X1, L3_Y1, 1);
	Linexy(L4_X0, L4_Y0, L4_X1, L4_Y1, 1);
	Linexy(L5_X0, L5_Y0, L5_X1, L5_Y1, 1);
	Linexy(L6_X0, L6_Y0, L6_X1, L6_Y1, 1);
	Linexy(L7_X0, L7_Y0, L7_X1, L7_Y1, 1);
	Linexy(L8_X0, L8_Y0, L8_X1, L8_Y1, 1);
	Linexy(L9_X0, L9_Y0, L9_X1, L9_Y1, 1);
	Linexy(L10_X0, L10_Y0, L10_X1, L10_Y1, 1);
	
	PutCdotInGraph(HIGHT_X, HIGHT_Y,16, hight[0]);
	PutCdotInGraph(HIGHT_X+2, HIGHT_Y,16, hight[1]);
	PutCdotInGraph(HIGHT_X+4, HIGHT_Y,16, hight[2]);
	PutCdotInGraph(HIGHT_X+6, HIGHT_Y,16, hight[3]);
	PutSdotInGraph(HIGHT_X+8, HIGHT_Y, ":");
	PutCdotInGraph(HIGHT_X+9, HIGHT_Y,16, fuhao);
	
	PutCdotInGraph(SENSITIVE_X, SENSITIVE_Y,16, sensitive[0]);
	PutCdotInGraph(SENSITIVE_X+2, SENSITIVE_Y,16, sensitive[1]);
	PutCdotInGraph(SENSITIVE_X+4, SENSITIVE_Y,16, sensitive[2]);
	PutCdotInGraph(SENSITIVE_X+6, SENSITIVE_Y,16, sensitive[3]);
	PutSdotInGraph(SENSITIVE_X+8, SENSITIVE_Y, ":");
	PutCdotInGraph(SENSITIVE_X+9, SENSITIVE_Y,16, fuhao);

	PutCdotInGraph(DELAY_X, DELAY_Y,16, delay[0]);
	PutCdotInGraph(DELAY_X+2, DELAY_Y,16, delay[1]);
	PutCdotInGraph(DELAY_X+4, DELAY_Y,16, delay[2]);
	PutCdotInGraph(DELAY_X+6, DELAY_Y,16, delay[3]);
	PutSdotInGraph(DELAY_X+8, DELAY_Y, ":");
	PutCdotInGraph(DELAY_X+9, DELAY_Y,16, fuhao);
	
	PutCdotInGraph(RESULT_X, RESULT_Y,16, result[0]);
	PutCdotInGraph(RESULT_X+2, RESULT_Y,16, result[1]);
	PutSdotInGraph(RESULT_X+4, RESULT_Y, ":");

	PutCdotInGraph(NOWVALUE_X, NOWVALUE_Y,16, nowvalue[0]);
	PutCdotInGraph(NOWVALUE_X+2, NOWVALUE_Y,16, nowvalue[1]);

	PutCdotInGraph(TARGET_X, TARGET_Y,16, target[0]);
	PutCdotInGraph(TARGET_X+2, TARGET_Y,16, target[1]);

	PutCdotInGraph(P5_X, P5_Y,16, p5dot);  

	PutCdotInGraph(P6_X, P6_Y,16, p6dot);

	PutCdotInGraph(P7_X, P7_Y,16, p7dot);

	PutCdotInGraph(P8_X, P8_Y,16, p8dot);

	PutCdotInGraph(TTH_X, TTH_Y,16, tthdot[0]);
	PutCdotInGraph(TTH_X+2, TTH_Y,16, tthdot[1]);
	PutCdotInGraph(TTH_X+4, TTH_Y,16, tthdot[2]);	

	NumDisp_816(HIGHT_V_X, HIGHT_V_Y, 5, hight_limit);
	NumDisp_816(SENSITIVE_V_X, SENSITIVE_V_Y, 5, sensitive_limit);
	NumDisp_816(DELAY_VALUE_X, DELAY_VALUE_Y, 5, delay_value);

	PutCdotInGraph(RESULT_V_X, RESULT_V_Y, 24,  pass[0]);
	PutCdotInGraph(RESULT_V_X+3, RESULT_V_Y, 24,  pass[1]);
	PutCdotInGraph(RESULT_V_X+6, RESULT_V_Y, 24,  pass[2]);
	PutCdotInGraph(RESULT_V_X+9, RESULT_V_Y, 24,  pass[3]);

	BmpDisp(16,0,192,240,bmp);

	ram_clear(RESULT_V_X, RESULT_V_Y, 96, 24);
}

void disp_4point(uchar flag)
{
	int tmp32;
	if(flag==TT_AD)
	{
		NumDisp(P1_X_V, P1_Y_V, Data1[0]);
		NumDisp(P2_X_V, P2_Y_V, Data1[1]);
		NumDisp(P3_X_V, P3_Y_V, Data1[2]);
		NumDisp(P4_X_V, P4_Y_V, Data1[3]);
	}
	if(flag==POLE_AD)
	{
		NumDisp_816(P5NOW_X, P5NOW_Y, 0, Data2[0]);
		NumDisp_816(P6NOW_X, P6NOW_Y, 0, Data2[1]);
		NumDisp_816(P7NOW_X, P7NOW_Y, 0, Data2[2]);
		NumDisp_816(P8NOW_X, P8NOW_Y, 0, Data2[3]);
		tmp32=((Data1[0]+Data1[1]+Data1[2]+Data1[3])-(Data2[0]+Data2[1]+Data2[2]+Data2[3]))>>2;
		NumDisp_816(TTH_CHECK_X, TTH_CHECK_Y, 0, tmp32);
	}
}

void disp_target()
{
	NumDisp_816(P5TAR_X, P5TAR_Y, 0, h5);
	NumDisp_816(P6TAR_X, P6TAR_Y, 0, h6);
	NumDisp_816(P7TAR_X, P7TAR_Y, 0, h7);
	NumDisp_816(P8TAR_X, P8TAR_Y, 0, h8);
}


#if 1
void adjustset()
{
    uchar i=0;
    if(START==0)
    {
    	delay_xms(100);
    	if(START==0)
    	{
    	    while(1)
    	    {
				delay_xms(100);
        		if((KEY_1==1)&&(KEY_2==1)&&(KEY_3==0))     //按下“MENU”键
        	    {
                    delay_xms(30);
                    if((KEY_1==1)&&(KEY_2==1)&&(KEY_3==0))
                    {
        	            i++;
        	            if(i>=8)
        	                i=0;
                    }
        	    }
        		if((KEY_1==1)&&(KEY_2==0)&&(KEY_3==1))      //按下“UP”键
        		{
        			delay_xms(30);
        			if((KEY_1==1)&&(KEY_2==0)&&(KEY_3==1))
        			{
						if(i<4)
            				para1[i]++;
						else
							para2[i-4]++;
        			}
        		}
        		if((KEY_1==0)&&(KEY_2==1)&&(KEY_3==1))      //按下“DOWN”键
        	    {
                    delay_xms(30);
                    if((KEY_1==0)&&(KEY_2==1)&&(KEY_3==1))
                    {
						if(i<4)
        	            	para1[i]--;
						else
							para2[i-4]--;
                    }
        	    }

				if((KEY_1==1)&&(KEY_2==0)&&(KEY_3==0))     //按下“LEFT”键
			    {
		            delay_xms(30);
		            if((KEY_1==1)&&(KEY_2==0)&&(KEY_3==0))
		            {
			            if(i<4)
        	            	para1[i]-=20;
						else
							para2[i-4]-=20;
		            }
			    }

				if((KEY_1==0)&&(KEY_2==1)&&(KEY_3==0))      //按下“RIGHT”键
			    {
		            delay_xms(30);
		            if((KEY_1==0)&&(KEY_2==1)&&(KEY_3==0))
		            {
			            if(i<4)
        	            	para1[i]+=20;
						else
							para2[i-4]+=20;
		            }
			    }

				NumDisp(16, 13, para1[0]);
				NumDisp(16, 14, para1[1]);
				NumDisp(16, 15, para1[2]);
				NumDisp(16, 16, para1[3]);
				NumDisp(16, 17, para2[0]);
				NumDisp(16, 18, para2[1]);
				NumDisp(16, 19, para2[2]);
				NumDisp(16, 20, para2[3]);
				ADS8364_read(TT_AD,CHECK_TIMES);
				ADS8364_read(POLE_AD,CHECK_TIMES);
				disp_4point(TT_AD);
				disp_4point(POLE_AD);

				if((KEY_1==0)&&(KEY_2==0)&&(KEY_3==1))          //按下“ESC”键
			    {
		            delay_xms(30);
		            if((KEY_1==0)&&(KEY_2==0)&&(KEY_3==1))
		            {
			            break;
		            }
			    }
        	}
			parasave();
    	}
    }
}
#endif

void parasave()
{
	uchar tmp[22];
	tmp[0]=(uchar)hight_limit;
	tmp[1]=(uchar)(hight_limit>>8);
	tmp[2]=(uchar)sensitive_limit;
	tmp[3]=(uchar)(sensitive_limit>>8);
	tmp[4]=(uchar)delay_value;
	tmp[5]=(uchar)(delay_value>>8);
	tmp[6]=(uchar)para1[0];
	tmp[7]=(uchar)(para1[0]>>8);
	tmp[8]=(uchar)para1[1];
	tmp[9]=(uchar)(para1[1]>>8);
	tmp[10]=(uchar)para1[2];
	tmp[11]=(uchar)(para1[2]>>8);
	tmp[12]=(uchar)para1[3];
	tmp[13]=(uchar)(para1[3]>>8);
	tmp[14]=(uchar)para2[0];
	tmp[15]=(uchar)(para2[0]>>8);
	tmp[16]=(uchar)para2[1];
	tmp[17]=(uchar)(para2[1]>>8);
	tmp[18]=(uchar)para2[2];
	tmp[19]=(uchar)(para2[2]>>8);
	tmp[20]=(uchar)para2[3];
	tmp[21]=(uchar)(para2[3]>>8);
	WritEEEprom(EEPROM_H, EEPROM_L, 22, tmp);
}

void pararead()
{
	uchar tmp[22];
	REadEEprom(EEPROM_H, EEPROM_L, 22, tmp);
	hight_limit=tmp[1];
	hight_limit<<=8;
	hight_limit+=tmp[0];
	sensitive_limit=tmp[3];
	sensitive_limit<<=8;
	sensitive_limit+=tmp[2];
	delay_value=tmp[5];
	delay_value<<=8;
	delay_value+=tmp[4];
	para1[0]=tmp[7];
	para1[0]<<=8;
	para1[0]+=tmp[6];
	para1[1]=tmp[9];
	para1[1]<<=8;
	para1[1]+=tmp[8];
	para1[2]=tmp[11];
	para1[2]<<=8;
	para1[2]+=tmp[10];
	para1[3]=tmp[13];
	para1[3]<<=8;
	para2[3]+=tmp[12];
	para2[0]=tmp[15];
	para2[0]<<=8;
	para2[0]+=tmp[14];
	para2[1]=tmp[17];
	para2[1]<<=8;
	para2[1]+=tmp[16];
	para2[2]=tmp[19];
	para2[2]<<=8;
	para2[2]+=tmp[18];
	para2[3]=tmp[21];
	para2[3]<<=8;
	para2[3]+=tmp[20];
}

⌨️ 快捷键说明

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