数字温度计.docx
- 文档编号:8187968
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:20
- 大小:126.04KB
数字温度计.docx
《数字温度计.docx》由会员分享,可在线阅读,更多相关《数字温度计.docx(20页珍藏版)》请在冰豆网上搜索。
数字温度计
第一章设计的内容、要求及目的
1.1设计内容
设计基于单片机控制的四位数字温度计,数字式温度计测试范围为0~51℃,精度误差在0.5℃以内,LED数码管直读显示。
1.2设计要求
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成必要元器件选择;
(4)完成应用程序设计;
(*5)进行应用程序的调试;
第二章系统总体方案选择与说明
2.1总体设计方案
方案一:
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二:
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
第三章系统方框图与工作原理
3.1系统组成
四位数字温度计由三部分组成:
DS18B20温度传感器、AT89C2051、显示模块。
产品的主要技术指标:
1.采用单总线技术,与单片机通信只需要一根I/O线,在一根线上可以挂接多个DS18B20。
2.每只DS18B20具有一个独有的,不可修改的64位序列号,根据序列号访问地址的器件。
3.低压供电,电源范围从3~5V,可以本地供电,也可以直接从数据线上窃取电源(寄生电源方式)。
4.测温范围为0~51℃,误差在0.5℃以内。
3.2系统总设计框图
根据项目要求,确定该系统的设计方案,如图所示为该系统设计方案的硬件设计方案框图。
硬件由6个部分组成,即单片机、时钟电路、复位电路、LED显示驱动电路、LED显示电路及温度检测电路。
时钟电路LED显示器驱动电路LED显示电路
复位电路温度检测电路
图1 总体设计方框图
3.3工作原理
温度传感器DS18B20将被测环境温度转化成带符号的数字信号(以十六位补码形式,占两个字节),传感器输出脚I/O直接与单片机的P1.1相连,R25为上拉电阻,传感器采用外部电源供电。
AT89C2051是整个装置的控制核心,AT89C2051内带FlashROM,用户程序存放在这里。
显示器模块由四个单独的共阳LED数码管组成。
系统程序分传感器控制程序和显示器程序两部分,传感器控制程序是按照DS18B20的通信协议编制。
系统的工作是在程序控制下,完成对传感器的读写和对温度的显示。
第四章各部分方案选定、功能及计算
4.1主控制器
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
4.2温度传感器电路
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图2DS18B20与单片机的接口电路
4.3显示电路
显示电路采用4位共阳LED数码管,从P3口RXD,TXD串口输出段码。
显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。
图3温度显示电路
第五章器件说明
5.1温度传感器
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如下图所示。
图4DS18B20内部结构
第六章程序设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
6.1主程序
程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图5所示。
图5主程序流程图图6读温度流程图
6.2温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图6示。
6.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图7所示。
图7温度转换流程图
6.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图8所示。
图8 计算温度流程图
6.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图9。
图9 显示数据刷新流程图
第七章调试说明
(1)当操作者按下或松开按键时,按键会产生机械抖动。
这种抖动发生在按下或松开的瞬间,一般持续几到几十毫秒,抖动时间随按键的结构不同而不同。
在扫描键盘过程中,必须想办法消除按键抖动,否则会引起错误。
(2)在键盘扫描中,应当防止一次键而有多个对应键输入的情况。
这种情况的发生是由与键扫描速度和键处理速度较快,当按下的键还未松开时,键扫描程序和键处理程序已执行了多遍。
这样,由于程序执行和按键动作不同步而造成按一次键有多个值输入的错误状态。
为避免发生这种情况,必须保证按一次键,
CPU只对该键作一次处理。
为此,在扫描程序中不仅要检测是否有按键按下,在有键按下的情况,作一次键处理,而且在键处理完毕后,还应检测按下的键是否松开,只有当按下的键松开以后,程序才往下执行。
这样每按一个键,只作一个键处理,使两者达到同步,消除按一次按键有多次键值输入的错误情况。
设计总结
俗话说:
世上无难事,只怕有心人。
通过此次单片机课程设计,我总算明白了这个道理,真的深有体会。
一开始接到这个课题,我真的很茫然,不知道从何处下手,脑子完全蒙了,一头雾水,或许是因为我平时用功太少了。
每天对着课题左思右想,上网查资料,询问同学,从课本的第一页看到最后一页,我还是步履维艰。
后来,我和一组的同学一起开始苦战,一个问题一个地解决,从最简单的地方开始,放慢了速度,用心地做。
对程序的每个指令的由来,和单片机芯片的结构和原理,每一个引脚的功能,然后将它们结合起来,一步一步地前进。
渐渐地,脑子中对单片机模糊地记忆变得深刻起来,思路大概地清晰起来,老师在课堂是讲解的东西也越来越记忆犹新了。
最后,我和同学更加努力,从程序的调试,到原理图的绘制,遇上错误就仔细寻找问题,一一地修改。
这期间虽然花费了许多时间,有时候我们真的想放弃了,可看到身边的其他人还在拼命地加班熬夜,我又提起了精神,坐会电脑面前,告诫自己,既然已经开始了,要是现在放弃就是前功尽弃,这样很不值得。
秉着这个信念,我一路而来,功夫不负有心人,问题一一地被我们攻破了,眼前也渐渐地明亮起来,总算把难题给解决掉了。
回顾此次课程设计,我认识了一个问题,那就是做事的态度是成败的关键所在。
要是你不用心,是不可能完成的。
要是你用心了,就算累一点,苦一点,那也是值得的。
因为我从中懂得了许多东西,例如个人的动手能力,查阅资料,发现问题,分析问题,处理问题,对课本的知识有了更深刻的了解。
感谢老师的指导和同学的帮助,是你们的默默支持让我充满信心地一路走过来。
参考文献
1.何立民主编.MCS-51系列单片机应用系统设计配置与接口技术.北京:
北京航空航天大学出版社,1999
2.高锋主编.单片微机应用系统设计及使用技术.北京:
机械工业出版社,1996
3.苏凯,刘庆国,陈国平编著.MCS-51系列单片机系统原理与设计.北京:
冶金工业出版社,2003
4.周向红主编.51系列单片机应用与实践教程.北京:
北京航空航天大学出版社,2008
附录
一、程序清单
ORG0000H;主程序入口地址
AJMPMAIN;转主程序
ORG0003H;外中断0中断入口
DB00H,00H,00H,00H,00H,00H,00H;
RETI;跳至INTEX0执行中断服务程序
ORG000BH;定时器T0中断入口地址
DB00H,00H,00H,00H,00H,00H,00H;
RETI;跳至定时器T0执行中断服务程序
ORG0013H;外中断1中断入口
DB00H,00H,00H,00H,00H,00H,00H;
RETI;跳至INTEX1执行中断服务程序
ORG001BH;定时器T1中断入口地址
DB00H,00H,00H,00H,00H,00H,00H;
RETI;中断返回(不开中断)
ORG0023H;串行口中断入口地址
DB00H,00H,00H,00H,00H,00H,00H;
RETI;中断返回(不开中断)
MAIN:
MOVSP,#50H
MOVP1,#0FFH
LPTEMP:
LCALLGET_TEMPER;调用读温度子程序
LCALLCONVTEMP;温度BCD码计算处理子程
LCALLDISPBCD;显示区BCD码温度值刷新子程序
LCALLDISPLAY;调用数码管显示子程序
CPLP3.0
AJMPLPTEMP
INIT_1820:
SETBTEMPDIN
NOP
CLRTEMPDIN;主机发出延时537微秒的复位低脉冲
MOVR1,#3
TSR1:
MOVR0,#107
DJNZR0,$
DJNZR1,TSR1
SETBTEMPDIN;然后拉高数据线
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBTEMPDIN,TSR3;等待DS18B20回应
DJNZR0,TSR2
LJMPTSR4;延时
TSR3:
SETBFLAG1;置标志位,表示DS1820存在
CLRP3.7;检查到DS18B20就点亮P3.7LED
LJMPTSR
TSR4:
CLRFLAG1
DS1820CLRP3.1
LJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBTEMPDIN
RET
GET_TEMPER:
SETBTEMPDIN
LCALLINIT_1820;先复位DS18B20
JBFLAG1,TSS2
RET;判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
;CLRP3.3;DS18B20已经被检测到
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLDISPLAY
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200
RET
DS18B20的子程序
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRTEMPDIN
MOVR3,#6
DJNZR3,$
RRCA
MOVTEMPDIN,C
MOVR3,#23
DJNZR3,$
SETBTEMPDIN
NOP
DJNZR2,WR1
SETBTEMPDIN
RET
处理温度BCD码子程序
CONVTEMP:
MOVA,TEMPH
ANLA,#80H
JZTEMPC1;判断温度是否在零下?
CLRC;温度值补码变成原码
MOVA,TEMPL
CPLA
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A;TEMPHCHI=符号位
MOVTEMPHC,#0BH;置"-"标志
SJMPTEMPC11
TEMPC1:
MOVTEMPHC,#0AH;置"+"标志
TEMPC11:
MOVA,TEMPHC;计算小数位温度BCD值
SWAPA
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;乘0.0625
MOVDPTR,#TEMPDOTTAB
MOVCA,@A+DPTR
MOVTEMPLC,A;TEMPLCLOW=小数部分BCD
MOVA,TEMPL;计算整数位温度BCD值
ANLA,#0F0H
SWAPA
MOVTEMPL,A
MOVA,TEMPH
ANLA,#0FH
SWAPA
ORLA,TEMPL
MOVTEMPER_L,A
LCALLHEX2BCD1;调用单字节十六进制转BCD子程序
MOVTEMPL,A
ANLA,#0F0H
SWAPA
ORLA,TEMPHC;TEMPHCLOW=十位数BCD
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH
SWAPA;TEMPLCHI=个位数
BCD
ORLA,TEMPLC
MOVTEMPLC,A
MOVA,R7
JZTEMPOUT
ANLA,#0FH
SWAPA
MOVR7,A
MOVA,TEMPHC;TEMPHCHI=百位数
BCD
ANLA,#0FH
ORLA,R7
MOVTEMPHC,A
TEMPOUT:
RET
小数部分分码表
TEMPDOTTAB:
DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB06H,07H,08H,08H,09H,09H;
显示区BCD码温度值刷新子程序
DISPBCD:
MOVA,TEMPLC;温度数据移入显示寄存器
ANLA,#0FH
MOVBUF1,A;显示小数
MOVA,TEMPLC
SWAPA
ANLA,#0FH
MOVBUF2,A;显示个位
MOVA,TEMPHC
ANLA,#0FH
MOVBUF3,A;显示十位
MOVA,TEMPHC
SWAPA
ANLA,#0FH
MOVBUF4,A;显示百位
MOVA,TEMPHC
ANLA,#0F0H
CJNEA,#10H,DISPBCD0;百位数=0?
SJMPDISPOUT
DISPBCD0:
MOVA,TEMPHC
ANLA,#0FH
JNZDISPOUT;十位数是0?
MOVA,TEMPHC
SWAPA
ANLA,#0FH
MOVBUF4,0AH;符号位不显示
MOVBUF3,A;十位数显示符号
DISPOUT:
RET
HEX2BCD1:
MOVB,#64H;十六进制->BCD
DIVAB;B=A%100
MOVR7,A;R7=百位数
MOVA,#0AH
XCHA,B
DIVAB
SWAPA
ORLA,B
RET
CRC8CAL:
PUSHACC
MOVR7,#08H
CRC8LOOP1:
XRLA,B
RRCA
MOVA,B
JNCCRC8LOOP2
XRLA,#18H
CRC8LOOP2:
RRCA
MOVB,A
POPACC
RRA
PUSHACC
DJNZR7,CRC8LOOP1
POPACC
RET
读DS18B20的程序,从DS18B20中读出9个字节数据
开始的两个字节为温度数据
READ_18200:
MOVR4,#9;将温度高位和低位从DS18B20中读出
MOVR1,#TEMPER_L;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
MOVB,#00H
RE00:
MOVR2,#8;数据一共有8位
RE01:
CLRC
SETBTEMPDIN
NOP
NOP
CLRTEMPDIN
NOP
NOP
NOP
SETBTEMPDIN
MOVR3,#9
RE10:
DJNZR3,RE10
MOVC,TEMPDIN
MOVR3,#23
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
INCR1
LCALLCRC8CAL
DJNZR4,RE00
MOVA,B
JNZREAD_OUT
MOVTEMPL,TEMPER_L
MOVTEMPH,TEMPER_H
READ_OUT:
RET
显示子程序
DISPLAY:
MOVDPTR,#NUMTAB;指定查表启始地址
MOVR0,#4
DP11:
MOVR1,#250;显示1000次
DPLP:
SETBP1.7
MOVA,BUF1;取小位数
MOVCA,@A+DPTR;查小位数的7段代码
MOVP1,A;送出小位的7段代码
CLRP3.0;开小位显示
ACALLDL1ms;显示1ms
SETBP3.0
MOVA,BUF2;取个位数
MOVCA,@A+DPTR;查个位数的7段代码
MOVP1,A;送出个位的7段代码
CLRP1.7
CLRP3.1;开个位显示
ACALLDL1ms;显示1ms
SETBP3.1
SETBP1.7
MOVA,BUF3;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
MOVP1,A;送出十位的7段代码
CLRP3.2;开十位显示
ACALLDL1ms;显示1ms
SETBP3.2
SETBP1.7
MOVA,BUF4;取百位数
MOVCA,@A+DPTR;查百位数的7段代码
MOVP1,A;送出百位的7段代码
CLRP3.3;开百位显示
ACALLDL1ms;显示1ms
SETBP3.3
DJNZR1,DPLP;250次没完循环
DJNZR0,DP11;4个100次没完循环
RET
0.2MS延时(按12MHZ算)
DL1MS:
MOVR7,#100
DJNZR7,$
RET
二、主电路图
单片机主板电路
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度计
![提示](https://static.bdocx.com/images/bang_tan.gif)