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

📄 main.c.bak

📁 24位AD压力实验板 protell99se打开
💻 BAK
字号:
//========================================================================================
//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 "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;

//========================================================================================
//系统变量
//========================================================================================
unsigned char Task_Mode;//主任务变量
//========================================================================================
//压力变量变量
//========================================================================================




//========================================================================================
//AD变量
//========================================================================================
unsigned char EN_AD_Measure,AD_Task_Start,AD_Task_Complete;//AD采样任务变量
unsigned char AD_Sampling_Num;
union AD_Sampling_Data{                       
                        long int Sampling_AD_Num[5];
                       unsigned char Data_8Bit[4];
                       } Sampling_AD;

long int  ad1240_test[5],ad1240;
float  ad1240_test1[5],pressure;
unsigned long int  AD_Error[5];

long  ad12401;

//========================================================================================
//LCD变量
//========================================================================================
unsigned char Back_Light_Task_Start,Back_Light_Time_num;//背光任务变量


unsigned char WDT_num;



//========================================================================================
//函数: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();  
  } 
}
//========================================================================================
//函数:void main(void)
//功能:HX601产品主函数 主要实现高精度,低功耗压力测量
//变量:无
//返回:无
//========================================================================================
void main(void)
{
unsigned char i; 
//unsigned int   j;
//================================================================================
//初始化
//================================================================================   
 WDTCTL=WDTPW+WDTHOLD;  //Stop WDT  
 init_port(); 
 //P5OUT&=~BIT6;
 Delay_1ms(1000); 
 Task_Mode=0; 
 //P5OUT=BIT6;  
//_BIS_SR(LPM3_bits + GIE);                 // Enter LPM3  w/ interrupt
//_NOP(); 
//========================================================================================
//看门狗初始化
//========================================================================================  
WDT_num=0;
 WDTCTL =WDT_ADLY_250;                  // WDT 1s/4 interval timer
 IE1 |= WDTIE;                          // Enable WDT interrupt 
//P5OUT &= ~BIT6;
//========================================================================================
//初始化液晶
//======================================================================================== 
init_lcd(); 
//I_VDisplay(6,pressure);
set_lcd_powdn();
//========================================================================================
//打开全局中断
//======================================================================================== 
_EINT(); 
EN_AD_Measure=1;
AD_Task_Start=0;
AD_Task_Complete=1;
Task_Mode=0;
PGA_Plus=6;
//P6OUT &= ~BIT5;

while(1)
{ 
//================================================================================
//进入休眠
//================================================================================
_BIS_SR(LPM3_bits + GIE);                 // Enter LPM3  w/ interrupt
_NOP(); 

 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];
	      }
	      pressure=((ad1240_test1[0]+ad1240_test1[1])/2);
	     //AD_Data_Manage(ad1240_test1,(AD_Sampling_Time-1));
	      for(i=0;i<(AD_Sampling_Time-1);i++)
	        {
	        //AD_Error[i]=(float)labs(pressure-ad1240_test1[i]);
	        // if(AD_Error[i]>wuchar)
	        // {pressure=0; break;}
	        }
	       //pressure=(pressure/100);
	      
	       //set_lcd_out();          
	      I_VDisplay(6,pressure);
	      set_lcd_powdn();       
	      AD_Task_Complete=0;
	      AD_Task_Start=0;
      }
   _NOP();
   _NOP();
break; 
case 1://压力校准任务,
 
break; 
case 2://温度测量任务
  
break; 
case 3://显示任务,压力显示任务,密码显示任务,键盘输入的压力值显示任务,AD值显示任务
 
break; 
case 4://键盘任务:密码输入任务,压力值输入任务,背光任务,关电源任务

break; 
case 5://CPU休眠任务


break; 
default: break;
 }
}
}
//========================================================================================
//函数:__interrupt void watchdog_timer (void)
//功能:检测AD采样是否完成
//变量:Byte
//返回:无
//========================================================================================
 
 #pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
	WDT_num++;
	if(WDT_num>5)
		{   
		if(EN_AD_Measure==1)
			{      
			AD_Task_Complete=0; 
			P6OUT &= ~BIT5;
			//Open_AD_Power();        
			Delay_1ms(10);    
			} 
		}
	if(Back_Light_Task_Start)
		{
		 Back_Light_Time_num++; 
		 if(Back_Light_Time_num>5)
			 {
			 P2OUT |= BIT5;
       Back_Light_Task_Start=0;
			 }
		}
	if(WDT_num>5)
		{    
	  if(EN_AD_Measure==1)
		  {   
	    WDT_num=0;  
	    ADS1240Init();      
		  En_AD_DRDY_INT(); 
	    adc_init();	
	    AD_Task_Start=1; 
		  }
		}   
} 
//========================================================================================
//函数:__interrupt void Port10_AD_DRDY(void)
//功能://ADC interrupt
//变量:无
//返回:无
//========================================================================================
#pragma vector=PORT1_VECTOR
__interrupt void Port10_AD_DRDY(void)
{  
  unsigned char i;     
  if(P1IFG&BIT0)//P1.0(DRDY)=0
    {    
      ADS1240SendByte(ADS1240_CMD_RDATA);
     //ad0.dat4[1]高字节,ad0.dat4[2]中间字节,ad0.dat4[3]低字节
      for(i=0;i<3;i++)
         Sampling_AD.Data_8Bit[i]=ADS1240ReceiveByte();   
      ad1240=0;
      ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[0]<<8;    
      ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[1]<<8;
      ad1240= ad1240+(unsigned long)Sampling_AD.Data_8Bit[2];
      //if (ad1240 & 0x800000)
      // ad1240 |= 0xff000000;
      Sampling_AD.Sampling_AD_Num[AD_Sampling_Num]=ad1240;  
      if(AD_Sampling_Num>(1))
        {
			   AD_Task_Complete=1; 
			   AD_Task_Start=0;
			   AD_Sampling_Num=0;           
			   Dis_AD_DRDY_INT(); //关中断
			   Close_AD_Power();//关AD电源              
			   _BIC_SR_IRQ(LPM3_bits);                 // Clear LPM3 bits from 0(SR)
			   _NOP();	
        }
      else      
        {AD_Sampling_Num++; }    
   }
  P1IFG&=~BIT0;//clear IFG 
}


⌨️ 快捷键说明

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