DS18B20单片机数码管显示原理图和程序
DS18B20原理及程序编写

DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
ds18b20 单片机数码管显示原理图和程序

temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值
temp2=a&0x0f; //小数的值
temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshu
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示xs小数xiaoshu
{
unsigned char x=0;
DQ = 1; //DQ复位ds18b20通信端口
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时大于480us
DQ = 1; //拉高总线
delay(4);
x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //高电平拉成低电平时读周期开始
先上原理图:
洞洞板布局图:
然后就是实物图了:
附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
DS18B20智能温度控制器(附软件程序)

DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
基于51单片机的温度监测系统(DS18B20)

DS18B20读时序
所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为 高
配置寄存器
8 位 CRC 生成器
DS18B20的时序
DS18B20复位时序
DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主 机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。在初始化步骤中,总线 上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收 模式。当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测 到上升沿后等待15到60us,发出存在脉冲,拉低总线60-240us至此,初始化和存在时序 完毕。时序图如下:
1.主控制器电路和测温
电路的设计
主控制器电路由AT89S52 及外围时钟和复位电路构成, 测温电路由DS18B20、报警 电路组成。AT89C52是此硬 件电路设计的核心,通过 AT89S52的管脚P2.7与 DS18B20相连,控制温度的 读出和显示。硬件电路的功 能都是与软件编程相结合而 实现的。具体电路原理图如 右图2所示。
送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线
将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产 生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。
18B20温度传感器温度计程序

18B20温度传感器温度计程序2008-9-261.实验任务本实验实现的是通过18B20温度传感器读回温度并在6位数码管上显示。
精度为,范围为2.实验目的学会使用单片机控制18B20此类单总线器件。
原理及引脚介绍DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20产品的特点(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。
C到+125。
C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见下图,其引脚功能描述见下:1.GND地信号2.DQ数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也能够向器件提供电源。
3.VDD可选择的VDD引脚。
当工作于寄生电源时,此引脚必需接地。
18B20管脚图4.实验原理图实验原理图5. 18B20操纵命令字指令说明读ROM(33H) 读18B20的序列号匹配ROM(55H) 继续读完64位序列号的命令,用于多个18B20时定位跳过ROM(CCH) 此命令执行后的在存储器打操作针对在线所有18B20 搜ROM(F0H) 识别总线上各器件的编码,为操作各器件做准备报警搜索(ECH) 公温度越限的器件对此命令作出响应指令说明温度转换(44H) 启动在线18B20做温度AD转换读数据(BEH) 从高速暂存器读9位温度值和CRC值写数据(4EH) 将数据写入高速暂存的第3和第4字节中复制(48H) 将高速暂存器中第3和第4字节复制到EERAM读EERAM(B8H) 将EERAM内容写入高速暂存器中第3和第4字节读电源供电方式(B4H) 了解18B20的供电方式6. 实验源程序WENDU_L EQU 29H;用于保留读出温度的低字节WENDU_H EQU 28H;用于保留读出温度的高字节XIAOSHU EQU 27H;用于保留温度的小数部份ZHENGSHU EQU 26H;用于保留整数部份BIAOZHI BIT 50H;18B20检查位1为存在,0为不存在ORG 0000HAJMP MAINORG 0030HMAIN:MOV SCON,#00HACALL DUWENACALL ZHENGHEACALL BCDACALL DISPACALL TIME1AJMP MAIN;---------------------------------------------------------------------------------------------------------------------------------------- ;读温度子程序;---------------------------------------------------------------------------------------------------------------------------------------- DUWEN:SETBACALL FUWEI ;读温度之前必需先复位JB BIAOZHI,CUNZAI;查看标志位看18B20是不是存在,1为存在,0为不存在RET ;不存在那么返回CUNZAI: ;存在那么开始读温度MOV A,#0CCH ;跳过ROM匹配ACALL XIE ;调写子程序MOV A,#44H ;发出温度转换命令ACALL XIE ;调写子程序ACALL TIME1 ;调1秒延时,等等AD转换完成,此刻分辨率为12位,温度最大转换时刻为750MSACALL FUWEI ;读温前需要复位MOV A,#0CCH ;跳过ROM匹配ACALL XIEMOV A,#0BEH ;发读温度命令ACALL XIEACALL DUSHU ;将闱出数据读回CLRRET;------------------------------------------------------------------------------------------------------------------------------;复位子程序;18B20复位需要将数据位拉低500us;18B20收到信号后要等待16-60us,然后发出60-240us的低脉冲;------------------------------------------------------------------------------------------------------------------------------- FUWEI:SETBNOPCLRMOV R0,#3INTE:MOV R1,#107 ;设一个537us延时KK1: DJNZ R1,KK1DJNZ R0,INTESETB ;拉高数据线,等待回应NOPNOPNOPMOV R0,#25 ;INTE1:JNB ,INTE2 ;延时延时50us等待18B20回应,假设返回低脉冲那么说明18B20存在DJNZ R0 ,INTE1AJMP INTE3 ;通过反映时刻而没检测到18B20的存在,那么跳转去清零标志位INTE2:SETB BIAOZHI ;检测到18B20存在,置1标志位CLRAJMP INTE4INTE3:CLR BIAOZHI ;没检测到18B20,清零标志位AJMP INTE5INTE4:MOV R0,#120 ;延时240us,确定回应信号已发完KK: DJNZ R0,KKINTE5:SETBRET;---------------------------------------------------------------------------------------------------------------------------------------- ;写18B20子程序;----------------------------------------------------------------------------------------------------------------------------------------- XIE:MOV R2,#8 ;写计数寄放器,一共有8位数据CLR CLP:CLRMOV R3,#6 ;设一个延时LL1:DJNZ R3,LL1RRC A ;右循环,先输出低位MOV ,CMOV R3,#23 ;设延时LL: DJNZ R3,LL ;SETBNOPNOPDJNZ R2,LP ;判定是不是完成数据传送SETB ;完成传送拉高数据位RET;----------------------------------------------------------------------------------------------------------------------------------------- ;从18B20中读出温度数据子程序;-----------------------------------------------------------------------------------------------------------------------------------------DUSHU:MOV R4,#2 ;设读回数据个数指针MOV R1,#WENDU_L ;把温度数据低位存入29HRE: MOV R2,#8 ;设数据长度指针RE1: CLR CSETBNOPNOP CLRNOPNOPNOPSETBMOV R3,#9 DJNZ R3,$ MOV C, MOV R3,#23NN: DJNZ R3,NNRRC ADJNZ R2,RE1MOV @R1,A DEC R1 ;高位存入28H DJNZ R4,RERET;---------------------------------------------------------------------------------------------------------------------------------;数据整合子程序;温度源数据的整合,读出数据的高字节的低四位决定温度的整数部份;低字节的低四位决定小数部份;----------------------------------------------------------------------------------------------------------------------------- ZHENGHE:MOV A,#0FHANL A,WENDU_L ;低字节的低四位就是小数部分MOV XIAOSHU,A ;取得小数部份MOV A,WENDU_L ;将高字节的低四位移入低字节的高4位,MOV C,40H ;获得的新字节就是整数部分的数据RRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV ZHENGSHU,ARET;----------------------------------------------------------------------------------------------------------------------------------------- ;显示数据拆解程序、显示程序、延时程序;----------------------------------------------------------------------------------------------------------------------------------------;数据拆解程序BCD:MOV A,ZHENGSHU MOV B,#10DIV ABMOV 50H,AMOV 51H,BMOV A,XIAOSHUMOV R0,#52HMOV R2,#4D0:MOV B,#10MUL ABMOV B,#16DIV ABMOV @R0,AINC R0MOV A,BDJNZ R2,D0RET ;----------------------------------- ;显示程序;---------------------------------- DISP:ACALL TIMEMOV R7,#6MOV DPTR,#TABMOV R0,#55HLP1:MOV A ,@R0;MOVC A,@A+DPTRCJNE R7,#2,NE1ANL A,#07FHNE1:MOV SBUF,AJNB TI ,$CLR TIDEC R0DJNZ R7,LP1RET;---------------------------------------- ;延时程序;---------------------------------------- TIME1:MOV R6,#4LOOP2:MOV R5,#250LOOP1:ACALL D1MSDJNZ R5,LOOP1DJNZ R6,LOOP2RETTIME:MOV R6,#200LOOP3:ACALL D1MSDJNZ R6,LOOP3RETD1MS:MOV R7,#250LOOP0:NOPNOPNOPDJNZ R7,LOOP0RETTAB:DB 0C0H,0F9H,0A4H,0B0H DB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H,0A1H,86H, 8EHDB 0FFHEND。
单总线温度传感器DS18B20简介

单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
ds18b20详解及程序

最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计.DS18B20 产品的特点:(1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间;在—10 ~+85℃范围内误差为±5℃;(5)、数字温度计的分辨率用户可以从9 位到12 位选择.将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置.DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平。
通常要求外接一个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~5。
5V; 当工作于寄生电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第3, 4字节是TH和TL的易失性拷贝,在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝,同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:MSB LSBR0和R1是温度值分辨率位,按下表进行配置。
默认出厂设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0。
5℃,0.25℃,0.125℃, 0。
0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:其中高字节前5位都是符号位S,若分辨率低于12位时,相应地使最低为0, 如:当, 高字节不变.。
电子温度计 DS18B20 程序 电路图

它的功能是:1.读出当前温度值。
2.可通过按键调整报警温度上下限。
按第一个键,进入温度上线调节模式,第二个键温度加,第三个键温度减,再按一下第一个键,进入温度下线调节模式,第二个键温度加,第三个键温度键,再按一下第一个键,正常显示当前温度。
3.当进入报警温度上下限调节时,红灯亮,当显示当前温度是,绿灯亮。
4.当当前温度超过上限温度时,或者低于下限温度时,蜂鸣器报警且黄灯闪烁。
需要说明的是,一般情况下,DQ引脚应该有一个上拉电阻来拉高电平,但是我通过观察发现,初始状态下,89C52单片机的引脚都为高电平,故我将上拉电阻去除,1820与单片机正常通信,加上上拉电阻,反而不能正常通信。
#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^0;sbit Speak=P1^7;sbit Out=P3^2;sbit Button1=P1^4;sbit Button2=P1^5;sbit Button3=P1^6;sbit Ledblue=P1^0;sbit Ledred=P1^1;bit Point;uint T;int Up=980,Down=300,Tplace=0;code uchar Ledcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x8f}; /*数码管显示的数字0123456789℃*/code uchar Ledcode_s[]={0xbf,0x86,0xdb,0xcf, /*带小数点数码管显示0123456789-*/0xe6,0xed,0xfd,0x87,0xff,0xef,0x40};code uchar Ledplace[]={0,0x1e,0x1d,0x1b,0x17,0x0f}; /*数码管的位置1 2 3 4 5 位*/void Delay_2us(uchar num_us) /*可调度为2us,最大误差为6us,最大延时510us*/ {while(--num_us);}void Delay_8us(uint num_us) /*延时8微妙最大误差263us*/{while(--num_us);}void Delay_ms(uint num_ms) /*延时1毫秒*/{uint i;while(num_ms--){for(i=0;i<123;i++);}}void Speaker() /*蜂鸣器响*/{uint i=50;while(--i)Speak=~Speak;Delay_8us(500);}}void Nospeaker() /*蜂鸣器不响*/ {Speak=0;}bit Reset() /*复位*/{bit flag;DQ=1;_nop_();DQ=0;Delay_8us(70);DQ=1;Delay_2us(20);flag=DQ;Delay_2us(70);DQ=1;Delay_2us(70);return flag;}void Writedata(uchar dat) /*写数据*/{uchar i;bit flag;for(i=0;i<8;i++){flag=dat&0x01;DQ=1;_nop_();DQ=0;Delay_2us(5);DQ=flag;Delay_2us(40);dat=dat>>1;DQ=1;Delay_2us(2);}Readdata() / *读数据*/ {uchar i=0,dat=0;bit flag=0;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;Delay_2us(5);DQ=1;flag=DQ;Delay_2us(30);DQ=1;Delay_2us(5);dat=dat>>1;if(flag){dat|=0x80;}Delay_2us(3);}Out=0;return dat;}uint ReadTem() /*温度转换*/ {uint High,Low;Reset();Writedata(0xcc);Writedata(0x44);Delay_8us(85);Reset();Writedata(0xcc);Writedata(0xbe);Delay_8us(85);Low=Readdata();High=Readdata();Point=High&0xf8;if(Point){T=(~((High<<8)|Low)+1)*0.625;}else{T=((High<<8)|Low)*0.625;}return T;}Display(uint T) /*显示*/{if(Point){P2=Ledplace[1];P0=Ledcode_s[10];Delay_ms(5);P0=0;}else{P2=Ledplace[1];P0=0;Delay_ms(5);P0=0;}P2=Ledplace[2];P0=Ledcode[T/100];Delay_ms(5);P0=0;P2=Ledplace[3];P0=Ledcode_s[T%100/10];Delay_ms(5);P0=0;P0=Ledcode[T%10];Delay_ms(5);P0=0;P2=Ledplace[5];P0=Ledcode[10];Delay_ms(5);P0=0;}void Outinter() interrupt 0 /*外部中断*/{if((T>Up&&Point==0)||(T>Down&&Point==1)){Speaker();}else{Nospeaker();}Out=1;}main(void) /*主程序*/{EA=1;EX0=1;IT0=0;while(1){switch(Tplace){case 0: {Ledblue=1;Ledred=0;Display(ReadTem());}break;case 1: {Ledred=1;Ledblue=0;Point=0;Display(Up);}break;case 2: {Ledred=1;Ledblue=0;Point=1;Display(Down);}break;}if(!Button1){Delay_ms(300);if(Tplace==3){Tplace=0;}}if(!Button2&&Tplace==1){Delay_ms(300);Up=Up+10;if(Up>990){Up=0;}}if(!Button3&&Tplace==1){Delay_ms(300);Up=Up-10;if(Up<0){Up=990;}}if(!Button2&&Tplace==2){Delay_ms(300);Down=Down-10;if(Down<0){Down=550;}}if(!Button3&&Tplace==2){Delay_ms(300);Down=Down+10;if(Down>550){Down=0;}}}}用ISIS模拟,显示正常,但是将模拟的电路焊出来,反而出现了几个问题:1.必须去掉第五位数码管选择位管脚的三极管,数码管方能正常显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近天气热了,想要是做个能显示温度的小设备就好了, 于是想到DIY 个电子温度计,
网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。
作为单
片机小虾的我做这个用了 2天时间,当然是下班后,做工不行见谅了。
主要元件用到了单片机
STC89C54RD+ , DB18B20温度传感器,4为共阳数码管,
PNPS8550三极管等。
先上原理图:
洞洞板布局图:
然后就是实物图了:
函8D P3 iW 、
E E
FJ T I RF
D51*BZ0渥度澈码管显示
F7 Dl'AI>D li'A£> I 2、心
PDRM, 杖心P0WAD7
Pl I^TO
洋心EI^AJ D FLSAH
附上源程序:程序是别人写的,我只是自己 修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h”
#define uchar unsigned char #define uint unsigned int
sbit DQ=P3A 4; 〃温度数据口
sbit wx1=P2A0; sbit wx2=P2A1; sbit wx3=P2A2; sbit wx4=P2A3;
unsigned int temp, temp1,temp2, xs;
//位选1 //位选2 //位选3 //位选4
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};
/****** 延时程序 *******/ void delay1(unsigned int m)
{
unsigned int i,j; for(i=m;i>0;i--) for(j=110;j>0;j--); }
void delay(unsigned int m) {
while(m--);
}
/***********ds18b20 uchar ReadOneChar() {
unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {
读一个字节 **************/
void Init_DS18B20() { unsigned char x=0;
DQ = 1; //DQ 复位 delay(8); 〃稍做延时 DQ = 0; 〃单片机将 ds18b20通信端口 DQ 拉低
delay(80); //精确延时大于480us DQ = 1;
delay(4); x=DQ; delay(20); } 〃拉高总线
//稍做延时后如果x=0则初始化成功 x=1
则初始化失败
〃共阳数码管
〃温度延时程序
DQ = 0; //高电平拉成低电平时读周期开始 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; // delay(4); } return(dat); }
void WriteOneChar(unsigned char dat) {
unsigned char i=0; for (i=8; i>0; i--) {
DQ = 0; //从高电平拉至低电平时,写周期的开始 DQ = dat&0x01; //数据的最低位先写入
delay(5); //60us 至U 120us 延时
DQ = 1;
dat>>=1; //从最低位到最高位传入
读取 ds18b20 当前温度 ************/ void ReadTemperature()
{
unsigned char a=0; unsigned b=0; unsigned t=0; Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 /
WriteOneChar(0x44); // 启动温度转换 delay(5); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读 9个寄存器)
前两个就是温度/
delay(5);
a=ReadOneChar(); 〃读取温度值低位
/
b=ReadOneChar();
〃读取温度值高位
/
/*************ds18b20
写一个字节 ****************/ /**************
〃高8位中后三位数的值
〃低8位中的高4位值加上高8位中后三位数的值 tempi
temp2=a&0x0f; 〃小数的值
temp=((b*256+a)>>4);
〃当前采集温度值除 16得实际温度值 zhenshu
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs 小数 xiaoshu
void wenduxianshi() (
wx1=0;
P0=table[temp/10];
〃显示百位
delay1(5); wx1=1; wx2=0; P0=table[temp%10]+0x80; 〃显示十位 加上0x80就显示小数
点了。
delay1(5); wx2=1; wx3=0; P0=table[xs%10]; 〃显示个位 delay1(5); wx3=1; wx4=0; P0=table[12]; //显示 C 字符 delay1(5); wx4=1; }
void main()
(
while(1) (
ReadTemperature(); wenduxianshi();
temp1=b<<4;
temp1+=(a&0xf0)>>4; 室温整数值。