当前位置:首页 >> 电子/电路 >>

DS18B20+DS1302项目报告


题目: 项目管理人: 硬件负责人: 软件负责人: 发题时间: 交题时间: 班级: 指导老师:

DS18B20+24C02+按键 罗俊杰 罗俊杰 罗俊杰 2012/3/10 2012/3/24 电研二班 王筝老师

1

摘要:
本温度测量仪由 8 位 MCU 单片机为主控制器,通过 DS18B20对温度的 采集, 24C02 保存上下限温度报警值, 按键可以调节上下限报警温度, DS1302 时钟显示,LCD1602 显示,自动进入待机省电模式。该系统能测量温度范围 在:-55 度到+128 度。测量精度达到 1%是理想的测温系统。

关键词: DS18B20,DS24C02,LCD1602,DS1302。



题目要求: 实现 DS18B20 测温,温度范围(-55~+128) ,通过 LCD1602 显示。 按键进行上下限温度调节,和断电保存上下限温度值,并且可以实现报警功 能,另外就是通过 1302 显示时间。 题目分析: 1.DS18B20 能够实现正常的温度测量 2.LCD1602 要能够显示出 DS18B20 的温度值,以及 1302 的时间, 年月日星期,显示。 3.1302 时钟模块要能够正常显示时间,年月日,星期的显示。
2



4.按键能够调整上下限报警的温度值。 三.功能描述: 当开启时,同一个界面同时显示 1302 时间时间显示模块,通过按 键可以跳转到另一个界面, 调节上下限温度值, 当温度超过上下限温度值时, 蜂鸣器会自动报警。

四.硬件电路设计

3

五.汇编程序代码:

;**************************************************** ;程序编写人:罗俊杰,QQ:849833861 ;程序编写时间:2012 年 3 月 17 日 于源点 EIC 实验室

;程序实现的功能:DS18B20 测温+1302 时钟+24C02 存储 ;**************************************************** TEMP_ZH TEMPL TEMPH TEMP_TH TEMP_TL TEMPHC TEMPLC TEMPFC LCD_X COUNT COUNT1 FLAG1 RELAY BEEP lcd ce equ equ DATA DATA DATA DATA DATA DATA DATA EQU EQU EQU EQU EQU EQU EQU p0 p2.1 ;复位脚
4

24H 25H 26H 27H 28H 29H 2AH 2BH 2FH 51H ; ;

;实时温度值存放单元 ; ; ;高温报警值存放单元 ;低温报警值存放单元 ;

;LCD 字符显示位置 ;1s 计时

52H ;60s 计时 20H.0 P1.3 P3.3 ;DS18B20 是否存在标志 ;指示灯 ;蜂鸣器

dio clk rs rw en dq

equ equ equ

p2.2 p2.3 p2.4

;数据脚 ;时钟

equ p2.5 equ equ p2.6 p3.7 equ 40h ;分 ;时 ;天 44h ;月 ;周 ;年 ;秒 ;使能端

second minute hour day month week year bcd hex K1 K2 K3 K4 SDA SCL org equ equ

equ 41h equ 43h equ 42h

equ 45h equ 46h equ 47h 48h EQU EQU EQU EQU P1.4 P1.5 P1.6 P1.7

;查看温度报警设置值,并能调节加减 ;低温报警值加减按键 ;高温报警值加减按键 ;保存设置值并退出 ;定义 24C02 数据线 ;定义 24C02 时钟线

BIT P1.0 BIT P1.1 0000h ajmp org 0030h start

;*****************初始化*********************************** start: MOV LCALL SP,#60H SET_LCD ;对 LCD 做初始化设置及测试 ;DS18B20 暂存器操作子程序
5

LCALL

RE_18B20

LCALL

RST

;调用 18B20 复位子程序(初始化)

/////////////////////////////////////////////////////////////////// lcall lcall lcall lcall lcall ds1302csh lcdcsh w1302 r1302 display ;调用 1302 初始化子程序 ;调用 lcd 初始化子程序 ;调用 1302 写子程序 ;调用 1302 读子程序 ;调用显示子程序

;************************************************************* main: CALL : CALL AJMP MK3 MAIN ;ds18b20 的写读及显示加 1302 时钟显示 MK1 ;判断 DS18B20是否响应以及初始值的设定

;************************************************************* MK4: MK1: AJMP JNB LCALL 序 CALL RET ;************************************************************* MK3: LCALL JNB 序 MOV LCALL MOV LCALL LCALL A,#0CCH WRITE A,#44H WRITE RST ;跳过 ROM 匹配命令 ;DS18B20 数据写入操作子程序 ;温度转换命令 ;DS18B20 数据写入操作子程序 ;调用 DS18B20 复位子程序
6

MK2 FLAG1,MK4 MENU_OK

;跳转到错误子程序 ;DS1820 不存在 ;DS1820 存在,调用显示正确信息子程

RD_EEPROM

;将报警温度值从 EEPROM 中读出来

RST FLAG1,MK4

;调用 DS18B20 复位子程序 ;DS18B20 不存在跳转到错误显示子程

MOV LCALL MOV LCALL LCALL LCALL LCALL LCALL LCALL 程序 LCALL

A,#0CCH WRITE A,#0BEH WRITE READ CONVTEMP DISPBCD CONV TEMP_COMP

;跳过 ROM 匹配 ;DS18B20 数据写入操作子程序 ;读温度命令

;调用 DS18B20 数据读取操作子程序 ;调用温度数据 BCD 码处理子程序 ;调用温度数据显示子程序 ;调用 LCD 显示处理子程序 ;调用实测温度值与设定温度值比较子

PROC_KEY

;调用键扫描子程序

;******************************************************************** ****** LCALL SJMP SHIZHONG MK3 ;调用 1302 时钟模块

;******************************************************************** * SHIZHONG:mov mov mov setb lp1: jbc clr lp2: mov mov lcall lcall setb tf0,lp2 tr0 th0,#70h tl0,#00h r1302 display tr0
7

tmod,#01h th0,#70h tl0,#00h tr0

;用定时器 0,方式一工作 ;为定时器赋初值

;定时器溢出跳到 lp2 处并将 tf0 清零

;为定时器赋初值

;调用读 1302 子程序 ;调用显示程序

RET ;******************LCD 初始化********************************** set_lcd: CLR EN LCALL LCALL RET ;//////////////////////////////////////////////////////////////////// /////// ;设置 1302 初值子程序 ds1302csh:mov second,#00h mov mov mov mov mov mov minute,#57h hour,#15h day,#17h month,#03h week,#06h year,#12h ;时 ;天 ;月 ;周 ;年 ;分 ;miao 秒 INIT_LCD STORE_DATA ;初始化 LCD ;将自定义字符存入 LCD 的 CGRAM

;//////////////////////////////////////////////////////////////////// / ;lcd 初始化子程序 lcdcsh: mov lcd,#38h

lcall xzl mov lcd,#08h

lcall xzl mov lcd,#01h

lcall xzl mov lcd,#06h

lcall xzl mov lcd,#0ch
8

lcall xzl ;///////////////////////////// ;1302 写数据子程序 w1302: clr ce clr clk nop setb ce ;复位脚置高电平 ;送操作地址 ;调用写字节子程序 ;送操作数 ;调用写字节子程序 ;串行时钟置高电平,下降沿有效 ;禁止写入数据 ;复位脚置低电平 ;串行时钟置低电平

mov b,#8eh lcall wbit

mov b,#00h lcall setb clr ce wbit clk

mov r0,#second ;将秒寄存器送到 r0 mov r1,#80h mov r7,#7 ;将 80h 送到 A ;将 r7 送 7

///////////////////////////////////////////////////////////////////// ///// wloop: clr ce clr clk nop setb ce ;复位脚置高电平,准备写数据 ;将 r1 内的数据送给 b ;调用写字节子程序 ;将 r0 内地址中的数送到 A ;将 a 中的数送到十进制寄存器 ;调用十进制转 bcd 码子程序 ;复位脚置低电平 ;复位脚置低电平

mov b,r1 lcall wbit

mov a,@r0 mov hex,a lcall mov b,a lcall wbit

hex_bcd

;将 a 内的数送给 b ;调用写字节子程序
9

inc r0 inc r1 inc r1 setb clr ce djnz clr ce clr clk nop setb ce clk

;r0 加一 ;r1 加一

;串行时钟下降沿写入 ;禁止写入

r7,wloop

;判断是否将年月日等七组数写入 1302

;禁止写入 ;

;准备写入 ;送操作地址 ;调用写字节子程序 ;送操作数 ;调用写字节子程序 ;下降沿有效 ;禁止写入 ;子程序返回

mov b,#8eh lcall wbit

mov b,#80h lcall setb clr ce ret wbit clk

;///////////////////////////// ;写字节子程序 wbit: mov w_loop: mov rrc mov mov setb nop clr djnz clk r2,w_loop ;禁止写入 ;判断是否送完
10

r2,#08h

;给 r2 送 8

a,b a b,a dio,c clk

;b 送给 a ;带进位的右移 A

;sclk 上升沿时写入数据

ret ;///////////////////////////// ;hex 转 bcd 码 hex_bcd: mov a,hex add a,#00h da a ret ;///////////////////////////// ;1302 读数据子程序

;

;将十六进制数送给 A ; ;对 A 进行十进制调整

r1302: mov r0,#second ;将秒寄存器送到 R0 mov r1,#81h mov r7,#7 r_loop: clr clk nop setb ce ;准备写数据 ;将 r1 送到 B ;调用写字节子程序 ;调用读字节子程序 ;将 a 中的数据送到 R0 所指的地址 ;加一 clr ce ;将首读地址送到 R1 ;R7 送 7 ;复位脚清零 ;时钟串行口清零

mov b,r1 lcall lcall wbit rbit

mov @r0,a inc r0 inc r1 inc r1 setb clr ce djnz ret clk

;

r7,r_loop

;判断是否读完

;/////////////////////////////
11

;读字节子程序 rbit: mov r4,#08h rloop: mov c,dio rrc a setb nop clr clk djnz ret ;///////////////////////////// ;显示子程序 display: mov lcd,#80h lcall xzl r4,rloop ;判断是否读完 clk ;送 8 ;读 IO 数据 ;带进位右移 A ;下降沿有效

mov a,#'2' lcall xsj

mov lcd,#81h lcall xzl

mov a,#'0' lcall xsj

mov lcd,#84h lcall xzl

mov a,#2dh lcall xsj

mov lcd,#87h lcall xzl

mov a,#2dh lcall xsj

mov lcd,#8bh
12

lcall

xzl

mov a,#'W' lcall xsj

///////////////////////////////////////////////////////////// mov lcd,#8ch lcall xzl

mov a,#3ah lcall xsj lcd,#0c2h xzl a,#3ah xsj lcd,#0c5h xzl a,#3ah xsj ;以上显示冒号

mov lcall mov lcall mov lcall mov lcall

;////////////以下显示动态////////////////// mov bcd,year lcall mov lcall mov MOVC A,@A+DPTR lcall mov lcall mov mov MOVC xsj lcd,#83h xzl dptr,#tab a,b ;查表
13

;将年送给 bcd ;调用 bcd 码转十进制子程序 ;将显示位置送到 lcd ;调用写指令子程序 ;建表

bcd_dec lcd,#82h xzl dptr,#tab ;查表

;调用写数据子程序 ;将显示位置送到 lcd ;调用写指令子程序 ;建表 ;将 b 送给 A

A,@A+DPTR

lcall mov

xsj

;调用写数据子程序

bcd,month lcall mov lcall mov bcd_dec lcd,#85h xzl dptr,#tab

MOVC

A,@A+DPTR lcall mov lcall mov mov xsj lcd,#86h xzl dptr,#tab a,b

MOVC

A,@A+DPTR lcall xsj bcd,day lcall mov lcall mov bcd_dec lcd,#88h xzl dptr,#tab

mov

MOVC

A,@A+DPTR lcall mov lcall mov mov xsj lcd,#89h xzl dptr,#tab a,b

MOVC

A,@A+DPTR lcall xsj

mov

bcd,week lcall bcd_dec
14

mov lcall mov mov a,b MOVC lcall

lcd,#8dh xzl dptr,#tab

A,@A+DPTR xsj

;///////////////////////////// mov bcd,hour lcall mov lcall mov MOVC A,@A+DPTR lcall mov lcall mov mov MOVC a,b xsj lcd,#0c1h xzl dptr,#tab bcd_dec lcd,#0c0h xzl dptr,#tab

A,@A+DPTR lcall mov lcall mov lcall mov xsj bcd,minute bcd_dec lcd,#0c3h xzl dptr,#tab ;以上显示时

MOVC

A,@A+DPTR lcall mov lcall xsj lcd,#0c4h xzl
15

mov mov MOVC A,@A+DPTR lcall mov lcall mov lcall mov MOVC xsj

dptr,#tab a,b

;以上显示分 ;秒数值赋给 bcd

bcd,second bcd_dec lcd,#0c6h xzl dptr,#tab

A,@A+DPTR lcall mov lcall mov mov xsj lcd,#0c7h xzl dptr,#tab a,b

MOVC

A,@A+DPTR lcall ret xsj ;以上显示秒

;///////////////////////////// bcd_dec: mov mov div ret ;////////////////////////////// ;lcd 写指令子程序 xzl: clr rw a,bcd b,#16 ab

;bcd 转十进制

;a 中放置十位,b 中放置个位

clr rs setb en
16

lcall clr en ret

delay3

;///////////////////////////// ;lcd 写数据子程序 xsj: mov lcd,a

clr rw setb setb lcall clr en ret ;///////////////////////////// ;延时子程序 delay3: mov r5,#4 ;延时 5ms rs en delay3

d0: mov r6,#255 djnz djnz ret ;///////////////////////////// ;表格 tab: DB 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;0 到 9 r6,$ r5,d0

;-------------------------------------------------------------EEPROM: MOV MOV MOV REP: MOV R0,#27H R1,#00H R2,#02H CLR A,@R0
17

;要写入的数据,TH,TL ; 要保存数据的首地址

;数据的长度 A

MOV LCALL INC INC DJNZ RET

B,A WR_Byte R1 R0 R2,REP ;调用 24c02 写子程序

;----------------------------------------WR_Byte: REP_S1: LCALL LCALL JC REP_S2: MOV LCALL MOV Begin A,#0A0H ;调用启动 24c02 子程序 ;写器件地址 ;调用发送一个字节到 I2C 总线子程序 ;调用应答信号检测程序 ;没有应答则重发数据 ;写入地址 ;调用发送一个字节子程序

Send_B WAITACK REP_S1 A,R1 Send_B WAITACK REP_S2

LCALL LCALL JC REP_S3: MOV LCALL LCALL JC LCALL LCALL RET CLR

A A,B Send_B WAITACK REP_S3 STOP Delay ;调用停止子程序 ;10MS 延时 ;写入数据

;//////向 IIC 总线发送一个字节数据子程序///////////////////////////// ;入口参数:A---待发送数据存放在 A 中 ;////////////////////////////////////////////////////////////////// Send_B: S_B: MOV RLC R7,#08H A
18

;发送位数

MOV NOP SETB NOP CLR DJNZ NOP RET

SDA,C

SCL

SCL R7,S_B ;8 位发送完毕?

;//////检测应答信号////////////////////////////////////////////// ;出口参数:C---是否有应答信号 ;//////////////////////////////////////////////////////////////// WAITACK: NOP SETB NOP REP3: CLR NOP RET ;***************** RD_EEPROM: MOV MOV MOV REP1: MOV INC R0,#27H R1,#00H R2,#02H LCALL @R0,A R0 ;设置读出数据保存首地址 ;送读数首地址 ;要读 2 个数 RD_Byte ;调用 24c02 读子程序 MOV SCL C,SDA SCL SETB SDA ;释放 SDA 信号线

;把读出数据送到 TH,TL ;保存数据地址加一,保存在 27H,28H 单元中,

27H 为 TH,28H 为 TL INC R1 ;
19

DJNZ RET

R2,REP1

;

;//////读 24c02 操作子程序/////////////////////////////////////// ;输入参数:R2---要读的字节地址, ;输出参数: A---结果 ;////////////////////////////////////////////////////////////// RD_Byte: LCALL REP_S4: LCALL LCALL JC REP_S5: LCALL LCALL JC REP_S6: MOV LCALL LCALL JC LCALL 程序 LCALL RET ;////// 从 IIC 总 线 上 接 收 一 个 字 节 数 据 子 程 序 Stop MOV Send_B WAITACK REP_S5 LCALL A,#0A1H Send_B WAITACK REP_S6 Receive_B ;调用从 I2C 总线上接收一个字节数据子 Begin ;重发启动信号 ;读数 MOV Send_B WAITACK REP_S4 A,R1 ;送读数地址 Begin A,#0A0H ;启动信号 ;器件地址

;调用发送一个字节子程序

////////////////////////////// ;出口参数:A---接收数据存放在 A 中 ;////////////////////////////////////////////////////////////////////
20

// Receive_B: MOV CLR R_B: NOP MOV RLC CLR NOP DJNZ SETB NOP RET ;//////停止 24c02 子程序/////////////////////////////////// Stop: 为停止信号 NOP SETB NOP SETB NOP CLR RET Begin: ;24C02 启动子程序 SETB 动信号 NOP SETB SDA
21

SETB

SDA

;释放 SDA 数据线 ;一个字节共接收 8 位数据

R7,#08H A SETB SCL

;启动一个时钟周期,读总线

C,SDA A SCL

;将 SDA 状态读入 C ;结果移入A

R7,R_B SDA

;判断 8 位数据是否接收完全?

CLR

SDA

;时钟高电平时数据上升沿

SCL

SDA

SCL

SCL

;时钟高电平时数据下降沿为启

NOP CLR NOP CLR 据 NOP RET ;**************** 无 温 度 显 示 时 子 程 序 SCL ;钳住 IC 总线准备发送或接受数 SDA

************************************************************ MK2: LCALL SJMP RET ;**************LCD 初 始 化 MENU_ERROR $ ;调用显示出错信息子程序

*********************************************** INIT_LCD: MOV A,#38H LCALL LCALL MOV LCALL LCALL MOV LCALL LCALL MOV LCALL LCALL MOV LCALL WCOM DELAY1 A,#38H WCOM DELAY1 A,#38H WCOM DELAY1 A,#0CH WCOM DELAY1 A,#01H WCOM
22

;2 行显示,字形 5*7 点阵

;开显示,显示光标,光标不闪烁

;清除 LCD 显示屏

LCALL RET

DELAY1

;************************DS1820 初始化时序************************ RST: SETB DQ NOP CLR MOV MOV TSR1: DQ R0,#6BH R1,#04H ;主机发出延时复位低脉冲

DJNZ R0,$ MOV R0,#6BH

DJNZ R1,TSR1 SETB DQ NOP NOP NOP MOV TSR2: JNB R0,#32H DQ,TSR3 ;等待 DS18B20 回应 ;拉高数据线

DJNZ R0,TSR2 JMP TSR3: TSR4 ; 延时 ; 置 1 标志位,表示 DS1820 存在

SETB FLAG1 JMP TSR5 FLAG1 TSR7 R0,#06BH

TSR4:

CLR JMP

; 清 0 标志位,表示 DS1820 不存在

TSR5: TSR6: TSR7:

MOV

DJNZ R0,$ SETB DQ RET

; 时序要求延时一段时间

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

LCD
23











********************************** SHOW_DIG2H: MOV B,#100 DIV ADD PUSH MOV LCALL POP MOV XCH DIV ADD INC PUSH MOV LCALL POP INC MOV MOV ADD LCALL RET ;*************************** ***************************** PROC_KEY: JB CALL K1,PROC_K1 BEEP_BL ; 按键 K1 处理 ;调用蜂鸣器处理程序
24

AB A,#30H B B,LCD_X LCDP2 B A,#0AH A,B AB A,#30H LCD_X B B,LCD_X LCDP2 B LCD_X A,B B,LCD_X A,#30H LCDP2













JNB MOV MOV CALL CALL JB CALL JMP PROC_K1: JB CALL JNB MOV MOV CALL CALL CALL PROC_K2: CALL // PROC_END: RET RESET_A1: DB

K1,$

;按键没有松开则继续等待 ;查表,LOOK ALERT CODE

DPTR,#M_ALAX1 A,#1

;设置显示在第一行

LCD_PRINT ;调用第一行显示,显示 LOOK ALERT CODE LOOK_ALARM K3,$ BEEP_BL PROC_K2 ;调用温度报警值显示子程序 ;判断 K3 是否按下,没按下则等待 ;按下了调用蜂鸣器处理程序 ;跳到 PROC_K2 ; 按键 K2 处理 K2,PROC_END BEEP_BL K2,$ ;判断 K2 是否按下,没有按下则跳出去 ;调用蜂鸣器处理程序 ;按键 2 没有松开则等待 ; 表头指向 RESET ALERT CODE

DPTR,#RESET_A1 A,#1 LCD_PRINT SET_ALARM

;设置显示位置为第一行 ;调用 LCD 显示,显示 RESET ALERT CODE ;调用报警值设置子程序 ;将设定的 TH,TL 值写入 EEPROM

EEPROM

MENU_OK TEMP_BJ

;调用正常温度显示,显示 DS18B20 OK ;调用显示温度标记子程序

CALL

"RESET ALERT CODE" 设 定 温 度 报 警 值 TH 、 TL

;*************************** *************************** SET_ALARM: LCALL AS0: JB LOOK_ALARM K1,AS00

25

LCALL JNB CPL AS00: JB JMP ASZ01: JB LCALL INC MOV CJNE MOV ASZ011: LCALL MOV LCALL JMP ASZ02: JB LCALL INC MOV CJNE MOV ASZ021: LCALL MOV LCALL JMP ASZ03: JB LCALL JNB RET

BEEP_BL K1,$ 20H.1 20H.1,ASZ01 ASJ01 K2,ASZ02 BEEP_BL TEMP_TH A,TEMP_TH A,#120,ASZ011 TEMP_TH,#0 LOOK_ALARM R5,#10 DELAY ASZ01 K3,ASZ03 BEEP_BL TEMP_TL A,TEMP_TL A,#99,ASZ021 TEMP_TL,#00H LOOK_ALARM R5,#10 DELAY ASZ02 K4,AS0 BEEP_BL K4,$ ;确定调整 ;TL 值调整(增加) ;UP/DOWN 标记 ;20H.1=1,增加 ;20H.1=0,减小 ;TH 值调整(增加)

26

ASJ01:

JB LCALL DEC MOV CJNE JMP

K2,ASJ02 BEEP_BL TEMP_TH A,TEMP_TH A,#0FFH,ASJ011 ASJ022 LOOK_ALARM R5,#10 DELAY AS0 K3,ASJ03 BEEP_BL TEMP_TL A,TEMP_TL A,#0FFH,ASJ021 ASJ022 LOOK_ALARM R5,#10 DELAY AS0 20H.1 ASZ01 ASZ03 ;

;TH 值调整(减少)

ASJ011:

LCALL MOV LCALL JMP

ASJ02:

JB LCALL DEC MOV CJNE JMP

;TL 值调整(减少)

ASJ021:

LCALL MOV LCALL JMP

ASJ022:

CPL JMP

ASJ03:

JMP RET

RST_A1:

DB

" SET ALERT CODE " ,0

;-------------------------------------------M_ALAX1: DB M_ALAX2:
27

" LOOK ALERT CODE",0

DB

"TH:

TL:

",0

LOOK_ALARM: MOV MOV CALL MOV CALL MOV MOV CALL MOV CALL MOV MOV CALL RET ;******************************************************************** ** TEMP_BJ1: LCALL WCOM MOV MOV MOV BBJJ2: MOV MOVC DPTR,#BJ2 R1,#0 R0,#2 A,R1 A,@A+DPTR ;指针指到显示信息区 DPTR,#M_ALAX2 A,#2 LCD_PRINT A,#0C6H TEMP_BJ1 A,TEMP_TH LCD_X,#3 SHOW_DIG2H A,#0CEH TEMP_BJ1 A,TEMP_TL LCD_X,#12 SHOW_DIG2L ;加载 TL 数据 ;设置位置 ;显示数据 ;加载 TH 数据 ;设置位置 ;显示数据 ;指针指到显示信息区 ;显示在第二行 ;调用显示 ;

LCALL WDATA INC DJNZ RET
28

R1 R0,BBJJ2

BJ2:

DB

00H,"C"

;*********************** 实 测 温 度 值 与 设 定 温 度 值 比 较 子 程 序 ********************** TEMP_COMP:MOV SUBB JC MOV A,TEMP_TH A,TEMP_ZH CHULI1 ;减数>被减数,则 ;借位标志位 C=1,转

A,TEMPFC CJNE A,#0BH,COMP

SJMP CHULI2 COMP: MOV SUBB JC MOV A,TEMP_ZH A,TEMP_TL CHULI2 DPTR,#BJ5 ;减数>被减数,则 ;借位标志位 C=1,转

LCALL TEMP_BJ3 CLR RET CHULI1: MOV DPTR,#BJ3 RELAY ;点亮指示灯

LCALL TEMP_BJ3 SETB RELAY ;熄灭指示灯 ;蜂鸣器响

LCALL BEEP_BL RET CHULI2: MOV DPTR,#BJ4

LCALL TEMP_BJ3 SETB RELAY ;熄灭指示灯 ;蜂鸣器响

LCALL BEEP_BL RET

;----------------------------------------TEMP_BJ3: MOV A,#0CeH

LCALL WCOM
29

MOV MOV BBJJ3: MOV MOVC

R1,#0 R0,#2 A,R1 A,@A+DPTR

LCALL WDATA INC DJNZ RET BJ3: BJ4: BJ5: DB DB DB ">H" "<L" " C" 显 示 区 BCD 码 温 度 值 刷 新 子 程 序 R1 R0,BBJJ3

;************************ ********************** DISPBCD: MOV ANL MOV MOV SWAP ANL MOV MOV ANL MOV MOV SWAP ANL MOV DISPBCD2: RET ;************************ A,TEMPLC A,#0FH 70H,A A,TEMPLC A A,#0FH 71H,A A,TEMPHC A,#0FH 72H,A A,TEMPHC A A,#0FH 73H,A

;小数位

;个位

;十位

;百位

温 度 值
30

BCD

码 处 理 子 程 序

************************* CONVTEMP: MOV ANL JZ CLR MOV CPL ADD MOV MOV CPL A,TEMPH A,#08H TEMPC1 C A,TEMPL A A,#01H TEMPL,A A,TEMPH A ;二进制数求补(双字节) ;取反加 1 ;温度零上转 ;判温度是否零下

ADDC A,#00H MOV MOV MOV TEMPH,A ;负温度标志

TEMPHC,#0BH TEMPFC,#0BH SJMP TEMPC11

TEMPC1: MOV TEMPC11:

MOV

TEMPHC,#0AH

;正温度标志

TEMPFC,#0AH MOV A,TEMPHC

SWAP A MOV MOV ANL MOV TEMPHC,A A,TEMPL A,#0FH DPTR,#TEMPDOTTAB ;乘 0.0625

MOVC A,@A+DPTR MOV MOV ANL TEMPLC,A A,TEMPL A,#0F0H ;TEMPLC LOW=小数部分 BCD ;整数部分 ;取出高四位

SWAP A
31

MOV MOV ANL

TEMPL,A A,TEMPH A,#0FH ;取出低四位

SWAP A ORL MOV A,TEMPL TEMP_ZH,A ;重新组合

LCALL HEX2BCD1 MOV ANL TEMPL,A A,#0F0H

SWAP A ORL MOV MOV ANL A,TEMPHC TEMPHC,A A,TEMPL A,#0FH ;TEMPLC HI = 个位数 BCD ;TEMPHC LOW = 十位数 BCD

SWAP A ORL MOV MOV JZ ANL SWAP MOV MOV ANL ORL MOV TEMPC12: RET 二 A,TEMPLC TEMPLC,A A,R4 TEMPC12 A,#0FH A R4,A A,TEMPHC A,#0FH A,R4 TEMPHC,A

;TEMPHC HI = 百位数 BCD

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

















*****************************
32

HEX2BCD1: MOV DIV MOV MOV XCH DIV SWAP ORL RET TEMPDOTTAB:

B,#064H AB R4,A A,#0AH A,B AB A A,B

DB DB

00H,00H,01H,01H,02H,03H,03H,04H 05H,05H,06H,06H,07H,08H,08H,09H DS18B20

; 小数部分码表

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

数 据 读 取 操 作 子 程 序

************************** READ: 读出 MOV R1,#TEMPL RE00: RE01: MOV R2,#8 CLR CY SETB DQ NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#09 ;开始读总线释放 ;延时 18 微妙 ;读前总线保持为低 ;存入 25H、26H、27H、28H 单元 MOV R4,#4 ;将温度低位、高位、TH、TL 从 DS18B20 中

DJNZ R3,$ MOV C,DQ ;从 DS18B20 总线读得一位
33

MOV

R3,#3CH ;等待 100 微妙 ;把读得的位值环移给 A ;读下一位

DJNZ R3,$ RRC A

DJNZ R2,RE01 MOV INC @R1,A R1

DJNZ R4,RE00 RET ;*************************** ************************* SHOW_DIG2:ADD MOV LCALL RET ;*************************** ************************* LCDP2: PUSH MOV ADD LCALL POP LCALL RET ;******************************** *************************** MENU_OK: MOV MOV LCALL MOV DPTR,#M_OK1 A,#1 LCD_PRINT DPTR,#M_OK2 ;指针指到显示消息
34





















A,#30H B,LCD_X LCDP2





















ACC A,B A,#0C0H WCOM ACC WDATA ;设置显示地址 ;设置 LCD 的第二行地址 ;写入命令 ;由堆栈取出 A ;写入数据

显 示 正 确 信 息 子 程 序

;指针指到显示消息 ;显示在第一行

MOV LCALL RET M_OK1: M_OK2: DB DB

A,#2 LCD_PRINT

;显示在第一行

" " ,0 " ",0 显 示 出 错 信 息 子 程 序

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

MENU_ERROR:MOV MOV LCALL MOV MOV LCALL RET M_ERROR1: DB M_ERROR2: DB " "

DPTR,#M_ERROR1 A,#1 LCD_PRINT DPTR,#M_ERROR2 A,#2 LCD_PRINT

;指针指到显示消息

;显示在第一行

;指针指到显示消息 1 ;显示在第一行

",0 mistake ",0 LCD 的 第 一 行 或 第 二 行 显 示 字 符

;************************* ********************** LCD_PRINT:CJNE LINE1: MOV LCALL LCALL MOV LCALL JMP LINE2: MOV LCALL LCALL A,#1,LINE2 A,#80H WCOM CLR_LINE A,#80H WCOM FILL A,#0C0H WCOM CLR_LINE

;判断是否为第一行 ;设置 LCD 的第一行地址 ;写入命令 ;清除该行字符数据 ;设置 LCD 的第一行地址 ;写入命令

;设置 LCD 的第二行地址 ;写入命令 ;清除该行字符数据
35

MOV

A,#0C0H LCALL WCOM A A,@A+DPTR A,#0,LC1

;设置 LCD 的第二行地址

FILL:

CLR MOVC CJNE RET

;填入字符 ;由消息区取出字符 ;判断是否为结束码

LC1:

LCALL WDATA INC JMP RET DPTR FILL

;写入数据 ;指针加 1 ;继续填入字符

;*************************** **************************** CLR_LINE: MOV CL1: MOV R0,#24 A,#' '





1



LCD







LCALL WDATA DJNZ RET DE: MOV DJNZ RET ;************************** 显 示 数 据 R7,#250 R7,$ R0,CL1

************************************* SHOW_DIG2L: MOV DIV MOV XCH DIV ADD B,#100 AB A,#0AH A,B AB A,#30H
36

PUSH MOV LCALL POP INC MOV MOV ADD LCALL RET B

B B,LCD_X LCDP2

LCD_X A,B B,LCD_X A,#30H LCDP2

;*************************** ************************* CONV: MOV A,73H MOV LCD_X,#8

LCD

显 示 数 据 处 理 子 程 序

;加载百位数据 ;设置位置

CJNE A,#1,CONV1 JMP CONV1: MOV CONV2

CJNE A,#0BH,CONV11 A,#"-" JMP CONV111 A,#" " B,LCD_X LCDP2 CONV3 SHOW_DIG2 LCD_X A,72H SHOW_DIG2 LCD_X
37

;"-"号显示

CONV11: CONV111:

MOV MOV LCALL JMP

;"+"号不显示

CONV2: CONV3:

LCALL INC MOV LCALL INC

;显示数据

;十位

MOV LCALL INC MOV MOV LCALL MOV INC LCALL RET

A,71H SHOW_DIG2 LCD_X A,#'.' B,LCD_X LCDP2 A,70H LCD_X SHOW_DIG2

;个位

;加载小数点位 ;设置显示位置 ;显示数据

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

















******************************* WRITE_E2: LCALL RST A,#0CCH WRITE A,#48H WRITE ;把暂存器里的温度报警值拷贝到 EEROM ;跳过 ROM 匹配

MOV LCALL MOV LCALL RET

;************************ 将 自 定 义 字 符 写 入 ********************* STORE_DATA: MOV LCALL MOV MOV MOV S_DATA: MOV MOVC A,#40H WCOM R2,#08H DPTR,#D_DATA R3,#00H A,R3 A,@A+DPTR
38

LCD



CGRAM



LCALL INC DJNZ RET D_DATA: DB R3

WDATA

;写入数据

R2,S_DATA

0CH,12H,12H,0CH,00H,00H,00H,00H DS18B20 暂 存 器 操 作 子 程 序

;************************ *************************** RE_18B20:JB RET ;********************** FLAG1,RE_18B20A







***************************************************** RE_18B20A: LCALL MOV LCALL WR_SCRAPD: MOV LCALL MOV LCALL MOV LCALL MOV LCALL RET ;*********************** ************************ WRITE: MOV R2,#8 CLR C
39

RST A,#0CCH WRITE ;跳过 ROM 匹配

A,#4EH WRITE A,TEMP_TH WRITE A,TEMP_TL WRITE A,#7FH WRITE

;写暂器

;TH(报警上限)

;TL(报警下限)

;12 位精度

DS18B20

数 据 写 入 操 作 子 程 序

;一共 8 位数据

WR1: 状态

CLR DQ

;开始写入 DS18B20 总线要处于复位(低)

MOV R3,#07 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#3CH DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET ;**************写命令************************************** WCOM: MOV CLR CLR lcd,A RS RW ;以 8 位控制方式将命令写至 LCD ;写入命令 ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 ;写入下一位 ;等待 100 微妙 ;重新释放总线 ;总线复位保持 16 微妙以上 ;把一个字节 DATA 分成 8 个 BIT 环移给 C ;写入一位

SETB EN LCALL DELAY1 CLR RET ;**************写数据************************************** WDATA: MOV SETB CLR SETB CALL lcd,A RS RW EN DE
40

EN

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

CLR CALL RET

EN DE

;============================================== BEEP_BL: MOV D3: CALL CPL DJNZ MOV CALL RET DEX1: MOV DJNZ RET Delay: MOV D1: MOV DJNZ DJNZ DJNZ RET ;****************************延时************************ DELAY1: MOV DL2: MOV DJNZ DJNZ RET
41

;蜂鸣器处理程序 R6,#100 DEX1 BEEP R6,D3 R5,#10 Delay ; ;取反蜂鸣器 ;

R7,#180 R7,$

;(R5)*延时 10MS R6,#50 R7,#50 R7,$ R6,D1 R5,Delay

;延时 5MS R6,#25 R7,#100 R7,$ R6,DL2

;****************结束************************************ end 六.调试经验: 1.当你发现软件不论怎么改都正常显示不了的时候不妨去检查一下硬件,很 可能是硬件上的错误,从而耽误了你很多的时间。 2.DS18B20 主要是在转码的时候有点难度,以及温度的保存,报警。处理数 据的时候一定要注意。 3.1302 模块, 主要就是一个时钟序列的问题了,当你真的把整个数据手册看 懂的话你会觉得 1302 真的好简单的。 2012 年 3 月 26 日 罗俊杰

42


相关文章:
DS18B20+DS1302项目报告.doc
DS18B20+DS1302项目报告 - 题目: 项目管理人: 硬件负责人: 软
DS1302+DS18B20程序.txt
DS1302+DS18B20程序_理学_高等教育_教育专区。液晶显示温度和时间,
ds18b20+ds1302+lcd综合程序.pdf
ds18b20+ds1302+lcd综合程序_信息与通信_工程科技_专业资料。该
DS1302+DS18B20+12864+AT89C52多功能电子时钟设计报告.txt
温度检测模块温度检测模块 温度检测模块 DS1302 DS1302DS1302 DS1302 AT89C52 AT89C52AT89C52 AT89C52 DS18B20 DS18B20DS18B20 DS18B20 图1 系统设计总体...
ds1302 +ds18b20+LCD1602完整程序.doc.doc
DS1302+DS18B20+lcd1602 完整程序 #include <REG51.H> #include <intrins.h> //#include "LCD1602.h" //#include "DS1302.h" #define uint unsigned int...
基于DS18B20_DS1302 lcd1602 完整C程序 毕业论文设计 (2).doc
基于DS18B20_DS1302 lcd1602 完整C程序 毕业论文设计 (2)_文学_高等教育_教育...4.1.2 uVision3 集成开发环境 (1)、项目管理 工程(project)是由源文件、开发...
ds1302和ds18b20最详细的资料.doc
ds1302ds18b20应该是比较常见的两种外围芯片。ds1302是具有SPI总线接口的时钟芯片。ds18b20则是具有单总线接口的数字温度传感器。ds1302ds18b20应该是比较常见的两...
基于DS18B20温度计课程设计报告_图文.doc
2.6电路设计最终方案决定 1 洛阳理工学院 课程设计报告 综上各方案所述,对此次设计的方案选定: 采用 AT89C51作为主控制芯片, DS1302 时钟芯片计时,DS18B20采集...
玩转DS1302和DS18B20.doc
玩转DS1302DS18B20_信息与通信_工程科技_专业资料。对于市面上的大多数 51 单片机开发板来说。ds1302ds18b20 应该是比较常见的两种外围芯片。ds130 2 是...
ds1302与ds18b20程序.doc
ds1302ds18b20程序_信息与通信_工程科技_专业资料。在液晶1602上显示 温度与时间用C51语言编写 /*** ds18b20 程序 温度 ***...
完整版DS1302+12864+18B20.doc
完整版DS1302+12864+18B20_工学_高等教育_教育专区。DS1302+12864液晶+18B20的完整版C语言程序设计,认真看,你会有收获的。 (AT89S52+12864+DS18B20+DS1302)...
DS1302时钟+DS18B20温度.doc
DS1302时钟+DS18B20温度 - /* 忠兴淘宝店编辑 QQ:79275
基于51单片机DS1302 DS18B20和12864显示程序.doc
基于51单片机DS1302 DS18B20和12864显示程序_信息与通信_工程科技_专业资料。给...[i]&10)); } Write_DS1302(0x8e,0x80);//加保护 } //读取当前日期...
51单片机ds1302和ds18b20时间温度显示.txt
51单片机ds1302ds18b20时间温度显示_计算机硬件及网络_IT/计算机_专业资料。51单片机ds1302ds18b20时间温度显示 /* 时间:4月24日 功能:使用LCD1602显示ds1302...
玩转DS1302和DS18B20.doc
玩转DS1302DS18B20玩转DS1302DS18B20隐藏>> 对于市面上的大多数 51 单片机开发板来说。ds1302ds18b20 应该是比较常见的两种外围芯片。ds1302 是具有 SPI...
基于51单片机的DS1302+LCD12864+DS18B20小综合.doc
基于51单片机的DS1302+LCD12864+DS18B20小综合_电子/电路_工程科技_专业资料。51单片机综合实例(时钟+温度+键控+屏显) DS1302 DS18B20 LCD12864 ...
时钟DS1302程序详解+温度传感器DS18B20.txt
时钟DS1302程序详解+温度传感器DS18B20_信息与通信_工程科技_专业资料。内容包括ds1302的时钟程序,有年月日,时间,星期,按键调整时间。温度传感器DS18B20程序详解 ...
1602+ds1302+18B20万年历显示温度星期(完全通过).doc
1602+ds1302+18B20万年历显示温度星期(完全通过) - 该程序经过
使用lcd1602 ds1302 18b20日历时钟.txt
DS1302时钟芯片、DS18B20温度传感器完成该日历***/ #includ
DS1302+DS18B20+LCD12864.txt
DS1302+DS18B20+LCD12864 - /*** 本实验功能: 实现