基于单片机的温度报警系统+proteus仿真
以51单片机为核心的DS18B20的数码管显示温度程序Proteus仿真
<TEXr>严********************************************************************文件名:温度采集DS1SB20.C*描述 :该文件实现了用温度传感器件DS18B2O 对温度的采集,并在数码管上显示出 来。
*创建人:谢宜腾,2011年4月6 口 *版本号:1.0***********************************************************************/ /*#iiiclude <reg52.h> #inc lude <intrins.h> #define uchai unsigned char #define umt unsigned mt #define jump_ROM OxCC #define start 0x44 #define read_EEROM OxBE unsigned char TMPHHMPL;uchai code table[10] = {0x3f 、0x06・0x5b 、0x4f,0x66,0x6d,0x7d,0x07,0x7f 、0x6f}; sbit DQ = P2A 3; //OS 18B20 数据口sbit P30=P3A0; sbit P31=P3A 1;*/ /riiic lude<reg52.h> ^include <intriiis.h> #define uchar unsigned char #define uiiit unsisned intsbit DATA = P2A3; /.DS18B20 接入 I 丨uchai codevTExT-I |S-:X1> .・一 一Ml昭TT.I 「勺.丄卫; -- 丄閔:ia<AC4 4P !Of. 士土丄土一f y i XTAL2KUUIAUU P0.VAD1 P02^AD2 P03AD3 RSIPO 4JAD4 POS 认 D5 POS^ADB P0.7/AD7 P2.0/A8 P2.1/ASP22ZA1O PSHMP2 3/A11 ALE P2QM2P2.WM3 cAP26/A14 P1.0/T2 P1.1/T2EXPl.2P2 7/A1S P3.0.RBD P3.1HXD卜y iiPI .3IT Pi .4 PI .5 P3.4/T0 P35/T1 Pl .6P3.6A/<Jr?PI .7 P3.7W"U1189lfi 30 3? 3321丄1314 运至35迫_7i12 ■ ■ ■ .■*f U2DS1333J <TEXT>GND • •table[]={0x3f0x06,0x5b,0x4f,0x66.0x6d.0x7d.0x07.0x7f,0x6f,0x77.0x7c.0x39.0x5e.0x790x71}; char5bai,shi,ge; 〃定义变量/*延时子函数*/void delay(uint num){while(num-);}Iiut.DS 18B20(void) 〃传感器初始化{uchar x=0;DATA= 1; //DQ 复位delay(lO); 〃稍做延时DATA= 0; 〃单片机将DQ拉低delay(80); //精确延时人于480us //450DATA=1; 〃拉高总线delay(20);x=DATA; 〃稍做延时后如果x=0则初始化成功x=l则初始化失败delay(30);}〃读一个字节ReadOneChai(void){uchar 1=0;uchar dat = 0;for (i=8;i>0;i~){DATA = 0; //给脉冲信号dat»=l;DATA=1;//给脉冲信号if(DATA)dat|=0x80; delav(8);}retuin(dat);}〃写一个字节WnteOneChai(unsigned chai dat) uchar 1=0; for (i=8; i>0; i—)DATA=O;DATA= dat&OxOl; delay(lO);DATA= 1;dat»=l;} delay(8);}〃读取温度mt ReadTemperature(void)uchar a=0;uchar b=0;mt t=0;float tt=O;Ink_DS18E20();WnteOneCliai-(OxCC); U跳过读序号列号的操作WnteOneCliai(Ox44); 〃启动温度转换Iiut_DS18B20();WnteOneCliai-(OxCC); 〃跳过读序号列号的操作WiiteOneCliaf(OxBE); 〃读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChai();// 低位b=ReadOneChai();//高位t=b;t«=8;t=t|a;tt=t*0.0625;t= tt*10+0.5;retuin(t);}/*显示子函数*/void display(int bai,int shi,mt ge)PO=table[bai];〃显示T•位delay(5O);//—小段延时动态显示P3=table[slu];〃显示百位delay(5O);void maiiiQint temp;while(l){temp=ReadTemperature();// 读温度bai=temp% 1000/100;// 显示百位slii=temp% 100/10;//显示十位ge=temp% 10;//显示个位display(bai,shi,ge);// 显示函数}}。
单片机温度检测proteus仿真
if (!IO_18B20) //读取通信引脚上的值
dat &= ~mask;
else
dat |= mask;
DelayX10us(6); //再延时60us
}
EA = 1; //重新使能总中断
return dat;
}
bit Start18B20() //启动一次18B20温度转换,返回值代表是否启动成功
LcdWriteCmd(0x06); //文字不动,地址自动+1
LcdWriteCmd(0x01); //清屏
}
/***********************DS18B20.c文件程序源代码*************************/
#include <reg51.h>
#include <intrins.h>
_nop_();
} while (--t);
}
bit Get18B20Ack(void) //复位总线,获取存在脉冲,以启动一次读写操作
{
bit ack;
EA = 0; //禁止总中断
IO_18B20 = 0; //产生500us复位脉冲
DelayX10us(50);
IO_18B20 = 1;
DelayX10us(6); //延时60us
}
void LcdWriteCmd(unsigned char cmd) //写入命令函数
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
基于PROTEUS的单片机多路温度采集系统的仿真设计
维普资讯
第 5 期
王 红 仓 等 : 于 P TE S的单 片 机 多 路 温 度 采 集 系 统 的仿 真 设 计 基 RO U
・8 ・ 5
该 系统 包括 传感 器 电路 、 盘与 显示 电路 、 口通 信 电路等 组成 部 分. 键 串
图 1 硬 件仿 真 图 2 1 传 感 器部 分 .
器 , 支持 C语 言 , 可 以与 Kel 5 集 成 开发 环境 连接 ,将 用汇 编 和 C语 言 编 写 的程 序 编译 好 之后 , 不 但 iC 1
可 以立 即进行 软 、 件结 合 的系统 仿真 , 使用 仿 真器一 样来 调试 程序 . 硬 像 ]
2 硬 件 方案设 计 .
维普资讯
№ . 5
陕 西 科 技 大 学 学 报
J OURNAL OF S HAANXIUNI VERSTY CI I OF S ENC & TECHNOL E O
Vo . 5 12
文章 编 号 :0 0 5 1 ( 0 7 o — 0 4 0 1 0 — 8 1 2 0 ) 50 8 — 4
基 于 P oT U R E S的 单 片 机 多路温 度 采集 系统 的 仿 真 设 计
王 红 仓 ,张俊 涛
( 西 科 技 大 学 电 气 与 信 息 工 程 学 院 ,陕西 西 安 70 2 ) 陕 1 0 1
DS 8 2 1 B 0是一 种数 字化 的温 度传 感器 , 数据 输 出 9 2位 可 以通 过 编程 进 行选 择 . ~1 当选用 1 2位 输 出 时 , 大温度 转换 时 间为 7 0ms该 器件 采 用单 线通 讯 , 以允 许在 通 讯 总线 上 级联 多 个 D 1 B 0器 件 , 最 5 . 可 S8 2 所 以很 适合 多点 测温 . D 1 B 0片 内设 有报 警单 元 , 户 可 以定 义 报警 的上 下 限. 在 S8 2 用 在完 成 温 度转 换 后 , 与贮存 在 寄存器 中的用 户补 码 触发 报警 TH 值 和 TL值进 行 比较而 触 发报 警. 了适应 不 同场合 的测 温 为
基于PROTEUS的单片机测温系统的仿真设计
基于PROTEUS的单片机测温系统的仿真设计I.概述在现代工业生产中,温度的准确测量对于保证产品质量、确保生产安全至关重要。
因此,设计一套可靠的温度测量系统对于工程师来说是必要的。
本文将介绍一种基于PROTEUS仿真平台的单片机测温系统的设计方法,利用该系统可以实现对温度的准确测量和监控。
II.系统设计1.系统硬件设计系统硬件设计包括传感器、单片机和显示器等部件的选型和连接。
温度传感器选用DS18B20数字温度传感器,该传感器具有高精度和抗干扰能力。
单片机选用常用的51系列单片机,如STC89C52等。
显示器可以使用数码管或LCD液晶显示器。
2.系统软件设计系统软件设计包括单片机程序的编写和功能实现。
首先,需要编写初始化程序,初始化系统设置和连接传感器。
其次,编写温度测量程序,通过单片机与传感器进行通信,并获取温度值。
最后,编写温度显示程序,将测得的温度值显示在数码管或LCD显示器上。
III.仿真操作1.运行PROTEUS软件首先,打开PROTEUS软件,并创建一个新的工程文件。
2.添加单片机和传感器在PROTEUS的元件库中找到所需的单片机和传感器元件,并将其拖放到画布中。
然后,通过连线工具将它们连接起来。
3.编写单片机程序使用类似Keil C等开发工具编写单片机程序。
将编写好的程序导入到PROTEUS中的单片机元件中,然后设置程序的执行方式。
4.设置仿真参数设置仿真参数,如仿真时间、时钟频率等。
为了模拟真实环境下的测温系统,可以设置仿真时间较长,以确保系统的稳定性和可靠性。
5.运行仿真点击运行按钮,开始执行仿真。
在仿真过程中,可以观察温度传感器的输出、单片机的工作状态以及显示器的显示情况。
根据需要可以调整相关参数,进行优化和改进。
IV.仿真结果分析通过观察仿真结果,可以评估设计的温度测量系统的性能和稳定性。
根据实际需求,可以对系统参数进行调整和优化。
同时,可以根据仿真结果进一步完善系统设计和功能实现。
基于PROTEUS的单片机测温系统的仿真设计剖析
本科毕业设计(论文)题目:基于PROTEUS的单片机测温系统的仿真设计学院:机械电子工程学院专业:测控技术与仪器学号:学生姓名:指导教师:职称:二O一二年五月十八日摘要随着人们生活水平的不断提高,单片机控制无疑是人们追求目标之一,它给人们带来了很大的方便,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作,科研,生活,提供更好的更方便的设施就需要从多数单片机技术入手,一切向着数字化控制,智能化控制方向发展,温度传感器适用范围广,数量多,居各种传感器之首。
本文从硬件和软件两方面来讲述温度测量过程,在控制过程中应用单片机AT89C52、数字温度传感器DS18B20、共阴极数码管、锁存器74HC573。
主要是通过DS18B20数字温度传感器采集温度,以单片机为核心控制部件,并通过存储器进行存储、共阴极数码管显示实时温度的一种数字温度计。
软件方面采用C语言来进行程序设计,使指令执行速度快,节省存储空间。
为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,使硬件在软件的控制下协调运作。
本设计主要做了如下几方面的工作:一是确定系统的总体设计方案,包括其功能设计、组成与工作原理、设计说明;二是进行硬件电路设计,包括硬件电路构成及测量原理、温度传感器的选择、单片机的选择;三是进行了调试和仿真,获得仿真结果。
经实验测试表明,该系统测量精度高、抗干扰能力强,具有一定的参考价值。
该系统设计和布线简单、结构紧凑、体积小、重量轻、性价比高、扩展方便,在大型仓库、工厂、智能化建筑等领域的温度检测中有广阔的应用前景。
关键词:温度测量;数字温度传感器DS18B20;AT89C52单片机;共阴极数码管显示。
AbstractAs people living standard rise ceaselessly, SCM control is undoubtedly one of the goals of the people to pursue, it brings convenience is not negative, including digital thermometer is one example, but people on its demand is higher and higher, to work for modern, scientific research, life, providing better more convenient facilities should be, from most of the single chip microcomputer, all to digital control system, intelligent control direction, the temperature sensor application scope. The number of sensors in the list.This article from two aspects of hardware and software to tell temperature measurement process, in the main process of single chip microcomputer control application AT89C52, digital temperature sensor DS18B20, cathode tube of digital, latches 74 HC573, mainly through digital temperature sensor DS18B20 collection temperature, with the single chip processor as the core to control components, and through the memory storage, liquid crystal display shows real-time temperature of a digital thermometer. Software using C language program to design, make the instruction execution speed, save storage space. In order to facilitate the expansion and the change, the software design using modular structure, make the program design logical relationship more concise and clear, make the hardware in the software under the control of the harmonious operation.This design is the major of the following aspects of work: one is sure the design of the whole system solutions, including the function design, composition and working principle, design descriptions; 2 it is hardware circuit design, including hardware circuit structure and measuring principle, the temperature sensor of choice, the choice of the single chip microcomputer; 3 it is the testing and simulation, get the simulation results.The test results show that the system measurement precision, strong anti-interference, concrete the certain reference value. The system design and wiring is simple, compact structure, small volume, light weight, high performance/price ratio, expansion of convenient, in the large warehouse, factory, intelligent building and other areas of temperature in detecting have broad application prospects.Keywords: temperature measurement; Digital temperature sensor DS18B20; AT89C52 single chip microcomputer; The cathode tube of digital display.目录摘要 (Ⅰ)Abstract (Ⅱ)第一章概述 (1)1.1 课题研究的背景 (1)1.2 课题研究的意义 (1)1.3 课题设计的目的 (2)1.4 课题设计的任务及要求 (2)第二章系统总体设计 (3)2.1 系统的功能设计 (3)2.2 系统的组成与工作原理 (3)2.3 系统设计说明 (4)第三章系统硬件电路的设计 (5)3.1 系统硬件电路构成及测量原理 (5)3.1.1 系统硬件电路构成 (5)3.1.2 系统工作原理 (6)3.2 单片机AT89C52 (7)3.2.1 AT89C52的主要性能参数 (7)3.2.2 功能特性概述 (7)3.2.3 引脚功能说明 (7)3.2.4 时钟振荡器 (9)3.2.5 AT89C52软件编程模式 (9)3.2.6 单片机最小系统设计 (10)3.2.7 关于单片机上拉和阻值选择的问题 (11)3.3 数字温度传感器DS18B20 (12)3.3.1 DS18B20技术性能描述 (12)3.3.2 数字温度传感器DS18B20的简单介绍 (13)3.3.3 AT89C52单片机与DS18B20的接口 (17)3.3.4 DS18B20使用中注意事项 (19)3.4 温度显示方式 (19)3.4.2 74HC573锁存器 (21)3.4.3 数码管显示 (24)3.4.4 数码管跟液晶显示的选择 (27)第四章系统的软件设计 (29)4.1 系统的总体设计思路 (29)4.2 系统的程序设计 (29)4.2.1 主程序 (29)4.2.2 读出温度子程序 (30)4.2.3 温度转化命令子程序 (30)4.2.4 计算温度子程序 (31)第五章PROTEUS软件仿真 (32)5.1 PROTEUS 仿真器与集成开发环境KEIL (32)5.1.1 PROTEUS 仿真器 (32)5.1.2 集成开发环境KEIL4 (32)5.2 绘制温度测量系统仿真电路图 (33)5.3 实现温度测量系统的仿真 (34)第六章结束语 (35)致谢 (36)参考文献 (37)附录1:程序清单 (38)附录2:设计图纸 (43)第一章概述1.1 课题研究的背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作,科研,生活,提供更好的更方便的设施就需要从多数单片机技术入手,一切向着数字化控制,智能化控制方向发展,温度传感器适用范围广,数量多,居各种传感器之首。
基于PROTEUS的温度控制电路设计与仿真
基于PROTEUS的温度控制电路设计与仿真学生姓名:赵殿锋指导教师:郭爱芳学号:联系方式:专业:机械电子工程基于PROTEUS 的温度控制电路设计与仿真关键词:AD590 运算放大器 电压跟随器 电压比较器 晶体管 0 引言温度控制在冶金、化工、建材、食品、机械、石油等工业中有举足轻重的作用。
对于不同场所、工艺、所需温度范围、精度等要求,则采用的测温元件、测温方法以及对温度的控制方法也将不同。
Proteus 是90年代英国Labcenter Electronics 公司开发的一款EDA 仿真工具软件,该软件可仿真数电、模电、单片机至ARM7等不同电路,仿真和调试时,能够很好地与Keil C51集成开发环境连接,仿真过程可从多个角度直接观察程序运行和电路工作的过程与结果,简化了理论上程序设计验证的过程。
由于Proteus 仿真过程中硬件投入少、设计方便且与工程实践最为接近等优点,本文采用Proteus 来设计与仿真以提高控制系统的开发效率。
1 控制系统基本原理系统中包含温度传感器,K —℃ 转换电路,控制温度设定装置、数字电压表、放大器、指示灯、继电器和电感(加热装置)等构成。
温度传感器的作用是将温度信号转换成电压或电流信号,K —℃ 转换电路将热力学温度转换成摄氏温度。
放大器起到信号放大的作用,因为传感器产生的信号很微弱。
系统中有运算放大器组成的比较器来使传感器产生的信号与设定的信号相比较,由比较器输出电平来控制执行机构工作,从而实现温度的自动控制。
2 AD590温度传感器AD590是美国ANALOG DEVICES 公司的单片集成两端感温电流源,其输出与绝对温度成比例。
在4V 至30V 电源电压范围内,该器件可充当一个高阻抗、恒流调节器,调节系数为1K A /μ.片内薄膜电阻经过激光调整,可用于校准器件,使该器件在(25℃)时输出A μ。
目前采用传统电气温度传感器的任何温度检测均可应用AD590,AD590无需支持电路,单芯片集成,无需线性化电路、精密电压放大器、电阻测量电路和冷结补偿。
基于PROTEUS的单片机测温系统仿真设计
效率,降低开发成本,这些因素对于产品设计是非常重。
2.P ROTEUS 特性简介
PROTEUS 软 件 是 英 国 Labcenter electronics 公 司 出 版 的 EDA 工
具 软 件 , 是 基 于 SPICE3F5 仿 真 引 擎 的 混 合 电 路 仿 真 软 件 , 它 不 仅 具
件电路设计、程序设计和系统调试 3 个过程。其中硬件电路测试和系 行 PCB 设计。
统调试要进行电路板制作完成、元器件焊接反复调试, 开发板成本高,
3.多路温度数据采集系统仿真设计
开发周期长。特别是对于大量的初学者而言, 还可能由于设计的经验
3.1 硬 件 设 计 系 统 以 AT89C52 单 片 机 为 核 心 组 成 多 点 温 度 测
有其它 EDA 工具软件的仿真功能, 还能仿真单片机及外围器件, 是目
前最好的仿真单片机及外围器件的工具。
2.1 软件功能模块 PROTEUS 软件功能模块由三部分组成:
( 1) 智 能 原 理 图 输 入 系 统 ISIS(Intelligent Schematic Input System)
和虚拟系统模型 VSM (Virtual Model System); ( 2) PROSPICE 混合模型
KeilC51 集成开发环境连接, 将用汇编和 C 语言编写的程序编译好之
软件编写可以在 Keil C51 环境下进行, 芯片的型号选择
后, 可以立即进行软、硬件结合的系统仿真, 像使用仿真器一样来调试 AT89C52,编写 C 文件,利用 Keil C51 进行编译, 编译成功后生成 HEX
程序。
于电路的测试。PROTEUS 提供了两种单片机硬件电路和软件的调试 转换启动码,就可以实现所有 DS18B20 的统一转换,然 后 , 发 DS18B20
基矛Proteus的温度测控系统仿真研究
用 , 系 统 实 现低 成 本 高可 靠 性 的 目标 带 来 了极 大 的 方便 。 为本 ቤተ መጻሕፍቲ ባይዱ
D 1 B 0工作 电压 为 3 V, 量温度 范 围为-5+15 c, S8 2 测 5 ̄ 2 c
id s il rc s o t 1T i p p  ̄b sn rte i lt npafr epan e eino a i tmp rtr o t l n u t a o e scnr . hs a e yu igpou ssmuai lt m, list d sg f e hmee eauec nr r p o o o x h r o
I d i o , h e in i cu e h l c ip a d l, i h i o v n e t o e man s se i tra e i c e sn h n a dt n t e d s n l d st e co k ds ly mo u e wh c s c n e i n rt i y tm n ef c , n r a i g t e i g f h
温 度 一 直 与 人 类 的 活动 息 息 相关 。 无 论 是 日常生 活 中 , 还 是 工 农 业 控 制过 程 中 ,温 度 都 是 重 要 的被 控 对 象 之 一 , 准 确 的 温 度 测 量 和 及 时 的 温 度 控 制 对 人 类 的 生 存 发 展 有 着 重
英 国 L be t Eet nc 公 司 ,基 于 S IE F5仿 真 引 擎 的 acne lc ois r r PC 3 混 合 电 路 仿 真 软 件 , 一 款 含 有 大 量 的 系 统 资 源 、 富 的硬 是 丰 件 接 口 电路 , 有 强 大 的调 试 功 能 和 软 硬 件 相 结 合 的 仿 真 系 具 统 。它 很 好 地 解 决 了 硬件 设 计 和 软 件 调 试 的 问 题 , 仅 能 够 不 仿 真 模 拟 、 字 电 路 以 及 模 数 混 合 电路 , 能 够 仿 真 基 于 单 数 还
单片机课程设计---温度检测报警系统的设计
《单片机原理及接口》课程设计报告题目:专业名称:班级:学号:姓名:2010年 12月课程论文首页温度检测报警系统的设计摘要: proteus具有强大的仿真功能,通过proteus仿真可以为更快的对一些系统进行设计和性能测试,直到仿真系统可以运行。
该温度报警系统是用温度传感器18B20对温度进行采集,通过单总线结构与单片机AT89C52进行通信。
在此基础上,添加一个时钟芯片DS1302用来时钟计时。
并用液晶显示器对温度和时间进行显示,同时可以用控制按键可以切换“时间”、“日期”和“温度报警上下限”的显示,而且可以对温度报警上下限进行按键动态调整。
关键词:proteus 温度报警 AT89C52 单片机1、引言Proteus ISIS 是英国 Labcenter 公司开发的电路分析与实物仿真软件。
它运行于 Windows 操作系统上,可以仿真、分析各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE 电路仿真相结合。
②支持主流单片机系统的仿真。
③提供软件调试功能。
④具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE 分析于一身的仿真软件,功能极其强大。
本文是基于 PROTEUS 的单片机温度采集系统的仿真设计,由单片机对温度进行采集,由温度传感提供温度,然后通过数码管显示温度值,并通过按键设置报警温度的上下限,当温度超出范围时报警。
同时具有时间计时的功能。
2、功能及操作说明2.1 功能说明:a.具有温度采集功能。
b.具有时间计时功能。
c.液晶分两行显示,上一行显示“温度”,下一行可以对“时间”、“日期”和“温度上下限”进行切换显示。
d.可以对温度上下限进行动态设置,在超过温度的上限或低于温度的下限时蜂鸣器会响,进行报警。
e.初始化(复位)功能。
2.2 操作说明:a.按下proteus中的运行按键。
b.按下“K1”键对“时间”、“日期”和“温度上下限”进行切换显示。
图2-1 切换显示c.在显示“温度”和“温度上下限”的时候,按下“K2”键,进入“温度上下限”调整状态,调整位闪烁显示,如(图2)所示。
基于单片机仿真功能的温度显示报警电路设计概要
2011年第8期仪表技术·47·基于单片机仿真功能的温度显示报警电路设计孟庆涛,白思春,张维彪,李向荣(中国北方发动机研究所,山西大同037036)摘要:介绍一种应用Proteus单片机仿真软件结合Kile代码编译软件实现的温度显示报警电路模型设计。
该设计以8051单片机为控制核心,通过铂电阻PT100温度传感器检测被测环境温度,输出电信号经过调理放大及AD转换,进入单片机,实现最终数码显示及指示灯超限报警。
关键词:温度显示报警电路;Proteus;PT100;A/D转换中图分类号:TP391文献标识码:A文章编号:1006-2394(2011)08-0047-03 SimulationDesignoftheTemperatureDisplayingandWarningCircuitBasedonSingleChip MENGQing-tao,BAISi-chun,ZHANGWei-biao,LIXiang-rong (ChinaNorthEngineResearchInstitute,Datong037036,China)Abstract:OnekindoftemperaturedisplayingandwarningcircuitmodelisintroducedusingProteuscomb inewithKileasdesignsoftware.The8051singlechipisusedasthecontrolcore,thePT100sensorisusedtodetectthetempera-tureoftheenvironment,theoutputelectricsignalismodifiedandamplified,thenA/Dconverted,intothemicroproces-soratlast,realizednumeraldisplayingandindicatorlightswhichwillalarmwhenthetemperatureisexcee dthelimit.Keywords:temperaturedisplayingandwarningcircuit;Proteus;PT100;A/Dconversion0引言调用查表子程序,确定一维数据表中转换数字量所后,对应的显示温度值,并判断是否超过设定报警限,实际结果显示在单片机输出端口的数码管和发光二极管。
基于PROTEUS的单片机温度采集系统设计与仿真
Ke y wo r ds : P r o t e u s:S i n g l e C h i p M i c r o c o m p u t e r ;T e m p e r a t u r e;S i m u l a t i o n
S h i J i a n p i n g
( S c h o o l o f E l e c t r o n i c &C o m m u n i c a t i o n E n g i n e e r i n g ,G u i y a n g U n i v e r s i t y , G u i y a n g 5 5 0 0 0 5 , C h i n a )
a n d e n h a n c e s t h e s t a bi l i t y o f t h e s y s t e m .S y s t e m i n t e r a c t i v e s i m u l a t i o n o f h a r d w a r e a n d s o f t w a r e h a s b e e n d o n e o n t h e a d v a n c e d p l a t f o r m o f P r o t e u s ,v e r i f y i n g a n d e v a l u a t i n g t h e d e s i g n’ S f e a s i b i l i t y a n d s t a bi l i t y . T h e S i m u l a t i o n r e s u l t S s h o w t h a t ,i n t h e f i e l d o f e m b e d d e d d e v e l o p m e n t ,P r o t e u s i S c o n v e ni e n t ,a n d c a n
基于单片机的温度报警系统proteus仿真
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit HI_LED=P2^3; //高温,低温白净闪烁LEDsbit LO_LED=P2^6;sbit DQ=P3^3; //DS18B20数据线sbit BEEP=P3^7; //报警sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit K1=P1^7; //正常显示温度,越界时报警sbit K2=P1^4; //显示报警温度sbit K3=P1^1; //查看ROM CODEuchar code RomCodeStr[]={"-- ROM CODE --"};uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //64位ROM CODE uchar code Temp_Disp_Title[] ={"Current Temp: "};uchar Current_Temp_Display_Buffer[]={"TEMPE: "};uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //温度示字符uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};uchar temp_data[2]={0x00,0x00};uchar temp_alarm[2]={0x00,0x00};uchar display[5]={0x00,0x00,0x00,0x00,0x00,}; //温度值uchar display1[3]={0x00,0x00,0x00}; //温度报警值uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //温度小数位对照表//.......................................................//报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125)//数组中前一位为高温值,后一位为低温值//此处类型注意设为char,否则不能进行有符号数的比较char Alarm_Temp_HL[2]={70,-20};//............................................................uchar CurrentT=0; //当前读取温度整数部分uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位bit HI_Alarm=0,LO_Alarm=0; //高低温报警标志bit DS18B20_IS_OK=1; //传感器正常标志uint Time0_Count=0; //定时器延时累加//...........................//延时//...........................void DelayXus(int x){uchar i;while(x--)for(i=0;i<200;i++);}//.......................................//忙检测bit LCD_Busy_Check(){bit LCD_Status;RS=0;//寄存器选择RW=1;//读状态寄存器EN=1;//开始读DelayXus(1);LCD_Status=(bit)(P0&0x80) ;EN=0;return LCD_Status;}//写LCD指令void Write_LCD_Command(uchar cmd){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=0; //写选择命令寄存器RW=0; //写EN=0;P0=cmd; EN=1; DelayXus(1); EN=0;}//向LCD写数据void Write_LCD_Data(uchar dat){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=1;RW=0;EN=0;P0=dat;EN=1; DelayXus(1); EN=0;}//设置液晶显示位置void Set_LCD_POS(uchar pos){Write_LCD_Command(pos |0x80);}//LCD初始化void LCD_Initialise(){Write_LCD_Command(0x38);DelayXus(1);Write_LCD_Command(0x01); //清屏DelayXus(1);Write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移DelayXus(1);Write_LCD_Command(0x0C); //显示开,关光标DelayXus(1);}//...............................................//..........................................//自定义字符写CGRAM//..................................void Write_NEW_LCD_Char(){uchar i;Write_LCD_Command(0x40); //写CGRAMfor(i=0;i<8;i++)Write_LCD_Data(Temperature_Char[i]); //写入温度符号}//............................................//延时//........................................................void Delay(uint num){while(--num);}//...............................................//初始化DS18B20//...............................................uchar Init_DS18B20(){uchar status;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;return status; //初始化成功时返回0 }//...............................................//读一节//...............................................uchar ReadOneByte(){uchar i,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_(); _nop_();if(DQ) dat |=0x80;Delay(30);DQ=1;}return dat;}//...............................................//写一字节//...............................................void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}//...............................................//读取温度值//...............................................void Read_Temperature(){if(Init_DS18B20()==1) //DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0xBE); //读取温度寄存器Temp_Value[0]=ReadOneByte(); //温度低8位Temp_Value[1]=ReadOneByte(); //温度高8位Alarm_Temp_HL[0]=ReadOneByte(); //报警温度THAlarm_Temp_HL[1]=ReadOneByte(); //报警温度TLDS18B20_IS_OK=1;}}//...............................................//设置DS18B20温度报警值//...............................................void Set_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x4E); //将设定的温度报警值写入DS18B20WriteOneByte(Alarm_Temp_HL[0]); //写THWriteOneByte(Alarm_Temp_HL[1]); //写TLWriteOneByte(0x7F); //12位精度Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x48); //温度报警值存入DS18B20 }//......................................................//在LCD上显示当前温度//.....................................................void Display_Temperature(){uchar i;uchar t=150; //延时值uchar ng=0; //负数标识char Signed_Current_Temp;//如果为负数则取反加1,并设置负数标识if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00) Temp_Value[1]++;ng=1; //设负数标识}//查表得到温度小数部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//获取温度整数部分(无符号)CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);//有符号的当前温度值,注意此处定义为char, 其值可为-128~+127Signed_Current_Temp=ng?-CurrentT:CurrentT;//高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区分正负比较)HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0;LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0;//将整数部分分解为三位待显示数字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;//刷新LCD显示缓冲Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';Current_Temp_Display_Buffer[10]='.';Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';//高位为0时不显示if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';//高位为0且次高位为0时,次高位不显示if(Display_Digit[2]==0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8]=' ';//负数符号显示恰当位置if (ng){if(Current_Temp_Display_Buffer[8]==' ')Current_Temp_Display_Buffer[8]='_';elseif(Current_Temp_Display_Buffer[7]==' ')Current_Temp_Display_Buffer[7]='_';elseCurrent_Temp_Display_Buffer[6]='_';}//在第一行显示标题Set_LCD_POS(0X00);for(i=0;i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]);//在第二行显示当前温度Set_LCD_POS(0X40);for(i=0;i<16;i++) Write_LCD_Data(Current_Temp_Display_Buffer[i]); //显示温度符号Set_LCD_POS(0X4D);Write_LCD_Data(0x00);Set_LCD_POS(0X4E);Write_LCD_Data('C');}//.....................................//定时器中断,控制报警声音//.................................void T0_INT() interrupt 1{TH0=-1000/256;TL0=-1000%256;BEEP=!BEEP;if(++Time0_Count==400){Time0_Count=0;if(HI_Alarm) HI_LED=~HI_LED; else HI_LED=0;if(LO_Alarm) LO_LED=~LO_LED; else LO_LED=0;TR0=0;}}//...............................................//ROM CODE转换与显示//.....................................................void Display_Rom_Code(){uchar i,t;Set_LCD_POS(0x40);for(i=0;i<8;i++){t=((RomCode[i]&0xF0)>>4);if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //高位数显示t=RomCode[i]&0x0F;if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //低位数显示}}//..................................//读64位序列码//...............................void Read_Rom_Code(){uchar i;Init_DS18B20();WriteOneByte(0x33); //读序列码for (i=0;i<8;i++) RomCode[i]=ReadOneByte();}//.........................................//显示ROM CODE//...............................void Display_RomCode(){uchar i;Set_LCD_POS(0x00);for(i=0;i<16;i++) //显示标题Write_LCD_Data(RomCodeStr[i]);Read_Rom_Code(); //读64位序列码Display_Rom_Code(); //显示64位ROM CODE }//.......................................//显示报警温度//...............................................void Disp_Alarm_Temperature(){uchar i,ng;//显示Alarm_Temp_HL数组中的报警温度值//由于Alarm_Temp_HL类型为char,故可以直接进行正负比较//高温报警值.........................ng=0;if(Alarm_Temp_HL[0]<0) //如果为负数则取反加1{Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;ng=1;}//分解高温各数位到待显示串中Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4]=' ';if(Alarm_HI_LO_STR[4]==' '&& Alarm_HI_LO_STR[5]=='0') Alarm_HI_LO_STR[5]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[5]==' ') Alarm_HI_LO_STR[5]='-';elseif(Alarm_HI_LO_STR[4]==' ') Alarm_HI_LO_STR[4]='-';elseAlarm_HI_LO_STR[3]='-';}//低温报警值ng=0;if(Alarm_Temp_HL[1]<0) //如果为负数则取反加1 {Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;ng=1;}//分解低温各数位到待显示串中Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';Alarm_HI_LO_STR[13]=Alarm_Temp_HL[0]/10%10+'0'; Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12]=' ';if(Alarm_HI_LO_STR[12]==' '&& Alarm_HI_LO_STR[13]=='0') Alarm_HI_LO_STR[13]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[13]==' ') Alarm_HI_LO_STR[13]='-';elseif(Alarm_HI_LO_STR[12]==' ') Alarm_HI_LO_STR[12]='-';elseAlarm_HI_LO_STR[11]='-';}//显示高低温报警温度值Set_LCD_POS(0x00); //显示标题for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);Set_LCD_POS(0x40); //显示高低温for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]);}//................................//主函数//..................................void main(){uchar Current_Operation=1; //默认当前操作为显示温度LCD_Initialise();IE=0x82;TMOD=0x01;TH0=-1000/256;TL0=-1000%256;TR0=0;HI_LED=0;LO_LED=0;Set_Alarm_Temp_Value();Read_Temperature();Delay(50000);Delay(50000);while(1){if (K1==0) Current_Operation=1;if (K2==0) Current_Operation=2;if (K3==0) Current_Operation=3;switch (Current_Operation){case 1://正常显示当前温度,越界时报警Read_Temperature();if( DS18B20_IS_OK){if (HI_Alarm==1 || LO_Alarm==1) TR0=1;else TR0=0;Display_Temperature();}DelayXus(100);break;case 2: //显示报警温度上下限Read_Temperature();Disp_Alarm_Temperature();DelayXus(100);break;case 3: //显示DS18B20 ROM CODEDisplay_RomCode();DelayXus(50);break;}} }。
以51单片机为核心的DS18B20的数码管显示温度程序+Proteus仿真
//DS18B20的读写程序,数据脚P3.3 ////温度传感器18B20汇编程序,采用器件默认的12位转化////最大转化时间750微秒,显示温度-55到+125度,显示精度////为0.1度,显示采用4位LED共阳显示测温值////P0口为段码输入,P24~P27为位选///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P0 //段码输出口#define discan P2 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^3; //温度输入口sbit DIN=P0^7; //LED小数点控制uint h;uchar flag;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef}; //列扫描控制字uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){char k;for(k=0;k<4;k++) //四位LED扫描控制{Disdata=0xff;Disdata=dis_7[display[k]];if(k==1){DIN=0;}discan=scan_con[k];delay(90);discan=0xff;}}/////***********18B20复位函数**********/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay(50); // 550usDQ=1; //delay(6); // 66uspresence=DQ; // presence=0继续下一步}delay(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********///向1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //{DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay(6); //66usval=val/2; //右移一位}DQ = 1;delay(1);}///*********18B20读1个字节函数********///从总线上读取一个字节uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ = 0; //_nop_();_nop_();_nop_();_nop_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us if(DQ)value|=0x80;delay(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}///***********温度数据处理函数**********/ void work_temp(){uchar n=0;uchar doth,dotl;uchar flag3=1,flag2=1; //数字显示修正标记if((temp_data[1]&0xf8)!=0x00){temp_data[1]=~(temp_data[1]);temp_data[0]=~(temp_data[0])+1;n=1;flag=1;}//负温度求补码if(temp_data[0]>255){temp_data[1]++;}display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];doth=display[0]/10;dotl=display[0]%10;display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[3]=display[4]/100;display[2]=display[4]/10%10;display[1]=display[4]%10;if(!display[3]){display[3]=0x0a;flag3=0;if(!display[2]){display[2]=0x0a;flag2=0;}}//最高位为0时都不显示if(n){display[3]=0x0b;//负温度时最高位显示"-"flag3=0;}}/////**************主函数****************/main(){Disdata=0xff; //初始化端口discan=0xff;for(h=0;h<4;h++){display[h]=8;}//开机显示8888ow_reset(); // 开机先转换一次write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令for(h=0;h<500;h++){scan();} //开机显示"8888"2秒while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}////*********************结束**************************//。
基于proteus的温度检测与报警的仿真研究
苏州信息职业技术学院毕业设计报告(论文)系别:班级:学生姓名:学生学号:设计(论文)题目:基于Proteus的温度检测与报警的仿真设计指导教师:起讫日期: 2012.9.3~2012.11.16苏州信息职业技术学院/ 42毕业设计(论文)成绩评定表苏州信息职业技术学院毕业设计(论文)任务书学生(签名) 2012年9月 10日指导教师(签名) 2012年9月 10日教研室主任(签名) 2012年9月 10日系主任(签名) 2012年9月 10日苏州信息职业技术学院毕业设计(论文)开题报告苏州信息职业技术学院毕业设计(论文)中期检查表基于Proteus的温度检测与报警的仿真设计摘要:温度是与人们生活息息相关的环境参数,许多情况下都学要进行温度测量及报警,温度测量报警系统在现代日常生活.科研.工农生产中已经得到了越来越广泛的应用。
所以对温度的测量报警方法及设备的研究也变得极其重要。
随着人们生活的不断提高以及应对各种复杂测量环境的需要,我们对温度测量报警的要求也越来越高,利用单片机来实现这些控制无疑使人们追求的目标之一,它带给我们的方便时不可否定的,其中温度检测报警器就是一个典型的例子。
要为现代人工作,科研,生活,提供更好的设施,就需要从单片机技术入手,向数字化,智能化控制方向发展。
本设计所介绍的温度报警器,可以设置上下限报警温度,当温度不在设置范围内时,可以报警。
与传统温度测量系统相比,本设计中的数字温度测量报警系统具有很多前者没有的优点,如测温范围广而且准确,采用LED数字显示,读数方便等。
关键词:单片机,温度检测,AT89C51,DS18B20目录1 绪论 (1)1.1课题背景 (1)2 系统的具体设计 (2)3 硬件电路设计 (3)3.1单片机主控设计 (3)3.1.1主要特性 (4)3.1.2系统时钟电路 (5)3.1.3 复位电路 (5)3.2温度信号采集设计 (6)3.2.1 DS18B20的特性 (7)3.2.2 DS18B20的测温原理 (8)3.2.3 DS18B20与单片机接口电路 (9)3.4按键电路设计 (11)3.5报警电路设计 (12)4 温度控制系统的软件设计 (12)4.1主程序设计 (13)4.3温度采集设计 (14)4.4温度显示设计 (16)4.5按键开关设计 (17)4.6温度处理及蜂鸣器报警设计 (19)5 温度检测系统调试仿真 (19)致谢 (23)附录 (25)。
基于proteus的温度测控系统仿真设计
基于proteus的温度测控系统仿真设计摘要:如今在工业和农业生产以及日常生活中,温度的实时监测占据着非常重要的地位。
例如在消防场合的温度检测,我们家用中的电器设备热故障监测,各类运输工具的某些设备的温度检测,医院医疗设备的温度测试,化工车间和机械车间等设备温度过热检测,温度检测与其息息相关。
本次论文设计的温度检测系统是利用单片机AT89C51单片机作控制器,用C 语言来进行软件设计,而且能达到指令的执行速度快,节省存储空间。
它采用温度传感器传感器DS18B20进行温度测量,实现各个环境以及场合下的温度实时检测并通过LED显示器件显示温度的功能,能方便地应用于各种温度检测场合。
本论文设计的温度测控系统功能是能够实时的检测某一环境下的温度,测量的温度范围是-20℃到70℃,一旦超过最高或者是最低的温度都会通过蜂鸣器来达到报警效果。
另外我给该系统加了个复位开关,一旦出现乱码或者一般的故障可以通过该复位开关来进行复位。
本论文采用软、硬件相结合的方式,来进行各功能的编写。
本设计采用的是DS18B20和AT89C51单片机的一种温度检测系统。
论文中对用单片机温度控制原理的设计思想和软、硬件调试作了详细的论述。
关键词:89C51单片机; DS18B20;温度Temperature Monitoring System Based proteus simulation designAbstract:Today in the industrial agricultural production and our daily lifes, Real-time measurement of temperature play a very important position.For example, temperature detection in fire situations, electrical equipmentthermal fault monitoring in our household, temperature detecting some equipment of all kinds of transportion, the temperature test in hospital medical equipment, chemical plant and machinery plant... Equipment temperature detection,So temperature detection with the closely related to.This temperature monitoring system is designed using single chip machine AT89C51 as controller,it’s using C programming language to fulfill fast executing commands and saving storage.we used DS18B20 temperature sensor to monitor,it allowed us to monitor temperature in different conditions and then display digits on LED screen,this technology can be applied in many occations.this temperature monitoring system can measurereal-time temperaturein certain environment,temperature ranges from -20℃to 70℃,once reaching its limit,there will be a buzzer warning.I also added a reset button to the system in case of any glich or malfunctioning.This thesis is based on hardwares,using single chips DS18B20 and AT89C51 as temperature monitoring system.there’s more detailed information about the single chip temperature control principle and design idea,debugging in software and hardwares.Key words: display 89C51;DS18B20;Temperature目录前言 (1)1 设计要求及方案 (2)1.1温度自动检测系统技术指标 (2)1.2 温度检测系统的原理功能 (2)1.3 温度检测方案 (2)2 单片机以及所用的元器件介绍 (4)2.1 单片机 (4)2.2 AT89C51单片机单片机基本结构 (4)2.3单片机外部引脚功能 (6)2.4温度传感器(DS18B20)封装及功能介绍 (8)2.5 LED显示器 (9)2.5.1LED 的优点 (9)2.5.2 LED工作方式 (10)3硬件设计 (13)3.1 系统电路结构 (13)3.2 单片机最小系统 (13)3.3 温度采集传感电路 (15)3.4 温度显示电路 (16)4 系统软件设计 (18)4.1 系统程序总设计 (18)4.2 温度检测子程序设计 (18)4.3温度监测系统的温度程序设计 (19)5 系统仿真及结果 (20)5.1 仿真Proteus软件简介 (20)5.2软件介绍与组成 (20)5.3Proteus原理图设计 (21)5.4 Keil与Proteus联机仿真 (22)总结 (23)致谢 (24)参考文献 (25)附录 (27)前言如今在工业和农业生产的车间和设备以及我们的日常生活中的某些场合对温度的测量以及对它控制有着重要的作用。
基于Proteus的温控报警器设计
基于Proteus 的温控报警器设计宋东亚,黄家福(郑州华信学院河南郑州451150)摘要:利用仿Proteus 真软件实现了基于AT89C51单片机的温控报警器仿真设计。
详细分析温控报警器的硬件设计原理,并在Keil 开发环境下设计了对应的驱动程序,在Proteus 中完成了软、硬件的联合仿真调试,最后给出了仿真运行结果。
通过Proteus 软件和Keil 软件的联合调试,大大缩短了开发周期,降低开发成本。
该设计的电路及驱动程序对相应的实际应用系统具有一定的借鉴作用。
关键词:Proteus ;Keil ;温控报警器;仿真;程序中图分类号:TN02文献标识码:A文章编号:1674-6236(2012)23-0093-03Design of temperature control alarm system based on ProteusSONG Dong -ya ,HUANG Jia -fu(Zhengzhou Huaxin College ,Zhengzhou 451150,China )Abstract:The design of temperature control alarm system based on AT89C51microcontroller was realized with an embedded system simulation software Proteus.A detailed analysis of temperature control alarm hardware design principle ,and in the Keil development environment to design the corresponding driver ,in the Proteus completed the soft ,hardware co simulation debugging ,finally gives the simulation results of operation.By using Proteus software and Keil software joint debugging ,greatly reducing the development cycle ,reduce development cost.The design of the circuit and the driver of the corresponding practical application system has a certain referenceKey words:Proteus ;Keil ;temperature control alarm system ;simulation ;program收稿日期:2012-08-13稿件编号:201208051作者简介:宋东亚(1985—),女,河南漯河人,助教。
利用单片机控制18B20温度控制Proteus仿真
仿真图:程序:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;sbit DQ=P3^3;uchar code table[]={"Temperature:"}; //LCD第一行显示uchar temp_dis[]={" C"}; //LCD第二行//-----温度字符-----uchar code Temperature[]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};/* ************* 温度小数部分表********** */uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};uchar Temp_value[]={0x00,0x00}; //从DS18B20读取的温度值uchar digital[]={0,0,0,0}; //各温度数位uchar Current_T=0; //当前温度的整数部分//--------延时-------void delay(uint ms){uint t;while(ms--)for(t=0;t<120;t++);}void Delayus(uint m){while(m--);}//-------读LCD状态-------uchar read_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------void lcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------void lcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------void lcd_write_data(uchar dat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP(); //如果用delay()延时函数时,延时时间较长,导致LCD显示与电压表示数不同步LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------void lcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------void set_lcd_pos(uchar p){lcd_write_com(p | 0x80);}//---------液晶显示程序----------void lcd_print(uchar p,uchar *s,uint low){uint num;set_lcd_pos(p);for(num=0;num<low;num++){lcd_write_data(s[num]);delay(1);}}/* ******初始化DS18B20********/void Init_DS18B20(){uchar status=0;DQ=1; //DQ复位Delayus(8); //稍作延时DQ=0; //单片机将DQ拉低Delayus(80); //精确延时大于480usDQ=1; //拉高总线Delayus(8);status=DQ;Delayus(20);}/* ******* 从DS18B20读入数据******* */uchar ReadOneChar(){uchar i,dat = 0;for(i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;Delayus(4);}return(dat);}/* ******** 向DS18B20写命令******** */void WriteOneChar(uchar dat){uchar i=0;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;Delayus(5);DQ = 1;dat>>=1;}}/* ******DS18B20程序读取温度********* */ void ReadTemperature(){Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等,前两个就是温度Temp_value[0]=ReadOneChar(); //低八位Temp_value[1]=ReadOneChar(); //高八位}//--------显示当前温度值-------void display_temp(){uchar ng=0; //负数标志// 高5位全为1则为负数,为负数时取反加1,并设置负数标志if((Temp_value[1] & 0xf8)==0xf8){Temp_value[1]=~Temp_value[1];Temp_value[0]=~Temp_value[0]+1;if(Temp_value[0]==0x00)Temp_value[1]++;ng=1;}digital[0]=ditab[Temp_value[0] & 0x0f]; //温度小数部分// 获取温度整数部分(高字节中的低3位和低字节中的高4位)Current_T=((Temp_value[0] & 0xf0)>>4)|((Temp_value[1] & 0x07)<<4);digital[3]=Current_T/100; //分解digital[2]=Current_T%100/10;digital[1]=Current_T%10;// LCD显示temp_dis[7]=digital[0]+'0';temp_dis[6]='.';temp_dis[5]=digital[1]+'0';temp_dis[4]=digital[2]+'0';temp_dis[3]=digital[3]+'0';if(digital[3]==0) //高位为0时不显示temp_dis[3]=' ';if(digital[2]==0&&digital[3]==0)temp_dis[4]=' ';if(ng){if(temp_dis[4]==' ')temp_dis[4]='-';else if(temp_dis[3]==' ')temp_dis[3]='-';elsetemp_dis[2]='-';}lcd_print(0x02,table,12);lcd_print(0x41,temp_dis,16); }//------------主程序----------- void main(){lcd_init();ReadTemperature();delay(20);while(1){ReadTemperature();display_temp();delay(20);}}。
基于单片机的温度报警系统+proteus仿真
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit HI_LED=P2^3; //高温,低温白净闪烁 LEDsbit LO_LED=P2^6;sbit DQ=P3^3; //DS18B20数据线sbit BEEP=P3^7; //报警sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit K1=P1^7; //正常显示温度,越界时报警sbit K2=P1^4; //显示报警温度sbit K3=P1^1; //查看 ROM CODEuchar code RomCodeStr[]={"-- ROM CODE --"};uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //64位ROM CODE uchar code Temp_Disp_Title[] ={"Current Temp: "};uchar Current_Temp_Display_Buffer[]={"TEMPE: "};uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //温度示字符uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};uchar temp_data[2]={0x00,0x00};uchar temp_alarm[2]={0x00,0x00};uchar display[5]={0x00,0x00,0x00,0x00,0x00,}; //温度值uchar display1[3]={0x00,0x00,0x00}; //温度报警值uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //温度小数位对照表//.......................................................//报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125)//数组中前一位为高温值,后一位为低温值//此处类型注意设为char,否则不能进行有符号数的比较char Alarm_Temp_HL[2]={70,-20};//............................................................uchar CurrentT=0; //当前读取温度整数部分uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位bit HI_Alarm=0,LO_Alarm=0; //高低温报警标志bit DS18B20_IS_OK=1; //传感器正常标志uint Time0_Count=0; //定时器延时累加//...........................//延时//...........................void DelayXus(int x){uchar i;while(x--)for(i=0;i<200;i++);}//.......................................//忙检测bit LCD_Busy_Check(){bit LCD_Status;RS=0;//寄存器选择RW=1;//读状态寄存器EN=1;//开始读DelayXus(1);LCD_Status=(bit)(P0&0x80) ;EN=0;return LCD_Status;}//写LCD指令void Write_LCD_Command(uchar cmd){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=0; //写选择命令寄存器RW=0; //写EN=0;P0=cmd; EN=1; DelayXus(1); EN=0;}//向LCD写数据void Write_LCD_Data(uchar dat){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=1;RW=0;EN=0;P0=dat;EN=1; DelayXus(1); EN=0;}//设置液晶显示位置void Set_LCD_POS(uchar pos){Write_LCD_Command(pos |0x80);}//LCD初始化void LCD_Initialise(){Write_LCD_Command(0x38);DelayXus(1);Write_LCD_Command(0x01); //清屏DelayXus(1);Write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移DelayXus(1);Write_LCD_Command(0x0C); //显示开,关光标DelayXus(1);}//...............................................//..........................................//自定义字符写CGRAM//..................................void Write_NEW_LCD_Char(){uchar i;Write_LCD_Command(0x40); //写CGRAMfor(i=0;i<8;i++)Write_LCD_Data(Temperature_Char[i]); //写入温度符号}//............................................//延时//........................................................void Delay(uint num){while(--num);}//...............................................//初始化DS18B20//...............................................uchar Init_DS18B20(){uchar status;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;return status; //初始化成功时返回0}//...............................................//读一节//...............................................uchar ReadOneByte(){uchar i,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_(); _nop_();if(DQ) dat |=0x80;Delay(30);DQ=1;}return dat;}//...............................................//写一字节//...............................................void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}//...............................................//读取温度值//...............................................void Read_Temperature(){if(Init_DS18B20()==1) //DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0xBE); //读取温度寄存器Temp_Value[0]=ReadOneByte(); //温度低8位Temp_Value[1]=ReadOneByte(); //温度高8位Alarm_Temp_HL[0]=ReadOneByte(); //报警温度THAlarm_Temp_HL[1]=ReadOneByte(); //报警温度TLDS18B20_IS_OK=1;}}//...............................................//设置DS18B20温度报警值//...............................................void Set_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x4E); //将设定的温度报警值写入DS18B20WriteOneByte(Alarm_Temp_HL[0]); //写THWriteOneByte(Alarm_Temp_HL[1]); //写TLWriteOneByte(0x7F); //12位精度Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x48); //温度报警值存入DS18B20}//......................................................//在LCD上显示当前温度//.....................................................void Display_Temperature(){uchar i;uchar t=150; //延时值uchar ng=0; //负数标识char Signed_Current_Temp;//如果为负数则取反加1,并设置负数标识if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00) Temp_Value[1]++;ng=1; //设负数标识}//查表得到温度小数部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//获取温度整数部分(无符号)CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);//有符号的当前温度值,注意此处定义为char, 其值可为-128~+127Signed_Current_Temp=ng?-CurrentT:CurrentT;//高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区分正负比较)HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0;LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0;//将整数部分分解为三位待显示数字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;//刷新LCD显示缓冲Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';Current_Temp_Display_Buffer[10]='.';Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';//高位为0时不显示if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';//高位为0且次高位为0时,次高位不显示if(Display_Digit[2]==0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8]=' ';//负数符号显示恰当位置if (ng){if(Current_Temp_Display_Buffer[8]==' ')Current_Temp_Display_Buffer[8]='_';elseif(Current_Temp_Display_Buffer[7]==' ')Current_Temp_Display_Buffer[7]='_';elseCurrent_Temp_Display_Buffer[6]='_';}//在第一行显示标题Set_LCD_POS(0X00);for(i=0;i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]);//在第二行显示当前温度Set_LCD_POS(0X40);for(i=0;i<16;i++) Write_LCD_Data(Current_Temp_Display_Buffer[i]); //显示温度符号Set_LCD_POS(0X4D);Write_LCD_Data(0x00);Set_LCD_POS(0X4E);Write_LCD_Data('C');}//.....................................//定时器中断,控制报警声音//.................................void T0_INT() interrupt 1{TH0=-1000/256;TL0=-1000%256;BEEP=!BEEP;if(++Time0_Count==400){Time0_Count=0;if(HI_Alarm) HI_LED=~HI_LED; else HI_LED=0;if(LO_Alarm) LO_LED=~LO_LED; else LO_LED=0;TR0=0;}}//...............................................//ROM CODE转换与显示//.....................................................void Display_Rom_Code(){uchar i,t;Set_LCD_POS(0x40);for(i=0;i<8;i++){t=((RomCode[i]&0xF0)>>4);if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //高位数显示t=RomCode[i]&0x0F;if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //低位数显示}}//..................................//读64位序列码//...............................void Read_Rom_Code(){uchar i;Init_DS18B20();WriteOneByte(0x33); //读序列码for (i=0;i<8;i++) RomCode[i]=ReadOneByte();}//.........................................//显示ROM CODE//...............................void Display_RomCode(){uchar i;Set_LCD_POS(0x00);for(i=0;i<16;i++) //显示标题Write_LCD_Data(RomCodeStr[i]);Read_Rom_Code(); //读64位序列码Display_Rom_Code(); //显示64位ROM CODE }//.......................................//显示报警温度//...............................................void Disp_Alarm_Temperature(){uchar i,ng;//显示Alarm_Temp_HL数组中的报警温度值//由于Alarm_Temp_HL类型为char,故可以直接进行正负比较//高温报警值.........................ng=0;if(Alarm_Temp_HL[0]<0) //如果为负数则取反加1{Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;ng=1;}//分解高温各数位到待显示串中Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4]=' ';if(Alarm_HI_LO_STR[4]==' '&& Alarm_HI_LO_STR[5]=='0') Alarm_HI_LO_STR[5]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[5]==' ') Alarm_HI_LO_STR[5]='-'; elseif(Alarm_HI_LO_STR[4]==' ') Alarm_HI_LO_STR[4]='-';elseAlarm_HI_LO_STR[3]='-';}//低温报警值ng=0;if(Alarm_Temp_HL[1]<0) //如果为负数则取反加1{Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;ng=1;}//分解低温各数位到待显示串中Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';Alarm_HI_LO_STR[13]=Alarm_Temp_HL[0]/10%10+'0';Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12]=' ';if(Alarm_HI_LO_STR[12]==' '&& Alarm_HI_LO_STR[13]=='0') Alarm_HI_LO_STR[13]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[13]==' ') Alarm_HI_LO_STR[13]='-'; elseif(Alarm_HI_LO_STR[12]==' ') Alarm_HI_LO_STR[12]='-'; elseAlarm_HI_LO_STR[11]='-';}//显示高低温报警温度值Set_LCD_POS(0x00); //显示标题for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);Set_LCD_POS(0x40); //显示高低温for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]);}//................................//主函数//..................................void main(){uchar Current_Operation=1; //默认当前操作为显示温度 LCD_Initialise();IE=0x82;TMOD=0x01;TH0=-1000/256;TL0=-1000%256;TR0=0;HI_LED=0;LO_LED=0;Set_Alarm_Temp_Value();Read_Temperature();Delay(50000);Delay(50000);while(1){if (K1==0) Current_Operation=1;if (K2==0) Current_Operation=2;if (K3==0) Current_Operation=3;switch (Current_Operation){case 1://正常显示当前温度,越界时报警Read_Temperature();if( DS18B20_IS_OK){if (HI_Alarm==1 || LO_Alarm==1) TR0=1; else TR0=0;Display_Temperature();}DelayXus(100);break;case 2: //显示报警温度上下限Read_Temperature();Disp_Alarm_Temperature();DelayXus(100);break;case 3: //显示DS18B20 ROM CODEDisplay_RomCode();DelayXus(50);break;}}}(资料素材和资料部分来自网络,供参考。
基于单片机仿真功能的温度显示报警电路设计概要
2011年第8期仪表技术·47·基于单片机仿真功能的温度显示报警电路设计孟庆涛,白思春,张维彪,李向荣(中国北方发动机研究所,山西大同037036)摘要:介绍一种应用Proteus单片机仿真软件结合Kile代码编译软件实现的温度显示报警电路模型设计。
该设计以8051单片机为控制核心,通过铂电阻PT100温度传感器检测被测环境温度,输出电信号经过调理放大及AD转换,进入单片机,实现最终数码显示及指示灯超限报警。
关键词:温度显示报警电路;Proteus;PT100;A/D转换中图分类号:TP391文献标识码:A文章编号:1006-2394(2011)08-0047-03 SimulationDesignoftheTemperatureDisplayingandWarningCircuitBasedonSingleChip MENGQing-tao,BAISi-chun,ZHANGWei-biao,LIXiang-rong (ChinaNorthEngineResearchInstitute,Datong037036,China)Abstract:OnekindoftemperaturedisplayingandwarningcircuitmodelisintroducedusingProteuscomb inewithKileasdesignsoftware.The8051singlechipisusedasthecontrolcore,thePT100sensorisusedtodetectthetempera-tureoftheenvironment,theoutputelectricsignalismodifiedandamplified,thenA/Dconverted,intothemicroproces-soratlast,realizednumeraldisplayingandindicatorlightswhichwillalarmwhenthetemperatureisexcee dthelimit.Keywords:temperaturedisplayingandwarningcircuit;Proteus;PT100;A/Dconversion0引言调用查表子程序,确定一维数据表中转换数字量所后,对应的显示温度值,并判断是否超过设定报警限,实际结果显示在单片机输出端口的数码管和发光二极管。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit HI_LED=P2^3; //高温,低温白净闪烁LEDsbit LO_LED=P2^6;sbit DQ=P3^3; //DS18B20数据线sbit BEEP=P3^7; //报警sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit K1=P1^7; //正常显示温度,越界时报警sbit K2=P1^4; //显示报警温度sbit K3=P1^1; //查看ROM CODEuchar code RomCodeStr[]={"-- ROM CODE --"};uchar RomCode[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //64位ROM CODE uchar code Temp_Disp_Title[] ={"Current Temp: "};uchar Current_Temp_Display_Buffer[]={"TEMPE: "};uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //温度示字符uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};uchar temp_data[2]={0x00,0x00};uchar temp_alarm[2]={0x00,0x00};uchar display[5]={0x00,0x00,0x00,0x00,0x00,}; //温度值uchar display1[3]={0x00,0x00,0x00}; //温度报警值uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //温度小数位对照表//.......................................................//报警温度上下限(取值范围:-128~+127)(DS18B20温度范围为:-55~+125)//数组中前一位为高温值,后一位为低温值//此处类型注意设为char,否则不能进行有符号数的比较char Alarm_Temp_HL[2]={70,-20};//............................................................uchar CurrentT=0; //当前读取温度整数部分uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位bit HI_Alarm=0,LO_Alarm=0; //高低温报警标志bit DS18B20_IS_OK=1; //传感器正常标志uint Time0_Count=0; //定时器延时累加//...........................//延时//...........................void DelayXus(int x){uchar i;while(x--)for(i=0;i<200;i++);}//.......................................//忙检测bit LCD_Busy_Check(){bit LCD_Status;RS=0;//寄存器选择RW=1;//读状态寄存器EN=1;//开始读DelayXus(1);LCD_Status=(bit)(P0&0x80) ;EN=0;return LCD_Status;}//写LCD指令void Write_LCD_Command(uchar cmd){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=0; //写选择命令寄存器RW=0; //写EN=0;P0=cmd; EN=1; DelayXus(1); EN=0;}//向LCD写数据void Write_LCD_Data(uchar dat){while((LCD_Busy_Check()&0x80)==0x80); //忙等待RS=1;RW=0;EN=0;P0=dat;EN=1; DelayXus(1); EN=0;}//设置液晶显示位置void Set_LCD_POS(uchar pos){Write_LCD_Command(pos |0x80);}//LCD初始化void LCD_Initialise(){Write_LCD_Command(0x38);DelayXus(1);Write_LCD_Command(0x01); //清屏DelayXus(1);Write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移DelayXus(1);Write_LCD_Command(0x0C); //显示开,关光标DelayXus(1);}//...............................................//..........................................//自定义字符写CGRAM//..................................void Write_NEW_LCD_Char(){uchar i;Write_LCD_Command(0x40); //写CGRAMfor(i=0;i<8;i++)Write_LCD_Data(Temperature_Char[i]); //写入温度符号}//............................................//延时//........................................................void Delay(uint num){while(--num);}//...............................................//初始化DS18B20//...............................................uchar Init_DS18B20(){uchar status;DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);status=DQ;Delay(100);DQ=1;return status; //初始化成功时返回0 }//...............................................//读一节//...............................................uchar ReadOneByte(){uchar i,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_(); _nop_();if(DQ) dat |=0x80;Delay(30);DQ=1;}return dat;}//...............................................//写一字节//...............................................void WriteOneByte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}//...............................................//读取温度值//...............................................void Read_Temperature(){if(Init_DS18B20()==1) //DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0xBE); //读取温度寄存器Temp_Value[0]=ReadOneByte(); //温度低8位Temp_Value[1]=ReadOneByte(); //温度高8位Alarm_Temp_HL[0]=ReadOneByte(); //报警温度THAlarm_Temp_HL[1]=ReadOneByte(); //报警温度TLDS18B20_IS_OK=1;}}//...............................................//设置DS18B20温度报警值//...............................................void Set_Alarm_Temp_Value(){Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x4E); //将设定的温度报警值写入DS18B20WriteOneByte(Alarm_Temp_HL[0]); //写THWriteOneByte(Alarm_Temp_HL[1]); //写TLWriteOneByte(0x7F); //12位精度Init_DS18B20();WriteOneByte(0xCC); //跳过序列号WriteOneByte(0x48); //温度报警值存入DS18B20 }//......................................................//在LCD上显示当前温度//.....................................................void Display_Temperature(){uchar i;uchar t=150; //延时值uchar ng=0; //负数标识char Signed_Current_Temp;//如果为负数则取反加1,并设置负数标识if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00) Temp_Value[1]++;ng=1; //设负数标识}//查表得到温度小数部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//获取温度整数部分(无符号)CurrentT=((Temp_V alue[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);//有符号的当前温度值,注意此处定义为char, 其值可为-128~+127Signed_Current_Temp=ng?-CurrentT:CurrentT;//高低温报警标志设置(与定义为char类型的Alarm_Temp_HL比较,这样可区分正负比较)HI_Alarm=Signed_Current_Temp>=Alarm_Temp_HL[0]?1:0;LO_Alarm=Signed_Current_Temp<=Alarm_Temp_HL[1]?1:0;//将整数部分分解为三位待显示数字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;//刷新LCD显示缓冲Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';Current_Temp_Display_Buffer[10]='.';Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';//高位为0时不显示if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';//高位为0且次高位为0时,次高位不显示if(Display_Digit[2]==0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8]=' ';//负数符号显示恰当位置if (ng){if(Current_Temp_Display_Buffer[8]==' ')Current_Temp_Display_Buffer[8]='_';elseif(Current_Temp_Display_Buffer[7]==' ')Current_Temp_Display_Buffer[7]='_';elseCurrent_Temp_Display_Buffer[6]='_';}//在第一行显示标题Set_LCD_POS(0X00);for(i=0;i<16;i++) Write_LCD_Data( Temp_Disp_Title[i]);//在第二行显示当前温度Set_LCD_POS(0X40);for(i=0;i<16;i++) Write_LCD_Data(Current_Temp_Display_Buffer[i]); //显示温度符号Set_LCD_POS(0X4D);Write_LCD_Data(0x00);Set_LCD_POS(0X4E);Write_LCD_Data('C');}//.....................................//定时器中断,控制报警声音//.................................void T0_INT() interrupt 1{TH0=-1000/256;TL0=-1000%256;BEEP=!BEEP;if(++Time0_Count==400){Time0_Count=0;if(HI_Alarm) HI_LED=~HI_LED; else HI_LED=0;if(LO_Alarm) LO_LED=~LO_LED; else LO_LED=0;TR0=0;}}//...............................................//ROM CODE转换与显示//.....................................................void Display_Rom_Code(){uchar i,t;Set_LCD_POS(0x40);for(i=0;i<8;i++){t=((RomCode[i]&0xF0)>>4);if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //高位数显示t=RomCode[i]&0x0F;if(t>9) t+=0x37;else t+='0';Write_LCD_Data(t); //低位数显示}}//..................................//读64位序列码//...............................void Read_Rom_Code(){uchar i;Init_DS18B20();WriteOneByte(0x33); //读序列码for (i=0;i<8;i++) RomCode[i]=ReadOneByte();}//.........................................//显示ROM CODE//...............................void Display_RomCode(){uchar i;Set_LCD_POS(0x00);for(i=0;i<16;i++) //显示标题Write_LCD_Data(RomCodeStr[i]);Read_Rom_Code(); //读64位序列码Display_Rom_Code(); //显示64位ROM CODE }//.......................................//显示报警温度//...............................................void Disp_Alarm_Temperature(){uchar i,ng;//显示Alarm_Temp_HL数组中的报警温度值//由于Alarm_Temp_HL类型为char,故可以直接进行正负比较//高温报警值.........................ng=0;if(Alarm_Temp_HL[0]<0) //如果为负数则取反加1{Alarm_Temp_HL[0]=~Alarm_Temp_HL[0]+1;ng=1;}//分解高温各数位到待显示串中Alarm_HI_LO_STR[4]=Alarm_Temp_HL[0]/100+'0';Alarm_HI_LO_STR[5]=Alarm_Temp_HL[0]/10%10+'0';Alarm_HI_LO_STR[6]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[4]=='0') Alarm_HI_LO_STR[4]=' ';if(Alarm_HI_LO_STR[4]==' '&& Alarm_HI_LO_STR[5]=='0') Alarm_HI_LO_STR[5]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[5]==' ') Alarm_HI_LO_STR[5]='-';elseif(Alarm_HI_LO_STR[4]==' ') Alarm_HI_LO_STR[4]='-';elseAlarm_HI_LO_STR[3]='-';}//低温报警值ng=0;if(Alarm_Temp_HL[1]<0) //如果为负数则取反加1{Alarm_Temp_HL[1]=~Alarm_Temp_HL[1]+1;ng=1;}//分解低温各数位到待显示串中Alarm_HI_LO_STR[12]=Alarm_Temp_HL[1]/100+'0';Alarm_HI_LO_STR[13]=Alarm_Temp_HL[0]/10%10+'0'; Alarm_HI_LO_STR[14]=Alarm_Temp_HL[0]%10+'0';//屏蔽高位不显示的0if(Alarm_HI_LO_STR[12]=='0') Alarm_HI_LO_STR[12]=' ';if(Alarm_HI_LO_STR[12]==' '&& Alarm_HI_LO_STR[13]=='0') Alarm_HI_LO_STR[13]=' ';//"-"符号显示if (ng){if (Alarm_HI_LO_STR[13]==' ') Alarm_HI_LO_STR[13]='-';elseif(Alarm_HI_LO_STR[12]==' ') Alarm_HI_LO_STR[12]='-';elseAlarm_HI_LO_STR[11]='-';}//显示高低温报警温度值Set_LCD_POS(0x00); //显示标题for (i=0;i<16;i++) Write_LCD_Data(Alarm_Temp[i]);Set_LCD_POS(0x40); //显示高低温for (i=0;i<16;i++) Write_LCD_Data(Alarm_HI_LO_STR[i]);}//................................//主函数//..................................void main(){uchar Current_Operation=1; //默认当前操作为显示温度LCD_Initialise();IE=0x82;TMOD=0x01;TH0=-1000/256;TL0=-1000%256;TR0=0;HI_LED=0;LO_LED=0;Set_Alarm_Temp_Value();Read_Temperature();Delay(50000);Delay(50000);while(1){if (K1==0) Current_Operation=1;if (K2==0) Current_Operation=2;if (K3==0) Current_Operation=3;switch (Current_Operation){case 1://正常显示当前温度,越界时报警Read_Temperature();if( DS18B20_IS_OK){if (HI_Alarm==1 || LO_Alarm==1) TR0=1;else TR0=0;Display_Temperature();}DelayXus(100);break;case 2: //显示报警温度上下限Read_Temperature();Disp_Alarm_Temperature();DelayXus(100);break;case 3: //显示DS18B20 ROM CODEDisplay_RomCode();DelayXus(50);break;}}}。