大连理工大学单片机实验报告.docx

上传人:b****8 文档编号:9140384 上传时间:2023-02-03 格式:DOCX 页数:21 大小:129.26KB
下载 相关 举报
大连理工大学单片机实验报告.docx_第1页
第1页 / 共21页
大连理工大学单片机实验报告.docx_第2页
第2页 / 共21页
大连理工大学单片机实验报告.docx_第3页
第3页 / 共21页
大连理工大学单片机实验报告.docx_第4页
第4页 / 共21页
大连理工大学单片机实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

大连理工大学单片机实验报告.docx

《大连理工大学单片机实验报告.docx》由会员分享,可在线阅读,更多相关《大连理工大学单片机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

大连理工大学单片机实验报告.docx

大连理工大学单片机实验报告

大连理工大学本科设计报告

 

题目:

单总线高精度温度采集系统

 

课程名称:

单片机综合设计实验

学院(系):

信息与通信工程学院

专业:

电子信息工程

班级:

电子

学号:

学生姓名:

成绩:

 

2016年5月5日

一.设计要求

1.启动DS18B20进行12位高精度环境温度采集

2.利用12864LCD屏/数码管显示数据

3.具有温度上限声光报警器

4.可以通过键盘设定报警上限值(选)

二.设计分析及系统方案设计

通过DS18B20进行小数12位温度转换、采集,通过单片机读取DS18B20采集到的12位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上限,当温度高于上限时进入报警子程序。

利用SW1进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。

主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。

三.系统电路图

 

四.外围接口模块硬件电路功能描述

1.DS18B20:

用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。

2.ZLG7290B:

用于数码管动态显示驱动,键盘扫描管理。

能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键的扫描识别,其中八个键可以作为功能键使用。

接口采用I²C结构。

3.蜂鸣器:

这里用作报警,为无源蜂鸣器。

五.主程序中主要变量定义

变量名称

内存单元

功能

TEMPER_L

36H

存放温度低四位

TEMPER_H

35H

存放温度高四位

TEMPER

34H

转换后的温度值

TEMPER_BCD

33H

BCD形式温度值

TEMPER_NUM

60H

温度值缓冲单元

WSLA_7290

70H

7290写控制单元

RSLA_7290

71H

7290读控制单元

20-27H

数码管显示缓冲区

28H

存放温度上限值

30-31H

存放温度BCD码个位十位

六.系统软件中各个子程序的功能描述

子程序名称

入口参数

出口参数

功能描述

GET_TEMPER

35H,36H

读取18B20的温度值

READ_18200

35H,36H

向18b20读控制字

TEMPER_COV

35H,36H

20H,21H

温度转换成十进制BCD码形式

CF

R3,R4

拆分子程序,拆分送数码管显示

INIT_1820

温度传感器初始化

BUZZER

无无

蜂鸣器控制发声子程序

INT_7290

28H

读取按键外部中断子程序

RDKEY

A

读取键值子程序

DELAY

延时子程序

 

七.主程序程序流程图

8.程序清单(要求打印格式要规范、重要的语句要有必要的注释)

SDABITP1.0

SCLBITP1.1

TEMPER_LEQU36H

TEMPER_HEQU35H

TEMPEREQU34H;转换后温度值

TEMPER_BCDEQU33H;BCD码温度值

TEMPER_NUMEQU60H;缓冲单元

WSLA_7290EQU70H

RSLA_7290EQU71H

FLAG1BIT00H

DQBITP3.3;总线控制单元

ORG0000H

LJMPMAIN

ORG0003H

LJMPINT_7290

ORG0100H

MAIN:

MOVSP,#70H

;ZLG7290复位

CLRP1.7

LCALLDELAY

SETBP1.7

MOV28H,#1EH;温度上限初始值30度

MOVTMOD,#01H;模式一,16位计数器

SETBEA;允许INTO中断

MODE:

JBP1.3,SETTMP;拨码为0时采集温度

;温度采集

TMP:

CLREX0

MOV27H,#1FH;t

LP1:

LCALLGET_TEMPER

LCALLTEMPER_COV

;7290显示

MOVR7,#08H

MOVR0,#20H

MOVR2,#10H

MOVR3,#WSLA_7290

LCALLWRNBYT

LCALLDELAY

MOVA,TEMPER

;判断温度上限

MOV28H,R5

CLRC

CJNEA,28H,rel;此处报警温度为30度

rel:

JCNET

LCALLBUZZER;大于等于时蜂鸣器报警

;闪烁

MOV28H,#70H;闪烁命令字

MOV29H,#7FH;闪烁命令字

MOVR7,#02H;设定数据个数

MOVR0,#28H;设置源数据首地址

MOVR2,#07H;设置外围器件内部寄存器首地址

MOVR3,#WSLA_7290;设定外围器件地址

LCALLWRNBYT;调用显示子程序

LCALLDELAY

LJMPNEXTT

;设定温度上限

SETTMP:

SETBEX0

;7290复位

CLRP1.7

LCALLDELAY

SETBP1.7

;显示设定内容

MOV27H,#0B6H;S

MOV26H,#9EH;E

MOV25H,#1FH;T.

MOVR7,#03H

MOVR0,#25H

MOVR2,#15H

MOVR3,#WSLA_7290

LCALLWRNBYT

LCALLDELAY

SJMPNEXTT

NET:

MOV28H,#70H;不能闪烁

MOV29H,#00H

MOVR7,#02H

MOVR0,#28H

MOVR2,#07H

MOVR3,#WSLA_7290

LCALLWRNBYT

LCALLDELAY

NEXTT:

CALLDELAY

SJMPMODE

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

RET

WRITE_1820:

;写ds18b20程序

MOVR2,#8

CLRC

WR1:

CLRDQ

MOVR3,#6;延时24us

DJNZR3,$

RRCA

MOVDQ,C

MOVR3,#23;延时60us

DJNZR3,$

SETBDQ

NOP

DJNZR2,WR1

SETBDQ

RET

READ_18200:

;从1820中读出两个字节温度数据

PUSH01H

MOVR4,#2

MOVR1,#36H

RE00:

MOVR2,#8

RE01:

CLRC

SETBDQ

NOP

CLRDQ

NOP

NOP

SETBDQ

MOVR3,#2

DJNZR3,$

MOVC,DQ

MOVR3,#23H

DJNZR3,$

RRCA

DJNZR2,RE01

MOV@R1,A

DECR1

DJNZR4,RE00

POP01H

RETU8

TEMPER_COV:

;将读出的数据转换

PUSHDPH

PUSHDPL

PUSH02H

MOVA,#0F0H

ANLA,TEMPER_L;舍去小数点后的四位

SWAPA

MOVTEMPER_NUM,A

MOVA,TEMPER_H

ANLA,#07H

SWAPA

ADDA,TEMPER_NUM

MOVTEMPER,A

;转换成十进制数显示

MOVB,#10

DIVAB

MOV30H,B;个位

MOVB,#10

DIVAB

MOV31H,B;十位

ANLA,#0FH;百位

SWAPA

ADDA,B

MOVTEMPER_BCD,A

LCALLCF2;拆分查表

MOV25H,R3

MOV26H,R4

MOVA,30H

ANLA,#0FH

LCALLCF

MOV24H,R3

;处理四位小数位数据

MOVA,TEMPER_L

ANLA,#0FH;取低四位数据

MOVB,#02H

MULAB;字节转为字

MOVDPTR,#NUMSEG

MOVCA,@A+DPTR

MOVTEMPER_BCD,A

LCALLCF2

MOV22H,R3

MOV23H,R4

MOVA,TEMPER_L

ANLA,#0FH

MOVB,#02H

MULAB

INCA

MOVCA,@A+DPTR

MOVTEMPER_BCD,A

LCALLCF2

MOV20H,R3

MOV21H,R4

POP02H

POPDPL

POPDPH

RET

;--------------小数部分查表------------------------

NUMSEG:

DW0000H,0625H,1250H,1875H,2500H,3125H,3750H,4375H

DW5000H,5625H,6250H,6875H,7500H,8125H,8750H,9375H

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

;--------------拆分显示整数子程序------------------

CF:

PUSH02H

PUSHDPH

PUSHDPL

MOVDPTR,#LEDSEG

MOVR2,TEMPER_BCD

ANLA,#0FH

MOVCA,@A+DPTR;查表得字形码

MOVR3,A

MOVA,R2

SWAPA

ANLA,#0FH

MOVCA,@A+DPTR

MOVR4,A

INCR3;加上小数点

POPDPL

POPDPH

POP02H

RET

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

;--------------拆分显示小数子程序------------------

CF2:

PUSH02H

PUSHDPH

PUSHDPL

PUSHACC

MOVDPTR,#LEDSEG

MOVR2,TEMPER_BCD

MOVA,R2

ANLA,#0FH

MOVCA,@A+DPTR

MOVR3,A

MOVA,R2

SWAPA

ANLA,#0FH

MOVCA,@A+DPTR

MOVR4,A

;加上小数点

POPACC

POPDPL

POPDPH

POP02H

RET

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

;-----------------led字型码---------------------

LEDSEG:

DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H

DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH

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

INIT_1820:

SETBDQ

NOP

CLRDQ

MOVR0,#80H

TSR1:

DJNZR0,TSR1;延时300us

SETBDQ

MOVR0,#25H;96us

TSR2:

DJNZR0,TSR2

JNBDQ,TSR3

LJMPTSR4;延时

TSR3:

SETBFLAG1;致标志位

LJMPTSR5;ds18b20存在

TSR4:

CLRFLAG1;清标志位

LJMPTSR7;ds18b20不存在

TSR5:

MOVR0,#06BH;延时200us

TSR6:

DJNZR0,TSR6

TSR7:

SETBDQ

RET

DELAY1:

MOVR7,#20H;80us延时

DJNZR7,$

RET

;---------------蜂鸣器驱动子程序--------------

BUZZER:

PUSH07H

MOVR7,#00H

MOVTL0,#33H;设置定时0.5us初值

MOVTH0,#0FEH

SETBTR0;启动t0

WAIT:

JNBTF0,$

CLRTF0

MOVTL0,#33H

MOVTH0,#0FEH

CPLP1.2

DJNZR7,WAIT

CLRTR0

SETBP1.2

POP07H

RET

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

;-------------外部中断服务程序----------------

INT_7290:

PUSH00H

PUSH01H

PUSH02H

PUSH03H

PUSH04H

PUSH07H

PUSHACC

PUSHPSW

SJMPRD1

RD1:

JBP3.2,$;以查询方式等待下一次按键操作

SWAPA

LCALLRDKEY

CJNEA,#0AH,WAITT;容错功能调整

WAITT:

JNCRD1

MOVTEMPER_BCD,A

LCALLCF2

MOVB,#0AH

MULAB

MOVR5,A

MOV23H,R3

MOVR7,#01H

MOVR0,#23H

MOVR2,#13H

MOVR3,#WSLA_7290

LCALLWRNBYT

KEY2:

JBP3.2,$;以查询方式等待下一次按键操作

LCALLRDKEY

CJNEA,#0AH,WAITT2

WAITT2:

JNCKEY2

MOVTEMPER_BCD,A

LCALLCF2

MOVA,R5

ADDA,TEMPER_BCD

MOVR5,A

MOV22H,R3

MOV21H,#9CH;C

MOVR7,#02H

MOVR0,#21H

MOVR2,#11H

MOVR3,#WSLA_7290

LCALLWRNBYT

;确定键

COMF:

JBP3.2,$;等待确认键

LCALLRDKEY

CJNEA,#0FH,COMF

MOV28H,R5;上限值放入28h中

DOWN:

;7290复位

CLRP1.7

LCALLDELAY

SETBP1.7

CLRIE0;必须清标志

POPPSW

POPACC

POP07H

POP04H

POP03H

POP02H

POP00H

RETI

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

;------------读取键值子程序(键值保存在A中)---

RDKEY:

MOVR0,#1FH

MOVR7,#01H

MOVR2,#01H

MOVR3,#WSLA_7290

MOVR4,#RSLA_7290

LCALLRDADD

MOVA,1FH

DECA

RET

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

;------------延时子程序-----------------------

DELAY:

PUSH00H;延时子程序

PUSH01H

MOVR1,#00

LP:

MOVR1,#00H

DJNZR1,$

DJNZR0,LP

POP01H

POP00H

RET

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

(I2C子程序省略)

九.系统调试运行结果说明、分析所出现得问题,设计体会与建议

硬件使用ZLG51单片机开发平台,软件使用KEil2软件进行程序的编写编译以及调试。

运行结果:

能够实现当前环境温度的采集以及分为整数部分和小数部分的显示,设定温度上限,超过设定上限温度进行蜂鸣器报警,数码管同时闪烁,温度低于设定值立刻停止闪烁和报警。

能够通过拨码控制模式切换,切换到设定上限温度模式,通过按键输入上限温度值改变当前上限温度,能够纠错,输入10以上的数字时不显示,按下确定键时确定温度上限值。

问题:

(1)采集的温度为十六进制数字,如何转换成十进制BCD码。

通过查询上学期学习的计算机原理的相关算法,解决了此问题,成功显示。

(2)小数部分的显示问题。

通过将有可能出现的小数情况列举并进行查表显示,最后成功显示。

(3)高于温度报警闪烁之后,温度下降以后数码管仍然闪烁,后来发现是子程序逻辑错误已经改正。

十.结论及设计体会

通过本次实验,我对DS18B20芯片有了一定的了解,对于DS18B20编程的时序要求以及相应的编程操作流程有了更深度的掌握。

这次实验综合了中断、查询、时钟、ZLG7290芯片、DS18B20芯片等很多知识。

本次试验采用子程序调用的方法进行设计,可以逐一的进行调试,对于代码量比较大的程序来说子程序设计还是很好的编程开发方式。

此次试验中遇到很多细节的错误,比如子程序顺序混乱等逻辑错误,导致程序总是出现错误,幸好在最后都成功的改正了。

在代码量比较大的程序设计时,不能只对软件代码进行修改,还要结合硬件调试,否则很难看出问题,同时不怕错误,会正确的调试方法,灵活使用断点,会找错并改错也是很重要的素质。

这次实验对我以后的程序设计任务有很大的启发作用,让我明白了程序设计的基本顺序和需要注意的地方以及调试方法,相信在以后的学习和工作中都会受益。

最后感谢老师的悉心教导。

参考文献

[1]《MCS-51单片机应用实验教程》作者:

陈育斌,秦晓梅等

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

当前位置:首页 > 高等教育 > 医学

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

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