摘要…………………………………………………………………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 " 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显示“