这个主要还是看你的热敏电阻是不是线性的,如果是铂电阻这种,线性度很好的话,可以采用楼上的方法,原理就是注重学的已知两点,求一条直线,前提是你要知道两个已知的点。
如果你的电阻线性度不好,偏差比较大,有两种方法,
一、将阻值与温度的关系看做是折线,多求几条直线,根据不同的AD值范围采用不同的折线。
第二种方法就是做一张表,将温度值和AD值用一个表格表示出来,转换时直接查表就行了。
给你一个用ADC0809做AD转换的C程序作参考吧!希望对你有所帮助!#include<reg52.h>
unsigned char code dispbitcode[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f}
unsigned char dispbuf[4]
unsigned int i
unsigned int j
unsigned char getdata
unsigned int temp
unsigned int temp1
unsigned char count
unsigned char d
sbit ST=P3^0
sbit OE=P3^1
sbit EOC=P3^2
sbit CLK=P3^3
sbit P34=P3^4
sbit P35=P3^5
sbit P36=P3^6
sbit P20=P2^0
sbit P21=P2^1
sbit P22=P2^2
sbit P23=P2^3
sbit P17=P1^7
void TimeInitial()
void Delay(unsigned int i)//
void TimeInitial()
{
TMOD=0x10
TH1=(65536-200)/256//定时时间为2us,亦即CLK周期为0.4us
TL1=(65536-200)%256
EA=1
ET1=1
TR1=1
}
void Delay(unsigned int i)//延时函数
{
unsigned int j
for(i>0i--)
{
for(j=0j<125j++)
{}
}
}
void Display()//
{
P1=dispbitcode[dispbuf[3]]//十位
P20=0
P21=1
P22=1
P23=1
Delay(10)
P1=0x00
P1=dispbitcode[dispbuf[2]]//个位
P17=1//显示小数点
P20=1
P21=0
P22=1
P23=1
Delay(10)
P1=0x00
P1=dispbitcode[dispbuf[1]]//十分位
P20=1
P21=1
P22=0
P23=1
Delay(10)
P1=0x00
P1=dispbitcode[dispbuf[0]]//百分位
P20=1
P21=1
P22=1
P23=0
Delay(10)
P1=0x00
}
void main()//主函数
{
TimeInitial()
while(1)
{
ST=0//关闭转换
OE=0//关闭输出
ST=1//开启转换
ST=0//关闭转换
P34=0//选择通道0
P35=0
P36=0
while(EOC==0)//判断是否转换结束:是则执行以下语句,否则等待
OE=1//开启数据输出允许
getdata=P0//将数据取走,存放在变量getdata中
OE=0//关闭输出
temp=getdata*1.0/255*500//电压值转换,5V作为参考电压,分成256份
dispbuf[0]=temp%10//百分位
dispbuf[1]=temp/10%10//十分位
dispbuf[2]=temp/100%10//个位
dispbuf[3]=temp/1000//十位
Display()
}
}
void t1(void) interrupt 3 using 0//定时器中断服务函数作用:产生CLK信号
{
TH1=(65536-200)/256
TL1=(65536-200)%256
CLK=~CLK
}
热敏电阻测温度(程序+仿真)#include<reg52.h>
#include<intrins.h>
#include<math.h>
typedef unsignedchar uchar
typedef unsignedint uint
sbit CE = P1^1
sbit STS=P1^0
sbit RC=P1^4
sbit A0=P1^3
sbit CS=P1^2
sbit RS = P1^5
sbit RW = P1^6
sbit EN = P1^7
void delay_ms(uintz)
{
uint x,y
for(x=zx>0x--)
for(y=110y>0y--)
}
uintAD1674_Read(void)
{
uint temp
uchar temp1,temp2
CS=1//片选信号
CE=0//初始化,关闭数据采集
CS=0
A0=0
RC=0
CE=1//CE=1,CS=0,RC=0,A0=0启动12位温度转换
_nop_()
while(STS==1) //等待数据采集结束
CE=0//芯片使能关闭
RC=1
A0=0
CE=1//CE=1,CS=0,RC=1,12/8=1,A0=0 允许高八位数据并行输出
_nop_()
temp1=P0//读取转换结果的高八位
CE=0//芯片使能关闭
RC=1
A0=1
CE=1//CE=1,CS=0,RC=1,12/8=0,A0=1 允许低四位数据 并行输出
_nop_()
temp2=P0 //读取转换结果的第四位
temp=((temp1<<4)|(temp2&0X0F)) //高位和低位合成实际温度,temp2为PO口的高四位
return (temp) //还回转换结果,右移四位是因为temp2为P0口的高四位
}
/**
* 写数据
*/
voidw_dat(unsigned char dat)
{
RS = 1
//EN = 0
P2 = dat
delay_ms(5)
RW = 0
EN = 1
EN = 0
}
/**
* 写命令
*/
voidw_cmd(unsigned char cmd)
{
RS = 0
// EN = 0
P2 = cmd
delay_ms(5)
RW = 0
EN = 1
EN = 0
}
/**
* 发送字符串到LCD
*/
voidw_string(unsigned char addr_start, unsigned char *p)
{
unsigned char *pp
pp = p
w_cmd(addr_start)
while (*pp != '\0')
{
w_dat(*pp++)
}
}
/**
* 初始化1602
*/
voidInit_LCD1602(void)
{
EN = 0
w_cmd(0x38) // 16*2显示,5*7点阵,8位数据接口
w_cmd(0x0C) // 显示器开、光标开、光标允许闪烁
w_cmd(0x06) // 文字不动,光标自动右移
w_cmd(0x01) // 清屏
}
void process(uintdate,uchar add)
{
uchar A[7]
A[0]=date/1000%10+'0'
A[1]=date/100%10+'0'
A[2]='.'
A[3]=date/10%10+'0'
A[4]=date%10+'0'
A[5]='C'
w_string(add,A)
}
void main()
{
uintVOL[25]={343,339,332,328,320,316,312,304,300,292,289,285,277,273,265,261,257,250,246,242,234,230,226,222,218}
uintTemper[25]={100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500}
uchar i,flag=0
uint result,temp1,temp2
float res
Init_LCD1602()
w_string(0x80,"Temper:")
// w_string(0xC0,word2)
while (1)
{
res=(float)(AD1674_Read())
result=(uint)((res/2048.0-1.0)*500.0)
temp1=abs(result-VOL[0])
for(i=1i<25i++)
{
temp2=abs(result-VOL)
if(temp1>=temp2)
{
temp1=temp2
flag=i
}
}
process(Temper[flag],0x80+7)
//process(result,0xc0)
//delay_ms(1000)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)