一、项目介绍温度检测是工业自动化、生产线等众多领域中常见的应用场景之一,能及时准确地监测温度对于保障生产安全和提高生产效率有着非常重要的作用。而在现代的电子制造行业中,使用单片机和传感器等电子元器件进行温度检测已经成为了一个比较成熟的技术方案。
本项目选择stc89c52单片机和ds18b20数字温度传感器,通过读取传感器输出的温度值,经过计算和处理后,并将结果显示在数码管上,实现环境温度的实时监测和显示。其中,stc89c52单片机为主控芯片,负责接收和处理数字温度传感器的数据,并通过数码管将温度值进行显示。
二、整体设计【1】设计思路使用 stc89c52 单片机和 ds18b20 数字温度传感器,通过 i/o 口进行连接,读取传感器输出的温度值。通过计算和处理后,将温度值在数码管上进行显示。其中,stc89c52 单片机为主控芯片,负责接收和处理数字温度传感器的数据,并通过数码管将温度值进行显示。
【2】硬件连接硬件方面,需要使用 stc89c52 单片机和 ds18b20 数字温度传感器。其中,stc89c52 单片机通过 p1 口连接4位数码管的动态扫描信号线,并与 ds18b20 传感器的 dq 线相连。ds18b20需要使用一个2.2k欧姆上拉电阻和一个10k欧姆下拉电阻。
【3】软件设计在软件方面,主要进行以下操作:
(1)初始化函数
初始化串行总线,设置为推挽输出,并将数码管段选端口初始化为高电平输出,数码管位选端口初始化为低电平输出。
(2)读取温度值函数
通过发送读取命令,从 ds18b20 数字温度传感器中读取温度值。
(3)温度值计算函数
根据 ds18b20 数字温度传感器的温度值计算方法,将读取到的数值进行转换,得到实际温度值。
(4)数码管显示函数
将温度值分离出整数和小数部分,然后经过数码管驱动程序,通过数码管进行显示。
三、具体代码实现【1】ds18b20温度读取ds18b20 是一种数字温度传感器,采用单总线接口进行通讯。它可以在较长的距离内实现温度值的准确测量,并且不需要调零或校准,被广泛应用于各种计算机控制系统、电子设备和温度控制应用中。其分辨率为 12 位,温度范围为 -55 度 celsius 到 +125 度 celsius。
下面代码实现的功能是:读取ds18b20温度再通过串口打印出来。
#include #define uchar unsigned char #define uint unsigned int sbit dq = p1^0; // ds18b20 数字温度传感器数据线连接到 p1.0 引脚 // ds18b20 数据传输函数 void ds18b20_writebyte(uchar dat); uchar ds18b20_readbyte(); void ds18b20_start(); void ds18b20_end(); void ds18b20_delay(uint i); // 初始化函数 void init(); // 串口初始化函数 void uart_init(); // 串口发送函数 void send_string(char *s); void main() { uchar temp_h, temp_l; uint temp; init(); uart_init(); // 串口初始化 while(1) { ds18b20_start(); // 启动传输 ds18b20_writebyte(0xcc); // 忽略 rom 指令 ds18b20_writebyte(0x44); // 发送温度转换指令 ds18b20_end(); // 结束传输 ds18b20_start(); // 启动传输 ds18b20_writebyte(0xcc); // 忽略 rom 指令 ds18b20_writebyte(0xbe); // 发送读取指令 // 读取温度值 temp_l = ds18b20_readbyte(); // 读取低位温度值 temp_h = ds18b20_readbyte(); // 读取高位温度值 // 计算温度值 temp = (temp_h < < 8) + temp_l; temp = (float)temp / 16; send_string(the temperature is: ); send_string(temp); send_string(); ds18b20_end(); // 结束传输 } } // ds18b20 数据传输函数 void ds18b20_writebyte(uchar dat) { uchar i; for (i = 0; i >= 1; } } uchar ds18b20_readbyte() { uchar i, dat = 0; for (i = 0; i >= 1; if(dq) dat |= 0x80; ds18b20_delay(5); // 延时 5us dq = 1; // 读时序结束 } return dat; } void ds18b20_start() { dq = 1; ds18b20_delay(1); dq = 0; ds18b20_delay(480); dq = 1; ds18b20_delay(60); } void ds18b20_end() { dq = 1; ds18b20_delay(1); } void ds18b20_delay(uint i) { while(i--); } // 初始化函数 void init() { tmod |= 0x20; // 定时器 1 工作在模式 2 th1 = 0xfd; // 设置波特率,4800 bps tl1 = 0xfd; tr1 = 1; // 启动定时器 } // 串口初始化函数 void uart_init() { scon = 0x50; // 8 位数据,可变波特率,允许接收 es = 1; // 允许串口中断 ea = 1; // 允许总中断 } // 串口发送函数 void send_string(char *s) { while(*s) { sbuf = *s; while(!ti); ti = 0; s++; } }【2】读取温度数码管显示数码管是一种数码显示装置,通常由一个数码管的阵列组成,可以用来显示数字、字母和一些特殊符号。广泛应用于各种电子装置中,如计算器、时钟、温度计、电压表、档位指示器等。数码管通常可分为共阳极和共阴极两种类型,其中共阳极的数码管是将阳极连接在一起,通过控制对应的阴极接口以实现显示数字,而共阴极则是将阴极连接在一起,通过控制对应的阳极接口以实现显示。
数码管的显示原理是通过不同的电信号按照一定的逻辑在数码管内部的小灯泡上点亮不同的线段,从而形成所需的数字、字母或符号。要实现数码管的显示控制,需要使用微控制器或其他数字电路实现对数码管各个位的控制,在采集到数据后将其转换为可显示的信息,并将其显示在相应的数码管上。
下面是通过ds18b20 温度传感器读取温度再通过数码管显示温度:
火狐Firefox 73允许阻止网站的VR设备访问通知
PCB制造中PCB的面板化要求
4K超高清HDMI延长器解决4K信号长距离传输
浅析RF天线中的两个特殊的传输线段
赋能工业制造转型升级,自连工业物联网解决方案
STC89C52+DS18B20实现环境温度检测(数码管显示温度)
小鹏汽车携手英伟达深耕自动驾驶领域
洲明体育首款万级亮度LED显示屏满足户外体育场在强光下显示需求
什么是中断向量偏移,为什么要做中断向量偏移?
半加成法SAP于载板之量产
地方标准免费下载 |《重庆市城市道路照明管理办法》
军用无人驾驶气垫船 可巡视海域可作战
Immersive Factory融资85万英镑 用于开展一系列VR培训
国外公司正开发一种专利技术,可降低电动汽车的生产成本以及提高储能
企业如何应对“互联网+”时代的到来?
智能超声波振动筛电源发生器设计
华为mate10什么时候上市?华为mate10最新消息:黑科技缠身+双曲面屏,华为mate10能否战胜三星note8?
气体检测仪如何校准,操作过程的详细介绍
Shimmer专攻穿戴式传感器 打造开源技术平台
华为授予Qorvo“最佳协同合作伙伴奖”与“核心合作伙伴奖”两大奖项