资源描述
目录
1引言1
2 设计方案与论证1
3 设计内容2
3.1系统扩展接口的选择2
3。2温度传感器与A\D转换器的选择2
3。3显示接口芯片3
3。4设计原理及功能说明3
3。5系统软件设计4
3.6单元电路的设计(计算与说明)5
4.8086微处理器及其体系结构8
4.1 8086微处理器的一般性能特点8
4.2. 8086CPU的编程结构9
4.3 8255A并行I\O接口9
4.4 ADC0809概述11
4。5 ADC0809与8255的连接13
4。6键盘/显示方式设置命令字13
4。7 LED显示器14
5硬件的制作与调试14
6 结束语:17
参考文献19
附录1:元器件清单:20
附录2:电路总图20
附录3:程序20
1引言
为了实现计算机对生产过程及对象的控制,需要将对象的各种测量参数按照要求转换成数字信号送入计算机。计算机运算处理后再转换成适合于对生产过程进行控制的量。所以在微机和生产过程之间,须设置信息的变换和传递通道。主要功能就是随时间变化的模拟输入信号变成数字信号送入计算机,主要由AD590温度传感器,8088CPU,8255A, A/D转换器和数码管显示器等组成。
本实验通过设计一个微机控制的温度控制系统旨在能做到以下几点:1.了解微机控制的温度采集系统软硬件设计原理和方法。2.进一步掌握并行接口芯片和模数转换的工作原理与使用方法。
以8088 CPU 为核心设计一个温度采集系统,系统可以实现一路温度的采集,在3位LED显示器上显示当前温度。
本设计所用器件主要有传感器,A/D转换器,8088CPU,可编程并行接口8255,显示器等.首先传感器把所测的温度转换为电压,输入A/D转换器中进行转换,然后再把得到的二进制数经过CPU在数码管上显示出来。
本设计共分以下几个模块:8088主控模块、A/D转换模块、并行接口模块、显示模块.
2 设计方案与论证
采用铂电阻温度传感器的电阻与温度的关系是非线性的,用电桥实现温度升高引起的电阻变化对应于电压的变化。经A/D转换器后,送入锁存器锁存,在经译码器输出后,再在数码管上显示,由于74LS373具有锁存功能就能实现四位的温度显示。由于铂电阻与温度的关系是非线性的,因此输出的结果测试精度较低,并且不能达到我们对温度控制的要求。
电桥测温电路
放大电路
A/D转换电路
锁存器74LS373
译码器7448
LED数码显示
图2—1设计方案
3 设计内容
3。1系统扩展接口的选择
本次设计采用的是8086微处理器,选择8255A可编程并行接口作为系统的扩展接口,8255A的通用性强,适应灵活,通过它CPU可直接与外设相连接。
3。2温度传感器与A\D转换器的选择
本系统选用温度传感器AD590构成测温系统.AD590是一种电压输入、电流输出型集成温度传感器,测温范围为—55℃~150℃,非线性误差在±0.30℃,其输出电流与温度成正比,温度每升高1K(K为开尔文温度),输出电流就增加1uA。其输出电流I=(273+T)uA.本设计中串联电阻的阻值选用2KΩ,所以输出电压V+=(2730 + 10T)MV。另外,为满足系统输入模拟量进行处理的功能,对其再扩展一片ADC0809,以进行模拟—数字量转化.
3。3显示接口芯片
为满足本次设计温度显示的需要,我们选择了8279芯片,INTEL8279芯片是一种通用的可编程的键盘、显示接口器件,单个芯片就能完成键盘键入和数码管显示控制两种功能.
3。4设计原理及功能说明
本系统采用的是8086微处理器,选择8255A可编程并行接口作为系统的扩展接口,8255A的通用性强,适应灵活,通过它CPU可直接与外设相连接。对温度进行检测,然后通过A/D转换器(ADC0809)转换成数字信号输入主机。使用Intel8279可编程序的键盘、显示接口功能,完成键盘输入和显示控制两种功能。针对各模块的硬件功能,对各模块设定子程序,通过主程序对这些子程序模块的调用,完成软件设计。
(1)温度测量显示部分
温度通过AD590温度传感集成芯片,将温度变化量转换成电压值变化量,经过OP07一级跟随后输入到电压放大电路,放大后的信号输入到A/D转换器将模拟信号转换成数字信号,然后将该数字信号通过然间编程转化为十进制BCD码,并送到8279进行温度值的显示.
图 3-1主程序流程图
3.5系统软件设计
本设计的目的是以8086微处理器为控制器,将温度传感器输出的小信号经过放大和低通滤波后,送至A/D转换器;微控制器实时采集、显示温度值(要求以摄氏度显示),同时系统还应可设定、控制温度值,使系统工作在设定温度。
通过开始界面,显示提示信息,调用温度子程序,设置温度。通过模数转换器采集A\D值并求其平均值.调用BCD码转换子程序将其转换为十进制温度值;调用显示子程序,如果温度高于实际温度,就加热,反之拨动开关关闭,停止加热.在此过程中,还可以重复设置温度值.
(1) BCD码转换子程序
设定温度为0摄氏度时变换放大电路送出的模拟量为0.0V,此时A/D输出的数字量为00H;温度为68℃时变换器送出对应电压4.98V,此时A/D输出的数字量为FFH,即每0。3℃对应1LSB的变化量,对应电压值为19。5mV。报警温度设定为68℃,此时,输出电压约为5。0V左右。
(2)温度值设置子程序
为了避免加热温度过高,在程序设计中加了一条,即设定值不能大于68℃,否则就认为有错系统报警。
3。6单元电路的设计(计算与说明)
(1)温度检测系统
温度信息由温度传感器测量并转换成微安级的电流信号,经过运算放大电路将温度传感器输出的小信号进行跟随放大,输入到A/D转换器(ADC0809)转换成数字信号输入主机.数据经过标度转换后,一方面通过数码管将温度显示出来;另一方面,将该温度值与设定的温度值进行比较,调整电加热炉的开通情况,从而控制温度。在断开电加热器,温度仍然异常,报警器发出声音报警,提示采取相应的调整措施.
(2)温度测量部分
A\D590是AD公司生产的一种精度和线度较好的双端集成传感器,其输出电流与绝对温度有关,对于电源电压从5—10V变化只引起1uA最大电流的变化或1摄氏度等效误差。图4—1给出了用于获得正比于绝对温度的输出电流的基本温度敏感电路。
A\D590输出的电流I=(273+T)uA(T为摄氏温度)。
因此测量的电压V为(273+T)uA×10K=(2。73+T/100)V,为了将电压测量出来,又务必使电流I不分流出来.使用电压跟随器使其输出电压V2等于V 。
由于一般电源供应多器件之后,电源是带杂波的,因此使用稳压二极管作为稳压元件,再利用可变电阻分压,其输出电压V1需调至2.73V.
差动放大器其输出V0 为(100K/10K)×(V2-V1)=T/10,如果现在为摄氏28℃,输出电压为2.8V。
输出电压接A\D转换器,那么A\D转换输出的数字量就和摄氏温度成线性比例的关系。
图3-2输出电流的基本温度敏感电路
图3-3 ADC0809与8255的连接
模拟输入通道地址A,B,C直接接地,因此ADC0809只对通道IN0输入的电压进行模数转换。为了减少输入噪声其他通道直接接地。ADC0809的数据线D0-D7与8255的PB0—PB7相连接。其片选CS与8086的地址/数据总线AD14相连接。
图3—4 8086的可编程外设接口电路
8255的数据口D0—D7与CPU的6根控制线相连接,控制8255A内部的各种操作.控制线RESET用来使8255A复位。CS和地址线A1及A0用于芯片选择和通道寻址。分别与8086的高位地址线A19,A1,A0相连接.
数据显示部分中我们采用功能强大的可编程设置型显示器8279来对控制温度和实际温度进行显示.我们用8段数码管显示。
8279显示功能介绍:
8279内部有16X8的显示RAM,通过显示寄存器和两个四位端口0UT A0—3,0UT BO-3来刷新显示, 显示器可以是8段数码管,
图3—5 电路工作原理:
AD转换器将转换结果由十六进制转换为十进制后分别存储在54H,55H,56H,57H,58H,59H.中。8279连接一个74ls38译码器,经过译码再接6个8段数码管分别显示每个存储单元的内容
4。8086微处理器及其体系结构
4.1 8086微处理器的一般性能特点
(1) 16位的内部结构,16位双向数据信号线;
(2)20位地址信号线,可寻址1M字节存储单元;
(3)较强的指令系统;
(4)利用第16位的地址总线来进行I/O端口寻址,可寻址64K个I/O端口;
(5)中断功能强,可处理内部软件中断和外部中断,中断源可达256个;
(6)单一的+5V电源,单相时钟5MHz。
4.2. 8086CPU的编程结构
图4-1 8086/8088CPU内部功能结构图
编程结构:是指从程序员和使用者的角度看到的结构,亦可称为功能结构。从功能上来看,8086CPU可分为两部分,即总线接口部件BIU(Bus Interface Unit)和执行部件EU(Execution Unit)。
4。3 8255A并行I\O接口
8255A芯片内包含有3个8位的端口,它们是A口,B口和C口。这3个端口均可作为CPU与外设通讯时的缓冲器或锁存器,当需要“状态"或“联络”信号时,C口可以提供,此时,将C口的高4位为A口所用,C口的低4位为B口所用。3个端口通过各自的输入/输出线与外设联系.
并行输入/输出端口:一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。具有24个可编程设置的I/O口,即使3组8位的I/O口为PA口,PB口和PC口。它们又可分为两组12位的I/O口,A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定。
8255引脚功能:
RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:芯片选择信号线,当这个输入引脚为低电平时,即=0时,表示芯片被选中,允许8255与CPU进行通讯;=1时,8255无法与CPU做数据传输。
RD:读信号线,当这个输入引脚为低电平时,即=0且=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低电平时,即=0且=0时,允许CPU将数据或控制字写入8255.
D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送.
PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。PB0~PB7:端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器.端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口.
A0、A1:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。当A0=0,A1=0时,PA口被选择;当A0=0,A1=1时,PB口被选择;当A0=1,A1=0时,PC口被选择;
当A0=1。A1=1时,控制寄存器被选择.
4。4 ADC0809概述
ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
(1) ADC0809的主要特性
1)8路输入通道,8位A/D转换器,即分辨率为8位。
2)具有转换起停控制端。 3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为—40~+85摄氏度 7)低功耗,约15mW。
(2) ADC0809的内部逻辑结构
由下图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换.三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
图 4-2 ADC0809的内部逻辑结构
(3)外部特性(引脚功能)
ADC0809芯片有28条引脚,采用双列直插式封装,下面说明各引脚功能。
IN0~IN7:8路模拟量输入端.
2-1~2-8: 8位数字量输出端.
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路
ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量.
CLK:时钟脉冲输入端.要求时钟频率不高于640KHZ.
REF(+)、REF(-):基准电压.
Vcc:电源,单一+5V。 GND:地.
4.5 ADC0809与8255的连接
模拟输入通道地址A,B,C直接接地,因此ADC0809只对通道IN0输入的电压进行模数转换.为了减少输入噪声其他通道直接接地。ADC0809的数据线D0-D7与8255的PB0—PB7相连接。其片选CS与8086的地址/数据总线AD14相连接。
4。6键盘/显示方式设置命令字
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
0
0
0
D
D
K
K
K
其中:D7、D6、D5=000方式设置命令特征位.
D D(D4、D3):来设定显示方式,其定义如下:
00:8个字符显示,左入口
00:16个字符显示,左入口
00:8个字符显示,右入口
00:16个字符显示,右入口所谓左入口,即显示位置从最左一位(最高位)开始,以后逐次输入的显示字符逐个向右顺序排列;所谓右入口,即显示位置从最右一位(最低位)开始,以后逐次输入的显示字符时,已有的显示字符逐个向左顺序移动.
KKK(D2、 D1、 D0):用来设定七种键盘、显示工作方式
4.7 LED显示器
工作原理:发光二极管组成的显示器事单片机应用产品中最常用的廉价输出设备.它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一个比划被点亮,控制不同组合的二极管导通,就能显示出多种字符。常见LED数码管的两种接法如图3。8所示。
图4-3 7段LED数码管的两种接法
通过控制管脚a、b、c、d、e、f、g、dp的电平即可获得所需的符号显示.显示器的工作方式有两种,一种是静态显示:当显示器显示某一个字符时,相应的发光二极管恒定地导通或截止。另一种事本次设计中采用的动态显示方式:所谓动态显示即一位一位轮流的点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。但由于时间间隔很小,我们就可以看到完整的显示了。
5硬件的制作与调试
通过前一部分的介绍说明,我们对系统的工作情况有了大体的了解.为了进一步了解系统的工作过程,介绍一下系统调试过程及调试过程中出现的一些具体的问题,软件仿真图(在仿真软件上运行,只是电路的一部分,通过硬件可以制作出来).
按照要求,在仿真软件中画出一部分电路图:如下图
通过电路的设计与链接在仿真软件中即可运行,在其中运行的时候要注意操作,通过TPC2003,EMU中运行后得到。exe文件,按照要求运行
图5-1 数据显示部分
实验调试软件运行于DOC环境下,其步骤如下:
一、根据硬件图和原理图连接好线路。
二、在PC机上敲入程序,对其进行的查错,编译,连接,最后生成可执行文件。
三、接上电源,敲入可执行文件的文件名,系统就开始了工作过程。
图5—2硬件原理图
1)这是DOC屏幕上会出现的一些提示信息,如
'ENTER ANY KEY TO BEGIN!'
’ LET PA0=0 TO ADJUST THE TEMPERATURE VALUE!'
' LET PA0=1 TO INPUT A
NEW TEMPERATURE VALUE!'这里后两条只作注释用。
2)然后敲任意一个键,系统就开始进行温度测量和显示,屏幕上就会显示’INPUT THE TEMPERATURE:’
在这一条信息之后敲入一温度值.注意这里敲入的温度值不能大于76摄氏度,否则屏幕将会显示’INPUT VALUE ERROR !’并返回 DOC.(以后重新设定温度时也是如此)
3)在正常情况下,敲入设定温度后系统就开始进行控制调节,当实际温度小鱼设定值时,系统就开始进行加热,如果不加改变,它就会加热一直稳定到设定的温度值;如果这是想重新设置一温度,只要把8255的PA0读取拨动开关拨到1,屏幕上就会显示:‘INPUT A NEW TEMPERATURE:’
这里又得注意一下,在敲入一个新的设定温度之前,得先把PA0读取拨动开关拨到0,否则,在敲完设定温度之后,屏幕上又会显示同样一条信息。因为它是根据PA0是0还是1来决定是去重新输入设定温度还是去调节温度。如果不先把PA0拨为0,它就是一直让你输入却不进行调节。
6 结束语:
本设计采用的8086微处理器实现温度的控制.具有体积小、重量轻、抗干扰能力强、对环境要求不高、价格低廉、可靠性高、灵活性好、易于推广应用等显著优点,通过软件逻辑控制实现对温度的控制和调节.温度控制系统,只是8086广泛应用于各行各业中的一例。本设计中应用了许多与微机接口技术的芯片和常用的外部设备,芯片如:ADC0809,8255等。外部设备如:温度检测元件AD590,键盘和显示系统中的LED显示器等.该系统的主要优点如下:
一、本系统本着简单可靠的原则完成了设计要求,尽量做到线路简单,充分利用软件编程,安装比较灵活而且价格较低.
二、在系统的硬件和软件设计中,都加有安全设计部分,避免加热过高造成设备的损坏。
最后,通过这次设计,我发现还有很多知识并不牢固,因此在以后的学习中更应该多了解并掌握微机原理与接口技术的相关知识,熟练掌握使用汇编语言编程实现微机芯片的控制,多积累经验为以后的工作打好基础,最后感谢王清珍老师的帮助与指点,对此我深表谢意。
参考文献
[1] 戴梅蕚《微型计算机技术及应用》2007 清华大学出版社
[2] 何克忠《计算机控制系统》 2002 清华大学出版社
[3] 朱善君《汇编语言程序设计》 1998。3 清华大学出版社
[4] 颜永军《protel99电路设计与应用》2001.1 国防工业出版社
[5] 康华光.电子技术基础(模拟部分)。高等教育出版社。2006。1
[6] 何希才。传感器及其应用电路[M]。 北京:电子工业出版社,2001.
[7] 沙占友.智能化集成温度传感器原理与应用[M]。 北京:机械工业出版社,2002。
[8] 赵继文.传感器与应用电路设计[M]。 北京:科学出版社,2002。
[9] 张洪润、刘秀英、张亚凡等。单片机应用设计200例[M].北京:航空航天大学出版社,2006。
附录1:元器件清单:
传感器,A/D转换器,8086|8088CPU,可编程并行接口8255A芯片,LED显示器(7SEG—MPX2-CC),74LS138锁存器,8279等
附录2:电路总图
附录3:程序
;DS18B20。ASM
;*************DS18B20g.ASM*********************************
;不用定时中断,用8253方式0延时,时钟1MHZ,计一个数1us
;**********************************************************
ioport equ 0ec00h—0280h
io8255k equ ioport+28bh ;8255 控制口
io8255c equ ioport+28ah ;8255 C口
io8255a equ ioport+288h ;8255 A口
io8253a equ ioport+283h ;8253 控制口
io8253b equ ioport+280h ;8253 计数器0
STACK SEGMENT
STA DB 20 DUP (?)
TOP EQU LENGTH STA
STACK ENDS
;-—-——-—-----—-——-—-—————--—-—-——-—-——-————-———-—-——--——-——
DATA SEGMENT
CSREG DW ?
IPREG DW ?
count0 db 00
COUNT db 00
COUNT1 DB 00
COUNT2 DB 00
qf db 0eh
TEMP DB 00 ;温度,8位
TEMPL DB 00 ;温度,低字节
TEMPH DB 00 ;温度,高字节
TEMPD DB 00 ;温度,小数位
MESS DB ’8253A TIMERO IN MODEO0 10uS TIMER’,0AH,0DH
DB ’8255 IN MODEO PA0 INPUT PC4—PC7 OUTPUT’,0AH,0DH
DB 'Strike any key, to convert temperature!’,0AH,0DH
DB ’Strike ESC key, return to DOS!’,0AH,0DH,'$’
buff db 20h
BUFF1 DB 20h
buff2 db 20h
buff3 db 20h
buff4 db 2eh
buff5 db 20h
;172
DATA ENDS
;-———-—--—————-————----—-—————-—————-——--—-———---—-——--—-—-
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;—-—-——-—-—---——————--——————-——--—-———-———-—-——-—---—---———
START: CLI
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,09H
INT 21H ;显示提示信息
;-—-————-————-——-————--———-———————-—----—-—-————-—
MOV DX,io8255k ;8255初始化
MOV AL,91H
OUT DX,AL ;8255 PA0 IN PC7—PC4
CALL INI ;初始化
MOV AH,0CCH ;跳过读ROM命令
CALL WRITE
MOV AH,4EH ;写暂存器命令
CALL WRITE
MOV AH,32H ;写高温度值50度
CALL WRITE
MOV AH,00H ;写低温度值0度
CALL WRITE
MOV AH,1FH ;写配置字节
CALL WRITE
KEY: MOV AH,01H ;查有否键入
INT 16H
jz key
MOV AH,00 ;有键入,读取键值
INT 16H
CMP Al,1BH
JZ sss ;ESC 退出
CALL INI ;初始化
MOV AH,0CCH ;跳过读ROM命令
CALL WRITE
MOV AH,44H ;温度转换命令
CALL WRITE
conv: MOV DX,io8255k
MOV AL,0eH ;PC7清另
OUT DX,AL
nop
nop
MOV DX,io8255k
MOV AL,0fH ;PC7置1
OUT DX,AL
conv1: call delay1 ;延迟50ms
call delay1
MOV DX,io8255k
MOV AL,0fH ;PC7置1
OUT DX,AL
CALL INI ;初始化
MOV AH,0CCH ;跳过读ROM命令
CALL WRITE
MOV AH,0BEH ;读暂存器命令
CALL WRITE
CALL READ ;读两个字节
MOV TEMPL,ah
CALL READ
MOV TEMPH,ah
MOV AL,TEMPL ;合成一个十六位字
MOV CL,04
SAL AX,CL ;左移四位
and ah,7fh
MOV TEMP,AH ;温度值整数部分
jmp jjj
sss: jmp exit
jjj: MOV BUFF,2BH ;+
AGN: MOV AH,TEMPL
AND AH,08H ;温度值小数部分
JZ AGN1
MOV BUFF5,35H ;.5
JMP AGN2
AGN1: MOV BUFF5,30H ;。0
;———-——-———--——-———————-—--—-—--——-—————--—-——-————--——-————-—————--———
AGN2: mov dl,buff
mov ah,02
int 21h
call disp ;显示
mov dl,0dh
mov ah,02
int 21h
mov dl,0ah
mov ah,02
int 21h
JMP KEY
;—-——-—---———-—--—————————————————-———-————-————---———-——--
;恢复现场,返回DOS
EXIT: MOV AX,4C00H
INT 21H
;--——-———-——————-——-—-—-—---—-—————-—————--————-—---——-——--
;延时子程序,延时时间长短由COUNT的值决定
DELAY: push ax
pushf
MOV DX,io8253a
MOV AL,30H ;定时器0,模式0,16
OUT DX,AL
MOV DX,io8253b
MOV Al,count ;8253 clk0 1MHZ
OUT DX,AL
Mov al,count0
Out dx,al
MOV DX,io8255c
lll: in al,dx
and al,01h
jz lll
popf
pop ax
RET
;--———————-——-—-————-—-—-—-————---—————-——-————-——--—-—————
;DS18B20初始化子程序
INI: MOV DX,io8255k
MOV AL,0eH
OUT DX,AL ;PC7置0 口清0
MOV COUNT0,02h
mov count,0bch
CALL DELAY ;主机发复位脉冲持续700微妙
MOV COUNT0,00
mov count,00
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL ;主机置位,为输入作准备
MOV COUNT0,00
mov count,28h
CALL DELAY ;等待40微秒
MOV COUNT,00
ini1: MOV DX,io8255a
IN AL,DX
AND AL,80H
JNZ INI ;数据线应变低,若没变低,重来。
;数据线变高,初始化成功
;初始化失败,重来
L2:
MOV COUNT0,02h
mov count,0bch
CALL DELAY ;DS18B20的应答过程至少需700
mov count0,00
MOV COUNT,00
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL
RET
;—---————-—-—-—-————-———-——--———-————-—-——-——---——-———--——----—-——-—-——-—
;写DS18B20子程序
WRITE PROC NEAR
MOV COUNT1,08H
W0:
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL ;PC7清1
w1: MOV DX,io8255k
MOV AL,0eH
OUT DX,AL ;PC7置0,DS18B20数据线变低
nop
nop
SHR AH,01
JC W2
MOV DX,io8255k
MOV AL,0eH
OUT DX,AL ;PC7置0,写0
JMP W3
W2: MOV DX,io8255k
MOV AL,0fH
OUT DX,AL ;PC7清1,写1
W3: MOV COUNT0,00
mov count,46h
CALL DELAY ;延时70微秒,写时间为70微秒
MOV COUNT,00
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL
DEC COUNT1
JNZ W1
RET
WRITE ENDP
;———-———-————————————--—————-——-———————————-—---——-———--—-—-——-———
;读DS18B20子程序
READ: MOV COUNT1,08H
mov ah,00
RE1:
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL ;PC7置1,数据线为1
nop
wt0: MOV DX,io8255k
MOV AL,0eH
OUT DX,AL ;PC7置0,数据线为0
mov cx,02h
wt2: loop wt2
MOV DX,io8255k
MOV AL,0fH
OUT DX,AL ;PC7置1,数据线为1
mov cx,08h
wt1: loop wt1
MOV DX,io8255a
IN AL,DX
AND AL,80H ;按位读数据
RCL al,01 ;数据送CF
RCR ah,01 ;数据通过CF送AH
MOV COUNT0,00
mov count,46h
CALL DELAY ;读数据过程持续60微秒
MOV COUNT,00
DEC COUNT1
JNZ wt0
RET
;———--———————--————-———————--—-———-————-—--——-——--—-——---————-———--
;转换成BCD码并显示
disp PROC NEAR ;BCD转换并显示子程序
mov al,temp
mov ah,00h
mov cl,100
div cl ;除100
mov buff1,al ;百位值
mov al,ah
mov ah,00
mov cl,10
div cl ;除10
mov buff2,al ;10位值
mov buff3,ah ;个位值
ttt:
mov al,buff1
call disp1
mov al,buff2
call disp1
mov al,buff3
call disp1
mov dl,buff4
mov ah,02
int 21h
mov al,buff5
call disp1
ret
DISP ENDP
;—-————————-—-—--—————---—----——-——-——-———-———-——-———-————-——----
disp1 PROC NEAR ;显示一个字符
and al,0fh
add al,30h
mov dl,al
mov ah,02
int 21h
ret
disp1 endp
;—-—-—————-—----———-——-—---——-————-———-——-————————--——---——---——-
disp2 proc near
mov al,temp
mov cl,04
shr al,cl
and al,0fh
add al,30h
cmp al,39h
jbe nt
add al,07
nt: mov dl,al
mov ah,02
int 21h
mov al,temp
and al,0fh
add al,30h
cmp al,39h
jbe nt1
add al,07
nt1: mov dl,al
mov ah,02
int 21h
mov dl,0ah
mov ah,02
int 21h
mov dl,0dh
mov ah,02
int 21h
ret
disp2 endp
;———--—-—-——-——-——————-—————-—----————-—-———-—————-—-——————
DELAY1 PROC NEAR
push ax
pushf
MOV DX,io8253a
MOV AL,30H ;定时器0,模式0,十六位
OUT DX,AL
MOV DX,io8253b
Mov al,50h ;8253 clk0 1MHZ
OUT DX,AL ;50ms延时
Mov al,0c3h
Out dx,al
Mov dx,io8255c
xxx: in al,dx
and al,01h
jz xxx
popf
pop ax
RET
DELAY1 endp
CODE ENDS
END START
26
展开阅读全文