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

📄 beifen.c

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