基于51单片机单总线高精度温度采集系统.docx
《基于51单片机单总线高精度温度采集系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机单总线高精度温度采集系统.docx(26页珍藏版)》请在冰豆网上搜索。
![基于51单片机单总线高精度温度采集系统.docx](https://file1.bdocx.com/fileroot1/2023-1/3/6612b15c-099f-4cf9-a076-bdbe441c6d22/6612b15c-099f-4cf9-a076-bdbe441c6d221.gif)
基于51单片机单总线高精度温度采集系统
大连理工大学本科设计报告
题目:
单总线高精度温度采集系统
题目:
单总线高精度温度采集系统
1设计要求
系统结构:
1)由DS18B20实现对温度的采集;
2)由数码管实现温度显示系统。
设计要求:
1)启动DS18B20进行12位高精度环境温度采集;
2)利用数码管显示数据;
3)具有温度上限声光报警;
4)可以通过键盘设定报警上限值。
扩展功能:
1)报警频率随实测温度与报警温度的差值变化,相差越大频率越高;
2)键盘设定上限值时十位,个位的闪烁,并且在输入后停止闪烁。
2设计分析及系统方案设计
程序采用无限循环结构。
一次循环中,完成对温度的采集和显示,判断超过设定值时报警。
键盘设定用外中断/INT1完成,T1产生方波驱动蜂鸣器发声,初值赋为采集温度与设定值的差值。
3.系统电路图
4外围接口模块硬件电路功能描述
ZLG7290B:
数码管动态显示驱动、键盘扫描芯片。
通过按键进行上限温度的设定及温度的显示模块。
蜂鸣器模块:
当温度超过上限则报警。
DS18B20:
智能温度传感器。
对环境温度进行12位精度的采集。
5主程序中主要变量定义
变量名称
RAM单元/寄存器
功能
TEMPER_L
36H
读出温度值低8位数据
TEMPER_H
35H
读出温度值高4位数据
TEMPER
34H
转换温度整数部分
TEMPER-NUM
60H
转换温度整数部分的缓冲单元
TEMPER_XS
33H
转换温度小数部分
TEMPER-NUM-XS
61H
转换温度小数部分的缓冲单元
LIMIT
14H
键盘输入的温度上限值
6系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能描述
GET_TEMPER
无
温度值高四位TEMPER_L、温度值低8位TEMPER_H
从DS18B20中读出12位温度数据
TEMPER_COV
TEMPER_L
TEMPER_H
TEMPER
TEMPER_XS
将读出的12位温度数据转换并保存
INT_1820
无
FLAG1
初始化DS18B20
WRITE_1820
A
无
向DS18B20中写入数据
INT_T1
TH1
TL1
定时器T1中断。
装定时初值,初值为温度差值,并对P3.5取反驱动蜂鸣器。
DISPLAY
TEMPER
TEMPER_XS
无
将温度通过数码管显示出来
READ_18200
无
TEMPER_L
TEMPER_H
从DS18B20中读出数据并储存
7主程序程序流程图
N
Y
Y
8程序清单
TEMPER_LEQU36H
;存放读出温度低位数据
TEMPER_HEQU35H
;存放读出温度高位数据
TEMPEREQU34H
;存放转换后的8位温度值
TEMPER_XSEQU33H
;存放转换温度的小数部分
TEMPER_NUMEQU60H
;缓冲单元
TEMPER_NUM_XSEQU61H
FLAG1BIT00H
DQBITP3.3
;一线总线控制端口
LIMITEQU14H
WSLAEQU070H
RSLAEQU071H
SDABITP1.0
SCLBITP1.1
ORG8000H
LJMPMAIN
ORG8003H;外中断Int0的入口地址
LJMPINT_7290
ORG801BH;定时器T1的入口地址
LJMPINT_T1
ORG8100H
MAIN:
MOVSP,#70H
CLRP1.2;7290复位
LCALLDELAY
SETBP1.2
MOVLIMIT,#0FFH
LP1:
SETBEX0;开外中断0
SETBEA
MOVTCON,#00H
SETBET1;开T1中断
SETBEA
MOVTMOD,#10H;T1初值
MOVTL1,#33H
MOVTH1,#0FEH
LCALLGET_TEMPER;从DS18B20读出温度数据
LCALLTEMPER_COV;转换读出的温度数据并保存
MOVA,TEMPER
CJNEA,LIMIT,NEXT
NEXT:
JNCNEXT1;TEMPER>=LIMIT
JMPNEXT2
NEXT1:
SETBTR1
LJMPNEXT3
NEXT2:
CLRTR1
NEXT3:
MOV31H,#00H;显示整数部分
MOV30H,#01H
MOVB,#10
DIVAB
ADDA,#02H
MOV37H,A
MOVA,B
ADDA,#0CH
MOV36H,A
MOVA,TEMPER_XS;显示小数部分
MOVB,#4
MULAB
ADDA,#16H
MOV35H,A
INCA
MOV34H,A
INCA
MOV33H,A
INCA
MOV32H,A
MOVDPTR,#LEDSEG1
CLRA
MOVR7,#08H
MOVR0,#20H
MOVR1,#30H
LOOP1:
MOVA,@R1
MOVCA,@A+DPTR
MOV@R0,A
INCR1
INCR0
DJNZR7,LOOP1
MOVR7,#08H
MOVR0,#20H
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY2
MOVA,TEMPER
SJMPLP1
;T1中断服务程序
INT_T1:
PUSHACC
PUSHPSW
CLRTF1
MOVA,TEMPER
SUBBA,LIMIT
MOVB,#2
MULAB
ADDA,#33H
MOVTL1,A;赋定时器t1初值
MOVTH1,#0FEH
CPLP3.5
POPPSW
POPACC
RETI
LEDSEG1:
DB0C6H,9CH;查表
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H
DB0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E5H,0FFH,0F7H
DB0FCH,0FCH,0FCH,0FCH,0FCH,0BEH,0DAH,0B6H,60H,0DAH,0B6H,0FCH,60H,0FEH,0E4H,0B6H
DB0DAH,0B6H,0FCH,0FCH,0F2H,60H,0DAH,0B6H,0F2H,0E4H,0B6H,0FCH
DB66H,0F2H,0E4H,0B6H
DB0B6H,0FCH,0FCH,0FCH
DB0B6H,0BEH,0DAH,0B6H
DB0BEH,0DAH,0B6H,0FCH
DB0BEH,0FEH,0E4H,0B6H
DB0E4H,0B6H,0FCH,0FCH
DB0FEH,60H,0DAH,0B6H
DB0FEH,0E4H,0B6H,0FCH
DB0F6H,0F2H,0E4H,0B6H
DB00H,0EEH,10H
DELAY2:
PUSH00H
PUSH01H
MOVR0,#00H
DELAY3:
MOVR1,#00H
DJNZR1,$
DJNZR0,DELAY3
POP01H
POP00H
RET
;******************************读取温度值
GET_TEMPER:
;读出转换后的温度值
SETBDQ;定时入口
BCD:
LCALLINIT_1820
JBFLAG1,S22
LJMPBCD
;若DS18B20不存在则返回
S22:
LCALLDELAY1
MOVA,#0CCH
;跳过ROM匹配0CCH
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLDELAY
CBA:
LCALLINIT_1820
JBFLAG1,ABC
LJMPCBA
ABC:
LCALLDELAY1
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200;READ_1820
RET
WRITE_1820:
;写DS18B20的程序
MOVR2,#8
CLRC
WR1:
CLRDQ
MOVR3,#6;延时24us
DJNZR3,$
RRCA
MOVDQ,C
MOVR3,#23;延时60us
DJNZR3,$
SETBDQ;一个写周期至少要维持60us以上
NOP;离下一个写周期至少要有1us间隔
DJNZR2,WR1
SETBDQ
RET
READ_18200:
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#36H;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOVR2,#8
RE01:
CLRC
SETBDQ
NOP
CLRDQ;DQ;DQ=015US内
NOP;18B20送数,主控器
NOP;必须完成DQ的采样
SETBDQ;主控器释放DQ
MOVR3,#2
DJNZR3,$;延时10us
MOVC,DQ;取dq数据位
MOVR3,#23;延时60us
DJNZR3,$
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
TEMPER_COV:
;将读出的数据进行转换
MOVA,#0F0H
ANLA,TEMPER_L
SWAPA
MOVTEMPER_NUM,A
MOVA,TEMPER_L
ANLA,#0FH
MOVTEMPER_NUM_XS,A
MOVTEMPER_XS,TEMPER_NUM_XS
TEMPER_COV1:
MOVA,TEMPER_H
ANLA,#07H
SWAPA
ADDA,TEMPER_NUM
MOVTEMPER_NUM,A
MOVTEMPER,TEMPER_NUM
RET
INIT_1820:
;DS18B20初始化程序
SETBDQ
NOP
CLRDQ
MOVR0,#80H
TSR1:
DJNZR0,TSR1
SETBDQ
MOVR0,#25H
TSR2:
DJNZR0,TSR2
JNBDQ,TSR3
LJMPTSR4
TSR3:
SETBFLAG1
LJMPTSR5
TSR4:
CLRFLAG1
LJMPTSR7
TSR5:
MOVR0,#06BH
TSR6:
DJNZR0,TSR6
TSR7:
SETBDQ
RET
DELAY1:
MOVR7,#20H
DJNZR7,$
RET
DELAY:
PUSH00H
PUSH01H
MOVR0,#00
LP:
MOVR1,#00H
DJNZR1,$
DJNZR0,LP
POP01H
POP00H
RET
;******************************键盘设定温度上限值
INT_7290:
PUSH00H
PUSH02H
PUSH03H
PUSH04H
PUSH07H
PUSHACC
PUSHPSW
LCALLRDKEY
CJNEA,#0AH,DOWN1
LJMPAKEY
DOWN1:
LJMPDOWN
AKEY:
LCALLDISPLAYA
;闪烁控制
PUSH05H
PUSH06H
MOVR5,#70H
MOVR6,#08H
MOVR7,#02H
MOVR0,#05H
MOVR2,#07H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY
POP06H
POP05H
CXUN:
JBP3.2,$
LCALLRDKEY
CJNEA,#0AH,NEXT4;查询输入值是否为数字
NEXT4:
JNCCXUN
NEXT5:
MOV40H,A
LCALLDISPLAY1
MOVA,40H
MOVB,#10
MULAB
MOV14H,A;存十位
;闪烁控制
PUSH05H
PUSH06H
MOVR5,#70H
MOVR6,#04H
MOVR7,#02H
MOVR0,#05H
MOVR2,#07H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY
POP06H
POP05H
CXUN1:
JBP3.2,$
LCALLRDKEY
CJNEA,#0AH,NEXT6;查询输入值是否为数字
NEXT6:
JNCCXUN1
;闪烁控制
NEXT7:
PUSH05H
PUSH06H
MOVR5,#70H
MOVR6,#00H
MOVR7,#02H
MOVR0,#05H
MOVR2,#07H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY
POP06H
POP05H
MOV41H,A;存个位
LCALLDISPLAY2;显示个位数
MOVA,41H
ADDA,14H
MOVLIMIT,A;设定报警值
JBP3.2,$
FH1:
LCALLRDKEY
CJNEA,#0BH,FH1
DOWN:
CLRIE0
POPPSW
POPACC
POP07H
POP04H
POP03H
POP02H
POP00H
RETI
RDKEY:
MOVR0,#1FH;键值缓冲单元
MOVR7,#01H;取一个数据(键值)
MOVR2,#01H;指向内部数据键值寄存器地址
MOVR3,#WSLA_7290;取器件地址(写)
MOVR4,#RSLA_7290;取器件地址(读)
LCALLRDADD;读出7290的01H单元中的键值
MOVA,1FH;取健值送缓冲单元
DECA
RET
DISPLAY2:
;显示输入的个位数
MOV30H,#01H
MOV31H,#00H
PUSHACC
MOVA,40H
ADDA,#02H
MOV33H,A
POPACC
ADDA,#02H
MOV32H,A
MOV34H,#56H
MOV35H,#56H
MOV36H,#56H
MOV37H,#57H
MOVDPTR,#LEDSEG1
CLRA
MOVR7,#08H
MOVR0,#20H
MOVR1,#30H
LOOP2:
MOVA,@R1
MOVCA,@A+DPTR
MOV@R0,A
INCR1
INCR0
DJNZR7,LOOP2
MOVR7,#08H
MOVR0,#20H
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY2
RET
DISPLAYA:
;显示A
MOV30H,#01H
MOV31H,#00H
MOV32H,#58H
MOV33H,#58H
MOV34H,#56H
MOV35H,#56H
MOV36H,#56H
MOV37H,#57H
MOVDPTR,#LEDSEG1
CLRA
MOVR7,#08H
MOVR0,#20H
MOVR1,#30H
LOOP3:
MOVA,@R1
MOVCA,@A+DPTR
MOV@R0,A
INCR1
INCR0
DJNZR7,LOOP3
MOVR7,#08H
MOVR0,#20H
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY2
RET
DISPLAY1:
;显示输入的十位数
MOV30H,#01H
MOV31H,#00H
MOV32H,#58H
ADDA,#02H
MOV33H,A
MOV34H,#56H
MOV35H,#56H
MOV36H,#56H
MOV37H,#57H
MOVDPTR,#LEDSEG1
CLRA
MOVR7,#08H
MOVR0,#20H
MOVR1,#30H
LOOP4:
MOVA,@R1
MOVCA,@A+DPTR
MOV@R0,A
INCR1
INCR0
DJNZR7,LOOP4
MOVR7,#08H
MOVR0,#20H
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY2
RET
;【附录一】由汇编语言编制的I2C通讯子程序
;
(1)带有内部单元地址的多字节写操作子程序WRNBYT
;*******************************
;通用的I2C通讯子程序(多字节写操作)
;入口参数R7字节数,R0:
源数据块首地址
;R0原数据块首地址;R2从器件内部子地址;R3:
外围器件地址(写)
;相关子程序WRBYT、STOP、CACK、STA
;*******************************
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3;取外围器件地地址(包含r/w=0)
LCALLSTA;发送起始信号S
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应
MOVA,R2
LCALLWRBYT;发送内部寄存器首地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
WRDA:
MOVA,@R0
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
;*******************************
;
(2)带有内部单元地址的多字节读操作子程序RDADD
;*******************************
;入口参数R7字节数;
;R0目标数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序WRBYT、STOP、CACK、STA、MNACK
;*******************************
RDADD:
PUSHPSW;从PCF8563的02H单元读入7个参数
PUSHACC;存放于20H-26H单元
RDADD1:
LCALLSTA
MOVA,R3;取器件地址(写)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
MOVA,R2;取内部地址
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
LCALLSTA
MOVA,R4;取器件地址(读)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
RDN:
LCALLRDBYT
MOV@R0,A
DJNZR7,ACK
LCALLMNACK
LCALLSTOP
POPACC
POPPSW
RET
ACK:
LCALLMACK
INCR0
SJMPRDN
;(3)I2C各个信号子程序
;*******************************
;启动信号子程序S
;*******************************
STA:
SETBSDA;启动信号S
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSDA
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
RET
;*******************************
;停止信号子程序P
;*******************************
STOP:
CLRSDA;停止信号P
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
SETBSDA
NOP;产生4.7US延时
NOP
NOP
NOP
NOP