大连理工大学单片机实验报告Word文件下载.docx
- 文档编号:22276489
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:21
- 大小:129.26KB
大连理工大学单片机实验报告Word文件下载.docx
《大连理工大学单片机实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《大连理工大学单片机实验报告Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
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
向18b20读控制字
TEMPER_COV
35H,36H
20H,21H
温度转换成十进制BCD码形式
CF
R3,R4
拆分子程序,拆分送数码管显示
INIT_1820
温度传感器初始化
BUZZER
无无
蜂鸣器控制发声子程序
INT_7290
读取按键外部中断子程序
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;
调用显示子程序
LJMPNEXTT
;
设定温度上限
SETTMP:
SETBEX0
7290复位
SETBP1.7
显示设定内容
MOV27H,#0B6H;
S
MOV26H,#9EH;
E
MOV25H,#1FH;
T.
MOVR7,#03H
MOVR0,#25H
MOVR2,#15H
SJMPNEXTT
NET:
MOV28H,#70H;
不能闪烁
MOV29H,#00H
MOVR7,#02H
MOVR0,#28H
MOVR2,#07H
NEXTT:
CALLDELAY
SJMPMODE
GET_TEMPER:
SETBDQ;
定时入口
BCD:
LCALLINIT_1820
JBFLAG1,S22
LJMPBCD;
若ds18b20不存在则返回
S22:
LCALLDELAY1
MOVA,#0CCH;
跳过rom匹配0cch
LCALLWRITE_1820
MOVA,#44H;
发出温度转换命令
CBA:
LCALLINIT_1820
JBFLAG1,ABC
LJMPCBA
ABC:
跳过rom匹配
MOVA,#0BEH;
发出读温度命令
LCALLREAD_18200
RET
WRITE_1820:
;
写ds18b20程序
MOVR2,#8
WR1:
CLRDQ
MOVR3,#6;
延时24us
DJNZR3,$
RRCA
MOVDQ,C
MOVR3,#23;
延时60us
SETBDQ
NOP
DJNZR2,WR1
SETBDQ
READ_18200:
从1820中读出两个字节温度数据
PUSH01H
MOVR4,#2
MOVR1,#36H
RE00:
MOVR2,#8
RE01:
CLRC
CLRDQ
MOVR3,#2
MOVC,DQ
MOVR3,#23H
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
ADDA,TEMPER_NUM
MOVTEMPER,A
转换成十进制数显示
MOVB,#10
DIVAB
MOV30H,B;
个位
MOV31H,B;
十位
ANLA,#0FH;
百位
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
LCALLCF2
MOV22H,R3
MOV23H,R4
MULAB
INCA
MOVCA,@A+DPTR
MOV20H,R3
MOV21H,R4
POP02H
POPDPL
POPDPH
;
--------------小数部分查表------------------------
NUMSEG:
DW0000H,0625H,1250H,1875H,2500H,3125H,3750H,4375H
DW5000H,5625H,6250H,6875H,7500H,8125H,8750H,9375H
--------------------------------------------------
--------------拆分显示整数子程序------------------
CF:
MOVDPTR,#LEDSEG
MOVR2,TEMPER_BCD
MOVCA,@A+DPTR;
查表得字形码
MOVR3,A
MOVA,R2
MOVR4,A
INCR3;
加上小数点
RET
-----------------------------------------------
--------------拆分显示小数子程序------------------
CF2:
PUSH02H
PUSHACC
MOVR2,TEMPER_BCD
POPACC
-----------------led字型码---------------------
LEDSEG:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
-----------------------------------------------
INIT_1820:
MOVR0,#80H
TSR1:
DJNZR0,TSR1;
延时300us
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
DELAY1:
MOVR7,#20H;
80us延时
DJNZR7,$
---------------蜂鸣器驱动子程序--------------
BUZZER:
PUSH07H
MOVR7,#00H
MOVTL0,#33H;
设置定时0.5us初值
MOVTH0,#0FEH
SETBTR0;
启动t0
WAIT:
JNBTF0,$
CLRTF0
MOVTL0,#33H
CPLP1.2
DJNZR7,WAIT
CLRTR0
SETBP1.2
POP07H
RET
---------------------------------------------
-------------外部中断服务程序----------------
INT_7290:
PUSH00H
PUSH01H
PUSH03H
PUSH04H
PUSHACC
PUSHPSW
SJMPRD1
RD1:
JBP3.2,$;
以查询方式等待下一次按键操作
SWAPA
LCALLRDKEY
CJNEA,#0AH,WAITT;
容错功能调整
WAITT:
JNCRD1
MOVTEMPER_BCD,A
MOVB,#0AH
MULAB
MOVR5,A
MOV23H,R3
MOVR7,#01H
MOVR0,#23H
MOVR2,#13H
MOVR3,#WSLA_7290
KEY2:
JBP3.2,$;
LCALLRDKEY
CJNEA,#0AH,WAITT2
WAITT2:
JNCKEY2
MOVA,R5
ADDA,TEMPER_BCD
MOV22H,R3
MOV21H,#9CH;
C
MOVR7,#02H
MOVR0,#21H
MOVR2,#11H
确定键
COMF:
JBP3.2,$;
等待确认键
CJNEA,#0FH,COMF
MOV28H,R5;
上限值放入28h中
DOWN:
;
CLRP1.7
LCALLDELAY
SETBP1.7
CLRIE0;
必须清标志
POPPSW
POPACC
POP04H
POP03H
POP02H
POP00H
RETI
------------读取键值子程序(键值保存在A中)---
RDKEY:
MOVR0,#1FH
MOVR7,#01H
MOVR2,#01H
MOVR4,#RSLA_7290
LCALLRDADD
MOVA,1FH
DECA
----------------------------------------------
------------延时子程序-----------------------
DELAY:
PUSH00H;
MOVR1,#00
LP:
MOVR1,#00H
DJNZR1,$
DJNZR0,LP
POP01H
POP00H
(I2C子程序省略)
九.系统调试运行结果说明、分析所出现得问题,设计体会与建议
硬件使用ZLG51单片机开发平台,软件使用KEil2软件进行程序的编写编译以及调试。
运行结果:
能够实现当前环境温度的采集以及分为整数部分和小数部分的显示,设定温度上限,超过设定上限温度进行蜂鸣器报警,数码管同时闪烁,温度低于设定值立刻停止闪烁和报警。
能够通过拨码控制模式切换,切换到设定上限温度模式,通过按键输入上限温度值改变当前上限温度,能够纠错,输入10以上的数字时不显示,按下确定键时确定温度上限值。
问题:
(1)采集的温度为十六进制数字,如何转换成十进制BCD码。
通过查询上学期学习的计算机原理的相关算法,解决了此问题,成功显示。
(2)小数部分的显示问题。
通过将有可能出现的小数情况列举并进行查表显示,最后成功显示。
(3)高于温度报警闪烁之后,温度下降以后数码管仍然闪烁,后来发现是子程序逻辑错误已经改正。
十.结论及设计体会
通过本次实验,我对DS18B20芯片有了一定的了解,对于DS18B20编程的时序要求以及相应的编程操作流程有了更深度的掌握。
这次实验综合了中断、查询、时钟、ZLG7290芯片、DS18B20芯片等很多知识。
本次试验采用子程序调用的方法进行设计,可以逐一的进行调试,对于代码量比较大的程序来说子程序设计还是很好的编程开发方式。
此次试验中遇到很多细节的错误,比如子程序顺序混乱等逻辑错误,导致程序总是出现错误,幸好在最后都成功的改正了。
在代码量比较大的程序设计时,不能只对软件代码进行修改,还要结合硬件调试,否则很难看出问题,同时不怕错误,会正确的调试方法,灵活使用断点,会找错并改错也是很重要的素质。
这次实验对我以后的程序设计任务有很大的启发作用,让我明白了程序设计的基本顺序和需要注意的地方以及调试方法,相信在以后的学习和工作中都会受益。
最后感谢老师的悉心教导。
参考文献
[1]《MCS-51单片机应用实验教程》作者:
陈育斌,秦晓梅等
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大连理工大学 单片机 实验 报告