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

📄 2.c

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

//========================================================================================
//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];
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;

//========================================================================================
//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=6;
//========================================================================================
//校正变量
//========================================================================================
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  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;




//========================================================================================
//函数:long ADS1240ReadData(int fWaitForDataReady)
//功能:读取AD1240积存器
//变量:Byte
//返回:无
//========================================================================================
void Delay(uint value)
{  while(value--);
}
//========================================================================================
//函数: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;
for(i=0;i<num;i++)
{

}
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
//返回:无
//========================================================================================
int main(void)
{
 unsigned char i,j;
 unsigned char char_bar[4];
 unsigned int bar1; 
 unsigned long int bar2;
 float k,press;
 //unsigned char ee_data1[2];
 //Open_AD_Power();
 
  WDTCTL=WDTPW+WDTHOLD;//Stop WDT
  //BCSCTL1 |= DIVA_1;                        // ACLK/4 
//========================================================================================
//读取EE中校正参数
//========================================================================================
 Press_Adjust_state=ReadWord(Adjust_state);
 // Press_Adjust_state=2;
  if(Press_Adjust_state==0x01)
    {    
    PGA_Plus=ReadWord(AD_PGA_Plus);
    PGA_Plus=ADS1240_GAIN_8;
    //=============================================
    //读取零点校正值
    //=============================================
    for(i=0;i<4;i++)
    {
      char_bar[i]=ReadWord(Press_Zero+i);     
     // Zero_data=ReadWord(Press_Zero);    
    }
    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]);
    //Initial_Resistance=(float)Zero_Sampling_AD/16;
    //Initial_Resistance=Initial_Resistance*3000;
  //  Initial_Resistance=Initial_Resistance/16777216;
    
    
    //=============================================
    //读取满程校正值
    //=============================================    
    for(i=0;i<4;i++)
    {
      char_bar[i]=ReadWord(Press_Most+i);     
     // Zero_data=ReadWord(Press_Zero);    
    }
    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]);
    //k=((float)(Most_Sampling_AD-Zero_Sampling_AD))/16;
    //k=k*3000;
   // k=k/16777216;
    //Zero_Most_k=(Most_data-Zero_data)/k;
   // Zero_Most_Revise_Flag=1; 
    //=============================================
    //读取满程校正值
    //=============================================   
    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]=ReadWord(Press_Standard+i*8+j);     
     // Zero_data=ReadWord(Press_Zero);    
    }
    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]=ReadWord(Press_Measure+i*8+j);     
     // Zero_data=ReadWord(Press_Zero);    
    }
    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=ADS1240_GAIN_8;
    Zero_data=0x00;
    Most_data=0xbb8;//3000
    Most_decimal_num=0x04;
    line_modify_num=0x00;
    Most_Flag=0x00;
    }
//========================================================================================
//给AD初始化参数付值
//========================================================================================
AD1240_Reg_Val[0]=0;//ADS1240_GAIN_32;//PGA_Plus;//SETUP
AD1240_Reg_Val[1]=ADS1240_MUXP_AIN0+ADS1240_MUXN_AIN1;//MUX
AD1240_Reg_Val[2]=0;/BUFEN_BIT+RANGE_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;
//========================================================================================
//初始化液晶
//========================================================================================
init_lcd();
//========================================================================================
//初始化串口
//========================================================================================
uart_init();
EN_uart();

//========================================================================================
//看门狗初始化
//========================================================================================  
WDT_num=0;
WDTCTL =WDT_ADLY_1000;                // WDT 1s/4 interval timer
IE1 |= WDTIE;                         // Enable WDT interrupt 
//========================================================================================
//打开全局中断
//======================================================================================== 
_EINT(); 
//========================================================================================
//主循环开始
//========================================================================================  

star:  
 init_port();  
En_key_INT(); 
  _BIS_SR(LPM3_bits + GIE);               // Enter LPM3   
  _NOP(); 
stara1:
switch( Mode)
{
case 0://压力测量模式
   if(KeyDown_flag==1)
   {
     mode_check();
    KeyDown_flag=0; 
    goto  stara1;   
   }
  if(Press_Adjust_state==1)
  {
   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];
                           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -