基于51单片机单总线高精度温度采集系统.docx

上传人:b****6 文档编号:6052168 上传时间:2023-01-03 格式:DOCX 页数:26 大小:54.99KB
下载 相关 举报
基于51单片机单总线高精度温度采集系统.docx_第1页
第1页 / 共26页
基于51单片机单总线高精度温度采集系统.docx_第2页
第2页 / 共26页
基于51单片机单总线高精度温度采集系统.docx_第3页
第3页 / 共26页
基于51单片机单总线高精度温度采集系统.docx_第4页
第4页 / 共26页
基于51单片机单总线高精度温度采集系统.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于51单片机单总线高精度温度采集系统.docx

《基于51单片机单总线高精度温度采集系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机单总线高精度温度采集系统.docx(26页珍藏版)》请在冰豆网上搜索。

基于51单片机单总线高精度温度采集系统.docx

基于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

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

当前位置:首页 > 自然科学

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

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