1、大连理工大学本科设计汇报题目:基于DS18B20、ZLG7290温度 采集系统设计 课程名称: 单片机综合设计试验 学院(系): 信息和通信工程学院专 业: 电子信息工程 班 级: 电子 学 号: 学生姓名: 成 绩: 20 16 年 5 月 6 日题目:1 设计要求1.利用DS18B20实现现场环境温度采集;2.利用ZLG7290B实现温度数据证书十进制显示;3.默认一个上限温度报警(蜂鸣器);4.能够利用ZLG7290B键盘操作修改“上限报警值”;5.能够显示温度小数位,以提升温度检测分辨率;6.程序中必需有中止步骤。 2 设计分析及系统方案设计利用P3.3口采集DS18B20温度信息,采
2、集后,经过I2C协议控制ZLG7290显示温度信息,而且将小数部分显示出来,经过P1.3连接一个拨码用来做模式控制,控制是温度显示状态模式或设定温度上限模式,其中温度上限存放在28H单元中。利用T0定时器控制蜂鸣器发声一段时间,超出温度上限报警声音提醒,同时数码管进行闪烁以报警。利用INT0外部中止读取按键值,用于设定上限温度并保留。3系统电路图P1.3P1.3P1.25 主程序中关键变量说明内存单元定义、功效等。变量名称内存单元功效TEMPER_L 36H存放温度低四位TEMPER_H 35H存放温度高四位TEMPER 34H转换后温度值TEMPER_BCD33HBCD形式温度值TEMPER
3、_NUM 60H温度值缓冲单元WSLA_7290 70H7290写控制单元RSLA_7290 71H7290读控制单元20-27H数码管显示缓冲区28H存放温度上限值30-31H存放温度BCD码个位十位6系统软件中各个子程序功效描述子程序名称、功效,和入口、出口参数。子程序名称功效 描述GET_TEMPER读取18B20温度值WRITE_1820向18b20写控制字READ_18200向18b20读控制字TEMPER_COV温度转换成十进制BCD码形式CF拆分子程序,拆分送数码管显示INIT_1820温度传感器初始化BUZZER蜂鸣器控制发声子程序INT_7290:读取按键外部中止子程序RDK
4、EY读取键值子程序DELAY延时子程序7主程序程序步骤图8程序清单(I2C库函数省略)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复位C
5、LRP1.7LCALLDELAYSETBP1.7MOV28H,#1EH;温度上限初始值30度 MOVTMOD,#01H;模式一,16位计数器SETBEA;许可中止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度
6、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,#
7、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匹配0
8、cchLCALLWRITE_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,$SET
9、B DQNOPDJNZR2,WR1SETBDQRETREAD_18200:;从1820中读出两个字节温度数据PUSH01HMOVR4,#2MOVR1,#36HRE00:MOVR2,#8RE01:CLRCSETBDQNOPCLRDQNOPNOPSETBDQMOVR3,#2DJNZR3,$MOVC,DQMOVR3,#23HDJNZR3,$RRC ADJNZR2,RE01MOVR1,ADECR1DJNZR4,RE00POP01HRETTEMPER_COV:;将读出数据转换PUSHDPHPUSHDPLPUSH02HMOVA,#0F0HANLA,TEMPER_L;舍去小数点后四位SWAPAMOVTEMP
10、ER_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,#02HMULABMOVDPTR,#NUMSEGMOVCA,A+DPT
11、RMOVTEMPER_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:PUSH02HPUSHDP
12、HPUSHDPLMOVDPTR,#LEDSEGMOVR2,TEMPER_BCDANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,AINCR3;加上小数点POPDPLPOPDPHPOP02HRET;-;-拆分显示小数子程序-CF2:PUSH02HPUSHDPHPUSHDPLPUSHACCMOVDPTR,#LEDSEGMOVR2,TEMPER_BCDMOVA,R2ANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHMOVCA,A+DPTRMOVR4,A;加上小数点POP
13、ACCPOPDPLPOPDPHPOP02HRET;-;-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;d
14、s18b20不存在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:PUSH00HPUSH01HP
15、USH02HPUSH03HPUSH04HPUSH07HPUSHACCPUSHPSWSJMPRD1RD1: JBP3.2,$;以查询方法等候下一次按键操作SWAPALCALLRDKEYCJNEA,#0AH,WAITT;容错功效调整WAITT:JNC RD1MOVTEMPER_BCD,ALCALLCF2MOVB,#0AHMULABMOVR5,AMOV23H,R3MOVR7,#01HMOVR0,#23HMOVR2,#13HMOVR3,#WSLA_7290LCALLWRNBYTKEY2:JBP3.2,$;以查询方法等候下一次按键操作LCALLRDKEYCJNEA,#0AH,WAITT2WAITT2:J
16、NCKEY2MOVTEMPER_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;
17、-;-读取键值子程序(键值保留在A中)-RDKEY:MOVR0,#1FHMOVR7,#01HMOVR2,#01HMOVR3,#WSLA_7290MOVR4,#RSLA_7290LCALLRDADDMOVA,1FHDECARET;-;-延时子程序-DELAY:PUSH00H;延时子程序PUSH01HMOVR1,#00LP:MOVR1,#00HDJNZR1,$DJNZR0,LPPOP01HPOP00HRET;-;【附录一】由汇编语言编制I2C通讯子程序;【提 示】下列程序是在系统时钟为12MHZ(或11.0592MHZ),即NOP指令为1微秒左右。;(1)带有内部单元地址多字节写操作子程序 WRN
18、BYT;*;通用I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);相关子程序WRBYT、STOP、CACK、STA;*WRNBYT:PUSHPSWPUSHACCWRADD:MOVA,R3;取外围器件地地址(包含r/w=0)LCALLSTA;发送起始信号S LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件应答信号JBF0,WRADD;假如应MOVA,R2LCALLWRBYT;发送内部寄存器首地址LCALLCACK;检测外围器件应答信号JBF0,WRADD;假如应答不正确返回重来 WRD
19、A:MOVA,R0LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件应答信号JBF0,WRADD;假如应答不正确返回重来INCR0DJNZ R7,WRDALCALLSTOP POPACCPOPPSWRET ;*;(2)带有内部单元地址多字节读操作子程序 RDADD ;*;通用I2C通讯子程序(多字节读操作);入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);相关子程序WRBYT、STOP、CACK、STA、MNACK ;*RDADD: PUSHPSW;从PCF856302H单元读入7个参数PUSHACC;存放于20H-2
20、6H单元RDADD1:LCALLSTA MOVA,R3;取器件地址(写)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件应答信号JBF0,RDADD1;假如应答不正确返回重来MOVA,R2;取内部地址LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件应答信号JBF0,RDADD1;假如应答不正确返回重来LCALLSTAMOVA,R4;取器件地址(读)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件应答信号JBF0,RDADD1;假如应答不正确返回重来RDN:LCALLRDBYT MOVR0,ADJNZR7,ACKLCALLMNACKLCALL
21、STOPPOPACCPOPPSWRETACK:LCALLMACKINCR0SJMPRDN ;(3)I2C各个信号子程序;*;开启信号子程序S ;*STA:SETBSDA;开启信号SSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSDANOP;产生4.7US延时NOPNOPNOPNOP CLRSCLRET ;*;停止信号子程序P ;*STOP:CLRSDA ;停止信号PSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPSETBSDANOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET ;*;应答信号子程序 MACK;*MACK:CL
22、RSDA;发送应答信号ACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLSETBSDARET;*;非应答法信号子程序MNACK;*MNACK:SETBSDA;发送非应答信号NACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET;*;应答检测子程序CACK;*CACK:SETBSDA;应答位检测子程序SETBSCL CLRF0MOVC,SDA;采样SDAJNCCEND;应答正确时转CENDSETBF0;应答错误时F0置一CEND:CLRSCLRET;*;发送一个字节子程序WRBYT;*WRBYT:PUSH06HMOV
23、R6,#08H;发送一个字节子程序 WLP:RLCA ;(入口参数A)MOVSDA,CSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLDJNZR6,WLPPOP06HRET;*;接收一个字节子程序RDBYT ;*RDBYT: PUSH06HMOVR6,#08H;接收一个字节子程序RLP:SETBSDASETBSCL; *NOP;!产生大于15微秒延时!NOP ;注意这是专门为ZLG7290NOP ;添加20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP; *MOVC,SDAMOVA,R2RLCAMOVR2,ACLRSCLDJNZ
24、R6,RLP ;(出口参数R2)POP06HRET ;*end9系统调试运行结果说明、分析所出现问题,设计体会和提议硬件使用ZLG51单片机开发平台,软件使用KEil2软件进行程序编写编译和调试。运行结果:能够实现目前环境温度采集和显示、和超出设定上限温度进行报警,数码管闪烁功效。同时能够经过拨码控制模式切换,切换到设定上限温度模式,经过按键输入上限温度值改变目前上限温度。调试问题:(1)采集温度为十六进制数字,怎样转换成十进制BCD码。经过查询上学期学习计算机原理相关算法,处理了此问题,成功显示(2)小数部分显示问题。经过将全部可能小数情况列举并进行查表显示,最终成功显示。(3)读取按键值时
25、键入非0-9键值也会录入,但不符合实际情况。以后经过判定大小语句更正,确保了按键输入容错功效(4)温度上限值保留问题,不能够立即改变,发觉不管怎样保护R1或是28H单元值,其中上限值总会发生跳变。以后发觉R5寄存器一直没有使用,于是将上限温度保留在R5中,再赋给28H单元,成功保留上限值。不过还出现了假如给了R5初值则上限值又无法成功保留问题,至今无法处理,故初始上限值为0度。10结论及设计体会此次试验综合性比较强,将前几次试验所学习利用知识全部用上了,而且综合整合到一起,调试过程并不是尤其费劲,一切全部比较顺利,不过也碰到了不少困难,从中学到了不少东西。此次试验是基于一个现现在很普及和实用性
26、很强单片机开发平台完成试验,此项试验也含有很大实际生活应用意义,对我们以后更深入完成单片机开发甚至嵌入式开发全部有很大帮助!此次试验最大收获有两点:第一点,编程能力有了显著提升,尤其是汇编语言编程能力,刚开始时候感觉比较困难,先要将温度用十进制显示出来,刚开始时候有些不知所措,以后想到了上学期学习汇编时用算法成功处理了问题,以后一点一点将以前代码加入整合调整。第二点,调试程序能力,尤其是结合硬件调试程序能力,以前总是喜爱一个人窝在寝室码代码,不过这次试验不一样,需要跟开发板硬件相结合,光靠自己凭空写代码是没有用,只有结合硬件接口才能找到软件跟硬件连接问题所在,才能够愈加好完成功效实现。参考文件1 教材MCS-51单片机应用试验教程,秦晓梅,陈育斌等