📄 smb363.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 + -