基于51单片机的Pt100的温度计程序

合集下载

51单片机数字温度计程序

51单片机数字温度计程序
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date//读一个字节数据函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
{
uchar A1,A2,A2t,A3;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1]; //显示百位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
dula=0;
读出的数据?最低位在最?前面这样刚好一?个字节在d?atvoidtmpwr?iteby?teuchar?datwrite?ds18b?20向ds18?b20写一?个字节数据?函数bittestb?

基于51单片机的Pt100的温度计程序

基于51单片机的Pt100的温度计程序

基于51单片机的Pt100的温度计程序#include#include#define uchar unsigned char#define uint unsigned int#define ADC0801 XBYTE[0x7fff]#define disp_dat P1#define LED_n P2sbit INTR=P3^2;const uchar tab[]={0xc0,0xf9,0xa4,0xb0,//0~30x99,0x92,0x82,0xf8,//4~70x80,0x90,0xff,0x86 //8、9、mie};const uchar tab_dot[]={0x40,0x79,0x24,0x30,//0.~3.0x19,0x12,0x02,0x78,//4.~7.0x00,0x10, 0xff,0x86//8.、9.、mie、E};uchar T[4]={1,0,4,5};uchar tem[11]={10,10,20,13,11,11,15,21,18,29,11};uchar T_num=20,sam_n=0;/************************函数声明***********************/ void delay(int n); //延时函数void init_T0(void); //定时器T0初始化void disp_seg(uchar n,uchar d_dat); //显示函数uchar AD_dat(void); //AD转换函数uchar median(uchar *dat,uchar num_d); //中值滤波函数float account_res(void); //电阻值计算函数float temperature(void); //计算温度函数void adj_t(void); //调整显示数据函数void disp(void); //温度显示程序void renovate(void); //更新显示数据/*********************主程序*********************/main(){init_T0(); //初始化T0while(1){disp(); //调用显示函数renovate(); //更新显示数据};}/*****************温度显示函数*****************/void disp(void)uchar i;for(i=0;i<4;i++){disp_seg(i,T[i]);}}/***************更新显示数据函数***************/void renovate(void){if(sam_n==11) //去完11个采样值{sam_n=0; //清零采样计数器adj_t(); //调用数据调整程序}}/******************延时函数********************/void delay(int n){int i,j;for (i=0;i<n;i++)< bdsfid="120" p=""></n;i++)<> for (j=0;j<1000;j++);}/****************定时器T0初始化****************/ void init_T0(void){TMOD=0x01; //工作方式1TH0=0x4c; //定时50msTL0=0x00;ET0=1; //允许定时器T0中断EA=1; //开总中断TR0=1; //启动定时器T0}/*******************显示函数*******************/void disp_seg(uchar n,uchar d_dat){LED_n=0xff; //清位控制状态disp_dat=0xff; //清显示数据LED_n=~(0x01<<="">if(n==2)disp_dat=tab_dot[d_dat]; //送带小数点显示数据else disp_dat=tab[d_dat]; //送无小数点显示数据delay(1); /********************AD转换函数*********************/ uchar AD_dat(void){uchar temp;ADC0801=0; //启动AD转换while (INTR); //等待转换结束temp=ADC0801; //读取转换值}/*******************中值滤波函数*********************/ uchar median(uchar *dat,uchar num_d) //需要排序的数组{uchar i,j,temp;for (i=0;i{if (dat[i]>dat[i+1]){temp=dat[i];dat[i]=dat[i+1];dat[i+1]=temp;}}return(dat[(num_d-1)/2]); //取中值并返回}/*******************电阻值计算函数*********************/ float account_res(void){uchar temp;float temp_r;temp=median(tem,11); //利用中值法求取中间值temp_r=((float)temp)*150/255+100;return(temp_r);}/*****************计算温度函数*******************/float temperature(void){float temp1,T_out;temp1=account_res(); //计算Pt100阻值temp2=(uchar)temp1; //取Pt100阻值高位if(temp2<100)T_out=777; //若阻值在小于0℃之间else if(temp2<139)T_out=2.558*temp1-256.02; //若阻值在0~100℃之间else if(temp2<177)T_out=2.637*temp1-267.01; //若阻值在100~200℃之间else if(temp2<214)T_out=2.721*temp1-281.9; //若阻值在200~300℃之间else if(temp2<250)T_out=2.81*temp1-300.94; //若阻值在300~400℃之间else if(temp2>250)T_out=777; //若阻值在大于400℃之间return(T_out);}/*******************调整显示数据函数*******************/void adj_t(void){float temp_v;uint value;temp_v=10*temperature(); //利用计算温度值value=(uint)temp_v;if(value==7770) //超出测量范围{T[0]=11; //显示'E'T[1]=11; //显示'E'T[2]=11; //显示'E'T[3]=11; //显示'E'}else{T[0]=value/1000; //待显示百位T[1]=(value%1000)/100; //待显示十位T[2]=(value%1000)%100; //待显示个位T[3]=(value%1000)%100%10; //待显示小数if(T[0]==0x00){T[0]=10;if(T[1]==0)T[1]=10;}}}/*******************定时T0中断程序*****************/ void senddat_T0(void) interrupt 1{TH0=0x4c; //重载定时器初值TL0=0x00;if(--T_num==0){tem[sam_n]=AD_dat(); //读取温度值存入缓冲区sam_n++; //温度采样个数加1T_num=20; //恢复计数值}}。

基于51单片机的水温测控系统实验报告

基于51单片机的水温测控系统实验报告

摘要本次实验是软硬件相结合的实验,通过传感器得到的阻值与其它电阻,可以搭建一个电桥,将水温转化为电压,然后通过放大器将电压放大到所需要的值,将所得的电压送入单片机的AD转换电路,将模拟信号转换成数字信号,从而在单片机的液晶屏上显示当前的温度。

此烧水壶是可控制的,即设定温度,使水加热到设定温度且保温,此控制算法采用PID控制算法来控制继电器的通断,来保证水温恒定在设定温度处。

一、设计要求1.传感器:Pt100铂热电阻2.测量放大器:自己设计与搭建3.被控对象:400W电热杯,约0.5公斤自来水4.执行机构:12V驱动,5A负载能力的继电器5.控制系统:51单片机6.控制算法:PID7.温度范围:环境温度~100度8.测量误差1度,控制误差2度二、设计原理及方案1.热电阻传感器热电阻传感器是利用导体或半导体的电阻值随温度变化而变化的原进行测温的。

热电阻的工作原理:温度升高,金属内部原子晶格的振动加剧,从而使金属内部的自由电子通过金属导体时的阻碍增大,宏观上表现出电阻率变大,电阻值增加,我们称其为正温度系数,即电阻值与温度的变化趋势相同。

2.实验原理框图3.测量放大器电路图说明:电位器R10用来调节偏置电压,而电位器R7则用来调节增益。

实验时,用R10来调节零点,用R7来调节满度。

该电路将0℃-100℃转换为0-5V 电压。

上述电路图采用仪表放大器,将铂热电阻两端的电压U2与电位器R10两端的电压U1差放大,放大器输出电压U0与电压差的关系为:)-)(2(1127248U U R RR R U o ⨯+=由铂热电阻阻值与水温的关系可知,铂热电阻的范围是ΩΩ140~100。

则100)10012(12-140)140(1212)-(100)10012(12-100)10012(1212⨯+⨯+≤≤⨯+⨯+K K U U K K 整理得:V U U 04.0)-(012≤≤而仪表放大器的输出电压为0~5V ,所以放大倍数大约为:5/0.04=125。

基于51单片机的数字温度计

基于51单片机的数字温度计

引言:数字温度计是一种基于51单片机的温度测量装置,它通过传感器感知环境的温度,并使用单片机将温度值转换为数字形式,并显示在液晶屏上。

本文将详细介绍数字温度计的设计原理、硬件连接、软件编程以及应用领域。

概述:数字温度计基于51单片机的设计理念,其基本原理是通过传感器将温度转换为电信号,然后通过ADC(模数转换器)将电信号转换为数字信号,最后使用单片机将数字信号转换为温度值。

同时,数字温度计还将温度值显示在液晶屏上,方便用户直观地了解环境温度。

正文内容:1. 硬件连接:1.1 使用温度传感器感知环境温度:常用的温度传感器有NTC热敏电阻和DS18B20数字温度传感器。

通过将传感器连接到51单片机的引脚上,可以实现对环境温度的感知。

1.2 连接ADC进行模数转换:ADC是将模拟信号转换为数字信号的关键部件。

通过将51单片机的引脚连接到ADC芯片的输入端,可以将模拟的温度信号转换为数字信号。

1.3 连接液晶屏显示温度值:通过将51单片机的引脚连接到液晶屏的控制引脚和数据引脚,可以将温度值以数字形式显示在液晶屏上。

2. 软件编程:2.1 初始化引脚和ADC:在软件编程中,需要初始化51单片机的引脚设置和ADC的工作模式。

通过设置引脚为输入或输出,以及设置ADC的参考电压和工作模式,可以确保硬件正常工作。

2.2 温度测量算法:根据传感器的工作原理和电压-温度特性曲线,可以编写相应的算法将ADC测得的电压值转换为温度值。

例如,对于NTC热敏电阻,可以使用Steinhart-Hart公式进行温度计算。

2.3 温度值显示:将温度值以数字形式显示在液晶屏上。

通过设置液晶屏的控制引脚和数据引脚,可以控制液晶屏的显示内容,并将温度值以数字形式显示在屏幕上。

3. 基于51单片机的数字温度计应用:3.1 家庭温度监测:数字温度计可以安装在家庭中的不同区域,实时监测室内温度,并通过数字显示提供直观的温度信息。

这对于家庭的舒适性和节能都有重要意义。

(完整word版)基于PT100传感器的温度测量系统的设计

(完整word版)基于PT100传感器的温度测量系统的设计

信息与控制工程学院硬件课程设计说明书基于PT100传感器的温度测量系统的设计学生学号:09540217学生姓名:李默默专业班级:测控0902指导教师:金炳涛职称:讲师起止日期:2012.03.05~2012.03.25吉林化工学院课程设计任务书一、设计题目:基于PT100传感器的温度测量系统的设计二、设计目的1.熟悉Keil uVision开发软件及Protel电路设计设计软件的使用。

2. 掌握SST89E51单片机体系结构及C语言程序设计方法。

3. 掌握PT100热电阻测温系统的结构及电路板的焊接、检测方法。

三、设计任务及要求1.设计热电阻测温电路,并应用Protel画出其电路原理图。

2.完成SST89E51单片机热电阻测温系统的焊装和硬件调试。

3.学习SST89E51单片机,编写完整的实验程序,下载到单片机并进行调试。

4. 撰写设计说明书。

四、设计时间及进度安排设计时间共三周(2012.3.5~2012.3.25),具体安排如下表:五、指导教师评语及学生成绩目录课程设计任务书 (I)目录 (II)摘要 (IV)第1章概述 (1)第2章硬件设计及相关介绍.............................................................. 错误!未定义书签。

2.1 恒流源部分 (2)2.1.1 PT100传感器特性和测温原理 (2)2.1.2 PT100温度传感器原理 (2)2.2 信号采集调理电路 (3)2.3 A/D模数转换模块 (4)2.4 显示模块 (7)2.5串口电路及MAX232芯片简介 (8)2.6 SST89E51单片机简介 (9)第3章软件设计及相关介绍 (11)3.1 编程语言(C语言)介绍 (11)3.2编程软件Keil简介 (11)3.3程序设计流程图 (14)3.4初始化程序 (14)3.5液晶显示 (16)3.6用插值法计算数据 (18)3.7运行结果 (18)3.8数据测试及误差分析 (18)结论 (19)参考文献 (20)摘要近几年我国热电阻行业发展速度较快,受益于热电阻行业生产技术不断提高以及下游需求市场不断扩大,热电阻行业在国内和国际市场上发展形势都十分看好。

基于PT100热电阻的单片机温度检测系统设计

基于PT100热电阻的单片机温度检测系统设计

基于PT100热电阻的单片机温度检测系统设计摘要本文介绍了一种基于PT100热电阻的单片机温度检测系统设计。

该系统采用了Maxim的MAX31865芯片来测量PT100热电阻的电阻值,并通过单片机将电阻值转换为温度值。

该系统可以实现高精度的温度测量,并且具有较低的功耗和较高的稳定性。

背景在许多工业应用中,需要对温度进行精确的测量。

PT100热电阻是一种常用的温度传感器,它的电阻值随着温度的变化而变化。

由于PT100热电阻的电阻值变化很小,因此需要使用高精度的电路来进行测量。

单片机是一种常见的控制器,它可以方便地集成多种功能。

将单片机与PT100热电阻结合使用,可以实现精确的温度测量,并且具有较低的功耗和较高的稳定性。

设计硬件设计硬件设计采用了MAX31865芯片来测量PT100热电阻的电阻值。

MAX31865是一种高精度热电偶转换器,可以方便地测量PT100热电阻的电阻值。

MAX31865还提供了冗余检测和安全防护功能,可以提高系统的可靠性。

MAX31865芯片的引脚与单片机的引脚连接如下:MAX31865引脚单片机引脚SDI MOSISDO MISOSCK SCLKCS SS其中,MOSI、MISO、SCLK和SS是SPI总线的引脚,用于与MAX31865进行通信。

单片机的中断引脚连接到MAX31865的RDY引脚,用于检测MAX31865是否准备好进行测量。

PT100热电阻的引脚连接到MAX31865的RTD+和RTD-引脚。

为了减小测量误差,应尽量将RTD+和RTD-的长度保持一致,并且尽可能靠近MAX31865芯片。

软件设计软件设计采用了Arduino环境,可以方便地进行程序开发和调试。

首先需要初始化SPI总线和MAX31865芯片。

可以使用Arduino的SPI库来初始化SPI总线,使用MAX31865库来初始化MAX31865芯片。

MAX31865库提供了方便的接口来进行温度测量和数据读取。

51单片机温度计程序

51单片机温度计程序
4)在倒计时状态复位情况下,可通过按动KADD或KSUB键进行时间的递增或递减调整,调整步长为10秒。当数值小于10以后,下调步长为1秒。
5)在计时状态停止时按动KFUN键可复位计时时间
6)按动KFUN键可启动或停止计时
7)在计时过程中按动KADD或KSUB键,可暂停计时和连续计时
8)倒顺计时的任意情况下按动KSET键,可退出计时回到正常的时钟状态
//uchar DB_tmp[5]; //存放从键盘输入的密码
uchar Disp[4];//显示寄存器
uchar Bset=0;//功能状态寄存器。
uchar error;//记录密码错误状态
uchar hold=50;//蜂鸣器保持时间。
uchar msecl,msec,second;//10毫秒,0.5秒,秒计时单元。
write_byte(0x44);//发出温度转换命令
delay(70);//800us
ow_reset();//p
for(i=32;i>0;i--);
write_byte(0xcc);
write_byte(0xbe);//发出读温度命令
for(i=2;i>0;i--);
5、单灯亮时,需要输入正确密码,亮起双灯才能修改密码
6、长按Kset键,系统锁定,红灯亮起
三、温度模块
可设定报警温度上限和下限。温度超限时,发出蜂鸣报警声。
1、在时间模块,通过长按set键进入温度模块。
2、在温度模块下,按动up键进入温度上限设置。按动down键,进入温度下限报警设置。
void delay(uchar i)
{
uchar j;

基于51单片机数字温度计系统设计与实现

基于51单片机数字温度计系统设计与实现

基于51单片机数字温度计系统设计与实现数字温度计是一种可以测量环境温度并将结果以数字方式显示的设备。

在本次任务中,我们将基于51单片机设计和实现一个数字温度计系统。

本文将介绍数字温度计的原理、硬件设计、软件设计以及系统的实施过程。

首先,让我们来了解一下数字温度计的工作原理。

数字温度计通过传感器获取环境温度的模拟信号,然后将其转换为数字信号进行处理,并最终在数字显示器上显示温度值。

通常,我们使用的传感器是温度敏感电阻或数字温度传感器。

接下来,我们将讨论硬件设计。

在本次任务中,我们使用的是51单片机作为主控制器。

我们需要连接一个温度传感器来测量温度,并将温度值转换为数字信号。

同时,我们还需要连接一个数字显示器,用于显示温度值。

为了实现这些功能,我们需要设计一个电路板,并正确布局电子元件。

另外,我们还需要通过键盘或按钮来控制系统的操作,例如切换温度单位等。

在软件设计方面,我们需要编写程序来完成以下任务:首先,我们需要初始化51单片机的引脚和中断。

然后,我们需要编写一个温度转换的函数,将传感器输出的模拟信号转换为数字信号。

接下来,我们需要编写一个显示函数,将转换后的数字温度值显示在数字显示器上。

最后,我们还可以添加一些功能,例如设置温度单位(摄氏度或华氏度)和存储温度数据等。

在系统实施过程中,我们需要按照以下步骤进行操作:首先,进行硬件的连接和组装。

确保所有电子元件正确连接并固定在电路板上。

然后,烧录编写好的程序到51单片机中。

接下来,我们可以通过设置开关或按键来控制系统的操作。

最后,我们可以测试系统的功能和性能,确保数字温度计正常工作。

值得注意的是,在设计和实现数字温度计系统时,我们需要考虑一些问题。

例如,温度传感器的精度和响应时间,数字显示器的显示精度和分辨率,以及系统的稳定性和可靠性等。

通过合理的设计和选择高质量的元件,我们可以提高系统的性能和可靠性。

总结起来,本次任务中我们基于51单片机设计和实现了一个数字温度计系统。

基于51单片机的数字温度计实时监测方案探究

基于51单片机的数字温度计实时监测方案探究

基于51单片机的数字温度计实时监测方案探究数字温度计是一种能够实时监测环境温度的仪器。

本方案通过使用51单片机,将温度传感器与单片机相连接,以实现对环境温度的实时监测。

以下是本方案的详细内容。

一、硬件设计1. 硬件器材准备:准备一个51单片机开发板,一个温度传感器(如DS18B20)、若干杜邦线、一个电阻和一个LCD液晶显示屏。

2. 连接电路:将温度传感器的Vcc引脚连接到单片机的VCC引脚,将GND引脚连接到单片机的GND引脚。

将传感器的DATA引脚连接到单片机的一个IO引脚,并通过一个4.7kΩ的上拉电阻连接到VCC引脚。

将LCD显示屏的引脚连接到单片机相应的IO引脚和电源引脚。

3. 编写单片机程序:使用C语言编写单片机程序,通过读取传感器数据并将结果显示到LCD屏幕上。

程序中需要包括初始化函数、温度读取函数以及数据显示函数。

二、软件设计1. 初始化函数:在初始化函数中设置单片机的工作模式、引脚功能和相关参数,如为LCD显示屏设置数据总线引脚和控制引脚等。

2. 温度读取函数:通过单片机的IO口读取传感器数据。

使用51单片机的串行通信功能与温度传感器进行通信,并读取传感器发送的数据。

根据传感器的规格说明书,将接收到的数据转换为温度值。

3. 数据显示函数:将读取到的温度值显示到LCD屏幕上。

先清除LCD屏幕上的内容,然后使用LCD屏幕上的光标控制函数将温度值显示到特定位置。

可以选择在LCD屏幕上显示华氏度或摄氏度。

三、实时监测方案1. 循环读取温度值:在主函数中,使用一个无限循环来实现连续地读取温度值。

在每次循环中调用温度读取函数,读取传感器当前的温度值。

2. 设置温度报警:根据实际需求,在主函数中添加一个判断语句,当温度值超过或低于某个阈值时,触发温度报警。

可以通过LED灯、蜂鸣器等外设来实现报警。

3. 数据保存和上传:根据需求,可以将读取的实时温度值保存到相应的存储介质中,如SD卡或EEPROM。

基于51单片机的数字温度计实现

基于51单片机的数字温度计实现

基于51单片机的数字温度计实现数字温度计是一种能够精确测量温度的仪器,利用数字技术将温度传感器测得的模拟信号转换成数字信号,以显示出实时温度数值。

在这个任务中,我们要使用51单片机来实现一个基于数字技术的温度计。

首先,我们需要一种温度传感器,常用的有热敏电阻传感器和数字温度传感器。

在这里,我们选择使用热敏电阻传感器,因为它价格低廉且性能稳定。

热敏电阻传感器的电阻值会随着温度的变化而发生改变,我们可以利用这个特性来测量温度。

51单片机是一种常用的微型计算机芯片,具有强大的计算和控制能力,非常适合用于实现温度计。

我们可以将热敏电阻传感器连接到单片机的模拟输入引脚上,通过读取引脚上的电压值来获取温度值。

接下来,我们需要编写51单片机的程序来实现温度的转换和显示。

首先,我们需要将模拟信号通过模数转换器(ADC)转换成数字信号。

然后,我们可以通过一定的算法将数字信号转换成对应的温度数值。

为了实现温度的显示,我们可以连接一个LCD液晶屏到51单片机上。

LCD屏幕可以显示数字和字符,我们可以在屏幕上显示实时的温度数值。

除了温度的显示,我们还可以添加一些功能来增强温度计的实用性。

例如,我们可以设置一个温度报警功能,在温度超过一定阈值时发出声音或亮起警示灯。

这样可以方便用户随时知晓温度是否正常。

另外,我们还可以为温度计添加保存数据的功能。

通过连接一个存储器芯片,我们可以将温度数据存储下来,方便后续分析和查看。

总之,基于51单片机的数字温度计实现可以通过连接热敏电阻传感器并编写相应的程序来实现温度的测量和显示。

通过添加额外的功能,例如温度报警和数据存储,可以增强温度计的实用性和功能性。

这样的温度计可以广泛应用于室内温度检测、工业控制和科研实验等领域。

基于51单片机数字温度计的设计与实现

基于51单片机数字温度计的设计与实现

基于51单片机数字温度计的设计与实现数字温度计是一种能够测量环境温度并显示数值的设备。

基于51单片机的数字温度计设计与实现是指利用51单片机作为核心,结合温度传感器和其他辅助电路,实现一个能够测量温度并通过数码管显示温度数值的系统。

本文将从硬件设计和软件实现两个方面介绍基于51单片机数字温度计的具体设计与实现过程。

一、硬件设计1. 温度传感器选取在设计数字温度计时,首先需要选取合适的温度传感器。

市面上常用的温度传感器有热敏电阻、功率型温度传感器(如PT100)、数字温度传感器(如DS18B20)等。

根据设计需求和成本考虑,我们选择使用DS18B20数字温度传感器。

2. 电路设计基于51单片机的数字温度计的电路设计主要包括单片机与温度传感器的连接、数码管显示电路和电源电路。

(1)单片机与温度传感器的连接在电路中将51单片机与DS18B20数字温度传感器相连接,可采用一线总线的方式。

通过引脚的连接,实现单片机对温度传感器的读取控制。

(2)数码管显示电路为了能够显示温度数值,我们需要设计一个数码管显示电路。

根据温度传感器测得的温度值,通过数字转换和数码管驱动,将温度数值显示在数码管上。

(3)电源电路电源电路采用稳压电源设计,保证整个系统的稳定供电。

根据实际需求选择合适的电源电压,并添加滤波电容和稳压芯片,以稳定电源输出。

3. PCB设计根据电路设计的原理图,进行PCB设计。

根据电路元件的布局和连线的走向,绘制PCB板的线路、元件和连接之间。

二、软件实现1. 单片机的编程语言选择对于基于51单片机的数字温度计的软件实现,我们可以选择汇编语言或者C语言进行编程。

汇编语言的效率高,但编写难度大;C语言的可读性好,开发效率高。

根据实际情况,我们选择使用C语言进行编程。

2. 温度传感器数据获取利用单片机的IO口与温度传感器相连,通过一线总线协议进行数据的读取。

根据温度传感器的通信规则,编写相应的代码实现数据的读取。

基于51单片机的数字温度计开发及应用

基于51单片机的数字温度计开发及应用

基于51单片机的数字温度计开发及应用数字温度计是一种利用数字技术来实现温度测量和显示的仪器。

它具有测量精度高、响应迅速、体积小、易于携带等优点,广泛应用于工业控制、生活中的温度测量和监控。

本文将介绍基于51单片机的数字温度计的开发及应用。

一、硬件设计1. 温度传感器选择:常见的温度传感器有热电偶、热敏电阻、半导体温度传感器等。

根据应用需求选择合适的温度传感器,如DS18B20数字温度传感器。

2. 电路设计:根据温度传感器的工作原理,设计合适的电路进行温度测量。

一种常用的电路是将温度传感器与单片机相连,通过单片机来读取传感器的温度数值。

电路设计要注意电源稳定性、信号放大和滤波等。

3. 显示器选择:可以选择液晶显示器、LED数码管等来显示温度数值。

液晶显示器可以显示更多信息,LED数码管则结构简单、适合简单的温度显示。

4. 控制器选择:选择一款合适的51单片机作为控制器,具有丰富的外设接口和较高的性价比。

如常用的STC89C52单片机。

二、软件开发1. 编程语言选择:使用C语言进行开发,具有相对较高的运行效率和开发效率。

2. 温度测量算法:根据温度传感器的特性和电路设计,编写测量算法来准确读取温度数值。

对于DS18B20传感器,可以参考其提供的通信协议进行编程。

3. 数据处理与显示:读取到温度数值后,通过算法和数据处理来获得最终的温度值。

将温度值显示在选定的显示器上,可以实现数字显示、小数点显示等功能。

4. 控制模块设计:可以根据需求设计控制模块,如报警功能、温度范围设定、温度记录等。

根据温度数值进行判断和控制,实现相应的控制逻辑。

三、应用场景1. 家庭温度监控:将数字温度计应用于家中,实时监测室内温度。

可以设置温度报警阈值,当温度超过设定值时发出警报提示。

2. 工业控制:在工业生产中,温度是一个重要的参数。

将数字温度计应用于控制系统中,实时监测生产环境的温度变化,保持生产过程的稳定性和安全性。

3. 温室农业:数字温度计可以应用于温室农业中,实时监测温室内外的温度差异,帮助农民掌握温室环境,并进行相应的调节和控制。

基于51单片机的智能温度计

基于51单片机的智能温度计

基于51单片机的智能温度计作者:肖慧来源:《管理观察》2009年第13期摘要:本论文叙述了应用89C51单片机设计的智能温度计的设计原理。

采用精度较高的铂电阻Pt100作为测温元件。

使用ADC0803进行A/D转换将铂电阻输出的温度电压信号转换成数字信号传给单片机进行处理。

89C51单片机将处理后的温度数据通过3个数码管进行动态显示。

另外添加上下限报警、打印、与上位机通信等功能。

关键词:智能温度计 89C51单片机铂电阻Pt1001.铂电阻测温电路设计铂电阻测量温度的基本原理是,铂电阻的阻值是温度的函数,通过铂电阻的电阻值即可测量温度。

铂电阻的阻值与温度的函数是非线性的,通常可用多项式表示,即:Rt=R0(1+a1t+a2t2+…+antn)式中,R0是温度为0℃时的电阻值,其值与电阻型号有关。

目前国内统一的一般工业标准铂电阻有100Ω和500Ω两种,器分度号分别为Pt100和Pt500。

鉴于高次幂项数值很小,因此实际应用时用二次多项式表示铂电阻的阻值与温度的关系,即:Rt=R0(1+a1t+a2t2)式中,系数a1a21采用最小二乘法确定,对于Pt100型铂电阻,在0~630.74℃内有:a1=3.9684×10-3/℃,a2=-5.8458×10-7/℃, 因此有:Rt=R0(1+3.9658×10-3t-5.8458×10-7t2)。

设计Pt100的测温电路如图一:这样单片机仅需要对数据进行查表和简单计算即可得到温度值,所得结果高七位为温度数据的整数值(0-100),最低位为小数位,为零时表示温度数据的小数为0,为1时温度数据的小数为5。

因此很好的避免了单片机不擅长的数学计算。

单片机电路如图二由C1和R4构成的电路产生单片机的RET信号,实现单片机的上电复位。

单片机的P1.1输出控制ADC0803 A/D转换的控制信号,首先将P1.1至于低电平重置ADC0803,在将P1.1至于高电平启动A/D转换。

PT100智能数字热敏温度计主程序

PT100智能数字热敏温度计主程序
PH=0;
//delay();
P1=0xFB;
P2=table[fu[2]];
//delay();
P1=0xF7;
P2=0xBF;
//delay();
}
void timer0() interrupt 1 using 1
{
THO=(65536-1000)/256;
P1=0xFB;
P2=table[zheng[2]];
//delay();
P1=0xF7;
P2=0xFF;
//delay();
}
void displayf()
{
P1=0xFE;
P2=table[fu[0]];
//delay();
P1=0xFD;
P2=table[fu[1]];
//display();
}
else
{
T=(25.7*(150000-(119900*dat)))/(15000-(109*dat));
fu[0]=T%10; //取得个位数
fu[1]=T/10%10; //取得十位数
fu[2]=T/100%10; //取得百位数
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar zheng[3];
START=0; //启动AD
while(EOC==0);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC0801 XBYTE[0x7fff]
#define disp_dat P1
#define LED_n P2
sbit INTR=P3^2;
const uchar tab[]={
0xc0,0xf9,0xa4,0xb0,//0~3
0x99,0x92,0x82,0xf8,//4~7
0x80,0x90,0xff,0x86 //8、9、mie
};
const uchar tab_dot[]={
0x40,0x79,0x24,0x30,//0.~3.
0x19,0x12,0x02,0x78,//4.~7.
0x00,0x10, 0xff,0x86//8.、9.、mie、E
};
uchar T[4]={1,0,4,5};
uchar tem[11]={10,10,20,13,11,11,15,21,18,29,11};
uchar T_num=20,sam_n=0;
/************************函数声明***********************/ void delay(int n); //延时函数
void init_T0(void); //定时器T0初始化void disp_seg(uchar n,uchar d_dat); //显示函数
uchar AD_dat(void); //AD转换函数uchar median(uchar *dat,uchar num_d); //中值滤波函数float account_res(void); //电阻值计算函数
float temperature(void); //计算温度函数
void adj_t(void); //调整显示数据函数void disp(void); //温度显示程序void renovate(void); //更新显示数据
/*********************主程序*********************/
main()
{
init_T0(); //初始化T0
while(1)
{
disp(); //调用显示函数
renovate(); //更新显示数据};
}
/*****************温度显示函数*****************/
void disp(void)
{
uchar i;
for(i=0;i<4;i++)
{
disp_seg(i,T[i]);
}
}
/***、、、、、、、、************更新显示数据函数*******、、、、、、、、、、、、、、、、。

********/ void renovate(void)
{
if(sam_n==11) //去完11个采样值
{
sam_n=0; //清零采样计数器
adj_t(); //调用数据调整程序
}
}
/******************延时函数********************/
void delay(int n)
{
int i,j;
for (i=0;i<n;i++)
for (j=0;j<1000;j++);
}
/****************定时器T0初始化****************/
void init_T0(void)
{
TMOD=0x01; //工作方式1
TH0=0x4c; //定时50ms
TL0=0x00;
ET0=1; //允许定时器T0中断
EA=1; //开总中断
TR0=1; //启动定时器T0
}
/*******************显示函数*******************/
void disp_seg(uchar n,uchar d_dat)
{
LED_n=0xff; //清位控制状态
disp_dat=0xff; //清显示数据
LED_n=~(0x01<<n); //送数据显示位
if(n==2)
disp_dat=tab_dot[d_dat]; //送带小数点显示数据else
disp_dat=tab[d_dat]; //送无小数点显示数据
delay(1);
}
/********************AD转换函数*********************/
uchar AD_dat(void)
{
uchar temp;
ADC0801=0; //启动AD转换
while (INTR); //等待转换结束
temp=ADC0801; //读取转换值
return(temp);
}
/*******************中值滤波函数*********************/
uchar median(uchar *dat,uchar num_d) //需要排序的数组
{
uchar i,j,temp;
for (i=0;i<num_d;i++) //采用冒泡法对采样温度进行排序for (j=0;j<num_d-i;j++)
{
if (dat[i]>dat[i+1])
{
temp=dat[i];
dat[i]=dat[i+1];
dat[i+1]=temp;
}
}
return(dat[(num_d-1)/2]); //取中值并返回
}
/*******************电阻值计算函数*********************/
float account_res(void)
{
uchar temp;
float temp_r;
temp=median(tem,11); //利用中值法求取中间值
temp_r=((float)temp)*150/255+100;
return(temp_r);
}
/*****************计算温度函数*******************/
float temperature(void)
{
float temp1,T_out;
uchar temp2;
temp1=account_res(); //计算Pt100阻值
temp2=(uchar)temp1; //取Pt100阻值高位
if(temp2<100)
T_out=777; //若阻值在小于0℃之间else if(temp2<139)
T_out=2.558*temp1-256.02; //若阻值在0~100℃之间else if(temp2<177)
T_out=2.637*temp1-267.01; //若阻值在100~200℃之间else if(temp2<214)
T_out=2.721*temp1-281.9; //若阻值在200~300℃之间
else if(temp2<250)
T_out=2.81*temp1-300.94; //若阻值在300~400℃之间else if(temp2>250)
T_out=777; //若阻值在大于400℃之间return(T_out);
}
/*******************调整显示数据函数*******************/
void adj_t(void)
{
float temp_v;
uint value;
temp_v=10*temperature(); //利用计算温度值
value=(uint)temp_v;
if(value==7770) //超出测量范围
{
T[0]=11; //显示'E'
T[1]=11; //显示'E'
T[2]=11; //显示'E'
T[3]=11; //显示'E'
}
else
{
T[0]=value/1000; //待显示百位
T[1]=(value%1000)/100; //待显示十位
T[2]=(value%1000)%100; //待显示个位
T[3]=(value%1000)%100%10; //待显示小数
if(T[0]==0x00)
{
T[0]=10;
if(T[1]==0)
T[1]=10;
}
}
}
/*******************定时T0中断程序*****************/
void senddat_T0(void) interrupt 1
{
TH0=0x4c; //重载定时器初值TL0=0x00;
if(--T_num==0)
{
tem[sam_n]=AD_dat(); //读取温度值存入缓冲区
sam_n++; //温度采样个数加1
T_num=20; //恢复计数值}
}。

相关文档
最新文档