📄 beifen.c
字号:
//******************************************************************************
// HX60 1 MSP-FET430f149 Program - press_measure
//
// MSP430F149
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.0|-->LED
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include <msp430x14x.h>
#include "lcd.h"
#include "init.h"
#include "ADS1240.h"
#include "uart.h"
#include "24C64.h"
#include "Key.h"
//#define AD_Data_num 4
#define Mode_num1 0 //MODE 0显示压力值
#define Mode_num2 1 //MODE 1校准模式
#define Mode_num3 2
void power_off(void);
void reset_AD_reg(void);
void mode_check(void);
void adc_init(void);
void LCD_Display(unsigned char Cursor_Addr,unsigned char *LCD_data);
void Password_check(void);
unsigned char get_key_bar(unsigned char *out_key_bar);
void Save_key_data(unsigned long int *data,unsigned int EE_addr);
void rest_LCD_data(void);
void Open_AD_Sampling(void);
void Close_AD_Sampling(void);
void Open_WatchDog(void);
void Close_WatchDog(void);
void Show_AD_Data(void);
void Save_AD_Data(unsigned long int*data,unsigned int EE_addr);
void writetoreg(uchar ad_reg);
extern void ADS1240SendByte(unsigned char Byte);
extern unsigned char send_buffer1[30];
extern unsigned int send_num_data;
extern unsigned char re_buffer1[30];
extern unsigned int receive_num_data;
//========================================================================================
//压力变量变量
//========================================================================================
float Resistance; //时时测量的电阻值
//========================================================================================
//AD变量
//========================================================================================
unsigned char AD_Sampling_num;
float Press_Data;
unsigned char AD_negative_flag;
//========================================================================================
//LCD变量
//========================================================================================
unsigned char Mode;
unsigned char key_data;
unsigned long dataa;
union ulonguintuchar {uchar dat4[4];} ad0;
unsigned char ad_flag;
unsigned long ad1240,ad1240_test[10],ad1240_test1[10];
long ad12401;
float adf;
unsigned char AD1240_Reg_Val[15];
unsigned char AD_num=0;
unsigned char WDT_num;
unsigned long int ee_data;
unsigned char KeyDown_flag;
unsigned char DRDY_low_flag,intdata;
unsigned long int key_assignments;
unsigned char back_light_flag,back_light_num,LCD_digit_num;
//========================================================================================
//LCD变量
//========================================================================================
unsigned char LCD_Cursor_Addr;
unsigned char password[6]={0,1,2,3,4,5};
unsigned char LCD_Key_bar[6]={0,0,0,0,0,0};
unsigned char password_ok_flag;
unsigned char LCD_NUM=5;
unsigned char LCD_negative_flag,negative_flag,negative_ok_flag;
//========================================================================================
//校正变量
//========================================================================================
unsigned char Press_Adjust_state;
unsigned char PGA_Plus;
unsigned long Zero_data,Most_data;
unsigned long Zero_Sampling_AD,Most_Sampling_AD;
unsigned char Most_decimal_num;
unsigned char line_modify_num;
unsigned char Most_Flag;
unsigned long int Standard_Press[100],Measure_Press[100];
float Measure_Press1[100];
float line_modify_k[100],Zero_Most_k;
//float Initial_Resistance;
unsigned char Zero_modify_ok;
unsigned char Most_modify_ok;
unsigned char line_modify_ok;
unsigned char Zero_Most_Revise_Flag;
//========================================================================================
//系统变量
//========================================================================================
unsigned char EN_AD_Flag;
unsigned char C_Power_Flag;
//========================================================================================
//函数:void reset_AD_reg(void)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void reset_AD_reg(void)
{
unsigned char i;
AD_num=0;
ad_flag=0;
for(i=0;i<5;i++)
{
ad1240_test[i]=0;
ad1240_test1[i]=0;
}
}
//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
ulong Hex_to_BCD(ulong data)
{
uchar i;
ulong data1[10],data2=0,data3,data4;
data3=data;
data4=0;
data2=0;
for(i=0;i<8;i++)
{
data2=data3/10;
data1[i]=data3-data2*10;
data3=data2;
}
data4=data1[7];
for(i=8;i>0;i--)
{
data4=(data4<<4)+data1[i-1];
}
return data4;
}
//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
unsigned long AD_Data_Manage(unsigned long *data,unsigned char num)
{
unsigned char i;
unsigned long max_data,min_data,ad_data=0;
unsigned long *data1;
data1=data;
max_data=data1[0];
min_data=data1[0];
for(i=0;i<num;i++)
{
ad_data=ad_data+data[i];
if(data[i]>max_data) max_data=data1[i];
else
if(data[i]<min_data) min_data=data1[i];
}
ad_data=ad_data-max_data-min_data;
ad_data=(unsigned long)(ad_data/(num-2));
return ad_data;
}
//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void Delay(uint value)
{ while(value>1)value--;}
//========================================================================================
//函数:void main(void)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void main(void)
{
unsigned char i,j,modify_num,zero_flag;
unsigned char char_bar[4];
unsigned int bar1;
unsigned long int bar2;
float bar3[4];
WDTCTL=WDTPW+WDTHOLD;//Stop WDT
init_port();
//========================================================================================
//读取EE中校正参数
//========================================================================================
Press_Adjust_state=ReadWord(Adjust_state);
if(Press_Adjust_state==0x01)
{
AD_negative_flag=ReadWord(AD_negative_ee_flag);
PGA_Plus=ReadWord(AD_PGA_Plus);
//=============================================
//读取零点校正值
//=============================================
for(i=0;i<4;i++)
char_bar[i]=ReadWord(Press_Zero+i);
Zero_data=0;
Zero_data=(Zero_data+(unsigned long)char_bar[3])<<8;
Zero_data=(Zero_data+(unsigned long)char_bar[2])<<8;
Zero_data=(Zero_data+(unsigned long)char_bar[1])<<8;
Zero_data=(Zero_data+(unsigned long)char_bar[0]);
for(i=0;i<4;i++)
char_bar[i]=ReadWord(Press_Zero_Sampling_AD+i);
Zero_Sampling_AD=0;
Zero_Sampling_AD=(Zero_Sampling_AD+(unsigned long)char_bar[3])<<8;
Zero_Sampling_AD=(Zero_Sampling_AD+(unsigned long)char_bar[2])<<8;
Zero_Sampling_AD=(Zero_Sampling_AD+(unsigned long)char_bar[1])<<8;
Zero_Sampling_AD=(Zero_Sampling_AD+(unsigned long)char_bar[0]);
//=============================================
//读取满程校正值
//=============================================
for(i=0;i<4;i++)
char_bar[i]=ReadWord(Press_Most+i);
Most_data=0;
Most_data=(Most_data+(unsigned long)char_bar[3])<<8;
Most_data=(Most_data+(unsigned long)char_bar[2])<<8;
Most_data=(Most_data+(unsigned long)char_bar[1])<<8;
Most_data=(Most_data+(unsigned long)char_bar[0]);
for(i=0;i<4;i++)
char_bar[i]=ReadWord(Press_Most_Sampling_AD+i);
Most_Sampling_AD=0;
Most_Sampling_AD=(Most_Sampling_AD+(unsigned long)char_bar[3])<<8;
Most_Sampling_AD=(Most_Sampling_AD+(unsigned long)char_bar[2])<<8;
Most_Sampling_AD=(Most_Sampling_AD+(unsigned long)char_bar[1])<<8;
Most_Sampling_AD=(Most_Sampling_AD+(unsigned long)char_bar[0]);
//=============================================
//读取满程校正值
//=============================================
Most_decimal_num=ReadWord(Press_Most_decimal);
//=============================================
//读取线性校正值数量
//=============================================
line_modify_num=ReadWord(Press_line_modify_num);
//=============================================
//读取线性校正值
//=============================================
for(i=0;i<line_modify_num;i++)
{
for(j=0;j<4;j++)
{
char_bar[j]=0;
bar1=Press_Standard+i*8+j;
char_bar[j]=ReadWord(bar1);
}
Standard_Press[i]=0;
Standard_Press[i]=(Standard_Press[i]+(unsigned long)char_bar[3])<<8;
Standard_Press[i]=(Standard_Press[i]+(unsigned long)char_bar[2])<<8;
Standard_Press[i]=(Standard_Press[i]+(unsigned long)char_bar[1])<<8;
Standard_Press[i]=(Standard_Press[i]+(unsigned long)char_bar[0]);
for(j=0;j<4;j++)
{
char_bar[j]=0;
bar1=Press_Measure+i*8+j;
char_bar[j]=ReadWord(bar1);
//char_bar[j]=ReadWord(Press_Measure+i*8+j);
}
Measure_Press[i]=0;
Measure_Press[i]=(Measure_Press[i]+(unsigned long)char_bar[3])<<8;
Measure_Press[i]=(Measure_Press[i]+(unsigned long)char_bar[2])<<8;
Measure_Press[i]=(Measure_Press[i]+(unsigned long)char_bar[1])<<8;
Measure_Press[i]=(Measure_Press[i]+(unsigned long)char_bar[0]);
}
Most_Flag=ReadWord(Press_Most_Flag);
}
else
{//各参数的默认值
PGA_Plus=0;//ADS1240_GAIN_32;
Zero_data=0x00;
Most_data=0xbb8;//3000
Most_decimal_num=0x04;
line_modify_num=0x00;
Most_Flag=0x00;
}
reset_EE_port();
for(i=0;i<100;i++)
{
if(Measure_Press[i]>0x7fffff)
{
bar2=(Measure_Press[i]|0xff000000);
bar2=~bar2+1;
Measure_Press1[i]=0;
Measure_Press1[i]=(float)(0-(float)bar2);
}
else
{
Measure_Press1[i]=(float)Measure_Press[i];
}
}
//========================================================================================
//给AD初始化参数付值
//========================================================================================
AD1240_Reg_Val[0]=PGA_Plus;//ADS1240_GAIN_32;//PGA_Plus;//SETUP
AD1240_Reg_Val[1]=ADS1240_MUXP_AIN0+ADS1240_MUXN_AIN1;//MUX
AD1240_Reg_Val[2]=0x00;//U_N_B_BIT+BUFEN_BIT+RANGE_BIT;//ACR
reset_AD_reg();
//========================================================================================
//初始化系统变量
//========================================================================================
KeyDown_flag=0;
key_data=0;
Mode=0;
LCD_Cursor_Addr=0;
AD_Sampling_num=0x04;
EN_AD_Flag=1;
back_light_flag=0;
back_light_num=0;
LCD_digit_num=0;
//========================================================================================
//初始化液晶
//========================================================================================
set_lcd_out();
init_lcd();
set_lcd_powdn();
P2DIR |= BIT5;
P5DIR|=BIT4;
//========================================================================================
//初始化串口
//========================================================================================
//uart_init();
// EN_uart();
AD_negative_flag=0;
//========================================================================================
//看门狗初始化
//========================================================================================
WDT_num=0;
WDTCTL =WDT_ADLY_1000;//WDT_ADLY_1000; // WDT 1s/4 interval timer
IE1 |= WDTIE; // Enable WDT interrupt
C_Power_Flag=1;
//========================================================================================
//打开全局中断
//========================================================================================
_EINT();
En_key_INT();
//Press_Adjust_state=0;
//========================================================================================
//主循环开始
//========================================================================================
while(1)
{
star:
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
_NOP();
stara1:
switch( Mode)
{
case 0://压力测量模式
if(KeyDown_flag==1)
{
mode_check();
KeyDown_flag=0;
goto stara1;
}
if(Press_Adjust_state==0x01)//校正了吗?
{//已校正
if(ad_flag==1)
{
if(AD_num>(AD_Sampling_num-1))
{
for(i=0;i<(AD_Sampling_num+1);i++)
ad1240_test1[i]=ad1240_test[i+1];
ad1240=0;
ad1240=AD_Data_Manage(ad1240_test1,AD_Sampling_num);
Press_Data=(float)ad1240;
if(ad1240>0x7fffff)
{
ad1240=(ad1240|0xff000000);
ad1240=~ad1240+1;
Press_Data=0-(float)ad1240;
}
modify_num=150;
if(Press_Data>=Measure_Press1[0])//正值计算
{
if(Press_Data>=Measure_Press1[line_modify_num-1])
{ modify_num=(line_modify_num-2);}
else
{
for(i=0;i<line_modify_num-1;i++)
{
if((Press_Data>=Measure_Press1[i])&&(Press_Data<Measure_Press1[i+1]) )
{ modify_num=i; break;}
}
}
}//if(Press_Data>=Measure_Press[0])
else//负值计算
{
modify_num=0;
}//负值计算
if(modify_num==150)
{Show_AD_Data();break;}
zero_flag=0;
bar3[0]=Measure_Press1[modify_num+1]-Measure_Press1[modify_num];
bar3[1]=Press_Data-Measure_Press1[modify_num];
bar3[2]=Standard_Press[modify_num+1]-Standard_Press[modify_num];
if(Press_Data>Measure_Press1[line_modify_num-1])
Press_Data=(((float)bar3[1]/(float)bar3[0])*bar3[2])+Standard_Press[line_modify_num-2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -