大连理工大学单片机实验报告(共25页).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_BCD33HBCD形式温度值TEMPER_NUM 60H温度值缓冲单元WSLA_7290 70H7290写控制单元RSLA_7290 71H7290读控制单元20-27H数码管显示缓冲区28H存放温度上限值30-31H存放温度BCD码个位十位六系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能 描述GET_TEMPER无35H,36H读取18B20的温度值READ_1820035H,36H无向18b20读控制字TEMPER_COV35H,36H20H,21H温度转换成十进制BCD码形式CF无R3,R4拆分子程序,拆分送数码管显示INIT_1820无无温度传感器初始化BUZZER 无无无蜂鸣器控制发声子程序INT_7290无28H读取按键外部中断子程序RDKEY无A读取键值子程序DELAY无无延时子程序七主程序程序流程图8.程序清单(要求打印格式要规范、重要的语句要有必要的注释)SDABITP1.0SCLBITP1.1TEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER EQU 34H;转换后温度值TEMPER_BCD EQU 33H;BCD码温度值TEMPER_NUM EQU 60H;缓冲单元WSLA_7290 EQU 70HRSLA_7290 EQU 71HFLAG1 BIT 00HDQ BIT P3.3;总线控制单元ORG0000HLJMPMAINORG0003HLJMPINT_7290ORG0100HMAIN:MOVSP,#70H;ZLG7290复位CLRP1.7LCALLDELAYSETBP1.7MOV28H,#1EH;温度上限初始值30度 MOVTMOD,#01H;模式一,16位计数器SETBEA;允许INTO中断MODE:JBP1.3,SETTMP;拨码为0时采集温度;温度采集TMP:CLREX0MOV27H,#1FH;tLP1:LCALLGET_TEMPERLCALLTEMPER_COV;7290显示MOVR7,#08HMOVR0,#20HMOVR2,#10HMOVR3,#WSLA_7290LCALLWRNBYTLCALLDELAYMOVA,TEMPER;判断温度上限MOV28H,R5CLRCCJNEA,28H,rel;此处报警温度为30度rel:JCNETLCALLBUZZER;大于等于时蜂鸣器报警;闪烁MOV28H,#70H;闪烁命令字MOV29H,#7FH;闪烁命令字MOVR7,#02H;设定数据个数MOVR0,#28H;设置源数据首地址MOVR2,#07H;设置外围器件内部寄存器首地址MOVR3,#WSLA_7290;设定外围器件地址LCALLWRNBYT;调用显示子程序LCALLDELAYLJMPNEXTT;设定温度上限SETTMP:SETBEX0;7290复位CLRP1.7LCALLDELAYSETBP1.7;显示设定内容MOV27H,#0B6H;SMOV26H,#9EH;EMOV25H,#1FH;T.MOVR7,#03HMOVR0,#25HMOVR2,#15HMOVR3,#WSLA_7290LCALLWRNBYTLCALLDELAY SJMP NEXTTNET:MOV28H,#70H;不能闪烁MOV29H,#00HMOVR7,#02HMOVR0,#28HMOVR2,#07HMOVR3,#WSLA_7290LCALLWRNBYTLCALLDELAYNEXTT:CALLDELAYSJMPMODEGET_TEMPER:SETBDQ;定时入口BCD:LCALLINIT_1820 JBFLAG1,S22LJMPBCD;若ds18b20不存在则返回S22:LCALLDELAY1MOVA,#0CCH;跳过rom匹配0cchLCALLWRITE_1820MOVA,#44H;发出温度转换命令LCALLWRITE_1820LCALLDELAYCBA:LCALLINIT_1820JBFLAG1,ABCLJMPCBAABC:LCALLDELAY1MOVA,#0CCH;跳过rom匹配LCALLWRITE_1820MOVA,#0BEH;发出读温度命令LCALLWRITE_1820LCALLREAD_18200RETWRITE_1820:;写ds18b20程序MOVR2,#8CLRCWR1:CLRDQMOVR3,#6;延时24usDJNZR3,$RRCAMOVDQ,CMOVR3,#23;延时60usDJNZR3,$SETB DQNOPDJNZR2,WR1SETBDQRETREAD_18200:;从1820中读出两个字节温度数据PUSH01HMOVR4,#2MOVR1,#36HRE00:MOVR2,#8RE01:CLRCSETBDQNOPCLRDQNOPNOPSETBDQMOVR3,#2DJNZR3,$MOVC,DQMOVR3,#23HDJNZR3,$RRC ADJNZR2,RE01MOVR1,ADECR1DJNZR4,RE00POP01HRETU8TEMPER_COV:;将读出的数据转换PUSHDPHPUSHDPLPUSH02HMOVA,#0F0HANLA,TEMPER_L;舍去小数点后的四位SWAPAMOVTEMPER_NUM,AMOVA,TEMPER_HANLA,#07HSWAPAADDA,TEMPER_NUMMOVTEMPER,A;转换成十进制数显示MOVB,#10DIVABMOV30H,B;个位MOVB,#10DIVABMOV31H,B;十位ANLA,#0FH;百位SWAPAADDA,BMOVTEMPER_BCD,ALCALLCF2;拆分查表MOV25H,R3MOV26H,R4MOVA,30HANLA,#0FHLCALLCFMOV24H,R3;处理四位小数位数据MOVA,TEMPER_LANLA,#0FH;取低四位数据MOVB,#02HMULAB;字节转为字MOVDPTR,#NUMSEGMOVCA,A+DPTRMOVTEMPER_BCD,ALCALLCF2MOV22H,R3MOV23H,R4MOVA,TEMPER_LANLA,#0FHMOVB,#02HMULABINCAMOVCA,A+DPTRMOVTEMPER_BCD,ALCALLCF2MOV20H,R3MOV21H,R4POP02HPOPDPLPOPDPHRET;-小数部分查表-NUMSEG:DW0000H,0625H,1250H,1875H,2500H,3125H,3750H,4375HDW5000H,5625H,6250H,6875H,7500H,8125H,8750H,9375H;-;-拆分显示整数子程序-CF:PUSH02HPUSHDPHPUSHDPLMOVDPTR,#LEDSEGMOVR2,TEMPER_BCDANLA,#0FHMOVCA,A+DPTR;查表得字形码MOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,AINCR3;加上小数点POPDPLPOPDPHPOP02HRET;-;-拆分显示小数子程序-CF2:PUSH02HPUSHDPHPUSHDPLPUSHACCMOVDPTR,#LEDSEGMOVR2,TEMPER_BCDMOVA,R2ANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,A;加上小数点POPACCPOPDPLPOPDPHPOP02HRET;-;-led字型码-LEDSEG:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4HDB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH;-INIT_1820:SETBDQNOPCLRDQMOVR0,#80HTSR1:DJNZR0,TSR1;延时300usSETBDQMOVR0,#25H;96usTSR2:DJNZR0,TSR2JNBDQ,TSR3LJMPTSR4;延时TSR3:SETBFLAG1;致标志位LJMPTSR5;ds18b20存在TSR4:CLRFLAG1;清标志位LJMPTSR7;ds18b20不存在TSR5:MOVR0,#06BH;延时200usTSR6:DJNZR0,TSR6TSR7:SETBDQRETDELAY1:MOVR7,#20H;80us延时DJNZR7,$RET;-蜂鸣器驱动子程序-BUZZER:PUSH07HMOVR7,#00HMOVTL0,#33H;设置定时0.5us初值MOVTH0,#0FEHSETBTR0;启动t0WAIT:JNBTF0,$CLRTF0MOVTL0,#33HMOVTH0,#0FEHCPLP1.2DJNZR7,WAITCLRTR0SETBP1.2POP07HRET;-;-外部中断服务程序-INT_7290:PUSH00HPUSH01HPUSH02HPUSH03HPUSH04HPUSH07HPUSHACCPUSHPSWSJMPRD1RD1: JBP3.2,$;以查询方式等待下一次按键操作SWAPALCALLRDKEYCJNEA,#0AH,WAITT;容错功能调整WAITT:JNC RD1MOVTEMPER_BCD,ALCALLCF2MOVB,#0AHMULABMOVR5,AMOV23H,R3MOVR7,#01HMOVR0,#23HMOVR2,#13HMOVR3,#WSLA_7290LCALLWRNBYTKEY2:JBP3.2,$;以查询方式等待下一次按键操作LCALLRDKEYCJNEA,#0AH,WAITT2WAITT2:JNCKEY2MOVTEMPER_BCD,ALCALLCF2MOVA,R5ADDA,TEMPER_BCDMOVR5,AMOV22H,R3MOV21H,#9CH;CMOVR7,#02HMOVR0,#21HMOVR2,#11HMOVR3,#WSLA_7290LCALLWRNBYT;确定键COMF:JBP3.2,$;等待确认键LCALLRDKEYCJNEA,#0FH,COMFMOV28H,R5;上限值放入28h中DOWN:;7290复位CLRP1.7LCALLDELAYSETBP1.7CLRIE0;必须清标志POPPSWPOPACCPOP07HPOP04HPOP03HPOP02HPOP00HRETI;-;-读取键值子程序(键值保存在A中)-RDKEY:MOVR0,#1FHMOVR7,#01HMOVR2,#01HMOVR3,#WSLA_7290MOVR4,#RSLA_7290LCALLRDADDMOVA,1FHDECARET;-;-延时子程序-DELAY:PUSH00H;延时子程序PUSH01HMOVR1,#00LP:MOVR1,#00HDJNZR1,$DJNZR0,LPPOP01HPOP00HRET;-(I2C子程序省略)九系统调试运行结果说明、分析所出现得问题,设计体会与建议 硬件使用ZLG51单片机开发平台,软件使用KEil2软件进行程序的编写编译以及调试。运行结果:能够实现当前环境温度的采集以及分为整数部分和小数部分的显示,设定温度上限,超过设定上限温度进行蜂鸣器报警,数码管同时闪烁,温度低于设定值立刻停止闪烁和报警。能够通过拨码控制模式切换,切换到设定上限温度模式,通过按键输入上限温度值改变当前上限温度,能够纠错,输入10以上的数字时不显示,按下确定键时确定温度上限值。问题:(1)采集的温度为十六进制数字,如何转换成十进制BCD码。通过查询上学期学习的计算机原理的相关算法,解决了此问题,成功显示。(2)小数部分的显示问题。通过将有可能出现的小数情况列举并进行查表显示,最后成功显示。(3)高于温度报警闪烁之后,温度下降以后数码管仍然闪烁,后来发现是子程序逻辑错误已经改正。十结论及设计体会 通过本次实验,我对DS18B20芯片有了一定的了解,对于DS18B20编程的时序要求以及相应的编程操作流程有了更深度的掌握。这次实验综合了中断、查询、时钟、ZLG7290芯片、DS18B20芯片等很多知识。本次试验采用子程序调用的方法进行设计,可以逐一的进行调试,对于代码量比较大的程序来说子程序设计还是很好的编程开发方式。此次试验中遇到很多细节的错误,比如子程序顺序混乱等逻辑错误,导致程序总是出现错误,幸好在最后都成功的改正了。 在代码量比较大的程序设计时,不能只对软件代码进行修改,还要结合硬件调试,否则很难看出问题,同时不怕错误,会正确的调试方法,灵活使用断点,会找错并改错也是很重要的素质。这次实验对我以后的程序设计任务有很大的启发作用,让我明白了程序设计的基本顺序和需要注意的地方以及调试方法,相信在以后的学习和工作中都会受益。最后感谢老师的悉心教导。参考文献1 MCS-51单片机应用实验教程 作者:陈育斌,秦晓梅等专心-专注-专业