⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 24位AD压力实验板 protell99se打开
💻 C
📖 第 1 页 / 共 3 页
字号:
//========================================================================================
//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 + -