基于51单片机-单总线高精度温度采集系统(共15页).doc

上传人:飞****2 文档编号:7872998 上传时间:2022-03-06 格式:DOC 页数:15 大小:71KB
返回 下载 相关 举报
基于51单片机-单总线高精度温度采集系统(共15页).doc_第1页
第1页 / 共15页
基于51单片机-单总线高精度温度采集系统(共15页).doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《基于51单片机-单总线高精度温度采集系统(共15页).doc》由会员分享,可在线阅读,更多相关《基于51单片机-单总线高精度温度采集系统(共15页).doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上大连理工大学本科设计报告题目: 单总线高精度温度采集系统 题目:单总线高精度温度采集系统1 设计要求系统结构:1)由DS18B20实现对温度的采集; 2)由数码管实现温度显示系统。设计要求 :1)启动DS18B20进行12位高精度环境温度采集;2)利用数码管显示数据;3)具有温度上限声光报警;4)可以通过键盘设定报警上限值。扩展功能: 1)报警频率随实测温度与报警温度的差值变化,相差越大频率越高;2)键盘设定上限值时十位,个位的闪烁,并且在输入后停止闪烁。2 设计分析及系统方案设计程序采用无限循环结构。一次循环中,完成对温度的采集和显示,判断超过设定值时报警。键盘设定

2、用外中断/INT1完成,T1产生方波驱动蜂鸣器发声,初值赋为采集温度与设定值的差值。3.系统电路图K1-K16键盘矩阵电路8位数码管显示4 外围接口模块硬件电路功能描述ZLG7290B:数码管动态显示驱动、键盘扫描芯片。通过按键进行上限温度的设定及温度的显示模块。蜂鸣器模块:当温度超过上限则报警。DS18B20:智能温度传感器。对环境温度进行12位精度的采集。 5 主程序中主要变量定义变量名称RAM单元/寄存器功能TEMPER_L36H读出温度值低8位数据TEMPER_H35H读出温度值高4位数据TEMPER34H转换温度整数部分TEMPER-NUM60H转换温度整数部分的缓冲单元TEMPER

3、_XS33H转换温度小数部分TEMPER-NUM-XS61H转换温度小数部分的缓冲单元LIMIT14H键盘输入的温度上限值6系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能 描述GET_TEMPER无温度值高四位TEMPER_L、温度值低8位TEMPER_H从DS18B20中读出12位温度数据TEMPER_COVTEMPER_LTEMPER_HTEMPERTEMPER_XS将读出的12位温度数据转换并保存INT_1820无FLAG1初始化DS18B20WRITE_1820A无向DS18B20中写入数据INT_T1TH1TL1定时器T1中断。装定时初值,初值为温度差值,并对P3.5取

4、反驱动蜂鸣器。DISPLAYTEMPERTEMPER_XS无将温度通过数码管显示出来READ_18200无TEMPER_LTEMPER_H从DS18B20中读出数据并储存7主程序程序流程图转换温度子程序读温度子程序开T1中断并赋初值开键盘中断INT07290复位开始把数据通过数码管显示出来采集温度值是否大于设定值 N开T1中断,把设定值与温度差值赋给T1初值,并驱动蜂鸣器报警 Y Y8程序清单专心-专注-专业TEMPER_L EQU 36H;存放读出温度低位数据TEMPER_H EQU 35H;存放读出温度高位数据TEMPER EQU34H ;存放转换后的8位温度值TEMPER_XS EQU

5、33H;存放转换温度的小数部分TEMPER_NUM EQU 60H;缓冲单元TEMPER_NUM_XS EQU61HFLAG1 BIT00H DQ BITP3.3;一线总线控制端口LIMIT EQU 14HWSLA EQU 070HRSLA EQU 071HSDA BIT P1.0SCL BIT P1.1ORG 8000HLJMP MAINORG 8003H;外中断Int0的入口地址LJMP INT_7290ORG 801BH;定时器T1的入口地址LJMP INT_T1ORG 8100HMAIN:MOV SP,#70HCLR P1.2;7290复位LCALL DELAYSETB P1.2MOV

6、 LIMIT,#0FFHLP1:SETB EX0;开外中断0SETB EAMOV TCON,#00HSETBET1;开T1中断SETBEAMOV TMOD,#10H;T1初值MOV TL1,#33HMOV TH1,#0FEHLCALL GET_TEMPER;从DS18B20读出温度数据LCALL TEMPER_COV;转换读出的温度数据并保存MOV A,TEMPERCJNE A,LIMIT,NEXTNEXT:JNC NEXT1;TEMPER=LIMITJMP NEXT2NEXT1:SETBTR1LJMPNEXT3NEXT2:CLRTR1NEXT3:MOV 31H,#00H;显示整数部分MOV

7、30H,#01HMOV B,#10 DIV ABADD A,#02HMOV 37H,AMOV A,BADD A,#0CHMOV 36H,AMOV A,TEMPER_XS;显示小数部分MOV B,#4MUL ABADD A,#16HMOV 35H,AINC AMOV 34H,AINC AMOV 33H,AINC AMOV 32H,AMOV DPTR,#LEDSEG1CLR AMOV R7,#08HMOV R0,#20HMOV R1,#30HLOOP1:MOV A,R1MOVC A,A+DPTRMOV R0,AINC R1INC R0DJNZ R7,LOOP1MOV R7,#08HMOV R0,#

8、20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY2MOV A,TEMPERSJMP LP1;T1中断服务程序INT_T1:PUSHACCPUSHPSWCLR TF1MOVA,TEMPERSUBB A,LIMITMOVB,#2MULABADD A,#33HMOV TL1,A ;赋定时器t1初值MOV TH1,#0FEHCPL P3.5POP PSWPOPACCRETILEDSEG1: DB 0C6H,9CH;查表 DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H DB 0FDH,61H,0DBH

9、,0F3H,67H,0B7H,0BFH,0E5H,0FFH,0F7H DB 0FCH,0FCH,0FCH,0FCH,0FCH,0BEH,0DAH,0B6H,60H,0DAH,0B6H,0FCH,60H,0FEH,0E4H,0B6H DB 0DAH,0B6H,0FCH,0FCH,0F2H,60H,0DAH,0B6H,0F2H,0E4H,0B6H,0FCH DB 66H,0F2H,0E4H,0B6H DB 0B6H,0FCH,0FCH,0FCH DB 0B6H,0BEH,0DAH,0B6H DB 0BEH,0DAH,0B6H,0FCH DB 0BEH,0FEH,0E4H,0B6H DB 0E4H,

10、0B6H,0FCH,0FCH DB 0FEH,60H,0DAH,0B6H DB 0FEH,0E4H,0B6H,0FCH DB 0F6H,0F2H,0E4H,0B6H DB 00H,0EEH,10HDELAY2:PUSH 00HPUSH 01HMOV R0,#00HDELAY3:MOV R1,#00HDJNZ R1,$DJNZ R0,DELAY3POP 01HPOP 00HRET ;*读取温度值GET_TEMPER:;读出转换后的温度值SETB DQ ;定时入口BCD:LCALL INIT_1820JB FLAG1,S22LJMP BCD ; 若DS18B20不存在则返回S22:LCALL DE

11、LAY1MOV A,#0CCH ; 跳过ROM匹配 0CCHLCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL DELAYCBA:LCALL INIT_1820JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;READ_1820RET WRITE_1820:;写DS18B20的程序MOV R2,#8CLR CWR1:CLR D

12、QMOV R3,#6;延时24usDJNZ R3,$RRC AMOV DQ,CMOV R3,#23;延时60usDJNZ R3,$SETB DQ;一个写周期至少要维持60us以上NOP;离下一个写周期至少要有1us间隔DJNZ R2,WR1SETB DQRETREAD_18200:; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)RE00:MOV R2,#8RE01:CLR CSETB DQNOPCLR DQ;DQ;D

13、Q=0 15US内NOP;18B20送数,主控器NOP;必须完成DQ的采样SETB DQ;主控器释放DQMOV R3,#2DJNZ R3,$;延时10usMOV C,DQ;取dq数据位MOV R3,#23;延时60usDJNZ R3,$RRC ADJNZ R2,RE01MOV R1,ADEC R1DJNZ R4,RE00RETTEMPER_COV:;将读出的数据进行转换MOV A,#0F0HANL A,TEMPER_LSWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LANL A,#0FHMOV TEMPER_NUM_XS,AMOV TEMPER_XS,TEMPER_NUM

14、_XSTEMPER_COV1:MOV A,TEMPER_H ANL A,#07HSWAP AADD A,TEMPER_NUMMOV TEMPER_NUM,AMOV TEMPER,TEMPER_NUMRETINIT_1820:; DS18B20初始化程序SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1SETB DQMOV R0,#25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4TSR3:SETB FLAG1LJMP TSR5TSR4:CLR FLAG1LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R

15、0,TSR6TSR7:SETB DQRETDELAY1:MOV R7,#20HDJNZ R7,$RETDELAY:PUSH 00HPUSH 01HMOV R0,#00LP:MOV R1,#00HDJNZ R1,$DJNZ R0,LPPOP 01HPOP 00HRET;*键盘设定温度上限值INT_7290:PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWLCALL RDKEYCJNE A,#0AH,DOWN1LJMPAKEYDOWN1:LJMP DOWNAKEY:LCALL DISPLAYA;闪烁控制PUSH05HPUSH06HMO

16、VR5,#70HMOVR6,#08HMOVR7,#02HMOVR0,#05HMOVR2,#07HMOVR3,#WSLALCALLWRNBYTLCALLDELAYPOP06HPOP05HCXUN:JB P3.2,$LCALL RDKEYCJNE A,#0AH,NEXT4;查询输入值是否为数字NEXT4: JNC CXUNNEXT5:MOV 40H,ALCALL DISPLAY1MOV A,40HMOV B,#10MUL ABMOV 14H,A;存十位;闪烁控制PUSH05HPUSH06HMOVR5,#70HMOVR6,#04HMOVR7,#02HMOVR0,#05HMOVR2,#07HMOVR3

17、,#WSLALCALLWRNBYTLCALLDELAYPOP06HPOP05HCXUN1:JB P3.2,$LCALL RDKEYCJNE A,#0AH,NEXT6;查询输入值是否为数字 NEXT6: JNC CXUN1;闪烁控制NEXT7:PUSH05HPUSH06HMOVR5,#70HMOVR6,#00HMOVR7,#02HMOVR0,#05HMOVR2,#07HMOVR3,#WSLALCALLWRNBYTLCALLDELAYPOP06HPOP05HMOV 41H,A;存个位LCALL DISPLAY2;显示个位数MOV A,41HADD A,14HMOV LIMIT,A;设定报警值JB

18、P3.2,$FH1:LCALL RDKEYCJNE A,#0BH,FH1DOWN:CLR IE0POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 00HRETIRDKEY:MOVR0,#1FH;键值缓冲单元MOVR7,#01H;取一个数据(键值)MOVR2,#01H ;指向内部数据键值寄存器地址MOVR3,#WSLA_7290;取器件地址(写)MOVR4,#RSLA_7290;取器件地址(读) LCALLRDADD;读出7290的01H单元中的键值MOVA,1FH;取健值送缓冲单元DECARETDISPLAY2:;显示输入的个位数MOV 30H,#01

19、HMOV 31H,#00HPUSHACCMOVA,40HADDA,#02HMOV 33H,APOPACCADD A,#02HMOV 32H,AMOV 34H,#56HMOV 35H,#56HMOV 36H,#56HMOV 37H,#57HMOV DPTR,#LEDSEG1CLR AMOV R7,#08HMOV R0,#20HMOV R1,#30HLOOP2:MOV A,R1MOVC A,A+DPTRMOV R0,AINC R1INC R0DJNZ R7,LOOP2MOV R7,#08HMOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DEL

20、AY2RETDISPLAYA:;显示AMOV 30H,#01HMOV 31H,#00HMOV 32H,#58HMOV 33H,#58HMOV 34H,#56HMOV 35H,#56HMOV 36H,#56HMOV 37H,#57HMOV DPTR,#LEDSEG1CLR AMOV R7,#08HMOV R0,#20HMOV R1,#30HLOOP3:MOV A,R1MOVC A,A+DPTRMOV R0,AINC R1INC R0DJNZ R7,LOOP3MOV R7,#08HMOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL DELAY2R

21、ETDISPLAY1:;显示输入的十位数MOV 30H,#01HMOV 31H,#00HMOV 32H,#58HADD A,#02HMOV 33H,AMOV 34H,#56HMOV 35H,#56HMOV 36H,#56HMOV 37H,#57HMOV DPTR,#LEDSEG1CLR AMOV R7,#08HMOV R0,#20HMOV R1,#30HLOOP4:MOV A,R1MOVC A,A+DPTRMOV R0,AINC R1INC R0DJNZ R7,LOOP4MOV R7,#08HMOV R0,#20HMOV R2,#10HMOV R3,#WSLALCALL WRNBYTLCALL

22、 DELAY2RET;【附录一】由汇编语言编制的I2C通讯子程序;(1)带有内部单元地址的多字节写操作子程序 WRNBYT;*;通用的I2C通讯子程序(多字节写操作);入口参数R7字节数,R0:源数据块首地址;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写);相关子程序WRBYT、STOP、CACK、STA;*WRNBYT:PUSHPSWPUSHACCWRADD:MOVA,R3;取外围器件地地址(包含r/w=0)LCALLSTA;发送起始信号S LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应MOVA,R2LCALLWR

23、BYT;发送内部寄存器首地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来 WRDA:MOVA,R0LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,WRADD;如果应答不正确返回重来INCR0DJNZ R7,WRDALCALLSTOP POPACCPOPPSWRET ;*;(2)带有内部单元地址的多字节读操作子程序 RDADD ;*;入口参数R7字节数;;R0目标数据块首地址;R2从器件内部子地址;;R3器件地址(写);R4器件地址(读);相关子程序WRBYT、STOP、CACK、STA、MNACK ;*RDADD:

24、 PUSHPSW;从PCF8563的02H单元读入7个参数PUSHACC;存放于20H-26H单元RDADD1:LCALLSTA MOVA,R3;取器件地址(写)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来MOVA,R2;取内部地址LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重来LCALLSTAMOVA,R4;取器件地址(读)LCALLWRBYT;发送外围地址LCALLCACK;检测外围器件的应答信号JBF0,RDADD1;如果应答不正确返回重

25、来RDN:LCALLRDBYT MOVR0,ADJNZR7,ACKLCALLMNACKLCALLSTOPPOPACCPOPPSWRETACK:LCALLMACKINCR0SJMPRDN ;(3)I2C各个信号子程序;*;启动信号子程序S ;*STA:SETBSDA;启动信号SSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSDANOP;产生4.7US延时NOPNOPNOPNOP CLRSCLRET ;*;停止信号子程序P ;*STOP:CLRSDA ;停止信号PSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPSETBSDANOP;产生4.7US延时NOPN

26、OPNOPNOPCLRSCLCLRSDARET ;*;应答信号子程序 MACK;*MACK:CLRSDA;发送应答信号ACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLSETBSDARET;*;非应答法信号子程序MNACK;*MNACK:SETBSDA;发送非应答信号NACKSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLCLRSDARET;*;应答检测子程序CACK;*CACK:SETBSDA;应答位检测子程序SETBSCL CLRF0MOVC,SDA;采样SDAJNCCEND;应答正确时转CENDSETBF0;应答错误时F0置一C

27、END:CLRSCLRET;*;发送一个字节子程序WRBYT;*WRBYT:PUSH06HMOVR6,#08H;发送一个字节子程序 WLP:RLCA ;(入口参数A)MOVSDA,CSETBSCLNOP;产生4.7US延时NOPNOPNOPNOPCLRSCLDJNZR6,WLPPOP06HRET;*;接收一个字节子程序RDBYT ;*RDBYT: PUSH06HMOVR6,#08H;接收一个字节子程序RLP:SETBSDASETBSCL; *NOP;!产生大于15微秒的延时!NOP ;注意这是专门为ZLG7290NOP ;添加的20微秒延时部分NOPNOPNOPNOPNOPNOPNOPNOPN

28、OPNOPNOPNOP; *MOVC,SDAMOVA,R2RLCAMOVR2,ACLRSCLDJNZR6,RLP ;(出口参数R2)POP06HRET ;*END9系统调试运行结果说明、分析所出现得问题,设计体会与建议调试阶段利用KeilC51 (uVsion3)配合TKSMonitor 51仿真器,在单片机综合仿真实验台上完成。程序采用汇编语言编写。 运行结果说明:这次综合设计的运行结果实现了基本功能,能实时监测温度变化并显示出来,有键盘设定上限值和报警的功能。在报警时,我添加了报警频率的改变,使报警频率与采集温度和设定温度的差值有关,即采集温度超过上限温度越多,报警的频率越大,声音越急促。

29、在键盘设定上限值时,我添加了闪烁控制,使输入的十位和个位闪烁,并且在输入后停止闪烁。 分析出现问题:在这次的设计中遇到了不少问题,特别是关于外中断INT0和定时器T1的编写花费了较长的时间,主要是因为这部分的原理我不是特别的明白,后来我又看了一遍书,并且在老师的帮助下通过设置断点进行调试,终于运行正确。还有一个问题就是当报警时,数码管就开始不断闪烁。后来通过了解是因为ZLG7290的复位端接在P1.7,而驱动蜂鸣器时,由于仿真器的缺陷,P1.7引脚输出很不稳定,不断对7290复位,造成显示异常。后来改接到P1.2口,则运行正常。10 结论及设计体会 这次单片机的综合设计让我获益匪浅,特别是I2C协议和以前的程序有所区别,但是通过练习让我对各个模块的编程及调试方法都有了了解与掌握。本来我对编程是有一定的恐惧心理的,可是,通过这学期的学习我发现编单片机的程序并不是一件困难的事情,在编写程序时一定要模块化,把一个模块调试好了再进行下一个模块的调试。当有错误时,可以通过设置断点单步运行来发现错误。感谢秦老师这学期对我的帮助和指导,让我收获了很多。参考文献陈育斌 . MCS_51单片机应用实验教程M . 大连理工大学出版社,2011

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁