?? main.c
字號:
//========================================================================================
//HX601公司:華信儀表
// 開發(fā)者:覃道堂 鄭穎 沈嘉榮
// 開發(fā)時間:2008年6月5日
// 主要功能:低功耗,高精密壓力測量計算顯示
//========================================================================================
// MSP-FET430f149 Program - press_measure
// MSP430F149
// Built with IAR Embedded Workbench Version: 3.42A
// _ _子任務(wù)
// |
// |_ _1,鍵盤掃描
// |
// |_ _2,液晶顯示
// |
// 壓力測量 ------->|_ _3,溫度測量
// (壓力校準(zhǔn),溫度測量) |
// |_ _4,壓力計算
// |
// |_ _5,壓力校準(zhǔn)綜合計算
// |
// |_ _6,功耗管理
//
// 一個主進(jìn)程,三個輔進(jìn)程; 進(jìn)程
// _ _1,(1)AD 壓力測量,(2)AD未進(jìn)行溫度補(bǔ)償?shù)膲毫τ嬎悖?// |
// |
// |
// |
// |
// 低功耗,高精密壓力測量計算顯進(jìn)程--->|_ _2,溫度測量
// |
// |
// |
// |
// |
// |_ _3,壓力校準(zhǔn)
//========================================================================================
#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校準(zhǔn)模式
#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);
//========================================================================================
//系統(tǒng)變量
//========================================================================================
unsigned char Task_Mode;//主任務(wù)變量
unsigned char Exit_Modify_flag;//主任務(wù)變量
unsigned char Unitage;//主任務(wù)變量
//========================================================================================
//壓力變量變量
//========================================================================================
//========================================================================================
//AD變量
//========================================================================================
unsigned char EN_AD_Measure,AD_Task_Start,AD_Task_Complete;//AD采樣任務(wù)變量
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];//存入標(biāo)準(zhǔn)壓力值下的用戶輸入值
long int Measure_Press[100];//存入標(biāo)準(zhǔn)壓力值下的采樣的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;//背光任務(wù)變量
unsigned char LCD_Cursor_Addr; //液晶光標(biāo)位置變量
unsigned char password[6]={0,1,2,3,4,5}; //密碼數(shù)組
unsigned char LCD_Key_bar[6]={0,0,0,0,0,0}; //液晶顯示的值數(shù)組
unsigned char Password_ok_flag; //密碼正確標(biāo)志
unsigned char LCD_NUM=6; //液晶顯示位數(shù)總數(shù)
unsigned char WDT_num;
//========================================================================================
//KEY變量
//========================================================================================
unsigned char key_data;//0x01背光 0x02校正 0x04清零 0x20單位
unsigned char KeyDown_flag;
//========================================================================================
//函數(shù):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();
}
}
//========================================================================================
//函數(shù):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;
}
//========================================================================================
//函數(shù):void main(void)
//功能:HX601產(chǎn)品主函數(shù) 主要實現(xiàn)高精度,低功耗壓力測量
//變量:無
//返回:無
//========================================================================================
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中校正參數(shù)
//========================================================================================
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;
//=============================================
//讀取線性校正值數(shù)量
//=============================================
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
{//各參數(shù)的默認(rèn)值
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)
{
//================================================================================
//進(jìn)入休眠
//================================================================================
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
_NOP();
if(KeyDown_flag==1)
{
Mode_Check();
KeyDown_flag=0;
}
switch( Task_Mode)
{
case 0://壓力計算 子任務(wù) 壓力測量,壓力計算
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://壓力校準(zhǔn)任務(wù),
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -