📄 main.c.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 + -