基于单片机的数字温度计设计(含程序、仿真图)
单片机基于stm32的数字温度计设计
单片机基于stm32的数字温度计设计
数字温度计是一种用于测量环境温度的设备。
在这个问题中,我们将使用基于STM32的单片机来设计一个数字温度计。
为了设计这个温度计,我们需要以下组件和步骤:
1. STM32单片机:STM32是一种基于ARM架构的单片机,它具有强大的计算能力和丰富的外设接口,适用于各种应用。
2. 温度传感器:我们需要选择一种适合的温度传感器,常用的有数字式温度传感器,如DS18B20。
3. 连接电路:将温度传感器连接到STM32单片机。
这通常需要使用一些电子元件,如电阻、电容和连接线等来建立电路连接。
4. 编程:使用适合STM32单片机的编程语言,如C语言,来编写程序。
程序将读取温度传感器的数据,并将其转换为数字值。
5. 温度显示:将温度数据显示在合适的显示设备上,如LCD显示屏或七段数码管。
可以使用STM32单片机的GPIO口控制这些显示设备。
6. 数据处理:可以对温度数据进行进一步处理,如计算平均温度、设定警报阈值等。
以上是一个基本的数字温度计设计的流程。
具体的实现细节和代码编写可能需要根据具体的硬件和软件平台进行调整。
基于STC89C52单片机的数字温度计(附源代码,完美实现)
基于STC89C52单片机的数字温度计学院:信息科学与工程学院专业:电子信息科学与技术一、摘要温度的检测是工业生产中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发。
本文设计了一种基于STC89C52单片机的温度检测系统,该系统将温度传感器DS18B20接在控制器的端口上,对温度进行采集,将采集到的温度值显示在1602液晶屏上。
经实验测试表明,该系统设计和布线简单,结构紧凑,有可读性高,反应速度快,测量准确,抗干扰能力强,性价比高,扩展方便等优点,具有关阔的应用前景。
关键词:STC89C52 数字温度计 DS18B20二、前言随着人民生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子。
单片机控制温度检测系统的温感系统主要是DS18B20芯片,该芯片由一根总线控制,电压范围为3.0v--5.5v。
DS18B20具有测温方便、测温范围广、测温精度高等特点。
出于对此类问题的探索,我们设计并制作了此温度检测系统。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确。
其输出温度采用数字显示,主要用于对测温比较准确的场所,该设计控制器模块主要使用STC89C52单片机,测温传感模块使用DS18B20;显示模块使用1602液晶显示屏,可以只管、准确的显示所测温度值。
三、系统组成及工作原理3.1、总体设计方案经分析,将系统分为两个部分,一个是由温度传感器DS18B20组成的检测部分,另一个是由单片机和1602液晶组成的主控与显示部分。
如图所示DS18B20将检测到的数据送到单片机,单片机对接收到的数据进行处理并送到1602显示,6V电源给各个部分供电。
3.2系统单元的选择与论证3.2.1单片机控制模块的选择与论证方案一:采用XC9000系列的FPGA。
基于单片机的数字温度计设计(课程设计有电路图和程序)
课程设计题目数字式温度计设计学院计信学院专业测控技术与仪器班级2006级2班学生姓名徐春数字式温度计设计组长:徐春 2006004071组员:蒋薇薇 2006004041 张静 2006004039 雷小利 2006004042 叶赛虎 2006004068 杨欣 2006004012摘要:随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。
关键词:单片机,数字控制,温度计,DS18B20,AT89S520 引言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求1、设计方案本设计方案的选择主要是感温元件的选择,经查阅资料,IC式感温器在市场上应用比较广泛的有以下几种:(1)AD590:电流输出型的测温组件,温度每升高1摄氏度K(凯式温度),电流增1uA,温度测量范围在-55℃~150℃之间。
其所采集到的数据需经A/D转换,才能得到实际的温度值。
.(2)DSl8B20:除了测量温度外,它还可以把温度值以数字的方式(9Bit)送出,温度送出的精度为O.5℃,温度测量范围在-55℃~125℃之间,可以做恒温控制。
(3)SMARTEC感温组件:这是一只3个管脚感温IC,温度测量范围在—45℃~130。
基于单片机的数字温度计方案设计书(附代码及仿真)
目录1、绪论 (3)2、方案选择2.1、主控芯片选择 (3)2.2、显示模块 (3)2.3、温度检测模块 (4)3、系统硬件设计3.1、51单片机最小系统设计 (4)3.2、电源供电电路设计 (5)3.3、LCD显示电路设计 (6)3.4、温度检测电路设计 (7)4、系统软件设计4.1、温度传感器数据读取流程图 (9)4.2、系统程序设计 (10)5、编程和仿真5.1、Keil编程软件 (11)5.2、proteus (11)5.3、仿真界面 (11)6、总结 (12)7、附录附录1、原理图 (12)附录2、程序清单 (13)1、绪论在信息高速发展的21世纪,科学技术的发展日新月异,科技的进步带动了测量技术的发展,现代控制设备的性能和结构发生了翻天覆地的变化。
我们已经进入了高速发展的信息时代,测量技术也成为当今科技的一个主流,广泛地深入到研究和应用工程的各个领域。
温度和人们的生活息息相关,温度的测量也就变得很重要。
2、系统方案选择2.1 主控芯片选择方案一:STC89C52RCSTC89C52RC是采用8051核的ISP在线可编程芯片,最高工作时钟频率80MHz,片内含8KB的可反复擦写1000次的Flash只读存储器,器件兼容MCS-51指令系统及8051引脚结构,芯片内集成了通用8位中央处理器和ISP Flash 存储单元,具有在线可编程特定,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC89C52RC系列单片机是单时钟周期、高速、低功耗的新一代8051单片机。
方案二:ATmega8ATmega8是ATMAL公司在2002年第一季度推出的一款新型AVR高档单片机。
在AVR家族中,ATmega8是一种非常特殊的单片机,它的芯片内部集成了较大容量的存储器和丰富强大的硬件接口电路,具备AVR高档单片机MEGA系列的全部性能和特点。
但由于采用了小引脚封装(为DIP28和TQFP/MLF32),所以其价格仅与低档单片机相当,再加上AVR单片机的系统内可编程特性,使得无需购买昂贵的仿真器和编程器也可进行单片机嵌入式系统的设计和开发,同时也为单片机的初学者提供了非常方便和简捷的开发环境。
基于单片机的数字温度计的设计
目录摘要 (1)关键词 (1)Abstract (1)Keywords (1)前言 (1)1 设计简介 (1)1.1设计背景 (1)1.2设计达到的预期目的 (1)2方案论证 (1)2.1测温电路方案设计 (1)2.2显示电路方案设计 (2)2.3方案比较 (3)2.4温度计工作原理 (3)3硬件电路设计 (1)3.1系统电源电路的设计 (1)3.2主板电路 (1)3.2.1单片机 AT89S52芯片介绍 (1)3.2.2 DS18B20温度传感器简介 (5)3.3 温度显示电路 (10)3.3.1 液晶显示器各种图形的显示原理 (11)3.3.2字符型LCD1602简介 (12)4软件设计 (2)4.1 主程序流程图 (2)4.2 读出温度子程序流程图 (3)4.3 温度转换命令子程序流程图 (3)4.4 计算温度子程序流程图 (4)4.5显示数据刷新子程序流程图 (4)5 Proteus仿真调试 (1)5.1 Proteus软件介绍 (1)5.2 Proteus界面介绍 (1)5.3 Keil软件简介 (2)5.4 设计仿真过程 (4)5.4.1 仿真原理图绘制 (4)5.4.2 系统调试 (5)5.4.3开始仿真 (5)6 总结和改进方法 (1)参考文献 (1)致谢 (1)附录1 程序清单 (1)附录2 元器件清单 (8)基于单片机的数字温度计设计摘要:单片机自20世纪70年代问世以来,已广泛的应用在工业自动化、自动检测与控制系统、智能仪器仪表、机电一体化设备、汽车电子、家用电器等各方面。
本文将介绍一种基于单片机控制的数字温度计,用单片机实现水温测量。
传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。
本次采用DS18B20数字温度传感器来实现基于AT89S52单片机的数字温度计的设计,用LCD1602液晶显示以串口传送数据,实现温度显示,单片机能独立对温度进行检测、控制,能准确达到要求。
基于单片机的数字温度计
数字温度计设计一、设计任务与要求1.1 设计容:数字温度计的设计要能实现温度的实时采集与显示,以AT89S51单片机为核心芯片,使用DS18B20数字温度传感器或使用热敏电阻之类的器件,利用其感温效应采集环境温度,并通过一组4位共阴极数码管将温度显示出来,也可用LM1602液晶显示屏。
1.2 设计基本要求:(1)温度设定围:温度为00℃—99℃(2)温度精度为0.1℃;(3)可以设置报警温度,发出报警信息,可以用声或光表示。
二、方案设计与论证本设计以检测温度并显示温度,以及提供上下限报警和设定某一个报警温度为目的。
按照系统设计功能的要求,对于温度的采集可以使用温度传感器、热敏电阻或热电偶等等;将采集到的温度传到单片机,利用软件编程对温度进行处理;温度围和精度由软硬件决定;报警采用声音和灯光相结合,由蜂鸣器和LED 灯组成;报警温度的设置由键盘的up和down来设定。
方案一由于本设计实现的是测温电路,首先我们可以使用热敏电阻之类的器件,利用其感温效应,将其随被测温度变化的电压或电流值采集过来,进行A/D转换后,就可以用单片机进行数据的处理,通过显示电路就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
因此,我们引出第二种方案。
方案二我们可以采用技术成熟、操作简单、精确度高的温度传感器,在此,可以选用数字温度传感器DS18B20,根据它的特点和测温原理,很容易就能直接读取被测温度值并进行转换,这样就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故在本设计中采用了方案二。
以下为利用DS18B20温度传感器的硬件构成图:图2.1 数字温度计设计总体硬件构成图 三、硬件电路设计3. 1、硬件设计总图见图3.1图3.1 硬件设计仿真总图DS18B20温度采集 复位电路 按键输入外部晶振电路单片机 AT89C52RC主控部分四位数码管显示温度声光报警电路3.2最小系统的电路设计单片机晶振电路、外部按键电路和复位电路的设计如图3.2所示。
单片机的数字温度计设计方案(附代码及仿真)
基于STC89C52的数字温度计目录1、绪论…………………………………………………………………… (3)2、方案选择2.1、主控芯片选择 (3)2.2、显示模块 (3)2.3、温度检测模块 (4)3、系统硬件设计3.1、51单片机最小系统设计 (4)3.2、电源供电电路设计 (5)3.3、LCD显示电路设计 (6)3.4、温度检测电路设计 (7)4、系统软件设计4.1、温度传感器数据读取流程图 (9)4.2、系统程序设计 (10)5、编程和仿真5.1、Keil编程软件 (1)15.2、proteus (11)5.3、仿真界面 (11)6、总结..................................................................................... .. (12)7、附录附录1、原理图 (12)附录2、程序清单 (13)1、绪论在信息高速发展的21世纪,科学技术的发展日新月异,科技的进步带动了测量技术的发展,现代控制设备的性能和结构发生了翻天覆地的变化。
我们已经进入了高速发展的信息时代,测量技术也成为当今科技的一个主流,广泛地深入到研究和应用工程的各个领域。
温度和人们的生活息息相关,温度的测量也就变得很重要。
2、系统方案选择2.1 主控芯片选择方案一:STC89C52RCSTC89C52RC是采用8051核的ISP在线可编程芯片,最高工作时钟频率80MHz,片内含8KB的可反复擦写1000次的Flash只读存储器,器件兼容MCS-51指令系统及8051引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在线可编程特定,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC89C52RC系列单片机是单时钟周期、高速、低功耗的新一代8051单片机。
方案二:ATmega8ATmega8是ATMAL公司在2002年第一季度推出的一款新型AVR 高档单片机。
基于单片机的数字温度计设计
目录1. 设计目的与要求 (1)1.1设计要求 (1)1.2设计思路简述 (1)1.3整体结构框图 (1)2.系统硬件设计 (2)2.1单片机最小系统模块 (2)2.1 单片机AT89C51 (2)2.1.2 晶振电路 (3)2.1.3 复位电路 (3)2.3温度传感器DS18B20模块 (4)2.3.1结构特点 (4)2.3.2引脚说明 (5)2.4LED数码管模块 (5)2.4.1工作原理 (5)2.4.2显示方式 (6)3.系统软件设计 (7)3.1主程序流程图 (7)3.2数据采集电路流程图 (8)3.3显示电路流程图 (9)4.系统仿真与调试 (10)参考文献 (11)附录 (12)1.设计目的与要求利用本学期学习的单片机知识完成一个单片机的设计并且进行仿真实现其功能,从而达到对单片机软硬件的进一步理解以及掌握相关传感器的原理以及使用方法,获得一定的实践经验,培养相互协作,理论与实践相结合,提过发现问题并且解决问题的能力。
1.1设计要求实时显示温度环境,四位数码管显示,3位整数,1位小数。
温度范围-55-127度。
1.2设计思路简述本设计使用DS18B20温度传感器,AT89C51单片机作为主控制器,结合反相驱动IC和共阳极4位数码管实现一个能够显示具体温度的数字温度计。
1.3整体结构框图基于单片机数字温度计的设计主要包括三大模块,分别为主控电路单片机AT89C51模块、数据采集电路温度传感器DS18B20模块和显示电路LED数码管模块。
整体结构如错误!未找到引用源。
所示图表 1.1整体结构框图2.系统硬件设计2.1单片机最小系统模块2.1 单片机AT89C511、AT89C51标准功能4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
基于单片机的数字温度计设计
1.设计任务与要求本课题的研究方法是利用单片机和数字温度传感器DS18B20设计一台数字温度计。
单片机作为主控制器,数字温度传感器DS18B20作为测温元件,传感器DS18B20可以读取被测量温度值,进行转换,从而用4位共阳极LED数码管来显示转换后的温度值,可以设定温度的上下限报警功能,实现报警提示。
2.系统的总体设计方案本设计将利用DS18B20智能温度传感器和单片机小系统,设计一个数字温度采集系统。
并设计一个人机接口电路:键盘采用独立按键(功能自定义),显示器采用共阴极4位LED显示。
系统的总体设计方案框图如图2.1所示图2.1 系统的总体设计方案框图3.硬件设计本设计采用的是AT89C52单片机为核心的数字温度计,包含了利用温度传感器DS18B20的测温电路、外接键盘、显示电路、报警电路、复位电路和晶振电路。
以DS18B20为主要测温元件进行实时监控温度值。
以4位数码管为显示器件,利用单片机的P0口和电阻排来驱动4位数码管的显示;利用单片机的P1.7来驱动温度传感器DS18B20测温;报警电路利用三极管放大作用驱动报警器报警;按键是利用单片机的P1口和上拉电阻来驱动工作3.1复位电路设计复位电路有上电自动复位和按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的,只要电源VCC的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。
按键手动复位有电平方式和脉冲方式两种。
其中,按键电平复位是通过使复位端经电阻与VCC电源接通而实现的,而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的。
本系统的复位电路采用上电复位方式。
复位电路图如图3.1所示:3.2 晶振电路图3.1 复位电路图设计图3.2 晶振电路图3.3 DS18B20芯片简介DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20外形及管脚排列如图3.8和表3-3所示[5]。
51单片机设计数字温度计(流程图+源码+实物图片)
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。
DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示。
N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数keyscan(); //按键扫描函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫描函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。
基于单片机的数字温度计设计与仿真
基于单片机的数字温度计设计与仿真盘桂云(吉首大学物理科学与信息工程学院,湖南吉首 416000)摘要本课题以单片机为控制核心,设计了一款数字温度计。
该系统由51单片机、DS18B20温度传感器以及1602 LCD液晶显示屏等部件组成。
系统上电后进入实时温度显示状态,此时将DS18B20中的温度值读到单片机中并将其显示在LCD液晶显示屏上。
系统可以设置上下限报警温度值,当测得结果超过设定值时进行相应的报警,提供一个接口可以将温度值传送给其它控制器或计算机,测量准确且误差小,其误差在±0.02℃。
关键词:单片机;温度采集;LCD显示;温度传感器;数字温度计;Emluater and Design of Digital Thermometer Based onMicrocomputer ControlPanguiyun(College of Physics Science and Information Engineering,JishouUniversity,Jishou,Hunan 416000)AbstractThis topic with the microcontroller as control core , and design a digital thermometer.It consists of 51 single -chip microcomputer, 18B20 temperature sensor and 1602 LCD screen display etc.After power on, the system into real-time temperature display state, then the temperature 18B20 will read in the single-chip microcomputer and displayed in the LCD screen.System can set upper temperature alarm, when the alarm measured results than the setting measured corresponding alarm, System can provide an interface which sends the temperature to other controller or computer. There is little measuring error, measuring error at ±0.02℃.Key words:Microcontroller;Temperature acquisition;LCD display;Temperatere sensor;Digital thermometer目录第一章绪论 (1)1.1 系统背景 (1)1.2 系统概述 (1)1.2.1 系统功能 (1)1.2.2 系统所用器件及其作用 (1)第二章系统总体设计2.1 系统硬件电路总体设计 (3)2.2系统软件的总体设计 (4)2.3主程序的流程设计与实现程序 (6)3.2.1 主程序的流程设计 (6)3.2.2 主程序的实现程序 (7)第三章主要器件介绍3.1 18B20温度传感器 (8)3.2 1602液晶显示器 (8)第四章系统详细设计4.1控制模块电路设计 (10)4.1.1晶振电路设计 (10)4.1.2复位电路设计 (10)4.2温度传感器模块 (11)4.2.1温度传感器模块电路设计 (11)4.2.2温度传感器模块程序设计 (12)4.3 液晶显示模块 (16)4.3.1液晶显示模块电路设计 (16)4.3.2液晶显示模块程序设计 (17)4.4 键盘输入模块 (17)4.4.1键盘输入模块电路设计 (17)4.4.2键盘输入模块程序设计 (18)4. 5报警模块 (19)4.5.1报警模块电路设计 (19)4.5.1报警模块程序设计 (20)4. 6串行输出模块 (20)第五章软件仿真与测试5.1软件的仿真分析与仿真结果 (21)结束语 (25)参考文献 (26)致谢 (27)附录1:系统电路图 (28)附录2:源程序清单 (29)第一章绪论1.1 系统背景在工农业生产和日常生活中,对温度的测量占据着极其重要地位。
基于单片机的数字温度计
数字温度计设计一、设计任务与要求1.1 设计内容:数字温度计的设计要能实现温度的实时采集与显示,以AT89S51单片机为核心芯片,使用DS18B20数字温度传感器或使用热敏电阻之类的器件,利用其感温效应采集环境温度,并通过一组4位共阴极数码管将温度显示出来,也可用LM1602液晶显示屏。
1.2 设计基本要求:(1)温度设定范围:温度为00℃—99℃(2)温度精度为0.1℃;(3)可以设置报警温度,发出报警信息,可以用声或光表示。
二、方案设计与论证本设计以检测温度并显示温度,以及提供上下限报警和设定某一个报警温度为目的。
按照系统设计功能的要求,对于温度的采集可以使用温度传感器、热敏电阻或热电偶等等;将采集到的温度传到单片机,利用软件编程对温度进行处理;温度范围和精度由软硬件决定;报警采用声音和灯光相结合,由蜂鸣器和LED灯组成;报警温度的设置由键盘的up和down来设定。
方案一由于本设计实现的是测温电路,首先我们可以使用热敏电阻之类的器件,利用其感温效应,将其随被测温度变化的电压或电流值采集过来,进行A/D转换后,就可以用单片机进行数据的处理,通过显示电路就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
因此,我们引出第二种方案。
方案二我们可以采用技术成熟、操作简单、精确度高的温度传感器,在此,可以选用数字温度传感器DS18B20,根据它的特点和测温原理,很容易就能直接读取被测温度值并进行转换,这样就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故在本设计中采用了方案二。
以下为利用DS18B20温度传感器的硬件构成图:图2.1 数字温度计设计总体硬件构成图 三、硬件电路设计3. 1、硬件设计总图见图3.1图3.1 硬件设计仿真总图3.2最小系统的电路设计单片机晶振电路、外部按键电路和复位电路的设计如图3.2所示。
XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。
数字温度计仿真图+源程序
源程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intucharyear,mon,day,xinqi;ucharsecond,minute,hour;ucharReadValue;uchardown,count;uchar flag; // 加减标志位char newsec,newmin,newhour; //重写数据用的秒,分,时char newyear,newmon,newday,newxinqi;uchar q;//---------------------ucharbai,shi,ge,fen,miao;#define t_cont 0.0625#define conever 0x44#define config 0x5f#define read 0xbe#define write 0x4e#define jmp 0xcc#define copy 0x48#define recall 0xb8sbitfmq=P2^3;sbitrs = P2^0;sbitrw = P2^1;sbit e = P2^2;sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;sbit DATA=P1^0; //位定义1302芯片的接口sbit SCLK=P1^1; //位定义1302芯片的接口sbit RST =P1^4; //位定义1302芯片的接口bit t_sign;bit flag1;sbit a=ACC^0;sbitdq=P1^5;float temp=0;//----------------------------------------//函数声明//----------------------------------------void delayus(uint n);void delayms(uint k);void mingling(uchar com);void Write1302(uchardat);uchar Read1302(void);void WriteSet1302(ucharCmd,uchardat);uchar ReadSet1302(ucharCmd);void Int1302(void);void readtime(void);void display(void);void Setdisplay(void);void menu(void);void inmenu(void);void max();void min();void funcinc();void turn_sub(ucharnewval,ucharnewaddr); void scanquit();void funcquit();//--------------------------------------------------------//函数功能:us延时//-------------------------------------------------------- void delayus(uint n){uchar i;for(i=0;i<n;i++);}void delayms(uint k){uchar i;for(i=0;i<k;i++)delayus(100);}void delaya(uint m){while(m--);}void init_1820(){uchar i=1;while(flag1==0){dq=1;delaya(8);dq=0;delaya(52);dq=1;delaya(2);while(1){i=dq;if(i==0){flag1=1;delaya(10);break;}}}flag1=0;}/*************向1820发送字节************/ void byte_1820(uchardat){uchar i=0;for(i=0;i<8;i++){dq=0;ACC=dat&0x01;dq=a;delaya(5);dq=1;dat>>=1;}}/**************读1820的数据*************/ uchar read_1820(void){uchari,indat;indat=0;for(i=0;i<8;i++){dq=0;indat>>=1;dq=1;if(dq) indat|=0x80;delaya(4);}return(indat);}/************获取TEM*****************/ void readtem(){uint y;uchar td=0;uchartg=0;uchar k;init_1820();byte_1820(jmp);byte_1820(conever);init_1820();byte_1820(jmp);byte_1820(read);td=read_1820();tg=read_1820();k=tg&0x08;if(k==0x08){t_sign=1;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=(-temp*100+52800);}else {t_sign=0;tg=tg&0x07;temp=(tg*256+td)*t_cont;temp=temp*100;}bai=(uint)temp/10000;y=(uint)temp%10000;shi=y/1000;y=(uint)y%1000;ge=y/100;y=(uint)y%100;fen=y/10;miao=(uint)y%10;}//----------------------------------------------------------------------//函数功能:向1302写一个字节数据//----------------------------------------------------------------------void Write1302(uchardat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delayus(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delayus(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位}}//-----------------------------------------------------------------------//函数功能:从1302读一个字节数据//-----------------------------------------------------------------------uchar Read1302(void){uchari,dat;delayus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delayus(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delayus(2); //稍微等待}return dat; //将读出的数据返回}//-----------------------------------------------------------------------//函数功能:根据命令字,向1302写一个字节数据//-----------------------------------------------------------------------void WriteSet1302(ucharCmd,uchardat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delayus(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}//----------------------------------------------------------------------//函数功能:根据命令字,从1302读取一个字节数据//----------------------------------------------------------------------uchar ReadSet1302(ucharCmd){uchardat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}//----------------------------------------------------------------------//读取1302内部时间到second,minute,hour;//----------------------------------------------------------------------void readtime(void){ReadValue = ReadSet1302(0x81); //从秒寄存器读数据second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x83); //从分寄存器读minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x85); //从分寄存器读hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化ReadValue = ReadSet1302(0x87); //从分寄存器读day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89); //从分寄存器读mon=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d); //从分寄存器读year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8b); //从分寄存器读xinqi=(ReadValue&0x0F);}//--------------------------------------------------------------------------------//DS1302的充电设置//--------------------------------------------------------------------------------void Int1302(void){second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302(0x90,0xa9); //打开充电二极管WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10); //禁止写入1302}//----------------------------------------------------//调时菜单进入//----------------------------------------------------void menu(void){if(!K1){delayms(1);if(!K1){down=1;while(K1!=1); //等待按键松开,如果按键不松,while条件成立进行空的死循环count++; //记录menu按下的次数if(count>7)count=1;WriteSet1302(0x8e,0x00); //允许写入1302second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second); //按下menu键后禁止ds1302工作,把秒写回1302WriteSet1302(0x8e,0x10); //禁止写入1302}}}//----------------------------------------------------------------------//进入菜单,调时程序//----------------------------------------------------------------------void inmenu(void){switch(count){case 1:{max();min();mingling(0xc7);mingling(0x0f);//开显示显示光标scanquit();}break;case 2:{max();min();mingling(0xc4);mingling(0x0f);//开显示显示光标scanquit();}break;case 3:{max();min();mingling(0xc1);mingling(0x0f);//开显示显示光标scanquit();}break;case 4:{max();min();mingling(0x89);mingling(0x0f);//开显示显示光标scanquit();}break;case 5:{max();min();mingling(0x86);mingling(0x0f);//开显示显示光标scanquit();}break;case 6:{max();min();mingling(0x83);mingling(0x0f);//开显示显示光标scanquit();}break;case 7:{max();min();mingling(0x8d);mingling(0x0f);//开显示显示光标scanquit();}break;default:break;}}//---------------------------------------------------//---------------------------------------------------void max() //判断加{if(!K2){delayms(1);if(!K2)while(!K2);flag=1;funcinc();}}void min() //判断减{if(!K3){delayms(1);if(!K3)while(!K3);flag=0;funcinc();}}//----------------------------------------------------void funcinc(){switch(count){case 1:turn_sub(newsec,0x81);second=ReadSet1302(0x81);WriteSet1302(0x80,0x80|second);break;case 2:turn_sub(newmin,0x83);break;case 3:turn_sub(newhour,0x85);break;case 4:turn_sub(newday,0x87);break;case 5:turn_sub(newmon,0x89);break;case 6:turn_sub(newyear,0x8d);break;case 7:turn_sub(newxinqi,0x8b);break;default: break;}}//--------------------------------------------------------------- void turn_sub(ucharnewval,ucharnewaddr){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag==1)newval++;else newval--;switch(count){case 1: if(newval>59) newval=0;break;case 2: if(newval>59) newval=0;break;case 3: if(newval>23) newval=0;break;case 4: if(newval>31) newval=0;break;case 5: if(newval>12) newval=0;break;case 6: if(newval>99) newval=0;break;case 7: if(newval>6) newval=0;break;default:break;}WriteSet1302(0x8e,0x00); //允许写入1302WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器WriteSet1302(0x8e,0x10); //禁止写入1302display(); //将修改后的值显示出来}//-----------------------------------------------------//-----------------------------------------------------void scanquit(){if(!K4){mingling(0x0c);delayms(1);if(!K4)while(!K4);funcquit();}}void funcquit(){mingling(0x0c);count=0;down=0;second=ReadSet1302(0x81);second=((second&0x70)>>4)*10+(second&0x0f);WriteSet1302(0x8e,0x00);WriteSet1302(0x80,(((second&0x7f)/10)<<4)|(second%10)); //保存当前秒并允许ds1302工作WriteSet1302(0x8e,0x10);}//---------------------------------------------------------------------- //显示程序//---------------------------------------------------------------------- //////////////命令/////////////////////void delay(uint m){uinti,j;for(i=0;i<m;i++)for(j=0;j<570;j++);}bit lcd_bz(){bit result;rs=0;rw=1;e=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);e=0;return(result);}void mingling(uchar com){while(lcd_bz());rs=0;e=0;rw=0;P0=com;e=1;e=0;delay(1);}void lcd_pos(ucharpos){mingling(pos);}//////////////数据/////////////////////void shuju(ucharshu){rs=1;rw=0;e=0;P0=shu;e=1;e=0;delay(1);}////////////初始化//////////////////////void init_1602(void){mingling(0X38);//功能设置delay(1);mingling(0X0c);//显示开关控制delay(1);mingling(0X06);//输入方式设置delay(1);mingling(0X01);//清显示delay(1);}//////////////显示//////////////////void date(void){switch(xinqi){case 0: shuju('S');shuju('u');shuju('n');break;case 1: shuju('M');shuju('o');shuju('n');break;case 2: shuju('T');shuju('u');shuju('e');break;case 3: shuju('W');shuju('e');shuju('d');break;case 4: shuju('T');shuju('h');shuju('u');break;case 5: shuju('F');shuju('r');shuju('i');break;case 6: shuju('S');shuju('a');shuju('t');break;default:break;}}void display(void){readtem();readtime();while(lcd_bz());delay(100);lcd_pos(0x80);shuju('2');shuju('0');shuju(year/10+0x30);lcd_pos(0x83);shuju(year%10+0x30);shuju('/');shuju(mon/10+0x30);shuju(mon%10+0x30);shuju('/'); shuju(day/10+0x30);shuju(day%10+0x30);lcd_pos(0xc0);shuju(hour/10+0x30);shuju(hour%10+0x30);shuju(':'); shuju(minute/10+0x30);shuju(minute%10+0x30);shuju(':'); shuju(second/10+0x30);shuju(second%10+0x30);lcd_pos(0x8c);date();lcd_pos(0xc8);if(t_sign==1){shuju(0x2d);delaya(10);if(bai!=0)shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}else{shuju(0x20);delaya(10);if(bai!=0)shuju(bai+0x30);else shuju(0x20);shuju(shi+0x30);shuju(ge+0x30);shuju(0x2e);shuju(fen+0x30);shuju(miao+0x30);shuju(0xdf);shuju(0x43);}/********/if((shi>=3&&ge>=3)||(shi<=2&&ge<=9)){fmq=0;}if((shi<=3&&ge<3)||(shi>=2&&ge>9))fmq=1;}//---------------------------------------------------------------------- //函数功能:主函数//---------------------------------------------------------------------- void main(void){Int1302();init_1602();init_1820();down=0;count=0;while(1){menu(); //检测是否调时if(down==1){inmenu(); //进入调时模式}else{while(lcd_bz());display();}}}。