DS18B20+DS1302项目报告.docx

上传人:b****6 文档编号:4267315 上传时间:2022-11-28 格式:DOCX 页数:38 大小:80.13KB
下载 相关 举报
DS18B20+DS1302项目报告.docx_第1页
第1页 / 共38页
DS18B20+DS1302项目报告.docx_第2页
第2页 / 共38页
DS18B20+DS1302项目报告.docx_第3页
第3页 / 共38页
DS18B20+DS1302项目报告.docx_第4页
第4页 / 共38页
DS18B20+DS1302项目报告.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

DS18B20+DS1302项目报告.docx

《DS18B20+DS1302项目报告.docx》由会员分享,可在线阅读,更多相关《DS18B20+DS1302项目报告.docx(38页珍藏版)》请在冰豆网上搜索。

DS18B20+DS1302项目报告.docx

DS18B20+DS1302项目报告

题目:

DS18B20+24C02+按键

项目管理人:

罗俊杰

硬件负责人:

罗俊杰

软件负责人:

罗俊杰

发题时间:

2012/3/10

交题时间:

2012/3/24

班级:

电研二班

指导老师:

王筝老师

 

摘要:

本温度测量仪由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时钟模块要能够正常显示时间,年月日,星期的显示。

4.按键能够调整上下限报警的温度值。

三.功能描述:

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

 

4.硬件电路设计

 

5.汇编程序代码:

 

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

;程序编写人:

罗俊杰,QQ:

849833861

;程序编写时间:

2012年3月17日于源点EIC实验室

;程序实现的功能:

DS18B20测温+1302时钟+24C02存储

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

TEMP_ZHDATA24H;实时温度值存放单元

TEMPLDATA25H;

TEMPHDATA26H;

TEMP_THDATA27H;高温报警值存放单元

TEMP_TLDATA28H;低温报警值存放单元

TEMPHCDATA29H;

TEMPLCDATA2AH;

TEMPFCEQU2BH;

LCD_XEQU2FH;LCD字符显示位置

COUNTEQU51H;1s计时

COUNT1EQU52H;60s计时

FLAG1EQU20H.0;DS18B20是否存在标志

RELAYEQUP1.3;指示灯

BEEPEQUP3.3;蜂鸣器

lcdequp0

ceequp2.1;复位脚

dioequp2.2;数据脚

clkequp2.3;时钟

rsequp2.4

rwequp2.5

enequp2.6;使能端

dqequp3.7

secondequ40h;秒

minuteequ41h;分

hourequ42h;时

dayequ43h;天

monthequ44h;月

weekequ45h;周

yearequ46h;年

bcdequ47h

hexequ48h

K1EQUP1.4;查看温度报警设置值,并能调节加减

K2EQUP1.5;低温报警值加减按键

K3EQUP1.6;高温报警值加减按键

K4EQUP1.7;保存设置值并退出

SDABITP1.0;定义24C02数据线

SCLBITP1.1;定义24C02时钟线

org0000h

ajmpstart

org0030h

;*****************初始化***********************************

start:

MOVSP,#60H

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

LCALLRE_18B20;DS18B20暂存器操作子程序

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

///////////////////////////////////////////////////////////////////

lcallds1302csh;调用1302初始化子程序

lcalllcdcsh;调用lcd初始化子程序

lcallw1302;调用1302写子程序

lcallr1302;调用1302读子程序

lcalldisplay;调用显示子程序

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

main:

CALLMK1;判断DS18B20是否响应以及初始值的设定:

CALLMK3;ds18b20的写读及显示加1302时钟显示

AJMPMAIN

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

MK4:

AJMPMK2;跳转到错误子程序

MK1:

JNBFLAG1,MK4;DS1820不存在

LCALLMENU_OK;DS1820存在,调用显示正确信息子程序

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

RET

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

MK3:

LCALLRST;调用DS18B20复位子程序

JNBFLAG1,MK4;DS18B20不存在跳转到错误显示子程序

MOVA,#0CCH;跳过ROM匹配命令

LCALLWRITE;DS18B20数据写入操作子程序

MOVA,#44H;温度转换命令

LCALLWRITE;DS18B20数据写入操作子程序

LCALLRST;调用DS18B20复位子程序

MOVA,#0CCH;跳过ROM匹配

LCALLWRITE;DS18B20数据写入操作子程序

MOVA,#0BEH;读温度命令

LCALLWRITE

LCALLREAD;调用DS18B20数据读取操作子程序

LCALLCONVTEMP;调用温度数据BCD码处理子程序

LCALLDISPBCD;调用温度数据显示子程序

LCALLCONV;调用LCD显示处理子程序

LCALLTEMP_COMP;调用实测温度值与设定温度值比较子程序

LCALLPROC_KEY;调用键扫描子程序

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

LCALLSHIZHONG;调用1302时钟模块

SJMPMK3

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

SHIZHONG:

movtmod,#01h;用定时器0,方式一工作

movth0,#70h;为定时器赋初值

movtl0,#00h

setbtr0

lp1:

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

clrtr0

lp2:

movth0,#70h;为定时器赋初值

movtl0,#00h

lcallr1302;调用读1302子程序

lcalldisplay;调用显示程序

setbtr0

RET

;******************LCD初始化**********************************

set_lcd:

CLREN

LCALLINIT_LCD;初始化LCD

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

RET

;///////////////////////////////////////////////////////////////////////////

;设置1302初值子程序

ds1302csh:

movsecond,#00h;miao秒

movminute,#57h;分

movhour,#15h;时

movday,#17h;天

movmonth,#03h;月

movweek,#06h;周

movyear,#12h;年

;/////////////////////////////////////////////////////////////////////

;lcd初始化子程序

lcdcsh:

movlcd,#38h

lcallxzl

movlcd,#08h

lcallxzl

movlcd,#01h

lcallxzl

movlcd,#06h

lcallxzl

movlcd,#0ch

lcallxzl

;/////////////////////////////

;1302写数据子程序

w1302:

clrce;复位脚置低电平

clrclk;串行时钟置低电平

nop

setbce;复位脚置高电平

movb,#8eh;送操作地址

lcallwbit;调用写字节子程序

movb,#00h;送操作数

lcallwbit;调用写字节子程序

setbclk;串行时钟置高电平,下降沿有效

clrce;禁止写入数据

movr0,#second;将秒寄存器送到r0

movr1,#80h;将80h送到A

movr7,#7;将r7送7

//////////////////////////////////////////////////////////////////////////

wloop:

clrce;复位脚置低电平

clrclk;复位脚置低电平

nop

setbce;复位脚置高电平,准备写数据

movb,r1;将r1内的数据送给b

lcallwbit;调用写字节子程序

mova,@r0;将r0内地址中的数送到A

movhex,a;将a中的数送到十进制寄存器

lcallhex_bcd;调用十进制转bcd码子程序

movb,a;将a内的数送给b

lcallwbit;调用写字节子程序

incr0;r0加一

incr1;r1加一

incr1

setbclk;串行时钟下降沿写入

clrce;禁止写入

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

clrce;禁止写入

clrclk;

nop

setbce;准备写入

movb,#8eh;送操作地址

lcallwbit;调用写字节子程序

movb,#80h;送操作数

lcallwbit;调用写字节子程序

setbclk;下降沿有效

clrce;禁止写入

ret;子程序返回

;/////////////////////////////

;写字节子程序

wbit:

movr2,#08h;给r2送8

w_loop:

mova,b;b送给a

rrca;带进位的右移A

movb,a

movdio,c;sclk上升沿时写入数据

setbclk

nop

clrclk;禁止写入

djnzr2,w_loop;判断是否送完

ret;

;/////////////////////////////

;hex转bcd码

hex_bcd:

mova,hex;将十六进制数送给A

adda,#00h;

daa;对A进行十进制调整

ret

;/////////////////////////////

;1302读数据子程序

r1302:

movr0,#second;将秒寄存器送到R0

movr1,#81h;将首读地址送到R1

movr7,#7;R7送7

r_loop:

clrce;复位脚清零

clrclk;时钟串行口清零

nop

setbce;准备写数据

movb,r1;将r1送到B

lcallwbit;调用写字节子程序

lcallrbit;调用读字节子程序

mov@r0,a;将a中的数据送到R0所指的地址

incr0;加一

incr1

incr1

setbclk;

clrce

djnzr7,r_loop;判断是否读完

ret

;/////////////////////////////

;读字节子程序

rbit:

movr4,#08h;送8

rloop:

movc,dio;读IO数据

rrca;带进位右移A

setbclk;下降沿有效

nop

clrclk

djnzr4,rloop;判断是否读完

ret

;/////////////////////////////

;显示子程序

display:

movlcd,#80h

lcallxzl

mova,#'2'

lcallxsj

movlcd,#81h

lcallxzl

mova,#'0'

lcallxsj

movlcd,#84h

lcallxzl

mova,#2dh

lcallxsj

movlcd,#87h

lcallxzl

mova,#2dh

lcallxsj

movlcd,#8bh

lcallxzl

mova,#'W'

lcallxsj

/////////////////////////////////////////////////////////////

movlcd,#8ch

lcallxzl

mova,#3ah

lcallxsj

movlcd,#0c2h

lcallxzl

mova,#3ah

lcallxsj

movlcd,#0c5h

lcallxzl

mova,#3ah

lcallxsj;以上显示冒号

;////////////以下显示动态//////////////////

movbcd,year;将年送给bcd

lcallbcd_dec;调用bcd码转十进制子程序

movlcd,#82h;将显示位置送到lcd

lcallxzl;调用写指令子程序

movdptr,#tab;建表

MOVCA,@A+DPTR;查表

lcallxsj;调用写数据子程序

movlcd,#83h;将显示位置送到lcd

lcallxzl;调用写指令子程序

movdptr,#tab;建表

mova,b;将b送给A

MOVCA,@A+DPTR;查表

lcallxsj;调用写数据子程序

movbcd,month

lcallbcd_dec

movlcd,#85h

lcallxzl

movdptr,#tab

MOVCA,@A+DPTR

lcallxsj

movlcd,#86h

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj

movbcd,day

lcallbcd_dec

movlcd,#88h

lcallxzl

movdptr,#tab

MOVCA,@A+DPTR

lcallxsj

movlcd,#89h

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj

movbcd,week

lcallbcd_dec

movlcd,#8dh

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj

;/////////////////////////////

movbcd,hour

lcallbcd_dec

movlcd,#0c0h

lcallxzl

movdptr,#tab

MOVCA,@A+DPTR

lcallxsj

movlcd,#0c1h

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj;以上显示时

movbcd,minute

lcallbcd_dec

movlcd,#0c3h

lcallxzl

movdptr,#tab

MOVCA,@A+DPTR

lcallxsj

movlcd,#0c4h

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj;以上显示分

movbcd,second;秒数值赋给bcd

lcallbcd_dec

movlcd,#0c6h

lcallxzl

movdptr,#tab

MOVCA,@A+DPTR

lcallxsj

movlcd,#0c7h

lcallxzl

movdptr,#tab

mova,b

MOVCA,@A+DPTR

lcallxsj;以上显示秒

ret

;/////////////////////////////;bcd转十进制

bcd_dec:

mova,bcd

movb,#16

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

ret

;//////////////////////////////

;lcd写指令子程序

xzl:

clrrw

clrrs

setben

lcalldelay3

clren

ret

;/////////////////////////////

;lcd写数据子程序

xsj:

movlcd,a

clrrw

setbrs

setben

lcalldelay3

clren

ret

;/////////////////////////////

;延时子程序

delay3:

movr5,#4;延时5ms

d0:

movr6,#255

djnzr6,$

djnzr5,d0

ret

;/////////////////////////////

;表格

tab:

DB30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;0到9

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

EEPROM:

MOVR0,#27H;要写入的数据,TH,TL

MOVR1,#00H;要保存数据的首地址

MOVR2,#02H;数据的长度

REP:

CLRA

MOVA,@R0

MOVB,A

LCALLWR_Byte;调用24c02写子程序

INCR1

INCR0

DJNZR2,REP

RET

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

WR_Byte:

LCALLBegin;调用启动24c02子程序

REP_S1:

MOVA,#0A0H;写器件地址

LCALLSend_B;调用发送一个字节到I2C总线子程序

LCALLWAITACK;调用应答信号检测程序

JCREP_S1;没有应答则重发数据

REP_S2:

MOVA,R1;写入地址

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

LCALLWAITACK

JCREP_S2

REP_S3:

CLRA

MOVA,B;写入数据

LCALLSend_B

LCALLWAITACK

JCREP_S3

LCALLSTOP;调用停止子程序

LCALLDelay;10MS延时

RET

;//////向IIC总线发送一个字节数据子程序/////////////////////////////

;入口参数:

A---待发送数据存放在A中

;//////////////////////////////////////////////////////////////////

Send_B:

MOVR7,#08H;发送位数

S_B:

RLCA

MOVSDA,C

NOP

SETBSCL

NOP

CLRSCL

DJNZR7,S_B;8位发送完毕?

NOP

RET

;//////检测应答信号//////////////////////////////////////////////

;出口参数:

C---是否有应答信号

;////////////////////////////////////////////////////////////////

WAITACK:

SETBSDA;释放SDA信号线

NOP

SETBSCL

NOP

REP3:

MOVC,SDA

CLRSCL

NOP

RET

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

RD_EEPROM:

MOVR0,#27H;设置读出数据保存首地址

MOVR1,#00H;送读数首地址

MOVR2,#02H;要读2个数

REP1:

LCALLRD_Byte;调用24c02读

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1