怎样写用热敏电阻测温度的程序,用单片机AD测的热敏电阻的AD值,怎样把数字量转换成温度?

怎样写用热敏电阻测温度的程序,用单片机AD测的热敏电阻的AD值,怎样把数字量转换成温度?,第1张

这个主要还是看你的热敏电阻是不是线性的,如果是铂电阻这种,线性度很好的话,可以采用楼上的方法,原理就是注重学的已知两点,求一条直线,前提是你要知道两个已知的点。

如果你的电阻线性度不好,偏差比较大,有两种方法,

一、将阻值与温度的关系看做是折线,多求几条直线,根据不同的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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10947079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存