DS18B20+DS1302项目报告.docx
《DS18B20+DS1302项目报告.docx》由会员分享,可在线阅读,更多相关《DS18B20+DS1302项目报告.docx(38页珍藏版)》请在冰豆网上搜索。
![DS18B20+DS1302项目报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/65e2879b-19ad-40c4-9751-f459645154b4/65e2879b-19ad-40c4-9751-f459645154b41.gif)
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读