📄 temp.c
字号:
/*******************************************************************************
* 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -