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

📄 hum.c

📁 用ATmega88的一款温湿度仪的原程序
💻 C
字号:
#include <avr/pgmspace.h> 
#include <math.h>
#include "flash_table.h"
int CalcTemp(long ResValue)
{
    unsigned char i;
    volatile long tTemp;
	volatile long t0,t1,tt;
    for(i=0;i<29;i++)
    {
		t1 = pgm_read_dword(R + i);
		 
        if(ResValue > t1)
        {
            break;
        }
    }
	t0 = pgm_read_dword(R + i-1);
	tt = pgm_read_dword(T + i);
    tTemp= tt;
    tTemp=tTemp -(ResValue-t1)*50 /(t0-t1);    
    return(tTemp);
}
//tRes 湿敏电阻值,真实值乘以100再代入
int CalcHumity(int tTemp,long tRes)
{
	 volatile unsigned char i,j;
	int tLogRes;
	volatile int r0,r1,r2,r3,h0,r4;
	tLogRes = (log10((double)tRes)-2)*1000;
	//寻找温度范围,比如13度在10-15度之间,此时i应等于3 .表示3*5=15;
	for(i=1;i<10;i++)
	{
		if(tTemp <= (5*i))
		   break;
	}

	if(i >=10)         //温度大于表中最大温度45度
	{
		tTemp = 45;
	 	i = 9;
	}

	//寻找湿度所在区间,比如20%-30%区间。j = 0 表示湿度小于20% j=1表示湿度小于30%
	for(j=0;j<8;j++)
	{	
		r4= pgm_read_word(&H[i-1][j]);
		if(tLogRes >= r4)
	//	if(tLogRes >= 0)
		{
			break;
		}
				
	}
	//边界条件
	if(j == 0)         //表示电阻大于大于表中最左侧电阻阻值
	{
		tLogRes = pgm_read_word(&H[i-1][j]);	
		j = 1;
	}
	if(j>=8)            //电阻小于表中最右侧电阻阻值
	{
		j = 7;
		tLogRes = pgm_read_word(&H[i-1][j]);	
	}
	if(i == 1)			//温度小于表中最小温度5度
	{
		tTemp = 5;
	 	i = 2;
	}
	r0 = pgm_read_word(&H[i-1][j]);      //r0为湿度为j*10+20,温度为i*5下的电阻
	r1 = pgm_read_word(&H[i-2][j]);		//r1 为湿度为j*10+20,温度为(i-1)*5下的电阻
	r2 = (r0-r1)*(tTemp-i*5)/5+r0;       //r2为湿度为j*10+20,温度为tTemp下的电阻(log型式)
	r3 = pgm_read_word(&H[i-1][j-1]);	//r3为湿度为(j-1)*10+20,温度为i*5下的电阻
	h0 = (tLogRes - r2)*10/(r0-r3)+j*10+20;	
	return h0;
}

⌨️ 快捷键说明

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