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

📄 main.c

📁 网上查了半天
💻 C
字号:
//*********************************************//
//****main.c***********************************//
//*****sanxianv1.0********************************//
//*****testencode,*******************************//
//*****testlcd, ********************************//
//*****testkey?
//***2005.10.11********************************//
//*********************************************//

#include <math.h>
#include <absacc.h>
#include <string.h>
//#include <lcd_c51.h>
#include <intrins.h>

#include <sanxian.h>

#define M 1607695

/*   常数定义   */
//#define  para1 0x10;   //文本图形显示区域宽度
/*  定义标志位  */

//void lcddisp();
void delay(unsigned char);	//延时8+6N个周期
void delay40n(unsigned int);
unsigned long counter();
void calculate(unsigned long);
unsigned long maxest();
void autoup();
void lcddisp();
//void key_func();
//uchar keypro();
//uchar key_test();

void clr_counter();

//位口线定义{
sbit b_qubai = P3^3;//P2^2;	//取摆输出
sbit b_tuixiao = P2^2;	//退销输出
sbit b_impact = P2^4;	//冲击输出
sbit b_fangbai = P2^3;	//放摆输出

sbit b_squp = P2^5;		//取摆到位信号输入
sbit b_sqxiao = P2^6;	//退销到位信号输入

sbit P_T0 = P3^4;
sbit P_T1 = P3^5;

//位口线定义}
		 
//变量定义{
uchar  O_X,O_Y;
uchar  n_cycle;	//计数器满的次数:即相对移动超过计数满量程的次数;无符号数
uint idata	sample_no;
uint  n_xshnl,n_chjrx; //应定义为全局变量//此处最好不要定义为全局变量,内存要不够!!
uint  shiceangle;   //实测预扬角
ulong idata n_liju,n_nlxzh;	 //力矩,能量修正值
unsigned long num_encode , maxer_encode ;	  //编码器的值,编码器计数的较大的值;
bit n_cycle_flag;  //n_cycle的正负号标识,"0"为正,"1"为负;
bit num_encode_flag; //编码器所计数的符号;"0"为正,"1"为负;
bit k_fangbai=1;	   //放摆输入按键
bit b_level;   //big 0 little 1
bit b_print_auto;
bit b_qubai_flag;
//bit b_disp_once;
bit b_firstinleft , b_do_once ;   //第一次检到进入左侧为"1"时第一次检出;只执行一次,为"0"且在左侧时执行;

//bit b_autoprint;  //是否自动打印,是则为1,否



uchar idata key_number,keypro_rtn;


float idata temp;
unsigned long maxest_encode;
unsigned long num1=0,encode_num;
/***************************/
/*       演示主程序    14m    */ 
/***************************/
main()
{
//	uchar i;
	
	b_qubai = 0;	//取摆输出
 	b_tuixiao = 0;	//退销输出
	b_impact = 0;	//冲击输出
	b_fangbai=0;					 
//********************************************************************
//定时器设置
//********************************************************************
    TMOD=0X55;//0X01; T0T1用作16位计数器                         //定时器0方式1
	TH0=0x0;//(65536-9216)/256;                //预置计数初值
	TL0=0x0;//(65536-9216)%256;
	TH1=0x0;
	TL1=0x0;
	
	P_T0=1;
	P_T1=1;
	ET1=1;	//开T1中断
	ET0=1;                               //开T/C0中断
	TR0=1;                               //启动T/C0
	TR1=1;	//启动T0
	EA=1;                                //开CPU中断

	delay40n(0xffff);

	delay40n(0xffff);
	initilcd();
//*******************************************************************e
//显示模块初始化
//********************************************************************

//	INT_1();         /* 初始化函数 */
//    CLEAR();         /* 清屏函数 */
	//lcddisp(); //显示液晶屏上固定的文字
	temp = cos(((float)(shiceangle))/100.0*3.14159/180.0);

	 while(1)
	 {

		sb_cont244 = 0;
		sb_test = !sb_test;
	//	delay40n(0xfff);
	//	sb_cont244 = 1;
		
	 	lcddisp();


		delay40n(0x8fff);


	 	if (k_fangbai==0)
		{
			if(num_encode<80)
			{
				b_fangbai = 0;
				k_fangbai=1;
			}
		}

	//	keypro();

		if(num_encode_flag==0)
		{
			maxest();
		}

	//	key_func();

		autoup();
		if(1==num_encode_flag)
		{
			b_firstinleft = 0;
			b_do_once = 0;
		}
	}	
 
}

//------------------------//
//----取摆函数-------------//
//------------------------//
void qubai()  
{
	 b_qubai=1;
	 delay40n(0xfff);
	 b_qubai=0;
}
/*
//----------------------//
//----退销函数-----------//
//----------------------//
void tuixiao() 
{
     b_tuixiao=1;
	 delay40n(0xfff);
	 b_tuixiao=0;
}

//-----------------------//
//----冲击函数------------//
//-----------------------//
void impact() 
{
	//在此处预置实测预扬角
	if(b_squp)
	{
	clr_counter();
	TH1 = 0xd;
	TL1 = 0X06;
	sample_no++;
	}
	/////
	b_impact=1;
	delay40n(0x3fff);
	b_impact=0;
	b_qubai_flag = 1;
}

//-----------------------------//
//-----放摆函数-----------------//
//-----------------------------//
void fangbai() 
{
	b_fangbai=1;
	b_qubai_flag = 1;
}
*/
//--------------------------------------------------------------------//
//--处理计数函数:即编码器的实际计数--------------------------------------//
//--返回值为编码器所计的当前无符号数,符号在num_encode_flag中0时为正,1时为负---//
//----------------------------------------------------------------------//
unsigned long counter()
{
	unsigned long num_encode;//编码器的脉冲数
	unsigned int  n_t0,n_t1; //t0和t1计数器里的值
	unsigned char n_th0,n_tl0,n_th1,n_tl1; //t0和t1各自高低字节内的值
   do
   {
		n_th0 = TH0;
		n_th1 = TH1;
		n_tl0 = TL0;
		n_tl1 = TL1;
	}
	while((n_th0 != TH0)||(n_th1 != TH1));	 //采集t0和t1的高低字节的值
	
	n_t0 = n_th0*256 + n_tl0;
	n_t1 = n_th1*256 + n_tl1;	

	if(n_cycle == 0)   //超过满量程的次数为0
	{
		if(n_t0 >= n_t1)	 //如果t0的值大于t1的值;
		{
			num_encode = n_t0 - n_t1;
			num_encode_flag = 0;  //符号为正
		}
		else				//如果t0的值小于t1的值;
		{
			num_encode = n_t1 - n_t0;
			num_encode_flag = 1;  //符号为负;	
		}
	}

	else    //如果超过满量程的次数不为0
	{
		if(n_cycle_flag==0)
		{
			num_encode = 65536*n_cycle + n_t0 - n_t1;
		}

		else
		{
			num_encode = 65536*n_cycle - n_t0 + n_t1;	
		}

		num_encode_flag = n_cycle_flag;
	}

	return(num_encode);  //返回值为编码器所计的当前无符号数,符号在num_encode_flag中;

}

//--------------------------------------------//
//----计算能量值及冲击韧性-----------------------//
//----当前脉冲下的角度能量和韧性值---------------
//-------------------------------------------//
void calculate(unsigned long num_encode)   //取摆后角度为负值 unsigned long
{	
	bit b_cy;	   //判断是否进住,以进行四舍五入运算
	unsigned long ul_angleb;

	ul_angleb = num_encode * 360;  //4位小数,2500线编码器,4倍频
	
	n_xshnl = ( uint ) ((float) n_liju * ( cos( ( float )( ul_angleb )* 3.14159/10000.0/180.0)+0.866)/100.0);//吸收能量有两位小数

	//b_cy = n_xshnl % 2;		   //此处的四舍五入方法不对,要注意!!!!
	n_xshnl = n_xshnl-(uint)(n_nlxzh*(ul_angleb/100/150+50)/100) ;
	if( _testbit_ ( b_cy ) )
		n_xshnl ++;

	n_chjrx = n_xshnl / 8*10;  //s

}

//------------------------------------------------//
//-------------求出冲后到达的最大值------------------//
//------------------------------------------------//
unsigned long maxest()
{

	num_encode = counter();


 if( 0==num_encode_flag)
	{
		if(0==b_do_once) 
		{
			maxer_encode = 0;
			b_do_once = 1;		   
		}
	
		if(num_encode > maxer_encode)
		{
		maxer_encode = num_encode;
		maxest_encode = maxer_encode;
		calculate(maxer_encode);
		}
	}
	return(maxer_encode);
}

//---------------------------------------//
//----------自动扬摆----------------------//
//---------------------------------------//
void autoup()								  
{	
	num_encode = counter();

	if(num_encode>300)
	{
		if(num_encode_flag==1)
		{
		 	if(counter()>num_encode)
		  	{
				if(num_encode>=maxest_encode-200)
				{
					if(b_qubai_flag)
					{
						qubai();
						b_qubai_flag = 0;
					}

				}
			
		   }

		}

	}

}


//------------------------------------------------//
//----------------编码器计数------------------------//
//------------------------------------------------//
timer0()interrupt 1 using 1	 //+计数//
{
	TH0 = 0x0;
	TL0	= 0x0;
	ET0 =1;
	TR0=1;
	P_T0=1;

	if(n_cycle_flag == 0) //如果符号为正
	{
		n_cycle++;
	} 
	else if(n_cycle_flag == 1)	 //如果符号为负
	{
		n_cycle--;

		if(n_cycle == 0)
		{
			n_cycle_flag = 0;
		}
	}


}

//--------------------------------//
//-------编码器计数----------------//
//--------------------------------//
timer1() interrupt 3 using 2  //-计数
{
 	TH1 = 0x0;
	TL1 = 0x0;
	ET0 = 1;
	TR0 = 1;
	P_T1 = 1;
	if( n_cycle_flag == 0 )
	{
		if( n_cycle == 0 )
		{
			n_cycle ++ ;
			n_cycle_flag = 1 ;

		}
		else 
		n_cycle -- ;
	}
	else if(n_cycle_flag == 1)  //就加入ELSE否则计数不对
	{
		n_cycle++ ;
	}

}

//------------------------------------------------//
//----------------clr_counter()-------------------//
//----------------清零----------------------------//
//------------------------------------------------//

void clr_counter()
{
	n_cycle = 0 ;
	num_encode_flag = 0 ;  //符号为正
	TH0 = 0x0 ;		//(65536-9216)/256;                //预置计数初值
	TL0 = 0x0 ;		//(65536-9216)%256;
	TH1 = 0x0 ;
	TL1 = 0x0 ;
    num1 = 0 ;
}





⌨️ 快捷键说明

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