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

📄 smb363.c

📁 加速度传感器
💻 C
字号:
#include	<reg931.h>
#include	<stdio.h>
#include	<math.h>
#include	<intrins.h>
#include	<flashiap.h>
#include	"ad7705.h"
#include	"resconfig.h"
#include	"macrodefine.h"

//---------------------------------------------------------------------------
//功能:看门狗初始化
//---------------------------------------------------------------------------
void WatchdogInit(void)
{
  	WDL 	=0XFF; 				//看门狗复位时间
  	EA 		=0;
  	WDCON 	=0XE6;    //选择看门狗振荡器为看门狗时钟源;//0XE5;选择PCLK为看门狗时钟源
  	WFEED1 	=0XA5;
  	WFEED2 	=0X5A;
  	EA 		=1;
}
///---------------------------------------------------------------------------
//功能:关看门狗定时器时钟
//---------------------------------------------------------------------------
/*void WatchdogStop(void)
{
	EA 		=0;
	WDCON 	=0XE1;
	WFEED1 	=0XA5;
	WFEED2	 =0X5A;
	EA 		=1;
} */
//---------------------------------------------------------------------------
//功能:喂狗程序
//---------------------------------------------------------------------------
void WatchdogFeed(void)
{
  	EA =0;
  	WFEED1 	=0XA5;
  	WFEED2 	=0X5A;
  	EA	 	=1;
}
void Init_SPI(void)
{
	SPCTL 	=0XDC;//工作频率1/4PCLK 先高后低 主机 忽略片选 空闲时高电平 前沿驱动后沿采样
}
//SPI通讯 用查询方式 行参为发送数据 返回读到数据
uint8 Communication_SPI(uint8 TDATA)
{
	uint8 temp;
	SPDAT 	=TDATA;
	while((SPSTAT &0X80)==0);
	temp 	=SPDAT;
	SPSTAT |=0XC0;
	return temp;
}
//I/O口初始化
void Init_IO(void)
{
	P0M1 	=0X00;
	P0M2 	=0X00;		//P0口全部为双向I/O
	P1M1 	=0X2C;
	P1M2 	=0X0C;		//P1口7、6、1、0为双向I/O;5为输入;3、2为开漏
	P2M1 	=0X00;
	P2M2 	=0X00;		//P2口全部为双向I/O
	P3M1 	=0X00;
	P3M2 	=0X00;		//P3口全部为双向I/O
	P0 		=0XFF;
	P1 		=0XFF;
	P2 		=0XFF;
	P3 		=0XFF;
}
//串口初始化
void Init_Uart(void)
{
	SCON 	=0X52;
	BRGCON 	=0X02;
	BRGR1 	=0X01;//BRGR1_DATA;
	BRGR0 	=0X70;//BRGR0_DATA;
	BRGCON 	=0X03;
	SSTAT 	=0X20;
	REN 	=1;
}
void Serial_Send(uint8 a)      //串口发送      
{
   SBUF	=a;
   while(TI!=1);
   TI	=0;
}
//定时器0初始化
void Init_Timer0(void)
{
  	DIVM 	=0;   			//不分频
  	TMOD 	=0X01;			//设置T0作定时器用,并且工作在模式1
  	TAMOD 	=0X00;
  	TL0 	=TL0DAT;
  	TH0 	=TH0DAT;
}
//启动定时器0
void T0Run(void)
{
	TR0 	=1; 
}
//停止定时器0
//void T0Stop(void)
//{
//  	TR0 	=0;
//}
//开启定时器0中断
void EnT0Int(void)
{
  	ET0 	=1;
}
//关闭定时器0
//void InvT0Int(void)
//{
//  	ET0 	=0;
//}
//复位AD7705
void Rest_AD7705(void)
{
	uint16 i =0x0fff;
	WatchdogFeed();
	ADRstn 	=0;
	while(i !=0)
	{
		i--;
	}
	ADRstn 	=1;
	bChannel =0;
	WatchdogFeed();
}
//AD7705初始化
void Init_AD7705(uint8 Channel)
{
	Rest_AD7705();
	ADCSn 	=0;
	_nop_(); _nop_();_nop_();_nop_();
	Config_ClkReg(Channel);		//配置时钟寄存器
	Config_SetupReg(Channel);	//配置设置寄存器
	_nop_(); _nop_();_nop_();_nop_();
	ADCSn 	=1;
}
//配置各个通道的设置寄存器函数
void Config_SetupReg(uint8 Channel)
{
	switch(Channel)
	{
		case 0://初始化通道0
			Communication_SPI(CMD_W_SetReg_0);//激活0通道,下一步操作选择写设置寄存器
			Communication_SPI(CMD_SelfCalibration);
		break;
		case 1://初始化通道1
			Communication_SPI(CMD_W_SetReg_1);//激活1通道,下一步操作选择写设置寄存器
			Communication_SPI(CMD_SelfCalibration);
		break;
		default:
		break;
	} 	
}
//配置各个通道的时钟寄存器函数
void Config_ClkReg(uint8 Channel)
{
	switch(Channel)
	{
		case 0://初始化通道0
			Communication_SPI(CMD_W_ClkReg_0);//激活0通道,下一步操作选择写时钟寄存器
			Communication_SPI(CMD_Clk_Config);
		break;
		case 1://初始化通道1
			Communication_SPI(CMD_W_ClkReg_1);//激活1通道,下一步操作选择写时钟寄存器
			Communication_SPI(CMD_Clk_Config);
		break;
		default:
		break;
	} 	
}
//读AD7705转换数据
void ReadAD7705Data(void)
{
	float	tempx=0.0,tempy=0.0;
	if(DRDYn ==1)
	{
		return;
	}
	ADCSn =0;
	AD7705Dog =0;
	_nop_(); _nop_();_nop_();_nop_();
	if(bChannel ==0)
	{
		Communication_SPI(CMD_R_DataReg_0);
		Axis_X.axis_voltage[0] = Communication_SPI(0xff);
		Axis_X.axis_voltage[1] = Communication_SPI(0xff);
		_nop_(); _nop_();_nop_();_nop_();
		Communication_SPI(CMD_W_SetReg_1);
		Communication_SPI(CMD_Clk_Config);
		WatchdogFeed();
		Axis_X_Buff[Axis_X_Counter] = Axis_X.Axis_voltage;
		Axis_X_Counter++;
		if(Axis_X_Counter>4)
		{
			Axis_X_Counter =0;
			Axis_X_Angle = IntChangeFloat(Axis_X_Buff);
			//if(bDataEnd ==1)
			//{
			//	printf("XV: %2.5f,XA: %2.4f\n",Axis_X_Angle,Axis_Y_Angle);
			//	bDataEnd =0;
			//}			
			bInitialX	=1;
		}  
	}
	else
	{
		Communication_SPI(CMD_R_DataReg_1);
		Axis_Y.axis_voltage[0] = Communication_SPI(0xff);
		Axis_Y.axis_voltage[1] = Communication_SPI(0xff);
		_nop_(); _nop_();_nop_();_nop_();
		Communication_SPI(CMD_W_SetReg_0);
		Communication_SPI(CMD_Clk_Config);
		WatchdogFeed();
		Axis_Y_Buff[Axis_Y_Counter] = Axis_Y.Axis_voltage;
		Axis_Y_Counter++;
		if(Axis_Y_Counter>4)
		{
			Axis_Y_Counter =0;
			Axis_Y_Angle = IntChangeFloat(Axis_Y_Buff);
			bInitialX	=1;	   
		}  
	}	
	if(bDataEnd ==1)
	{
//		printf("X= %2.5f,Y =%2.5f\n",Axis_X_Angle,Axis_Y_Angle);
		if(Axis_X_Angle>1.2884)
			tempx	=(Axis_X_Angle-1.2884)*0.971628449;
		else
			tempx	=(Axis_X_Angle-1.2844)*1.0078836667;
		if(Axis_Y_Angle>1.2574)
			tempy	=(Axis_Y_Angle-1.2574)*0.987109728;
		else
			tempy	=(Axis_Y_Angle-1.2574)*0.9809692;
		Axis_X_Angle_Temp.Zero_axis = 180.0/Pi*asin(tempx*2.0+0.001);
		Axis_Y_Angle_Temp.Zero_axis = 180.0/Pi*asin(tempy*2.0);
//		printf("X= %2.5f,Y =%2.5f\n",tempx,tempy);
		WatchdogFeed();
//		printf("X= %2.5f,Y =%2.5f\n",Axis_X_Angle,Axis_Y_Angle);
//		printf("%2.5f",Axis_X_Angle);
		Axis_X_HEX.Zero_axis	=Axis_X_Angle_Temp.Zero_axis;
		Axis_Y_HEX.Zero_axis	=Axis_Y_Angle_Temp.Zero_axis;
//以ASCII码发送
		if(HEXorASIIC_Temp==0x30)
		{
			if(((Axis_X_Angle_Temp.Zero_axis)-Zero_X.Zero_axis)<(-15.0))
			{
				printf("X =-----;");
			}
			else if(((Axis_X_Angle_Temp.Zero_axis)-Zero_X.Zero_axis)>15.0)
			{
				printf("X =+++++;");
			}
			else if(((Axis_X_Angle_Temp.Zero_axis)-Zero_X.Zero_axis)>(-15.0)&&((Axis_X_Angle_Temp.Zero_axis)-Zero_X.Zero_axis)<15.0)
			{
				printf("X =%2.2f;",((Axis_X_Angle_Temp.Zero_axis)-Zero_X.Zero_axis));
			}
			WatchdogFeed();
			if((Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis)<(-15.0))
			{
				printf("Y =-----\n");
			}
			else if((Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis)>15.0)
			{
				printf("Y =+++++\n");
			}				
			else if((Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis)>(-15.0)&&(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis)<15.0)
			{
				printf("Y =%2.2f\n",(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis));
			}
		}
//以16近制发送		
		else
		{
			if(((Axis_X_HEX.Zero_axis)-Zero_X.Zero_axis)>(-90.0) && ((Axis_X_HEX.Zero_axis)-Zero_X.Zero_axis)<90.0)
			{
				//SEND DATA;
				if(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis>0)
				{
				 	Serial_Send(0xa5);
					Serial_Send('-');
					Serial_Send((int)(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis+0.5));
					Serial_Send(';');
				}
				else
				{
				  	Serial_Send(0xa5);
					Serial_Send('+');
					Serial_Send((int)(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis-0.5));
					Serial_Send(';');
				}
				WatchdogFeed();
			}
			else
			{
				if(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis>0)
				{
				 	Serial_Send(0xa5);
					Serial_Send('-');
					Serial_Send((int)(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis+0.5));
					Serial_Send(';');
				}
				else
				{
				  	Serial_Send(0xa5);
					Serial_Send('+');
					Serial_Send((int)(Axis_X_Angle_Temp.Zero_axis-Zero_X.Zero_axis-0.5));
					Serial_Send(';');
				}
				ALARM_X	=1;
			}
			if((Axis_Y_HEX.Zero_axis-Zero_Y.Zero_axis)>-45.0 && (Axis_Y_HEX.Zero_axis-Zero_Y.Zero_axis)<45.0)
			{
				if(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis>0)
				{
					Serial_Send('+');
					Serial_Send((int)(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis+0.5));
					Serial_Send(0x5a);
				}
				else
				{
					Serial_Send('-');
					Serial_Send((int)(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis-0.5));
					Serial_Send(0x5a);	
				}
				WatchdogFeed();
			}
			else
			{
				//SANDDATA
				if(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis>0)
				{
					Serial_Send('+');
					Serial_Send((int)(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis+0.5));
					Serial_Send(0x5a);
				}
				else
				{
					Serial_Send('-');
					Serial_Send((int)(Axis_Y_Angle_Temp.Zero_axis-Zero_Y.Zero_axis-0.5));
					Serial_Send(0x5a);	
				}
			}	
		}
		WatchdogFeed();
		bDataEnd =0;
	}
//	printf("X	=%x,Y	=%x\n",Axis_X_Buff[0],Axis_Y_Buff[0]);			
	_nop_(); _nop_();_nop_();_nop_();
	ADCSn =1;
}
float IntChangeFloat(uint16 *pAxis_Buff)
{
	uint8 i;
	float temp[5];
	float tempbuff;
	tempbuff	=0;
	WatchdogFeed();
	for(i =0;i<5;i++)
	{
		temp[i] =((*(pAxis_Buff+i))*LSB);//-2.5)/2.0);
	}
	WatchdogFeed();
	for(i =0;i<5;i++)
	{
		tempbuff += temp[i];
	}
	databuff[testcount] = tempbuff/5.0;
	testcount++;
	if(testcount>2)
	{
		testcount =0;
		if(databuff[0]>databuff[1])
		{
			if(databuff[0]<databuff[2])
			{
				tempbuff = databuff[0];
			}
			else if(databuff[1]<databuff[2])
			{
				tempbuff = databuff[2];
			}
			else
			{
				tempbuff = databuff[1];
			}
		}
		else
		{
			if(databuff[0]>databuff[2])
			{
				tempbuff = databuff[0];
			}
			else if(databuff[1]>databuff[2])
			{
				tempbuff = databuff[2];
			}
			else
			{
				tempbuff = databuff[1];
			}			
		}
		if(bChannel ==1)
		{
			bDataEnd =1;
			bChannel =0;
			Config_SetupReg(0);
		}
		else
		{
			bChannel =1;
			Config_SetupReg(1);
		}
//		printf("tempbuff	=%2.5f\n",tempbuff);
		return (tempbuff);
	}
	WatchdogFeed();
	//return tempbuff;
}
//定时器0中断
void T0Int(void) interrupt 1
{
  TF0 = 0;
  TL0 = TL0DAT;
  TH0 = TH0DAT;
  if(bInitialX ==0)
  {
  	return;
  }
  //if(bInitialY ==0)
  //{
  //	return;
  //}
  TransUpdata++;
  if(TransUpdata>1000)
  {
 	TransUpdata =0;
	//printf("X: %2.5f\n",Axis_X_Angle);
  }
  AD7705Dog++;
  if(AD7705Dog>5000)
  {
  	Init_AD7705(0);
  }
}

void Serial() interrupt 4 using 1
{
 	if(RI)
    {
	  	CommandData[Command_i-1] = SBUF;
	  	if(CommandData[Command_i-1] == 0x0d)
	    {
		   	RIFlag = 1;
		   	Command_i = 7;
		}
	  	Command_i--;
		if(Command_i==0)
		{
			Command_i	=6;	
		}
	}						
 	RI = 0;
}
void	Delay(void)
{
	int	i;
	for(i=500;i>0;i--);
}		
void	main(void)
{
	uint8	i;
	Init_SPI();	
	Init_IO();
	Init_Uart();
	Init_Timer0();
	HEXorASIIC_Temp	=HEXorASIIC;
	Init_AD7705(0);
	EnT0Int();
	T0Run();
	EA 	=1;
	ES	=1;
	WatchdogInit();
	while(1)
	{
//		printf("hello world!\n");
		if(ZERO==0)
		{
			Delay();
			if(ZERO==0)
			{
			  	EA =0;
				for(i =0;i<8;i++)
				{
					FLASH_WriteByte(&(Zero_X.zero[i]),Axis_X_Angle_Temp.zero[i]);
					FLASH_WriteByte(&(Zero_Y.zero[i]),Axis_Y_Angle_Temp.zero[i]);
				}
				EA	=1;
			}
			else
				return;
		}
		ReadAD7705Data();
/*		if(RIFlag==1)
		{
			SerialRange();
			RIFlag	=0;
		}	  */
	}
}

⌨️ 快捷键说明

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