使用单片机进行温度测量
要实现温度监测,首先需要连接温度传感器到单片机,并读取传感器输出的模拟信号。通常使用的温度传感器是模拟输出的,可以选择使用模拟输入引脚(比如ADC引脚)来读取传感器信号。
以下是一个示例程序,演示如何在8051单片机上通过ADC读取温度传感器的模拟信号,并将其转换为温度值进行显示:
```c
#include <8051.h>
// 函数声明
void delay_ms(unsigned int milliseconds);
void init_adc();
unsigned char read_adc();
// 延时函数,单位为毫秒
void delay_ms(unsigned int milliseconds) {
while (milliseconds) {
unsigned int count = 12000; // 根据实际情况调整循环次数
while (count) {
count--;
}
milliseconds--;
}
}
// 初始化ADC
void init_adc() {
ADCON0 = 0x41; // 设置ADC转换时钟频率和通道
ADCON1 = 0x80; // 设置ADC数据格式和引用电压
}
// 读取ADC值
unsigned char read_adc() {
ADCON0 |= 0x04; // 启动ADC转换
while (ADCON0 & 0x04); // 等待ADC转换完成
return ADRESH; // 返回高字节数据
}
// 主函数
void main(void) {
unsigned char adc_value;
float temperature;
init_adc(); // 初始化ADC
while (1) {
adc_value = read_adc(); // 读取ADC值
// 转换为温度值(示例使用线性关系进行转换)
temperature = (adc_value * 0.48875) - 50;
// 显示温度值(通过串口、LCD等方式进行显示)
// 延时一段时间
delay_ms(1000);
}
}
```
在上面的示例中,我们定义了`init_adc`函数用于初始化ADC,`read_adc`函数用于读取ADC值。主函数中,我们通过调用`init_adc`函数来初始化ADC,然后在一个循环中不断读取ADC值并进行温度转换。
请注意,这只是一个示例程序,温度转换部分使用了简单的线性关系进行转换,具体的转换公式需要根据你所使用的温度传感器的特性而定。
另外,你可能需要根据实际情况将温度值以适当的方式进行显示,比如通过串口通信输出到计算机,或者连接液晶显示屏进行显示。
希望这个示例对你有帮助。如果还有其他问题,请随时提问。
51单片机温度测量系统Proteus仿真
串行扩展应用:
利用 DS18B20 和 LED 数码管实现单总线温度测量系统。DS18B20的测量范围是-5℃~128℃。由于只接有两个 LED数码管,所以显示的数值只能在 00~~99 之间。
硬件图Proteus仿真图:
(2)软件设计
#include<reg51.h>#include"intrins.h"#define uchar unsigned char#define uint unsigned int#define out P0sbit smg1=out^4;sbit smg2=out^5;sbit DQ=P3^7;void delay5(uchar);void init_ds18b20(void);uchar readbyte(void);void writebyte(uchar);uchar retemp(void);
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取: 加微信领取资料
void main(){uchar i,temp;delay5(1000);while(1){temp=retemp();for(i=0;i<10;i++){out=(temp/10)&0x0f;smg1=0;smg2=1;delay5(1000);out=(temp%10)&0x0f;smg1=1;smg2=0;delay5(1000);}}}
void delay5(uchar n){do{nop();nop();nop();n–;}while(n);}
void init_ds18b20(void){uchar x=0;DQ=0;delay5(120);DQ=1;delay5(16);delay5(80);}
uchar readbyte(void){uchar i=0;uchar date=0;for(i=8;i>0;i–){DQ=0;delay5(1);DQ=1;date>>=1;if(DQ)date|=0x80;delay5(11);}return(date);}
void writebyte(uchar dat){uchar i=0;for(i=8;i>0;i–){DQ=0;DQ=dat&0x01;delay5(12);DQ=1;dat>>=1;delay5(5);}}
uchar retemp(void){uchar a,b,tt;uint t;init_ds18b20();writebyte(0xcc);writebyte(0x44);init_ds18b20();writebyte(0xcc);writebyte(0xbe);a=readbyte();b=readbyte();t=b;t<<=8;t=t|a;tt=t*0.0625;return(tt);}
效果图
上图,仿真运行状态①(未操作温度)。
上图,仿真运行状态②(未操作温度)。
上图,仿真运行状态③(ds18b20按钮按下,温度增加)。
上图,仿真运行状态④(ds18b20按钮按下,温度增加)。
实验结论及分析
1.程序的核心思想
①DS18B20与传统的热敏电阻不同,DS18B20 可直接将被测温度转换为串行数字信号,供单片机处理。通过对 DS18B20 编程可以实现 9~12 位的温度读数,并可分别在 93.75ms 和 750ms 内完成 9 位和 12 位的数字量。其测温范围-55℃~+125℃,最大分辨率为 0.0625℃,在一10℃~+85℃范围内其测温准确度为±0.5℃。
②DS18B20也可以看作一个小的单片机系统,它将温度信息采集到自己的内存中,然后通过一定的节拍将温度信息一位一位地传入at89c51单片机中进行二位数码管的显数。
2.实验中遇到的问题
①lcd1602输入信息时要记得初始化,否则不会显数。
②注意DS18B20的温度信息一位一位地传入at89c51单片机中时严格把控节拍,节拍不正确将影响数据传输。
③at89c51单片机的时钟频率要设置成11.0592mhz。
原文链接:https://mp.weixin.qq.com/s/A9QS6xlYd9XKk8IHtJGffA
转载自:STM32嵌入式开发
原文链接:51单片机温度测量系统Proteus仿真
本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
相关问答
单片机温度 测试器怎么做?制作单片机温度测试器首先需要选择一个合适的单片机,如ATmega328P,然后将单片机与温度传感器DS18B20相连。通过单片机的GPIO口将DS18B20的数据线连接到单片机...
单片机温度 控制系统怎么解决?单片机温度控制系统可以通过以下步骤来解决:选择合适的传感器:选用温度传感器来监测环境温度。连接传感器:将传感器与单片机连接,以便采集温度数据。编写...
51 单片机温度 测量选哪个元器件?在51单片机温度测量中,最常用的元器件是温度传感器。其中,最经济实用的是NTC热敏电阻,它可以通过测量电阻值来反映温度变化。此外,还有PT100、热电偶等传感器...
单片机温度 变化率计算方法?用程序生成一个100ms的脉冲,DB0为本次采样,DB1为上次采样,在脉冲的上升沿将计算DB0和DB1差值,再将DB0传送给DB1,再将温度数据传送给DB0。这样就可以计算出本次...
protues7.8 单片机温度 检测?Proteus7.8单片机温度检测是基于51单片机的温度监控仿真设计,程序编译器为keil4/5,编程语言为C语言。该设计主要功能有:显示温度0-99,上电默认高温报警35...
单片机 怎么控制电热丝 温度 (精确控制)?要单片机控制温度,是完全可以的。要有温度传感器测温度,再去控制电热丝。电热丝也用5V电源吗?那电源的功率是多少,电热功率是多少?用5Ⅴ能使电热丝发热吗?这...
单片机 、光耦1系统总体结构原理粮食在储藏期间,由于受环境、气候和通风条件等因素的变化,粮仓内温度或湿度会发生异常,这极易造成粮食的霉烂、或发生虫害。那么...
单片机温度 传感器不显示示数?如果单片机温度传感器不显示示数,可能有几个原因。首先,检查传感器是否正确连接到单片机,并确保电源供应正常。其次,检查传感器的引脚是否正确配置,并确保...
怎样用 单片机 测量白光t12烙铁芯 温度 ?需要温度传感器,将温度传感器与单片机连接然后编程获取温度。焊台通过烙铁给工件快速传热从而控制温度。另外一种方法就是利用温控器,通过打开或是关闭电源来...
c51 单片机温度 报警器灯不亮?是致命错误。问题原因:编译工具及相关库文件在KEIL的tool.ini初始化文件指定的路径不存在或者指定的路径下的文件找不到。解决方案,有两种:1、安装KEIL...