单片机温度传感器proteus仿真
单片机温度检测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的电子体温计的设计与仿真设计
基于Proteus 的电子体温计的设计与仿真专业:电子信息工程学号:08128001 :施小飞摘要:体温计是现代人们日常家居生活的的必备品之一,而常见的体温计多为传统的水银体温计,该体温计是基于传统的热涨冷缩的性质制成的,该体温计在使用中存在着测温时间较长,读数不方便和水银外泄的不安全因数,因此十分有必要设计一款更加方便快速的电子体温计来解决这些问题。
本文将以AT89C51 单片机为基础并结合数字温度传感器DS18B20,以及数码管显示等,来实现电子体温计的设计。
关键词:电子体温计;AT89C51 单片机;温度传感器DS18B20Proteus's microcontroller-based design and simulation ofelectronic thermometerAbstract :Thermometer is the home of modern daily life of essential goods, and morecommonf or the traditional mercury thermometer thermometer, the thermometer is based on the traditional nature of the heating or cooling is made, and the thermometer in use there is a temperature a long time, reading is not convenient and safe mercury leakage factor, it is necessary to design a more convenient and fast electronic thermometer to solve these problems. This will be combined with AT89C51m icrocontroller based digital temperature sensor DS18B20, and digital display, electronic thermometer designed to achieve.Keywords :Electronic thermometer ;AT89C51 microcontroller ;Temperature sensor DS18B20 1、绪论1.1体温计的发展与现状体温测量的历史,可以追溯到l6 世纪。
基于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的单片机系统的仿真设计
如 模 拟 分 析 、 字 分析 、 合 信 号 分 析 、 率 分 析 等 有 各种 虚 拟 数 混 频
仪器 , 如示 波 器 、 辑 分 析 仪 、 号 发 生 器 、 数 器 、 表 等 。 和 可 简 化单 片机 程序 在 目标 硬 件 上 的调 试 工 作 .加 快 工 程 项 目的 逻 信 计 电 能 K i Ma a e , f b等 编 译 软 件 整 合 使 用 。 到 更 好 的 仿 真效 果 。 仿 真 开 发 过 程 , 低 开 发 成 本 。 需 要 注 意 的 是 , 真 不 能 完 全 代 替 实 l l 达 该 降 仿
空航 天 大 学 出版社 . 0 . 2 6 0 3 王锋 . 于 P oe s 数 字 时 钟 设 计 与 仿 真 卟 福 建 电 脑 ,0 91 : 5 . 基 rtu 的 2 0 ,01 - 3
1 6 3 .
4王 瑞 萍 . 于 Poe s 单 片 机 虚 拟 开 发 环 境 o. 代 电 子 技 术 , 0 ,: . 基 rtu 的 】现 2 98 0
16 4
福
建 电
脑
21 0 0年 第 6期
基 于 Po u 的 单 片 机 系统 的仿真 设计 rt s e
刘 艳 ,张 文 超 ,秦 鑫
(新 乡 医 学 院生 命 科 学技 术_ 河 南 新 乡 4 3 0 系 5 0 31 【 摘 要 】 介 绍 了利 用 P o u 开 发 单 片机 系 统 的 仿 真 设 计 方 法 。基 于 Po u 的 单 片 机 虚 拟 开 发 环 境 可 以 完 成 单 片 : rt s e rt s e
l i是 德 国 K i公 司 开发 的单 片机 编译 器 .是 一 种 集 成 化 (l e e l 参考文献: . 沈 郭 8 1单 片机 实 践 与 应 用 [ . 京 : 华 大学 0 M】北 清 的 文 件 管 理 编 译 环 境 , 编 辑 、 译 和 程 序 仿 真 等 于 一 体 。 用 1昊 金 戌 , 庆 阳春 , 庭 吉 . 5 集 编 可
基于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软件是英国Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB 的设计; ISIS模块用来完成电路原理图的布图和仿真。
它可以进行模拟电路仿真、数字电路仿真,也可以进行单片机及其外围电路组成的系统的仿真;软件提供了各种虚拟仪器,如示波器、逻辑分析仪、信号发生器、电压表、电流表等。
和其它仿真软件相比,Proteus ISIS最大特色是对单片机系统的仿真,目前支持的单片机类型有: 68000系列、8051系列、ARM系列、AVR系列、PIC系列、Z80系列、HC11系列等。
本文主要介绍Proteus软件在单片机方面的仿真功能,即ISIS模块的用法。
在单片机学习开发的过程中,程序的调试是一个很重要的环节,要安装电路进行实验,而且电路在调试过程中往往要进行调整和改变,这不紧增加了费用和难度,而且也影响了学习和开发的进度,这也成了一些初学者学习的障碍。
如果使用Proteus 软件就可以大大节省时间和开发费用,可以在软件仿真通过后再制作印刷电路板进行电路实验。
一、Proteus ISIS软件的工作环境和一些基本使用方法下面通过一个流水灯的实例来说明Proteus的基本使用方法,使用的软件版本是Proteus.Professional 7.1 SP2。
流水灯使用AT89C51单片机,用P2口作输出口。
先在Keil uVision编译器中输入下列程序:#include <reg51.h>void Delay1ms(unsigned int count)//延时子程序{unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}main() //主程序{unsigned char LEDIndex = 0;bit LEDDirection = 1;while(1){if(LEDDirection)P2 = ~(0x01<<LEDIndex);elseP2 = ~(0x80>>LEDIndex);if(LEDIndex==7)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%8;Delay1ms(200);}}将上述程序编译生成目标文件LED.hex。
基于Proteus软件的单片机仿真实验
该方案 目前在 国内高校具有较高的推广利用价值 。 关键词 :rt s 单片机 ; 真 ; Poe ; u 仿 实验 中图分类号 : P381 T 6 . 文献标志码 :A 文章编号 : 6 22 3 (0 1 0 -0 90 1 7 - 4 2 1 )302 - 4 4
第l O卷
第 3期
常
州
信
息
职
业
技
术
学
院
学
报
VO .O NO 1 3 1 Jm. 01 t 2 1
21 0 1年 6月
பைடு நூலகம்
J t l l o a g h u Vo a in lCo lg fI f r to c n lg: o t l fCh n z o c to a l e o n o ma i n Te h oo ra e
单片机技术是现代电子工业 中不可缺少的一项
技术 , 掌握 单 片机技 术 是 电子类 专 业 学 生 就业 的 一
计算机仿 真技术 , 是在计算机平台上使用电子 仿真软件进行 电路设计 、 仿真、 调试 , 完成通 常在相 应硬件实验室才可以完成的实验 。伴随着计算机软 件和硬件技术 的飞速发展 , 在各个领域都 出现 了各
基 于 Poes软件 的 单 片 机 仿真 实验 rtu
高立 新
( 广东机 电职业技术学 院 广东广 州 501) 15 5
摘
要 : 电子类 专业 教学中 , 在 单片机 的实验和实训 常规采用 硬件实验箱或实验 板方式 , 此硬件 实验平 台不 仅投资成本 高 , 而 且局 限于固有 的硬件电路 , 不便于更改 电路 。提 出一种基于 Po u 软件仿真 的单片机 虚拟实验方 案 , 案不需采 r es t 该方 购大量 的硬件 设备 , 而是使用 Poes rt 软件仿真 , u 完成单 片机的实验 和实训 。同时 , 使用 Po u 软件 的单片机 虚拟实 r es t
基于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虚拟实验教学内容传感器p r o t e u s虚拟实验《传感器原理与应用》实验指导书Proteus-V1.0版本实验1:基于DS18B20传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
包括:2个头文件LCD1602.h和DS18B20.h; 1个源文件LCD_18b20.c;代码如下LCD1602.h:#include //用AT89C51时就用这个头文件//#include //用华邦W78E58B时必须用这个头文件#include//注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开//PortDefinitions*************************************************** ******* sbit LcdRs = P2^0;sbit LcdRw = P2^1;sbit LcdEn = P2^2;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数*************************************************************** ****** *****unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80//实际硬件时打开此语句LcdEn=0;return DBPort;}//向LCD写入命令或数据************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************************************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式************************************************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD*********************************************************** * void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//************************************************************* ******* ****void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}void LCD_Print(unsigned char x, unsigned char y, unsigned char *str){GotoXY(x,y);Print(str);}DS18b20.h#include //用AT89C51时就用这个头文件//#include //用华邦W78E58B时必须用这个头文件sbit DQ = P3^4; //定义DQ引脚为P3.4/***********ds18b20延迟子函数(晶振12MHz )*******//************DS18B20对时间要求很严,但只能长不能短*************在11.0592M下也行,因为时间长些********/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于 480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/unsigned char *ReadTemperature(char TH,char TL,unsigned char RS){ unsigned char tt[2];Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x4E); // //写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器//先写TH,再写TL,最后写配置寄存器WriteOneChar(TH); //写入想设定的温度报警上限WriteOneChar(TL); //写入想设定的温度报警下限WriteOneChar(RS); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1//R1R0=00分辨率娄9位,R1R0=11分辨率为12位delay_18B20(80); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(80); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(80);tt[0]=ReadOneChar(); //读取温度值低位tt[1]=ReadOneChar(); //读取温度值高位return(tt);}LCD_18b20.c#include //用AT89C51时就用这个头文件//#include //用华邦W78E58B时必须用这个头文件#include#include#include#include#include#include#include "LCD1602.h" ////液晶显示头文件//sbit DQ = P3^4; //定义DQ引脚为P3.4unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'};//显示实时温度,上电时显示+125.00Cunsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'};//显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode[4]={0,25,50,75};/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*******再将表值分离出十位和个位后送到十分位和百分位********************/void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据{if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值{TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码TH=~TH;TH++;}else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码if(TL>0x7f){TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码TL=~TL+1;}else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐TempBuffer0[5]=(TH%100)/10+0x30; //分离出十位TempBuffer0[6]=(TH%100)%10+0x30; //分离出个位TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐TempBuffer0[13]=(TL%100)/10+0x30; //分离出十位TempBuffer0[14]=(TL%100)%10+0x30; //分离出个位} void covert1(void) //将温度转换为LCD显示的数据{unsigned char x=0x00,y=0x00;t[0]=*pt;pt++;t[1]=*pt;if(t[1]>0x07) //判断正负温度{TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码t[1]=~t[1]; /*下面几句把负数的补码*/t[0]=~t[0]; /* 换算成绝对值*********/x=t[0]+1; /***********************/t[0]=x; /***********************/if(x>255) /**********************/t[1]++; /*********************/}else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码t[1]<<=4; //将高字节左移4位t[1]=t[1]&0x70; //取出高字节的3个有效数字位x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它x>>=4; //右移4位x=x&0x0f; //和前面两句就是取出t[0]的高四位t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节TempBuffer1[1]=t[1]/100+0x30; //+0x30 为变 0~9 ASCII码if( TempBuffer1[1]==0x30) TempBuffer1[1]=0xfe; //百位数消隐TempBuffer1[2]=(t[1]%100)/10+0x30; //分离出十位TempBuffer1[3]=(t[1]%100)%10+0x30; //分离出个位t[0]=t[0]&0x0c; //取有效的两位小数t[0]>>=2; //左移两位,以便查表x=t[0];y=dotcode[x]; //查表换算成实际的小数TempBuffer1[5]=y/10+0x30; //分离出十分位TempBuffer1[6]=y%10+0x30; //分离出百分位}void delay(unsigned char i){while(i--);}main(){unsigned char TH=110,TL=-20; //下一步扩展时可能通过这两个变量,调节上下限//测温函数返回这个数组的头地址while(1){pt=ReadTemperature(TH,TL,0x3f); //上限温度-22,下限-24,分辨率10位,也就是0.25C//读取温度,温度值存放在一个两个字节的数组中,delay(100);covert1();covert0(TH,TL);LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行//为1表示第二行,第三个参数为显示数据的首地址LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);}}实验2:基于MPX4115传感器温度测量实验步骤:(1)在Proteus软件画出电路图(2)用keil C 软件写出C程序,并生成.hex文件,导入到单片机当中,进行仿真,观察结果。
Proteus单片机仿真实验内容
实验1 PROTUES环境及LED闪烁实验1.实验任务做一个闪烁灯:在P1.0端口上接一个发光二极管D1,使D1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒,重复循环。
2.电路原理图3.程序设计内容(1)延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大多是微秒级。
实验要求的闪烁时间间隔为0.2秒,所以在执行某一指令时,需要插入延时程序,来达到实验的要求。
延时子程序如下:DELAY: MOV R5, #20D1: MOV R6, #20D2: MOV R7, #248DJNZ R7, $DJNZ R6, D2DJNZ R5, D1RET(2)输出控制如上图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
实验2 外部中断实验1.实验任务设计一个交通灯正常工作程序,并在有意外情况发生的情况下,能自动中断进入到中断服务程序运行,进行紧急事故处理,处理完成后能回到正常工作程序继续运行。
如原理图所示,P1接一位数码管用于显示时间,P2端口接东西方向和南北方向红绿灯,P3.2接一个按钮用于模拟一个外部中断源,当正常工作时,东西方向绿灯亮8秒,然后南北方向绿灯亮9秒;当模拟中断源发出中断信号时,东西和南北红灯亮5秒后返回正常工作程序。
(注:这里数码管选用了共阳极的数码管)数码管的段选码如下表所示:2.电路原理图3.程序设计内容(1)从proteus库中选取元器件:单片机AT89C51、磁片电容CAP、电解电容CAP-ELEC,晶振CRYSTAL、电阻RES、数码管7SEG-COM-CAT-GRN,按钮BUTTON,发光二极管等。
(2)设计延时程序。
实验3 T0波形发生器实验1.实验任务(1)首先用AT89C51单片机定时器/计数器0的定时功能构成一方波发生器,实现周期为400us的方波输出,如图所示,P3.5,p3.7是两个波形输出端,分别输出反相波形,两路波形输入虚拟示波器的A通道和B通道,用示波器观察方波的周期是否是400us。
以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中仿真MSP430单片机的设置方法
在proteus中仿真MSP430单片机的设置方法
将MSP430单片机仿真库文件分别复制到proteus7.1安装目录相应地方,即可仿真MSP430单片机了。
1、选择芯片型号
如图1所示选择MSP430F2274,。
图1选择芯片型号
2、改变Linker设置
单击Linker/Output,选中Override default,更改t1.d43为t1.hex,即更改文件后缀为可执行文件hex。
选中Format中的Other,更改Output为intel-extended。
其它不变,如图2所示。
设置完成后,重新编译make生成t1.hex文件,路径为d:\mywork430\t1\debug\exe\t1.hex。
图2 Linker设置
3、打开proteus选择msp430芯片
图3 选择MSP430F2272芯片
4、装载可执行文件t1.hex
双击msp430f2272芯片图标,在edit compnent/program file装载可执行文件
d:\mywork430\t1\debug\exe\t1.hex
图4装载可执行文件t1.hex
5、仿真运行
在proteus中点击仿真运行,可观察到P1.0引脚电位变化,红色为高电位,蓝色为低电位。
接上发光二极管,可看见发光二极管的闪烁,如图5所示。
图5 仿真运行。
利用单片机控制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仿真单片机实验
目录引言 (2)实验1 PROTUES环境及LED闪烁综合实验 (7)实验2 多路开关状态指示 (10)实验3 报警产生器 (13)实验4 I/O并行口直接驱动LED显示 (16)实验5 按键识别方法之一 (19)实验6 一键多功能按键识别技术 (22)实验7 定时计数器T0作定时应用技术 (25)实验8定时计数器T0作定时应用技术 (28)实验9 “嘀、嘀、......”报警声 (32)实验10 8X8 LED点阵显示技术 (36)实验11电子琴 (40)引言单片机体积小,重量轻,具有很强的灵活性而且价格便宜,具有逻辑判断,定时计数等多种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。
以单片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。
在嵌入式系统的中,开发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。
利用Proteus我们可以很好地解决这个问题,由此我们可以快速地建立一个单片机仿真系统。
1. Proteus介绍Proteus是英国Labcenter Electronics公司开发的一款电路仿真软件,软件由两部分组成:一部分是智能原理图输入系统ISIS(Intelligent Schematic Input System)和虚拟系统模型VSM(Virtual Model System);另一部分是高级布线及编辑软件ARES (Advanced Routing and Editing Software)也就是PCB。
1.1 Proteus VSM的仿真Proteus可以仿真模拟电路及数字电路,也可以仿真模拟数字混合电路。
Proteus可提供30多种元件库,超过8000种模拟、数字元器件。
可以按照设计的要求选择不同生产厂家的元器件。
此外,对于元器件库中没有的元件,设计者也可以通过软件自己创建。
除拥有丰富的元器件外,Proteus还提供了各种虚拟仪器,如常用的电流表,电压表,示波器,计数/定时/频率计,SPI调试器等虚拟终端。
基于PROTEUS的DS18B20测温仿真与VB上位机显示
基于PROTEUS的DS18B20测温仿真与VB上位机显示成绩课程论文题目:基于PROTEUS的DS18B20测温仿真与VB上位机显示学生姓名:方瑞学生学号:1008050110系别:电气信息工程学院专业:电子信息科学与技术年级:2010级任课教师:沈晓波电气信息工程学院制淮南师范学院电气信息工程学院电子信息科学与技术专业Proteus课程论文2012年12月基于PROTEUS的DS18B20测温仿真与VB上位机显示学生:方瑞指导教师:沈晓波电气信息工程学院电子信息科学与技术专业摘要:本设计是基于在PROTEUS平台上仿真51单片机与DS18B20的测温,并将结果反馈到用VB开发的上位机界面,进行实时温控。
关键词:PROTEUS、DS18B20、VB、上位机1、原理图绘制PROTEUS软件是英国Lab Center Electronics公司开发的EDA工具软件。
PROTEUS软件由ISIS(Intelligent Schematic Input System)和ARES(Advanced Routing and Editing Software)两个软件构成,其中ISIS是一款智能原理图输入系统软件,可作为电子系统仿真平台;ARES是一款高级布线编辑软件,用于制作PCB。
本设计选用51系列AT89C52单片机和Dallas公司生产的DS18B20智能数字温度传感器。
AT89C52是高性能8位单片机,其主要特点如下:·8位CPU。
·片内带振荡器,频率范围1.2MHz~12MHz。
·片内带128B的数据程序存储器。
·32可编程I/O线·三个16位定时器/计数器·6个中断源·一个全双工的串行I/O接口,可多机通信。
·可编程串行通道。
·低功耗的闲置和掉电模式。
·片内振荡器和时钟电路。
DS18B20是Dallas公司开发的一款智能数字温度传感器,其主要特点如下:·使用电压范围宽,电压范围3.0~5.5V。
基于单片机的温度报警系统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;}} }。