基于单片机的温度报警系统+proteus仿真

合集下载

以51单片机为核心的DS18B20的数码管显示温度程序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仿真

单片机温度检测proteus仿真
_nop_();
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的单片机多路温度采集系统的仿真设计

基于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的单片机测温系统的仿真设计

基于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的单片机测温系统的仿真设计剖析

本科毕业设计(论文)题目:基于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的温度控制电路设计与仿真学生姓名:赵殿锋指导教师:郭爱芳学号:联系方式:专业:机械电子工程基于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的单片机测温系统仿真设计

基于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的温度测控系统仿真研究

基矛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 混 合 电 路 仿 真 软 件 , 一 款 含 有 大 量 的 系 统 资 源 、 富 的硬 是 丰 件 接 口 电路 , 有 强 大 的调 试 功 能 和 软 硬 件 相 结 合 的 仿 真 系 具 统 。它 很 好 地 解 决 了 硬件 设 计 和 软 件 调 试 的 问 题 , 仅 能 够 不 仿 真 模 拟 、 字 电 路 以 及 模 数 混 合 电路 , 能 够 仿 真 基 于 单 数 还
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}}}。

相关文档
最新文档