temp.c

来自「充电器源代码 才有AVR CPU 控制 可以对大部分电池充电」· C语言 代码 · 共 91 行

C
91
字号
/*******************************************************************************
*  name: temp.c
*  author: fengzai(panda)
*  date: 2007.1.25
*  decribe: detect the temp
********************************************************************************/

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "usart.h"
#include "temp.h"
#include "adc.h"


#define uchar	unsigned char
#define uint	unsigned int
#define BIT(x)	(1<<(x))
#define NOP()	asm("nop")
#define WDR() 	asm("wdr")


/*-----------------------------------------------------------------------------
*  温度测量模块,包括三个函数,adc2_init(); adc2_cal2(); temp();
*-----------------------------------------------------------------------------*/
void adc2_init(void)
{
	//adc转换初始化
	ADCSRA	= 0x00;	//禁止AD转换
	ADMUX	= 0xC2;
	SFIOR |= 0x00;
	ACSR	= 0x80; //禁止模拟比较器
	ADCSRA	= 0xC7;
}


unsigned int adc2_calc(void)
{
	//计算实际电压
	unsigned long value=0;
	unsigned int voltage=0; //电压单位为(mV)
	value=ADCL;		 //首先读低位
	value|=(int)ADCH << 8; //然后读高位
	voltage=(value*2560)>>10;
	return voltage;
}

unsigned int temp(void)
{
 unsigned int res,t,l=0;
 unsigned int temp1,temp2,temp;
 uchar i;

 for(i=0;i<16;i++)   //采样16次,减少误差
 {
   adc2_init();
   _delay_ms(10);
   l =  adc2_calc();
   //send_int(l);
   t += l;
 }
 i=0;
 //put_s("t:");
 t = t>>4;
 //send_int(t);
 
 res = (5000000/(5000-t)-1000)*22;  //计算热敏电阻的值
 
 if(res<17000&&res>1203)    //采用查表的方法测量温度
 {
    while(res<tempratrue[i])
    i++;
 }
 
 //put_s(((unsigned int)i));
 temp1 = tempratrue[i];      //找到温度范围后,假定变化是线性的
 temp2 = tempratrue[i-1];
 
 temp = i*5+(temp2-res)*5/(temp2-temp1);
 
 //send_int(temp);
 
 //send_int(res);
 
 return(temp);
}

/*------------------------------------------------------------------------------
*   end of file
*-----------------------------------------------------------------------------*/

⌨️ 快捷键说明

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