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

📄 driver.c

📁 传感器处理模块传感器处理模块传感器处理模块
💻 C
字号:
/*************************************************************************
 	Copyright (C)
  	FileName: 	
  	Author:       
  	Version :      
  	Date:		
  	Description: 
  				
  	Version:      
  	
  	History: 
      		<author>  <time>   <version >   <desc>
      		David    2007/07/26     1.0     build this moudle  
*************************************************************************/

//系统库头文件
#include "driver.h"
#include "Comm.h"
#include "dataSave.h"

/*Flash地址分配以及初值*/
#pragma abs_address:0x1FF0
const unsigned char    ADD_H;	//物理地址高字节
const unsigned char    ADD_L;	//物理地址低字节
#pragma end_abs_address

/*************************************************************************
  	Function:       	Delay
  	
  	Description:时间延时,中断时间为20ms
  	
  				输入板调试用
  	Input:         
  			num, 表示延时的时间,1表示延时500us
  	Output:         	
  			
  	Return:        
*************************************************************************/
void Delay(INT16U num)
{
	INT8U iLoop;
	INT16U iNum;

	for(iNum = 0; iNum < num; iNum++){
		for(iLoop = 0; iLoop < 255; iLoop++){
			;
		}
	}
}

/*************************************************************************
  	Function:       	InitSystem
  	Description: 初始化系统
  	Calls:	

  	Called by:

  	Input:          	
  		
  	Output:         	
  		
  	Return:        
*************************************************************************/
void InitSystem(void)
{
	CLI(); //disable all interrupts
	InitMega8();
	InitSysValue();

   	if(TestBit(MCUCSR,0) || TestBit(MCUCSR, BORF)){
		MCUCSR = 0;
	       g_sensor.status = FLG_SELF;
	}
   	else{
   		g_sensor.status = FLG_NORMAL;
   	}
	g_timeCount = 0;
	g_timeSign = 0;

	SENPROTECTON;		//开传感器电源
	SEI(); //re-enable interrupts
}

/*************************************************************************
 	unction:       	InitMega8
  	Description: 初始化系统
  	Calls:	

  	Called by:

  	Input:          	
  		
  	Output:         	
  		
  	Return:  
*************************************************************************/
void InitMega8(void)
{
 	PORTB = 0x00;
	DDRB  = 0x06;
	PORTC = 0x00; //m103 output only
	DDRC  = 0x10;
	PORTD = 0x00;
	DDRD  = 0x00;
	
 	//串口初始化
 	UARTInit();

	/*定计0设置25ms(9.984mSec)*/
	#if 0	//M16使用
 	TCCR0 = 0x00; //stop
 	TCNT0 = 0x3D; //set count
 	OCR0  = 0xC3;  //set compare
 	TCCR0 = 0x05; //start timer
 	#endif

#if 1	//M8定时器0初始化
 	TCCR0 = 0x00; //stop
 	TCNT0 = 0x3D; //set count
	 TCCR0 = 0x05; //start timer
	 #endif

	TCCR1B = 0x00; //stop
	 TCCR1A = 0x00;
	 TCCR1B = 0x05; //start Timer

	WDR (); //this prevents a timeout on enabling
 	WDTCR |= (1<<WDCE) | (1<<WDE);/* 30-Oct-2006 Umesh*/  
 	WDTCR = 0x0F;
 	
 	MCUCR = 0x00;
 	GICR  = 0x00;
 	TIMSK = 0x01; //timer interrupt sources

	/*ADC及模拟比较单元*/
 	ADCSR = 0x00; 	//disable adc
 	ADMUX = 0x00; 	//select adc input 0	
 	ACSR  = 0x80;	//关闭模拟比较器
}

/*************************************************************************
  	Function:       	InitSysValue
  	Description: 初始化系统全局变量
  	Called by:
  				
  	Input:
  		
  	Output:     采样得到的数据	
  		
  	Return:  	返回采样得到的数据	
*************************************************************************/
void InitSysValue(void)
{
	BOOLEAN flag = FALSE;

	Delay(400);	//延时200ms后再读取eeprom数据
	
	//属性1
	flag = GetEepromData(SENSORATTR1ADD, SENSORATTR1BACK, 4, &g_sensor.logAddr);
	if(!flag){//eeprom数据有误
		g_sensor.logAddr = 1;
		g_sensor.sensorType = SENSORDEVTYPE0;	//催化
		g_sensor.gasType = 0;					//甲烷
	}
	
	//属性2
	flag = GetEepromData(SENSORATTR2ADD, SENSORATTR2BACK, 6, (INT8U *)(&g_sensor.gasRange));
	if(!flag){//读取EEPROM正确
		g_sensor.gasRange = 100;
		g_sensor.testRange = 100;
		g_sensor.dispUnit = 0;
		g_sensor.dotFlag = 0;
	}
	
	//属性3
	flag = GetEepromData(SENSORATTR3ADD, SENSORATTR3BACK, 6, (INT8U *)(&g_sensor.oldZero));
	if(!flag){//读取EEPROM正确
		g_sensor.oldZero = 0;
		g_sensor.curZero = 0;
		g_sensor.highTmpture = 50;	//没有温度调整的标称值
		g_sensor.lowTmpture = 50;	
	}

	//属性4
	flag = GetEepromData(SENSORATTR4ADD, SENSORATTR4BACK, 6, (INT8U *)(&g_sensor.scale1Chroma));
	if(!flag){//读取EEPROM正确
		g_sensor.scale1Chroma = 0;
		g_sensor.scale1OldVot = 0;
		g_sensor.scale1CurVot = 0;
	}

	//属性5
	flag = GetEepromData(SENSORATTR5ADD, SENSORATTR5BACK, 6, (INT8U *)(&g_sensor.scale2Chroma));
	if(!flag){//读取EEPROM正确
		g_sensor.scale2Chroma = 0;
		g_sensor.scale2OldVot = 0;
		g_sensor.scale2CurVot = 0;
	}

	//属性6
	flag = GetEepromData(SENSORATTR6ADD, SENSORATTR6BACK, 6, (INT8U *)(&g_sensor.chromaA));
	if(!flag){//读取EEPROM正确
		g_sensor.chromaA = 0;
		g_sensor.chromaB = 0;
		g_sensor.chromaC = 0;
	}

	//属性7
	flag = GetEepromData(SENSORATTR7ADD, SENSORATTR7BACK, 6, (INT8U *)(&g_sensor.scale1Cnt));
	if(!flag){//读取EEPROM正确
		g_sensor.scale1Cnt = 0;
		g_sensor.scale2Cnt = 0;
		g_sensor.delTime = 0;
		g_sensor.delTimeVot = 0;
	}

	//属性8
	flag = GetEepromData(SENSORATTR8ADD, SENSORATTR8BACK, 6, (INT8U *)(&g_sensor.preDate));
	if(!flag){//读取EEPROM正确
		g_sensor.preDate = 0;
		g_sensor.sensorLife = 0;
		g_sensor.selfTime = 1;		//上电自检时间默认为1分钟
		g_sensor.deltaValue = 100;		//相对灵敏度为100的默认值
	}

	//获取物理地址
	g_sensor.sysAddr = ADD_H;
	g_sensor.sysAddr = (g_sensor.sysAddr << 8) + ADD_L;
}

/*************************************************************************
  	Function:  Timer0Ovf 	
  	
  	Description:   定时25mS
  	
  	Calls:		

  	Called by: TIMER0中断
  	
  	Input:      无
  		
  	Output:     无	
  		
  	Return:     

  	Other:mega系列通用
*************************************************************************/
#pragma interrupt_handler Timer0Ovf:iv_TIM0_OVF
void Timer0Ovf(void)              
{
	TCNT0 = 0x3D; //定时25ms

	g_timeCount++;
	if((g_timeCount % 12) == 0){//建立300毫秒标志
		SetBit(g_timeSign, FLG_300MS);
	}
	if((g_timeCount % 40) == 0){
		SetBit(g_timeSign, FLG_1S);//建立1秒到标志
	}

	if((g_timeCount % 240) == 0){
		SetBit(g_timeSign , FLG_60S);//建立1分钟到标志
		g_timeCount = 0;
	}
}


⌨️ 快捷键说明

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