📄 main.c
字号:
//========================================================================================
//HX601公司:华信仪表
// 开发者:覃道堂 郑颖 沈嘉荣
// 开发时间:2008年6月5日
// 主要功能:低功耗,高精密压力测量计算显示
//========================================================================================
// MSP-FET430f149 Program - press_measure
// MSP430F149
// Built with IAR Embedded Workbench Version: 3.42A
// _ _子任务
// |
// |_ _1,键盘扫描
// |
// |_ _2,液晶显示
// |
// 压力测量 ------->|_ _3,温度测量
// (压力校准,温度测量) |
// |_ _4,压力计算
// |
// |_ _5,压力校准综合计算
// |
// |_ _6,功耗管理
//
// 一个主进程,三个辅进程; 进程
// _ _1,(1)AD 压力测量,(2)AD未进行温度补偿的压力计算,
// |
// |
// |
// |
// |
// 低功耗,高精密压力测量计算显进程--->|_ _2,温度测量
// |
// |
// |
// |
// |
// |_ _3,压力校准
//========================================================================================
#include <msp430x14x.h>
#include <math.h>
#include "lcd.h"
#include "init.h"
#include "ADS1240.h"
#include "uart.h"
#include "24C64.h"
#include "Key.h"
#define Mode_num1 0 //MODE 0显示压力值
#define Mode_num2 1 //MODE 1校准模式
#define Mode_num3 2
#define AD_Sampling_Time 3
#define wuchar 1500
extern unsigned char Open_AD_Power(void);
extern void adc_init(void);
extern unsigned char PGA_Plus;
void Password_check(void);
void Mode_Check(void);
void Password_LCD_Display(unsigned char Cursor_Addr, unsigned char *LCD_data);
void Data_LCD_Display(unsigned char Cursor_Addr, unsigned char *LCD_data,unsigned char radixPoint);
float User_input(float input_data);
float Other_unit_to_KPa(unsigned char unit,float data);
unsigned char Line_num_Input(unsigned char line_num);
void rest_LCD_data(void);
void Long_TO_Char(long int data,unsigned char *s);
void Foat_TO_Char(float data,unsigned char *s);
extern void UP_num_Display(unsigned char Point, long Value);
//========================================================================================
//系统变量
//========================================================================================
unsigned char Task_Mode;//主任务变量
unsigned char Exit_Modify_flag;//主任务变量
unsigned char Unitage;//主任务变量
//========================================================================================
//压力变量变量
//========================================================================================
//========================================================================================
//AD变量
//========================================================================================
unsigned char EN_AD_Measure,AD_Task_Start,AD_Task_Complete;//AD采样任务变量
unsigned char AD_Sampling_Num,line_revise_num;
union AD_Sampling_Data{
long int Sampling_AD_Num[5];
unsigned char Data_8Bit[4];
} Sampling_AD;
long int ad1240_test[5],ad1240,Reset_AD_Data;
float ad1240_test1[5],pressure;
unsigned long int AD_Error[5];
unsigned long int ad1240_PGA;
long int ad12401;
float Standard_Press[100];//存入标准压力值下的用户输入值
long int Measure_Press[100];//存入标准压力值下的采样的AD值
float user_zero,user_basinful;
float Press_Data,Press_Data1;
extern unsigned char P_RangeFlag;
//========================================================================================
//压力校正变量
//========================================================================================
unsigned char Press_Adjust_state;
//========================================================================================
//LCD变量
//========================================================================================
unsigned char Back_Light_Task_Start,Back_Light_Time_num;//背光任务变量
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=6; //液晶显示位数总数
unsigned char WDT_num;
//========================================================================================
//KEY变量
//========================================================================================
unsigned char key_data;//0x01背光 0x02校正 0x04清零 0x20单位
unsigned char KeyDown_flag;
//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void Delay_1ms( long int value)
{
unsigned char i;
while(value>0)
{
value--;
for(i=0;i<93;i++)
_NOP();
}
}
//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
long int AD_Data_Manage( long int *data,unsigned char num)
{
unsigned char i;
long int max_data,min_data,ad_data=0;
long int *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;
}
//========================================================================================
//函数:void main(void)
//功能:HX601产品主函数 主要实现高精度,低功耗压力测量
//变量:无
//返回:无
//========================================================================================
void main(void)
{
unsigned char i=3,j,flag,char_data[4],modify_num;
unsigned long int k;
long int bar,bar2;
unsigned long int bar1;
float data,data_ad;
//ky=powf(user_zero,user_basinful);
//================================================================================
//初始化端口
//================================================================================
WDTCTL=WDTPW+WDTHOLD; //Stop WDT
init_port();
Delay_1ms(200);
Task_Mode=0;
//================================================================================
//初始化压力校验变量
//================================================================================
Press_Adjust_state=0;
Press_Adjust_state=ReadWord(Adjust_state);
//========================================================================================
//读取EE中校正参数
//========================================================================================
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_data[i]=ReadWord(Press_Zero+i);
bar=0;
bar=(bar+char_data[3])<<8;
bar=(bar+char_data[2])<<8;
bar=(bar+char_data[1])<<8;
bar=(bar+char_data[0]);
user_zero=(float)bar;
user_zero=user_zero/10;
for(i=0;i<4;i++)
char_data[i]=ReadWord(Press_Most+i);
bar=0;
bar=(bar+char_data[3])<<8;
bar=(bar+char_data[2])<<8;
bar=(bar+char_data[1])<<8;
bar=(bar+char_data[0]);
user_basinful=(float)bar;
user_basinful=user_basinful/10;
if(user_basinful>10000) P_RangeFlag=1;
//=============================================
//读取线性校正值数量
//=============================================
line_revise_num=ReadWord(Press_line_modify_num);
//=============================================
//读取线性校正值
//=============================================
for(i=0;i<line_revise_num;i++)
{
for(j=0;j<4;j++)
{
char_data[j]=0;
bar1=Press_Standard+i*8+j;
char_data[j]=ReadWord(bar1);
}
bar=0;
bar=(bar+char_data[3])<<8;
bar=(bar+char_data[2])<<8;
bar=(bar+char_data[1])<<8;
bar=(bar+char_data[0]);
Standard_Press[i]=(float)bar;
Standard_Press[i]=Standard_Press[i]/10;
for(j=0;j<4;j++)
{
char_data[j]=0;
bar1=Press_Measure+i*8+j;
char_data[j]=ReadWord(bar1);
}
bar=0;
bar=(bar+char_data[3])<<8;
bar=(bar+char_data[2])<<8;
bar=(bar+char_data[1])<<8;
bar=(bar+char_data[0]);
Measure_Press[i]=bar;
}
}
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;
P_RangeFlag=0;
}
//========================================================================================
//看门狗初始化
//========================================================================================
WDT_num=0;
WDTCTL =WDT_ADLY_250; // WDT 1s/4 interval timer
IE1 |= WDTIE; // Enable WDT interrupt
//========================================================================================
//初始化液晶
//========================================================================================
init_lcd();
//I_VDisplay(6,pressure);
//set_lcd_powdn();
//WriteData(UP, 14, 3<<3);
//========================================================================================
//打开全局中断
//========================================================================================
EN_AD_Measure=1;
AD_Task_Start=0;
AD_Task_Complete=0;
Task_Mode=0;
Reset_AD_Data=0;
_EINT();
CS2_1();
Unitage=0;
En_key_INT();
while(1)
{
//================================================================================
//进入休眠
//================================================================================
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
_NOP();
if(KeyDown_flag==1)
{
Mode_Check();
KeyDown_flag=0;
}
switch( Task_Mode)
{
case 0://压力计算 子任务 压力测量,压力计算
if(AD_Task_Complete)
{
for(i=0;i<(AD_Sampling_Time-1);i++)
{
ad1240_test[i]=Sampling_AD.Sampling_AD_Num[i+1];
//if (ad1240_test[i]& 0x800000)
// ad1240_test[i] |= 0xff000000;
//ad1240_test1[i]=(float)ad1240_test[i];
}
ad12401=AD_Data_Manage(ad1240_test,AD_Sampling_Time);
//ad12401=(long int)((ad1240_test[0]+ad1240_test[1])/2);
ad12401=ad12401-Reset_AD_Data;
modify_num=150;
for(i=0;i<line_revise_num-1;i++)
{
if((ad12401>=Measure_Press[i+1])&&(ad12401<Measure_Press[i]) )
{ modify_num=i; break;}
}
if(modify_num==150)
{
if(ad12401>=Measure_Press[0])
{ modify_num=0;}
else
{ if(ad12401<Measure_Press[line_revise_num-1])
modify_num=(line_revise_num-2);
//else{break;}
}
}
bar =Measure_Press[modify_num]-Measure_Press[modify_num+1];
bar2=ad12401-Measure_Press[modify_num+1];
data=Standard_Press[modify_num]-Standard_Press[modify_num+1];
if(ad12401<Measure_Press[line_revise_num-1])
Press_Data=Standard_Press[line_revise_num-1]+(((float)bar2/(float)bar)*data);
else
{
if(ad12401>Measure_Press[0])
Press_Data=(((float)bar2/(float)bar)*data)+Standard_Press[0];
else
Press_Data=(((float)bar2/(float)bar)*data)+Standard_Press[modify_num+1];
}
Press_Data=Press_Data*100;
Press_Data1=Press_Data;
//Press_Data=Press_Data-Reset_AD_Data;
PressureDisplay(0,4,Press_Data);
// UP_num_Display(3,Press_Data);
AD_Task_Complete=0;
AD_Task_Start=0;
}
_NOP();
_NOP();
break;
case 0x01://压力校准任务,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -