?? smb363.c
字號(hào):
#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; //看門狗復(fù)位時(shí)間
EA =0;
WDCON =0XE6; //選擇看門狗振蕩器為看門狗時(shí)鐘源;//0XE5;選擇PCLK為看門狗時(shí)鐘源
WFEED1 =0XA5;
WFEED2 =0X5A;
EA =1;
}
///---------------------------------------------------------------------------
//功能:關(guān)看門狗定時(shí)器時(shí)鐘
//---------------------------------------------------------------------------
/*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 先高后低 主機(jī) 忽略片選 空閑時(shí)高電平 前沿驅(qū)動(dòng)后沿采樣
}
//SPI通訊 用查詢方式 行參為發(fā)送數(shù)據(jù) 返回讀到數(shù)據(jù)
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為開(kāi)漏
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) //串口發(fā)送
{
SBUF =a;
while(TI!=1);
TI =0;
}
//定時(shí)器0初始化
void Init_Timer0(void)
{
DIVM =0; //不分頻
TMOD =0X01; //設(shè)置T0作定時(shí)器用,并且工作在模式1
TAMOD =0X00;
TL0 =TL0DAT;
TH0 =TH0DAT;
}
//啟動(dòng)定時(shí)器0
void T0Run(void)
{
TR0 =1;
}
//停止定時(shí)器0
//void T0Stop(void)
//{
// TR0 =0;
//}
//開(kāi)啟定時(shí)器0中斷
void EnT0Int(void)
{
ET0 =1;
}
//關(guān)閉定時(shí)器0
//void InvT0Int(void)
//{
// ET0 =0;
//}
//復(fù)位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); //配置時(shí)鐘寄存器
Config_SetupReg(Channel); //配置設(shè)置寄存器
_nop_(); _nop_();_nop_();_nop_();
ADCSn =1;
}
//配置各個(gè)通道的設(shè)置寄存器函數(shù)
void Config_SetupReg(uint8 Channel)
{
switch(Channel)
{
case 0://初始化通道0
Communication_SPI(CMD_W_SetReg_0);//激活0通道,下一步操作選擇寫設(shè)置寄存器
Communication_SPI(CMD_SelfCalibration);
break;
case 1://初始化通道1
Communication_SPI(CMD_W_SetReg_1);//激活1通道,下一步操作選擇寫設(shè)置寄存器
Communication_SPI(CMD_SelfCalibration);
break;
default:
break;
}
}
//配置各個(gè)通道的時(shí)鐘寄存器函數(shù)
void Config_ClkReg(uint8 Channel)
{
switch(Channel)
{
case 0://初始化通道0
Communication_SPI(CMD_W_ClkReg_0);//激活0通道,下一步操作選擇寫時(shí)鐘寄存器
Communication_SPI(CMD_Clk_Config);
break;
case 1://初始化通道1
Communication_SPI(CMD_W_ClkReg_1);//激活1通道,下一步操作選擇寫時(shí)鐘寄存器
Communication_SPI(CMD_Clk_Config);
break;
default:
break;
}
}
//讀AD7705轉(zhuǎn)換數(shù)據(jù)
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碼發(fā)送
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近制發(fā)送
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;
}
//定時(shí)器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;
} */
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -