数字系统基础实验实验报告_基于51单片机的智能数字温度计的设计
编号:
2011 -2012 学年第 2 学期
实验课程名称 数字系统基础实验
专 业 班 级 电信1002 学生姓名及学号
实验指导教师
实验项目名称 基于51单片机的智能数字温度计的设计 指导老师 肖铎 成绩
一、实验任务
设计89s51的数字温度计系统
二、实验
1(基本要求
a) 能够测量的温度范围 -20?~100?
b) 精度??=0.5?
c) 能对所测的温度进行数字显示
d) 采用DS18B20智能温度传感器
e) 基于51单片机设计
2(选项
a) 用LCD显示所测温度
b) 预置温度并控制温度(3*4键盘,加热电阻)
c) 所测温度通过RS232传到PC
三、器件
1 器件简介
单片机89S51
VCC:电源电压输入端。
GND:电源地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
- 2 -
浙江
大学城市学院 实 验 报 告 纸 PDIP封装的AT89S51管脚图
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口除了作为普通I/O口,还有第二功能:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(T0定时器的外部计数输入)
P3.5 T1(T1定时器的外部计数输入)
P3.6 /WR(外部数据存储器的写选通)
P3.7 /RD(外部数据存储器的读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。89C51的P0、P1、P2、P3口作为输入时都是准双向口。除了P1口外P0、P2、P3口都还有其他的功能。
RST:复位输入端,高电平有效。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:地址锁存允许/编程脉冲信号端。当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:外部程序存储器的选通信号,低电平有效。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
- 3 -
EA/VPP:外部程序存储器访问允许。当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:片内振荡器反相放大器和时钟发生器的输入端。
XTAL2:片内振荡器反相放大器的输出端。
1602LCD功能介绍
1602采用
的16脚接口,其中:
第1脚:VSS为电源地
第2脚:VDD接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端。
第7,14脚:D0,D7为8位双向数据端。
第15,16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 1602LCD的特性
n+5V电压,对比度可调
n内含复位电路
n提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能
n有80字节显示数据存储器DDRAM
n内建有160个5X7点阵的字型的字符发生器CGROM
n8个可由用户自定义的5X7的字符发生器CGRAM
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置: (初始化)
0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;
显示开关及光标设置: (初始化)
0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),
N=0(读或写一个字符后地址指针减1 &光标减1),
S=1 且 N=1 (当写一个字符后,整屏显示左移)
s=0 当写一个字符后,整屏显示不移动
数据指针设置:
数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)
其他设置:
01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)
- 4 -
浙江
大学城市学院 实 验 报 告 纸
DS18B20
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1: 技术性能描述
?、 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
? 、测温范围 ,55?,+125?,固有测温分辨率0.5?。
?、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
?、工作电源: 3~5V/DC
? 、在使用中不需要任何外围元件
?、 测量结果以9~12位数字量方式串行传送
? 、不锈钢保护管直径 Φ6
? 、适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温
?、 标准安装螺纹 M10X1, M12X1.5, G1/2”任选
? 、PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
接线说明
特点 独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ? C至+125 ? 。华氏相当于是-67 ? F到257华氏度 -10 ? C至+85 ? C范围内精度为?0.5 ? C
温度传感器可编程的分辨率为9~12位 温度转换为12位数字格式最大值为750毫秒 用户可定义的非易失性温度报警设置 应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统
描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数。信息被发送到/从DS18B20 通过1线接口,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。 因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方。它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
- 5 -
1、DS18B20的主要特性
1.1、适应电压范围更宽,电压范围:3.0,5.5V,在寄生电源方式下可由数 据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、 DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围,55?,+125?,在-10,+85?时精度为?0.5?
1.6、可编程 的分辨率为9,12位,对应的可分辨温度分别为0.5?、0.25?、0.125?和0.0625?,可实现高精度测温
1.7、在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"一 线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。
2、DS18B20的外形和内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的外形及管脚排列如下图1:
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图2: DS18B20内部结构图
- 6 -
浙江
大学城市学院 实 验 报 告 纸
3、DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在,55?所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3:DS18B20测温原理框图
DS18B20有4个主要的数据部件:
(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位 (28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625?/LSB形式
达,其中S为符号位。
表1: DS18B20温度值格式表
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125?的数字输出为07D0H,+25.0625?的数字输出为0191H,-25.0625?的数字输出为FE6FH,-55?的数字输出为FC90H 。
表2: DS18B20温度数据表
- 7 -
(3)DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器 TH、TL和结构寄存器。
(4)配置寄存器 该字节各位的意义如下:
表3:配置寄存器结构
TM R1 R0 1 1 1 1 1
低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用 户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)
表4:温度分辨率设置表
R1 R0 分辨率 温度最大转换时间
0 0 9位 93.75ms
0 1 10位 187.5ms
1 0 11位 375ms
1 1 12位 750ms
4、高速暂存存储器 高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在 高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算: 当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表 2是对应的一部分温度值。第九个字节是 冗余检
- 8 -
浙江
大学城市学院 实 验 报 告 纸 验字节。
表5:DS18B20暂存寄存器分布
字节地址 寄存器内容
温度值低位 (LS Byte) 0
温度值高位 (MS Byte) 1
高温限值(TH) 2
低温限值(TL) 3
配置寄存器 4
保留 5
保留 6
保留 7
CRC校验值 8
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行 复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后 释放,当DS18B20收到信号后等待16,60微秒左右,后发出60,240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表6:ROM指令表
约定代指 令 功 能 码
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)
发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出55H 符合 RO响应,为下一步对该 DS1820 的读写作准备。 M
0FOH 用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。 搜索 RO
M
跳过 RO0CCH 忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作。 M
- 9 -
告警搜索0ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。 命令
表6:RAM指令表
约定代指 令 功 能 码
启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节温度变换 44H RAM中。
读内部RAM中9字节的内容 读暂存器 0BEH
发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数写暂存器 4EH 据。
复制暂存器 48H 将RAM中第3 、4字节的内容复制到EEPROM中。
重调 EEPRO0B8H 将EEPROM中内容恢复到RAM中的第3 、4字节。 M
读供电方式 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。
5、DS18B20的应用电路DS18B20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优点。下面就是DS18B20几个不同应用方式下的 测温电路图:
5.1、DS18B20寄生电源供电方式电路图如下面图4所示,在寄生电源供电方式下,DS18B20从单线信号线上汲取能量:在信号线DQ处于高电平期间把能量储存在内部 电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。
独特的寄生电源方式有三个好处:
1)进行远距离测温时,无需本地电源
2)可以在没有常规电源的条件下读取ROM
3)电路更加简洁,仅用一根I/O口实现测温
要想使DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,由 于每个DS18B20在温度转换期间工作电流达到1mA,当几个温度传感器挂在同一根I/O线上进行多点测温时,只靠4.7K上拉电阻就无法提供足够的 能量,会造成无法转换温度或温度误差极大。
因此,图4电路只适应于单一温度传感器测温情况下使用,不适宜采用电池供电系统中。并 且工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。
- 10 -
浙江
大学城市学院 实 验 报 告 纸
图4
图4
5.2、DS18B20寄生电源强上拉供电方式电路图改进的寄生电源供电方式如下面图5所示,为了使DS18B20在动态转换周期中获得足够的电流供应,当进行温度转换或拷贝到 E2存储器操作时,用MOSFET把I/O线直接拉到VCC就可提供足够的电流,在发出任何涉及到拷贝到E2存储器或启动温度转换的指令后,必须在最 多10μS内把I/O线转换到强上拉状态。在强上拉方式下可以解决电流供应不走的问题,因此也适合于多点测温应用,缺 点就是要多占用一根I/O口线进行强上拉切换。
图5
图5
注意:在图4和图5寄生电源供电方式中,DS18B20的VDD引脚必须接地
5.3、DS18B20的外部电源供电方式在外部电源供电方式下,DS18B20工作电源由VDD引脚接入,此时I/O线不需要强上拉,不存在电源电流不足的问题,可以保证 转换精度,同时在总线上理论可以挂接任意多个DS18B20传感器,组成多点测温系统。注意:在外部供电的方式下,DS18B20的GND引脚不能悬空 ,否则不能转换温度,读取的温度总是85?。
图6:外部供电方式单点测温电路
图6
- 11 -
.
.
.
.
.
图7:外部供电方式的多点测温电路图
图7
外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度 监控系统。站长推荐大家在开发中使用外部电源供电方式,毕竟比寄生电源方式只多接一根VCC引线。在外接电源方式下, 可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC降到3V时,依然能够保证温度量精度。
6、DS1820使用中注意事项
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
6.1、较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此 ,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对 DS1820操作部分最好采用汇编语言实现。
6.2、在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个 DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时 要加以注意。
6.3、连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的 测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正 常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考 虑总线分布电容和阻抗匹配问题。
6.4、在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦 某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予 一定的重视。 测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
- 12 -
浙江
大学城市学院 实 验 报 告 纸
图片
引脚介绍
第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。15脚GND、16脚VCC(+5v)。
主要特点
1、符合所有的RS-232C技术标准
2、只需要单一 +5V电源供电
3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-
4、功耗低,典型供电电流5mA
5、内部集成2个RS-232C驱动器
6、高集成度,片外最低只需4个电容即可工作。
2 系统硬件设计
系统整体硬件电路包括:传感器数据采集电路、温度显示电路、上下限报警调整电路、单片机主板
- 13 -
电路等[6]。
2.1 主板电路
主板电路如图1 所示。图,中有3 个独立式按键,可以分别调整温度计的上下限报警设置,当被测
温度不在上下限范围内时,图中的蜂鸣器可以发出报警鸣叫声音,LED 数码管可以显示测出的温度值;
图中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时可以手动复位,这样,不用
再重启单片机电源就可以实现复位。
图1 单片机主板电路
2.2 显
读取温度DS18B20模块流程图
- 14 -
浙江
大学城市学院 实 验 报 告 纸
3(详细的软调试程序编辑及注解
系统程序主要包括C程序主函数、DS18B20复位函数、DS18B20写字节函数、DS18B20读字节函数、温度计算转换函数、显示函数等等。
以下是DS18B20温度计C语言程序清单:
/*********************************************************************/
//
// DS18B20温度计C程序
// 2012.3.6通过调试
/*********************************************************************/
//使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管
//P1口输出段码,P3口扫描
//#pragma src(d:\aa.asm)
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define Disdata P1 //段码输出口
#define discan P3 //扫描口
#define uchar unsigned char
#define uint unsigned int
- 15 -
sbit DQ=P3^7; //温度输入口
sbit DIN=P1^7; //LED小数点控制
uint h;
//
//
//*******温度小数部分用查表法**********//
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]={0xfe,0xfd,0xfb,0xf7}; // 列扫描控制字 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=dis_7[display[k]];
if(k==1){DIN=0;}
discan=scan_con[k];delay(90);discan=0xff;
}
}
//
//
/***********18B20复位函数**********/
ow_reset(void)
{
- 16 -
浙江
大学城市学院 实 验 报 告 纸
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0; //
delay(50); // 550us
DQ=1; //
delay(6); // 66us
presence=DQ; // presence=0继续下一步
}
delay(45); //延时500us
presence = ~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); //66us val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20读1个字节函数********/ //从总线上读取一个字节
uchar read_byte(void) {
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
- 17 -
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 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 ROM write_byte(0x44); // 发转换命令
}
//
/***********温度数据处理函数**********/ work_temp()
{
uchar n=0; //
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温
度求补码
display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
display[3]=display[4]/100; display[1]=display[4]%100; display[2]=display[1]/10; display[1]=display[1]%10; if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=0x0A;}}//最高位为0时都不
显示
if(n){display[3]=0x0B;}//负温度时最高位显示"-"
}
- 18 -
浙江
大学城市学院 实 验 报 告 纸 //
//
/**************主函数****************/ main()
{
Disdata=0xff; //初始化端口
discan=0xff;
for(h=0;h<4;h++){display[h]=8;}//开机显示8888 ow_reset(); // 开机先转换一次
write_byte(0xCC); // Skip ROM write_byte(0x44); // 发转换命令
for(h=0;h<500;h++)
{scan();} //开机显示"8888"2秒
while(1)
{
read_temp(); //读出18B20温度数据
work_temp(); //处理温度数据
for(h=0;h<500;h++)
{scan();} //显示温度值2秒
}
}
//
//*********************结束**************************//
DS18B20程序
//将DQ与Vcc之间接入4.7K上拉电阻 #include "reg52.h"
#include "INTRINS.H"
#include "1602.c"
#define uchar unsigned char #define uint unsigned int //#define CLEARSCREEN LCD_en_command(0x01) 1602清屏 sbit DQ="P1"^0;
/*操作命令代码
跳过ROM 0xCC
发送温度转换 0xBE
写EEPROM 0x4E
*/
/////////////低层驱动子程序/////////// void Init18B20(void); //初始化
void Write18B20(uchar ch);//写数据
unsigned char Read18B20(void);//读数据
- 19 -
void Delay15(uchar n); void Delay10ms(uint delay_num); void Display(void);
/////////////////////////////////////
code uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
code uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
uint ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位
uint ResultSignal;//符号位
main()
{ uint TemH,TemL,delay,k=0;
for(; ; )
{
Init18B20();
Write18B20(0xCC);//跳过ROM
_nop_();
//Write18B20(0x4E);//写EEPROM
// Write18B20(0x00);//Th
//Write18B20(0x00);//Tl
Write18B20(0x7f);//12 bits温度分辨率
Init18B20();
Write18B20(0xCC);//跳过ROM
_nop_();
Write18B20(0x44);//发送温度转换指令
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);//等待1s转换
Init18B20();
Write18B20(0xCC);//跳过ROM
Write18B20(0xBE);//发送温度转换指令
TemL="Read18B20"(); //读低位温度值
TemH="Read18B20"(); //读高位温度值
Delay10ms(2);
TemH=(TemH<<4)|(TemL>>4);
TemL="TemL"&0x0f; //取低4位
if(TemH&0x80)
{ TemH=~TemH;
TemL=~TemL+1;
- 20 -
浙江
大学城市学院 实 验 报 告 纸
ResultSignal="1"; //负
}
else ResultSignal="0"; //正
ResultTemperatureLH="decimalH"[TemL];
ResultTemperatureLL="decimalL"[TemL];
ResultTemperatureH="TemH";
Display();
for(delay=0;delay<60000;delay++);
for(delay=0;delay<20000;delay++);
}
}
void Display(void)
{ uint i,j,q;
LCD_init();
CLEARSCREEN;
LCD_en_command(0x01);
delay_nms(2);
q="ResultTemperatureH/100";
i=(ResultTemperatureH%100)/10;
j="ResultTemperatureH-"(i*10+q*100);
LCD_write_string(0,LINE1," Jaq1217 18B20 ");
if(ResultSignal)
{ LCD_write_string(0,LINE2," T is:- . "); }
else {LCD_write_string(0,LINE2," T is:+ . ");}
LCD_write_char(0x07,LINE2,q|0x30);
LCD_write_char(0x08,LINE2,i|0x30);
LCD_write_char(0x09,LINE2,j|0x30);
LCD_write_char(0x0b,LINE2,(ResultTemperatureLH/10)|0x30);
LCD_write_char(0x0c,LINE2,(ResultTemperatureLH%10)|0x30);
LCD_write_char(0x0d,LINE2,(ResultTemperatureLL/10)|0x30);
LCD_write_char(0x0e,LINE2,(ResultTemperatureLL%10)|0x30);
}
unsigned char Read18B20(void)
{ unsigned char ch;
unsigned char q ;
for(q=0;q<8;q++)
{ch=ch>>1;
DQ="0";
_nop_();
DQ="1";
- 21 -
_nop_();_nop_();_nop_();_nop_();
if(DQ==1)
{ch="ch|0x80";}
else {ch="ch"&0x7f;}
Delay15(3);
DQ="1";
}
return (ch);
}
void Write18B20(uchar ch)
{ uchar i;
for(i=0;i<8;i++)
{ DQ="0";
Delay15(1);
DQ="ch"&0x01;
Delay15(3);
DQ="1";
ch="ch">>1;
_nop_();
}
}
void Init18B20(void)
{ DQ="0";
Delay15(33);//至少延时480us
DQ="1";
Delay15(10);//至少延时100us
/*if(DQ==1) return 0; //初始化失败
else return 1;
DQ=1; Delay15(18); */
}
void Delay15(uchar n)
{ do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
n--;
}while(n);
}
void Delay10ms(uint delay_num) {
uchar i;
while(delay_num--)
- 22 -
浙江
大学城市学院 实 验 报 告 纸
{
for(i=0;i<125;i++)
{;}
}
}
MAX232 芯片简介
MAX232 芯片是MAXIM 公司生产的低功耗、单电源双RS232 发送/ 接收器1 适用于各种EIA - 232E 和V. 28/ V. 24 的通信接口1MAX232 芯片内部有一个电源电压变换器, 可以把输入的+ 5V 电源变换成RS - 232C 输出电平所需?10V 电压, 所以采用此芯片接口的串行通信系统只要单一的+
5V 电源就可以1
MAX232 外围需要4 个电解电容C1 、C2 、C3 、C4 , 是内部电源转换所需电容1 其取值均为1μF/
25V1 宜选用钽电容并且应尽量靠近芯片1C5 为0. 1μF 的去耦电容1
MAX232 的引脚T1IN、T2IN、R1OUT、R2OUT 为接TTL/ CMOS 电平的引脚1 引脚T1OUT、
R2IN 为接RS - 232C电平的引脚1 因此TTL/ CMOS 电平的T1IN、T2IN 引脚应接MCS T2OUT、R1IN、
- 51 的串行发送引脚TXD; R1OUT、R2OUT 应接MCS - 51 的串行接收引脚RXD1 与之对应的RS - 232C电平的T1OUT、T2OUT 应接PC机的接收端RD; R1IN、R2IN 应接PC机的发送端TD1 串行接口电路
采用MAX232 接口的硬件接口电路现选用其中一路发送/ 接收1R1OU T 接MCS - 51 的RXD , T1 IN 接MCS - 51 的TXD1T1OU T 接PC 机的RD , R1 IN 接PC 机的TD1 因为MAX232 具有驱动能力, 所以不需要外加驱动电路。
通信程序设计
串行通信程序包括两方面, 一方面是MCS- 51 单片机的通信程序, 另一方面为PC 机的通信程序1 在编写程序之前, 制定其双方通信协议是十分重要的, 否则将无法保证通信数据的可靠性, 从而失去通信的意义1 现约定其通
信协议如下:
1) 串行通信波特率为1200bps1
2) 帧格式为: 一位起始位, 八位数据位, 一位可编程的第九位(此位为发送和接收的地址/ 数据
的标志位) , 一位停止位1
3) 设定单片机的地址码为F1H1 在传送数据前先联络地址码, 如地址码正确则传送数据, 否则
继续联络地址码1
4) 无奇偶校验位1 数据的通信采用累加和校验的
, 即每传送一组数据(个数自定, 设为100
个) , 校验一次累加和是否正确, 正确则回送00H , 否则回送FFH1
5) 通信可以有中断传送方式和查询方式1 在这里介绍查询方式通信1
6) 联络方式为PC 机主动联络MCS - 51 单片机1
7) PC 机采用COM2 通信1
- 23 -
键盘3*4
键盘扫描电路的主要功能是识别按键,并产生相应的键值。键盘扫描电路KEYBOARD 由分频模块SCAN_GEN、键盘扫描计数器模块SCAN_COUNT、按键检测模KEY_SCAN按键抖动消除模块DEBOUNCE、键盘编码模块CODE_TRAN 组成。
CLOCK:输入同步时钟,来自单片机的ALE 端。
COL:来自键盘的8 路列输入信号。
ROW:输出到键盘的4 路行输出信号。
SCAN_F:输出分频信号,取1KHz。
BUTT_CODE[4..0]:输出编码信号。
KEY_VALID:按键有效信号,接入单片机。
当有键按下时,按键检测电路的KEY_PRESSED 的值为0,并输出到计数器电路,使计数停止。同时抖动消除电路在确认使用者正确按键后,输出按键确定值KEY_VALID 及按键编码值BUTT_CODE
5 /INT1 中断服务子程序流程图
Protel 99 se 图
- 24 -
浙江
大学城市学院 实 验 报 告 纸
- 25 -
- 26 -