大连理工大学单片机实验报告.docx
《大连理工大学单片机实验报告.docx》由会员分享,可在线阅读,更多相关《大连理工大学单片机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
![大连理工大学单片机实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/2/077f7c7a-b826-4ccf-82c1-a326b89ddcfe/077f7c7a-b826-4ccf-82c1-a326b89ddcfe1.gif)
大连理工大学单片机实验报告
大连理工大学本科设计报告
题目:
单总线高精度温度采集系统
课程名称:
单片机综合设计实验
学院(系):
信息与通信工程学院
专业:
电子信息工程
班级:
电子
学号:
学生姓名:
成绩:
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单片机应用实验教程》作者:
陈育斌,秦晓梅等