视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于DS18B20设计课程设计
2025-09-24 11:13:27 责编:小OO
文档
目录

摘要…………………………………………………………………2

一、绪论………………………………………………………………3

1、 课题研究的背景和意义………………………………………3

2、 课程设计的主要要求…………………………………………3

二、系统方案实现……………………………………………………3

三、主要硬件介绍……………………………………………………4

1、 DS18B20………………………………………………………4

2、 ATC51………………………………………………………4

3、 LCD1602………………………………………………………5

四、软件介绍 …………………………………………………………5

   1、  Proteus ………………………………………………………5

   2、  KeilμVision 2  ………………………………………………6

3、  Proteus和keil的连接设置 …………………………………6

五、硬件设置 …………………………………………………………7

六、软件设置 …………………………………………………………7

   1、  功能概述 ……………………………………………………7

   2、  系统软件流程图 ……………………………………………8 

3、  具体程序 ……………………………………………………8

七、总结…………………………………………………………………21

八、设计体会及今后的改进意见………………………………………22

九、参考文献……………………………………………………………22

十、图纸部分……………………………………………………………23

   1、  电路仿真图……………………………………………………23

   2、  功能结果图……………………………………………………23

摘要

本文基于DS18B20设计了一种温度数据采集系统,系统主要由单片机电路和一个DS18B20 数字传感器构成。软件方面,我们采用keil软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 50℃~ + 255℃,通过LCD1602显示所测温度。同时,可以实现高低温报警,若所测温度超出设定范围,相关器件就会自动报警。我们也可以通过对按键的处理来调节上下线报警温度。该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、PC 机与单片机通讯接口电路。系统的测温精度可以达到±0.5 ℃,并且能稳定的与单片机和PC 机通讯。

Abstract

Based on DS18B20 designed a temperature data acquisition system, the system mainly by the microcontroller circuit and a digital sensor DS18B20 composition. Software, we use keil software program writing, and debugging, hardware, our software through the Proteus hardware simulation and testing, the system is simple, low power consumption, temperature range - 50 ℃ ~ 255 ℃, shows the measured temperature through the LCD1602. At the same time, can achieve high and low temperature alarm, if the measured temperature exceeds the setting range, the device will automatically alert relevant. We can also handle on the button to adjust the temperature on the alarm off the assembly line. The system hardware is divided into three parts: DS18B20 temperature measurement module, the microcontroller module, PC machines with MCU interface circuit. System, temperature measurement accuracy can reach ± 0.5 ℃, and can be stable with the microcontroller and PC-machine communication.

关键词:DS18B20、LCD1602、高低温报警

一、绪论

1、课题研究的背景和意义

在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。

目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和KeilμVision 2软件对设计电路进行综合虚拟仿真,实现了温度实时测量和显示。

2、本设计的主要要求

1. 测量温度范围:-50℃~+255℃;

2.精度:±0.5℃;

3.超限报警功能;

       4.高低温报警温度设定

二、系统方案实现

系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后, DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内, 然后与系统进行数据通信, 系统将温度读出并驱动LED 数码管显示。如果温度值低于设定下限值或高于设定上限值, 则自动启动报警装置。

由于DS18B20 单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。该系统结构图

                     图1

三、主要硬件介绍

    1、DS18B20

           DSl820数字温度计是美国Dallas公司生产的数字温度计,它提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线。DSl820的电源可以由数据线本身提供而不需要外部电源。因为每一个DSl820在出厂时已经给定了唯一的序号,因此任意多DSl820可以存放在同一条单线总线上。这允许在许多不同的地方放置温度敏感器件。DSl820的测量范围从-55到+125,增量值为0.5,可在l s(典型值)内把温度变换成数字。每一个DSl820包括一个唯一的位长的序号,该序号值存放在DSl820内部的ROM(只读存贮器)中。开始8位是产品类型编码(DSl820编码均为10H)。接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码。图2为DS18B20的实物图。

     2、ATC51                                  图2 

          ATC51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位处理器(CPU)和Flash存储单元,功能强大ATC51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。ATC9C51实物图如图3。主要参数如下:

         ·与MCS-51产品指令系统完全兼容

·4k字节可重擦写Flash闪速存储器

·1000次擦写周期

·全静态操作:0Hz-24MHz

·三级加密程序存储器

·128×8字节内部RAM

·32个可编程I/O口线

·2个16位定时/计数器

·6个中断源

·可编程串行UART通道

·低功耗空闲和掉电模式 

                                      图3

     3、LCD1602

              由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。LCD1602的实物图如图4,主要参数如下:

          ·显示容量:16×2个字符

 ·芯片工作电压:4.5—5.5V

·工作电流:2.0mA(5.0V)

·模块最佳工作电压:5.0V

·字符尺寸:2.95×4.35(W×H)mm

 

                                                            图4

四、软件介绍

    1、Proteus

        Proteus是英国Labeenter electronics公司研发的EDA工具软件。

Proteus不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,

更是目前世界最先进、最完整的多种型号微控制器系统的设计与仿真平台。它真正实现了在计算机上完成从原理图设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整电子设计与研发过程。Proteus产品系列也包含了性的VSM技术,可以对基于微控制器的设计连同所有的外围电子器件一起仿真。Proteus工作界面如图5

                                    

                          图5

    2、KeilμVision 2

KeilμVision 2是Keil公司关于8051系列MCU的开发工具,可

       以用来编译C源码、汇编源程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等,是一种集成化的文件管理编译环境。它集成了文件编辑处理、编译连接、项目管理、窗口、工具引用和软件仿真调试等多种功能,是相当强大的开发工具。Keil工作界面如图6

                         图6

3、Proteus与Keil的连接设置

(1)检测TCP/IP。

         (2)复制Proteus安装目录下的MODELS文件夹里的vdm51.dll到keilc/C51/bin目录。

         (3)修改Keil安装目录下的tools.ini,添加TDRV4=BIN\VDM51.DLL。

         (4)在Proteus中画好原理图,在“Debug”菜单中选择“Use Remote Debug Monitor”。

         (5)在Keil中打开一个工程,右击Target1,选择Op-tions for Target‘Target 1’。在打开的对话框中选择“De-bug”选项卡,选择使用Proteus VSM Emulator仿真(如图六所示),单击“Ok”完成Debug设置。

图六

  这样Proteus和Keil就连接好了,仿真结果可以在Pro-teus或者Keil中看到。该电路系统采用“一线总线”数字传感器DS18B20实现温度的采集,采用LCD1602液晶显示器进行数据显示。首先启动Proteus并从Proteus元件库中选择需要的元件绘制电路图并设置相应元件的参数值,同时在keil里面编写好所需程序,然后将程序与仿真图进行连接,实现电路仿真

五、硬件设计

系统硬件设计包括温度采集设计、控制电路设计、通信接口电路设计。

采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和单片机构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。该系统利用单片机控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。

DS18B20温度传感器的1脚接地, 2脚作为信号线,与单片机的P3.3管脚相接;3脚接电源,显示电路采用LCD屏。

六、软件设计

1 功能概述

本系统的软件由汇编语言编写,程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。

     2 系统软件流程图

       

3、具体程序

TEMP_ZH   DATA  24H     ;实时温度值存放单元

          TEMPL     DATA  25H     ;

          TEMPH     DATA  26H     ;    

          TEMP_TH   DATA  27H     ;高温报警值存放单元

          TEMP_TL   DATA  28H     ;低温报警值存放单元

          TEMPHC    DATA  29H     ;

          TEMPLC    DATA  2AH

          K1     EQU  P1.4

          K2     EQU  P1.5

          K3     EQU  P1.6

          K4     EQU  P1.7

          BEEP   EQU  P2.6

       BEEP1  EQU  P2.3

          RELAY  EQU  P3.7

          LCD_X     EQU  2FH      ;LCD 地址变量

          LCD_RS    EQU  P2.0

          LCD_RW    EQU  P2.1

          LCD_EN    EQU  P2.2

          flag1     equ  20H.0    ;DS18B20是否存在标记

          KEY_UD    EQU  20H.1    ;设定 KEY 的UP与DOWN 标记

          date_line equ p3.3

;=====================================================

           ORG  0000H

           JMP  MAIN

MAIN:     MOV  SP,#60H

          MOV  A,#00H

          MOV  R0,#20H       ;将 20H-2FH 单元清零

          MOV  R1,#10H

CLEAR:    MOV  @R0,A

          INC  R0

          DJNZ  R1,CLEAR

          CALL  SET_LCD

          CALL  RE_18B20

start:    CALL  RESET          ;18B20复位子程序

          JNB   FLAG1,START1   ;DS1820不存在

          CALL  MENU_OK

          CALL  READ_E2

          CALL  TEMP_BJ        ;显示温度标记

          JMP   START2

START1:   CALL  MENU_ERROR

          CALL  TEMP_BJ        ;显示温度标记

          JMP  $

START2:

          CALL  RESET

          JNB  FLAG1,START1    ;DS1820不存在

          MOV   A,#0CCH        ; 跳过ROM匹配

          CALL  WRITE

          MOV   A,#44H         ; 发出温度转换命令

          CALL  WRITE

          CALL  RESET

          MOV   A,#0CCH        ; 跳过ROM匹配

          CALL  WRITE

          MOV   A,#0BEH        ; 发出读温度命令

          CALL  WRITE

          CALL  READ

          call CONVTEMP

          Call DISPBCD

          CALL CONV

          CALL TEMP_COMP

          CALL  PROC_KEY       ; 键扫描

          SJMP    START2

;-----------------------------------------------------

PROC_KEY:

     JB  K1,PROC_K1          ; 按键K1处理

         CALL  BEEP_BL

         JNB  K1,$

         MOV  DPTR,#M_ALAX1

         MOV  A,#1

         CALL  LCD_PRINT

         CALL  LOOK_ALARM

         JB  K3,$

         CALL  BEEP_BL

         JMP  PROC_K2

PROC_K1:              ; 按键K2处理

         JB  K2,PROC_END

         CALL  BEEP_BL

         JNB  K2,$

         MOV   DPTR,#RESET_A1

         MOV   A,#1

         CALL  LCD_PRINT

         CALL  SET_ALARM

         CALL  RE_18B20           ;将设定的TH,TL值写入DS18B20内

         CALL  WRITE_E2

PROC_K2:

         CALL  MENU_OK

         CALL  TEMP_BJ

PROC_END:

         RET

;============================================

;设定报警值 TH、TL

;============================================

SET_ALARM:

         CALL  LOOK_ALARM

AS0:

         JB   K1,AS00

         CALL  BEEP_BL

         JNB  K1,$

         CPL  20H.1            ;UP/DOWN 标记

AS00:    JB  20H.1,ASZ01       ;20H.1=1,UP

         JMP  ASJ01            ;20H.1=0,DOWN

ASZ01:   JB  K2,ASZ02          ;TH值调整(增加)

         CALL  BEEP_BL

         INC  TEMP_TH

         MOV  A,TEMP_TH

         CJNE  A,#120,ASZ011

         MOV  TEMP_TH,#0

ASZ011:  CALL  LOOK_ALARM

         MOV  R5,#10

         CALL  DELAY

         JMP  ASZ01

ASZ02:   JB  K3,ASZ03          ;TL值调整(增加)

         CALL  BEEP_BL

         INC  TEMP_TL

         MOV  A,TEMP_TL

         CJNE  A,#99,ASZ021

         MOV  TEMP_TL,#00H

ASZ021:  CALL  LOOK_ALARM    ;

         MOV  R5,#10

         CALL  DELAY

         JMP  ASZ02

ASZ03:   JB  K4,AS0          ;确定调整 OK

         CALL  BEEP_BL

         JNB  K4,$

         RET

ASJ01:

         JB  K2,ASJ02          ;TH值调整 (减少)

         CALL  BEEP_BL

         DEC   TEMP_TH

         MOV  A,TEMP_TH

         CJNE  A,#0FFH,ASJ011

         JMP  ASJ022

ASJ011:  CALL  LOOK_ALARM

         MOV  R5,#10

         CALL  DELAY

         JMP  AS0

ASJ02:   JB  K3,ASJ03         ;TL值调整(减少)

         CALL  BEEP_BL

         DEC  TEMP_TL

         MOV  A,TEMP_TL

         CJNE  A,#0FFH,ASJ021

         JMP  ASJ022

ASJ021:  CALL  LOOK_ALARM    ;

         MOV  R5,#10

         CALL  DELAY

         JMP  AS0

ASJ022:  CPL  20H.1

         JMP  ASZ01

ASJ03:   JMP  ASZ03

         RET

RESET_ALARM:

          MOV  DPTR,#RESET_A1  ;指针指到显示信息区

          MOV  A,#1            ;显示在第一行

          CALL  LCD_PRINT

          RET

RESET_A1:

     DB  "RESET ALERT CODE"

;====================================================

;实际温度值与标记温度值比较子程序

;====================================================

TEMP_COMP:

          MOV  A,TEMP_TH       

          SUBB  A,TEMP_ZH       ;减数>被减数,则

          JC  CHULI1            ;借位标志位C=1,转

          MOV  A,TEMP_ZH

          SUBB  A,TEMP_TL      ;减数>被减数,则

          JC  CHULI2            ;借位标志位C=1,转

          MOV  DPTR,#BJ5

          CALL  TEMP_BJ3

          CLR   RELAY           ;继电器吸合

          RET

 CHULI1:

          MOV  DPTR,#BJ3

          CALL  TEMP_BJ3

          CALL  BEEP_BL

          RET

 CHULI2:

          MOV  DPTR,#BJ4

          CALL  TEMP_BJ3

          CALL  BEEP_BH

          RET

;-----------------------------------------

TEMP_BJ3:

          MOV  A,#0CEH

          CALL WCOM

          MOV  R1,#0

          MOV  R0,#2

BBJJ3:    MOV  A,R1

          MOVC A,@A+DPTR

          CALL  WDATA

          INC R1

          DJNZ  R0,BBJJ3

          RET

BJ3:

DB ">H"

BJ4:

DB "BJ5:

      DB  " !"

;==================================================

;显示温度标记子程序

;==================================================

TEMP_BJ:

          MOV  A,#0CBH

          CALL WCOM

          MOV  DPTR,#BJ1  ;指针指到显示消息

          MOV  R1,#0

          MOV  R0,#2

BBJJ1:    MOV  A,R1

          MOVC A,@A+DPTR

          CALL  WDATA

          INC R1

          DJNZ  R0,BBJJ1

          RET

BJ1:

      DB  00H,"C"

;=================================================

MENU_OK:

          MOV  DPTR,#M_OK1  ;指针指到显示消息

          MOV  A,#1          ;显示在第一行

          CALL  LCD_PRINT

          MOV  DPTR,#M_OK2  ;指针指到显示消息

          MOV  A,#2          ;显示在第一行

          CALL  LCD_PRINT

          RET

M_OK1:

    DB   "   DS18B20 OK   ",0

M_OK2:

    DB   " TEMP:          ",0

;-----------------------------------------------

MENU_ERROR:

          MOV  DPTR,#M_ERROR1  ;指针指到显示消息1

          MOV  A,#1          ;显示在第一行

          CALL  LCD_PRINT

          MOV  DPTR,#M_ERROR2  ;指针指到显示消息1

          MOV  A,#2          ;显示在第一行

          CALL  LCD_PRINT

          RET

M_ERROR1:

    DB   " DS18B20 ERROR  ",0

M_ERROR2:

    DB   " TEMP: ----     ",0

;====================================================

RESET:  setb date_line

        nop

        clr date_line

        mov r0,#6bh         ;主机发出延时复位低脉冲

        mov r1,#04h

tsr1:   djnz r0,$

        mov r0,#6bh

        djnz r1,tsr1

        setb date_line        ;然后拉高数据线

        nop

        nop

        nop

        mov r0,#32h

tsr2:   jnb date_line,tsr3   ;等待DS18B20回应

        djnz r0,tsr2

        jmp tsr4             ; 延时

tsr3:   setb flag1           ; 置标志位,表示DS1820存在

        jmp tsr5

tsr4:   clr flag1            ; 清标志位,表示DS1820不存在

        jmp tsr7

tsr5:   mov r0,#06bh

tsr6:   djnz r0,$            ; 时序要求延时一段时间

tsr7:   setb date_line

        ret

;=======================================================

RE_18B20:

        JB  FLAG1,RE_18B20A

        RET

RE_18B20A:

        CALL  RESET

        MOV  A,#0CCH       

        LCALL  WRITE

        MOV  A,#4EH        ;写暂存寄存器

        LCALL  WRITE

        MOV  A,TEMP_TH     ;TH(报警上限)

        LCALL  WRITE

        MOV  A,TEMP_TL     ;TL(报警下限)

        LCALL  WRITE

        MOV  A,#7FH        ;12位精确度

        LCALL  WRITE

        RET

;------------------------------------------------------------

WRITE_E2:

        CALL  RESET

        MOV  A,#0CCH        ;跳过ROM匹配

        LCALL  WRITE

        MOV  A,#48H         ;把暂存器里的温度报警值拷贝到EEROM

        LCALL  WRITE

        RET

;--------------------------------------------------------------

READ_E2:

        CALL  RESET

        MOV  A,#0CCH        ;跳过ROM匹配

        LCALL  WRITE

        MOV  A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器

        CALL  WRITE

        RET

;--------------------------------------------------------------

;将自定义字符写入LCD1602的CGRAM中

;--------------------------------------------------------------

STORE_DATA:

        MOV  A,#40H

        CALL  WCOM

        MOV  R2,#08H

        MOV  DPTR,#D_DATA

        MOV  R3,#00H

S_DATA:

        MOV  A,R3

        MOVC  A,@A+DPTR

        CALL  WDATA      ;写入数据

        INC  R3

        DJNZ  R2,S_DATA

        RET

D_DATA:

    DB  0CH,12H,12H,0CH,00H,00H,00H,00H

;==============================================================

write:  mov r2,#8            ;一共8位数据

        CLR  C

wr1:

        clr date_line        

        mov r3,#07

        djnz r3,$            

        rrc a                

        mov date_line,c      

        mov r3,#3CH

        djnz r3,$            

        setb date_line       

        nop

        djnz r2,wr1         

        setb date_line

        ret

;--------------------------------------------------------------------

read:    mov r4,#3         

         mov r1,#TEMPL        

re00:    mov r2,#8

re01:    clr cy

         setb date_line

         nop

         nop

         clr date_line       

         nop

         nop

         nop

         setb date_line       

         mov r3,#09           

         djnz r3,$

         mov c,date_line      

         mov r3,#3CH

         djnz r3,$           

         rrc a                

         djnz r2,re01         

         mov @r1,a

         inc r1

         djnz r4,re00

         ret

;*****************************************************

;  处理温度 BCD 码子程序

;****************************************************

CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下

               ANL  A,#80H

               JZ  TEMPC1         ;温度零上转

               CLR  C

               MOV  A,TEMPL       ;二进制数求补(双字节)

               CPL  A             ;取反加1

               ADD  A,#01H

               MOV  TEMPL,A

               MOV  A,TEMPH

               CPL  A

               ADDC  A,#00H

               MOV  TEMPH,A

               SJMP  TEMPC11

TEMPC1:        MOV  TEMPHC,"+"     ;+

TEMPC11:       MOV  A,TEMPHC

               SWAP  A

               MOV  TEMPHC,A

               MOV  A,TEMPL

               ANL  A,#0FH              ;乘0.0625

               MOV  DPTR,#TEMPDOTTAB

               MOVC  A,@A+DPTR

               MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD

               MOV  A,TEMPL             ;整数部分

               ANL  A,#0F0H             ;取出高四位

               SWAP  A

               MOV  TEMPL,A

               MOV  A,TEMPH             ;取出低四位

               ANL  A,#0FH

               SWAP  A

               ORL  A,TEMPL             ;重新组合

               MOV  TEMP_ZH,A

               LCALL  HEX2BCD1

               MOV  TEMPL,A

               ANL  A,#0F0H

               SWAP  A

               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD

               MOV  TEMPHC,A

               MOV  A,TEMPL

               ANL  A,#0FH

               SWAP  A                  ;TEMPLC HI = 个位数 BCD

               ORL  A,TEMPLC

               MOV  TEMPLC,A

               MOV  A,R4

               JZ  TEMPC12

               ANL  A,#0FH

               SWAP  A

               MOV  R4,A

               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD

               ANL  A,#0FH

               ORL  A,R4

               MOV  TEMPHC,A

TEMPC12:       RET

;---------------------------------------------------------------

HEX2BCD1:

              MOV  B,#0H          ;十六进制-> BCD

              DIV  AB               ;B= A % 100

              MOV  R4,A             ;R7 = 百位数

              MOV  A,#0AH

              XCH  A,B

              DIV  AB               ;B = A % B

              SWAP  A

              ORL  A,B

              RET

;-------------------------------------------------------------

;  小数部分码表

;-------------------------------------------------------------

TEMPDOTTAB:

         DB   00H,00H,01H,01H,02H,03H,03H,04H

         DB   05H,05H,06H,06H,07H,08H,08H,09H

;=====================================================

LOOK_ALARM:

          MOV  DPTR,#M_ALAX2   ;指针指到显示信息区

          MOV  A,#2            ;显示在第二行

          CALL  LCD_PRINT

          MOV  A,#0C6H

          CALL  TEMP_BJ1

          MOV  A,TEMP_TH       ;加载TH数据

          MOV  LCD_X,#3        ;设置位置

          CALL  SHOW_DIG2H     ;显示数据

          MOV  A,#0CEH

          CALL  TEMP_BJ1

          MOV  A,TEMP_TL       ;加载TL数据

          MOV  LCD_X,#12       ;设置位置

          CALL  SHOW_DIG2L     ;显示数据

          RET

;--------------------------------------------

M_ALAX1:

     DB   " LOOK ALERT CODE",0

M_ALAX2:

     DB   "TH:      TL:    ",0

;--------------------------------------------

TEMP_BJ1:

          CALL WCOM

          MOV  DPTR,#BJ2      ;指针指到显示信息区

          MOV  R1,#0

          MOV  R0,#2

BBJJ2:    MOV  A,R1

          MOVC A,@A+DPTR

          CALL  WDATA

          INC R1

          DJNZ  R0,BBJJ2

          RET

BJ2:

      DB  00H,"C"

;---------------------------------------------------

SHOW_DIG2H:                ;在 LCD 的第二行显示数字

          MOV  B,#100

          DIV  AB

          ADD  A,#30H

          PUSH  B

          MOV  B,LCD_X

          CALL  LCDP2

          POP  B

          MOV  A,#0AH

          XCH  A,B

          DIV  AB

          ADD  A,#30H

          INC  LCD_X

          PUSH  B

          MOV  B,LCD_X

          CALL  LCDP2

          POP  B

          INC  LCD_X

          MOV  A,B

          MOV  B,LCD_X

          ADD  A,#30H

          CALL  LCDP2

          RET

SHOW_DIG2L:                ;在 LCD 的第二行显示数字

          MOV  B,#100

          DIV  AB

          MOV  A,#0AH

          XCH  A,B

          DIV  AB

          ADD  A,#30H

          PUSH  B

          MOV  B,LCD_X

          CALL  LCDP2

          POP  B

          INC  LCD_X

          MOV  A,B

          MOV  B,LCD_X

          ADD  A,#30H

          CALL  LCDP2

          RET

;-------------------------------------------------------------

;显示区 BCD 码温度值刷新子程序

;-------------------------------------------------------------

DISPBCD:

              MOV  A,TEMPLC

              ANL  A,#0FH

              MOV  70H,A                 ;小数位

              MOV  A,TEMPLC

              SWAP  A

              ANL  A,#0FH

              MOV  71H,A                 ;个位

              MOV  A,TEMPHC

              ANL  A,#0FH

              MOV  72H,A                 ;十位

              MOV  A,TEMPHC

              SWAP  A

              ANL  A,#0FH

              MOV  73H,A                 ;百位

              MOV  A,TEMPHC

              ANL  A,#0F0H

              CJNE  A,#010H,DISPBCD0

              SJMP  DISPBCD2

DISPBCD0:     MOV  A,TEMPHC

              ANL  A,#0FH

              JNZ  DISPBCD2               ;十位数是0

              MOV  A,TEMPHC

              SWAP  A

              ANL  A,#0FH

              MOV  73H,#0AH               ;符号位不显示

              MOV  72H,A                  ;十位数显示符号

DISPBCD2:     RET

;==========================================================

; LCD 1602 显示子程序

;==========================================================

CONV:

          MOV  A,73H         ;加载百位数据

          MOV  LCD_X,#5      ;设置位置

          CJNE A,#1,CONV1

          JMP  CONV2

CONV1:    MOV  A,#" "

          MOV  B,LCD_X

          CALL  LCDP2

          JMP  CONV3

CONV2:    CALL  SHOW_DIG2    ;显示数据

CONV3:    INC  LCD_X             ;

          mov  a,72h         ;十位

          CALL  SHOW_DIG2

          inc  LCD_X

          mov  a,71h         ;个位

          CALL  SHOW_DIG2

          inc  LCD_X

          MOV  A,#'.'

          MOV  B,LCD_X

          CALL  LCDP2

          MOV  A,70h         ;加载小数点位

          INC  LCD_X         ;设置位置

          CALL  SHOW_DIG2    ;显示数据

          RET

;-------------------------------------------------------

SHOW_DIG2:                 ;在 LCD 的第二行显示数字

          ADD  A,#30H

          MOV  B,LCD_X

          CALL  LCDP2

          RET

;---------------------------------------------------------

LCDP2:                    ;在LCD的第二行显示字符

         PUSH  ACC        ;

         MOV  A,B         ;设置显示地址

         ADD  A,#0C0H     ;设置LCD的第二行地址

         CALL  WCOM       ;写入命令

         POP  ACC         ;由堆栈取出A

         CALL  WDATA      ;写入数据

         RET

;---------------------------------------------------------

SET_LCD:                     ;对 LCD 做初始化设置及测试

          CLR  LCD_EN

          MOV R5,#15

          CALL DELAY

          CALL  INIT_LCD     ;初始化 LCD

          CALL  STORE_DATA   ;将自定义字符存入LCD的CGRAM

          RET

INIT_LCD:                  ;8位I/O控制 LCD 接口初始化

          MOV  A,#38H        ;双列显示,字形5*7点阵

          CALL  WCOM

          call  delay1

          MOV  A,#38H        ;双列显示,字形5*7点阵

          CALL  WCOM

          call  delay1

          MOV  A,#38H ;双列显示,字形5*7点阵

          CALL  WCOM

          call  delay1

          CALL BUSY

          MOV  A,#38H

          CALL  WCOM

          call  delay1

          CALL BUSY

          MOV  A,#10H        ;光标自动左移

          CALL  WCOM

          call  delay1

          CALL BUSY

          MOV  A,#08H

          CALL  WCOM

          call  delay1

          CALL BUSY

          MOV  A,#06H

          CALL  WCOM

          call  delay1

          CALL BUSY

          MOV  A,#0CH        ;开显示,显示光标,光标不闪烁

          CALL  WCOM

          call  delay1

          RET

;==================================================

CLR_LINE1:                   ;清除LCD的第一行字符

          MOV  A,#80H        ;设置 LCD 的第一行地址

          CALL  WCOM         ;

          MOV  R0,#24        ;设置计数值

    C1:   MOV  A,#' '        ;载入空格符至LCD

          CALL  WDATA        ;输出字符至LCD

          DJNZ  R0,C1        ;计数结束

          RET

;==================================================

LCD_PRINT:       ;在LCD的第一行或第二行显示字符

          CJNE  A,#1,LINE2  ;判断是否为第一行

  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址

          CALL  WCOM        ;写入命令

          CALL  CLR_LINE    ;清除该行字符数据

          MOV  A,#80H       ;设置 LCD 的第一行地址

          CALL  WCOM        ;写入命令

          JMP  FILL

  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址

          CALL  WCOM        ;写入命令

          CALL  CLR_LINE    ;清除该行字符数据

          MOV  A,#0C0H      ;设置 LCD 的第二行地址

          CALL  WCOM

  FILL:   CLR  A            ;填入字符

          MOVC  A,@A+DPTR   ;由消息区取出字符

          CJNE  A,#0,LC1    ;判断是否为结束码

          RET

  LC1:    CALL  WDATA       ;写入数据

          INC  DPTR         ;指针加1

          JMP  FILL         ;继续填入字符

          RET

;=========================================

CLR_LINE:                  ;清除该行 LCD 的字符

          MOV  R0,#24

   CL1:   MOV  A,#' '

          CALL  WDATA

          DJNZ  R0,CL1

          RET

   DE:    MOV  R7,#250

          DJNZ  R7,$

          RET

;============================================

WCOM:                     ;以8位控制方式将命令写至LCD

          MOV  P0,A       ;写入命令

          CLR LCD_RS      ;RS=L,RW=L,D0-D7=指令码,E=高脉冲

          CLR LCD_RW

          SETB LCD_EN

          ACALL DELAY1        

          CLR LCD_EN

          RET

;=============================================

WDATA:                    ;以8位控制方式将数据写至LCD

          MOV  P0,A       ;写入数据

          SETB  LCD_RS        

          CLR  LCD_RW

          SETB  LCD_EN        

          CALL  DE

          CLR  LCD_EN

          CALL  DE

          RET

;=============================================

;PRINT A CHAR ON LINE 1

;A=ASC DATA, B=LINE X POS

;==============================================

LCDP1:                    ;在LCD的第一行显示字符

         PUSH  ACC        ;

         MOV  A,B         ;设置显示地址

         ADD  A,#80H      ;设置LCD的第一行地址

         CALL  WCOM       ;写入命令

         POP  ACC         ;由堆栈取出A

         CALL  WDATA      ;写入数据

         RET

;==============================================

BEEP_BL:

         MOV  R6,#100

 BL2:    CALL  DEX1

         CPL  BEEP

     CPL  RELAY

         DJNZ  R6,BL2

         MOV  R5,#10

         CALL  DELAY

         RET

 DEX1:   MOV  R7,#180

 DE2:    NOP

         DJNZ  R7,DE2

         RET

BEEP_BH:

         MOV  R6,#100

 BL22:    CALL  DEX11

         CPL  BEEP1

     CPL  RELAY

         DJNZ  R6,BL22

         MOV  R5,#10

         CALL  DELAY

         RET

 DEX11:   MOV  R7,#180

 DE22:    NOP

         DJNZ  R7,DE22

         RET

DELAY:                    ;(R5)*延时10MS

         MOV  R6,#50

 DL1:    MOV  R7,#100

         DJNZ  R7,$

         DJNZ  R6,DL1

         DJNZ  R5,DELAY

         RET

DELAY1:                    ;延时5MS

         MOV  R6,#25

 DL2:    MOV  R7,#100

         DJNZ  R7,$

         DJNZ  R6,DL2

         RET

BUSY:   

        PUSH ACC           

TT0:    

        MOV A,P0                                                          

        ANL A,#80H

        JNZ TT0

        POP ACC

        RET

;================================================

         END

七、总结

       经过两个周的设计以及调试,我和我的合作者基本上完成了该课程设计的设计要求,能读出并显示DS18B20采集的温度,并且能够实现高低温报警,能通过对按键的处理来调节高低温报警温度,但还是有一项问题困扰着我们,我们至今也无法解决,这个问题就是LCD负数显示不正常,我们研究了好久也没找出原因何在,我们曾认为是程序上的错误,但经过好几次的修改也未获得成。但我想我们会在以后的学习中慢慢把这个问题解决。

八、设计体会及今后的改进意见

本系统采用采用单片机和数字温度转换器DS18B20 来实现,具有主机接口简单,结构灵活,调试方便等特点,实验结果表明这种测温系统转换速度快、精度高。

        课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

        回顾起此次课程设计,我们感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多东西。这次实习不仅巩固了以前所学过的知识,而且学到了很多在书本上没有的知识。通过这次课程设计,我们得到了一些工程项目知识,懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和思考的能力。在设计的过程中,我们经常遇到问题,可以说是困难重重,这毕竟第一次做,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。虽然两个周的课程设计过去了,但此次课程设计暴露了我不少问题,虽然在课堂上我学了不少东西,但当付诸于实际时却摸不着头脑,所以我们不但要学习知识,还要在实践中运用知识,做到游刃有余。不管是在以后的工作或学习中,我都会全力以赴,积极思考,勇于探索,不断创新!

   在设计中遇到了很多编程方面的调试问题,最后在老师的辛勤指导和同学的帮助下,终于迎刃而解。在此对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢!

九、参考文献

    1、《电子设计自动化技术基础》马建国、孟宪元编 清华大学出版   2004年4月

     2、 《实用电子系统设计基础》    姜威    2008年1月

     3、  《单片机系统的PROTEUS设计与仿真》    张靖武    2007年4月

     4、 《单片机测控系统设计大全》    王福瑞  北京航空航天大学出版社1998年4月

十、图纸部分

1、电路仿真图

2、功能结果图

    2.1、DS18B20连接不正常,LCD显示“DS18B20 ERROR” 

      

     2.2、正常显示,LCD显示“DS18B20 OK”,同时显示DS18B20所测温度              

      2.3、按下K3键,LCD显示高低温报警温度,如下图

           

      2.4、按下K2键,再通过K2、K1键设置高低温报警温度,LCD显示如下

           设置前设置后

      2.5、高温报警,LCD显示“>H”高温报警灯闪,同时喇叭发出蜂鸣          

      2.6、低温报警,LCD显示“        下载本文

显示全文
专题