片单机简易数字温度计大学论文.docx
《片单机简易数字温度计大学论文.docx》由会员分享,可在线阅读,更多相关《片单机简易数字温度计大学论文.docx(35页珍藏版)》请在冰豆网上搜索。
片单机简易数字温度计大学论文
第1章引言0
第2章开发和仿真软件简介1
2.1开发软件KeilC51uVision21
2.2仿真软件ProteusISIS2
第3章总体设计方案3
第4章系统硬件使用介绍4
4.1DS18B20温度传感器4
4.2单片机控制电路6
4.3显示器——采用LCD20048
第5章系统软件设计主要流程图9
5.1主程序流程图9
5.2计算温度流程图10
5.3液晶显示流程图11
5.4读出温度子程序12
第6章系统仿真14
第7章总结与体会15
主要参考资料16
附录17
附录一.源程序代码17
附录二.软件仿真图29
第1章引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
在信息采集(传感器技术)、信息传输(通信技术)和信息处理(计算机技术)三大信息技术中,传感器属于信息技术的前沿尖端产品,尤其是温度传感器技术,在我国各领域已经引用的非常广泛,可以说是渗透到社会的每一个领域,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:
①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。
目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。
社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
本次课程设计,利用Keil和Proteus软件设计和仿真该智能数字多点测温系统。
过程中所用到的主要电路由我们自主设计制作,通过查阅资料和借助指导老师最终设计出结构合理、美观,主要电气指标良好,性能稳定可靠的电路。
以培养我们严谨的科学态度,正确的设计思想,科学的设计方法和良好的工作作风,掌握一定的专业技能及综合运用基础理论、基本知识的能力。
第2章开发和仿真软件简介
2.1开发软件KeilC51uVision2
KeiluVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS-51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持、PLM、汇编和C语言的程序设计,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
KeilC51集成开发环境主要由菜单栏、工具栏、源文件编辑窗口、工程窗口和输出窗口五部分组成。
工具栏为一组快捷工具图标,主要包括基本文件工具栏、建造工具栏和调试工具栏,基本文件工具栏包括新建、打开、拷贝、粘贴等基本操作。
建造工具栏主要包括文件编译、目标文件编译连接、所有目标文件编译连接、目标选项和一个目标选择窗口。
调试工具栏位于最后,主要包括一些仿真调试源程序的基本操作,如单步、复位、全速运行等。
在工具栏下面,默认有三个窗口。
左边的工程窗口包含一个工程的目标(target)、组(group)和项目文件。
右边为源文件编辑窗口,编辑窗口实质上就是一个文件编辑器,我们可以在这里对源文件进行编辑、修改、粘贴等。
下边的为输出窗口,源文件编译之后的结果显示在输出窗口中,会出现通过或错误(包括错误类型及行号)的提示。
如果通过则会生成“HEX”格式的目标文件,用于仿真或烧录芯片。
基本环境如图2-1所示:
图2-1KeilC51软件的运行界面
2.2仿真软件ProteusISIS
Proteus软件是来自英国Labcenterelectronics公司的EDA工具软件。
该软件有十几年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,为用户建立了完备的电子设计开发环境。
ProteusISIS的工作界面是一种标准的Windows界面。
主要包括:
标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
主要功能是在图形编辑窗口做出所需的电路图。
软件的应用设计界面如图2-2所示:
第3章总体设计方案
此次课程设计要求设计一个简易数字温度计。
采用AT89C51单片机作为系统的控制电路,负责数据的采集、处理、发送。
可以采用一只温度传感器DS18B20产生温度数据并发送给单片机,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
显示部分采用LCD2004显示器。
这种方法电路比较简单,软件设计也比较简单。
总体设计框图如下:
51单片机
LCD2004显示器
图3.1总体设计框图
第4章系统硬件使用介绍
4.1DS18B20温度传感器
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EPROM中,掉电后依然保存。
温度传感器DS18B20引脚如图3所示。
8引脚封装TO-92封装
图4-1温度传感器
引脚功能说明:
NC:
空引脚,悬空不使用;
VDD:
可选电源脚,电源电压范围3~5.5V。
当工作于寄生电源时,此引脚必须接地。
DQ:
数据输入/输出脚。
漏极开路,常态下高电平。
GND:
为电源地
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。
第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。
第六、七、八个字节用于内部计算。
第九个字节是冗余检验字节。
该字节各位的意义如下:
TMR1R011111
低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如表1所示:
(DS18B20出厂时被设置为12位)
表1DS18B20温度转换时间表
R1
R0
分辨率/位
温度最大转向时间
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
4.2单片机控制电路
控制电路采用AT89C51作为控制电路主体,附加外部震荡电路和复位电路。
本设计用到的AT89C51内部引脚介绍:
图4.2AT89C51内部引脚
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
本设计中使用P0口作为输出口,输出单片机处理好的温度信息到1602液晶显示中。
使用时必须外接上拉电阻以保证输出的不是高阻态。
如图所示:
图4.3P0口接上拉电阻使用
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
本设计中P1口作为输出口输出1602的控制信号,控制1602的显示
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
本设计中P0口需要接10k上拉电阻,否则为P0输出高阻态。
震荡电路采用石英晶振接单片机XTAL1与XTAL2端口构成内部震荡方式。
电容C1,C2起稳定震荡频率、快速起震的作用,电容值选用33pF。
内部振荡的方式所得时钟信号比较稳定,电路中使用较多。
图4.4外部震荡电路
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
复位电路采用的是开关复位方式,接单片机RST端口。
图4.5复位电路
4.3显示器——采用LCD2004
图4.6LCD1602引脚图
2004采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
接单片机P2.5口。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
接单片机P2.6口。
第6脚:
E(或EN)端为使能(enable)端。
接单片机P2.7口。
第7-14脚:
D0-D7为8位双向数据端。
接单片机P0口。
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置:
(初始化)
00110000[0x38]设置20×4显示,8位数据接口;
显示开关及光标设置:
(初始化)
00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
000001NSN=1(读或写一个字符后地址指针加1&光标加1),N=0(读或写一个字符后地址指针减1&光标减1),S=1且N=1(当写一个字符后,整屏显示左移),S=0当写一个字符后,整屏显示不移动,数据指针设H,所以数据地址为80H+地址码(0-27H,40-67H)
其他设置:
置数据首地址为80,01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)
第5章系统软件设计主要流程图
5.1主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。
图5.1主程序流程图
5.2计算温度流程图
计算温度子程序是将所输入的数据进行处理,包括正负判定,小数位、百位、十位、个位计算
图5.2计算温度流程图
5.3液晶显示流程图
液晶显示是将LCD1602进行初始化并且确定好显示位,并且将内部存储的数据信息进行显示。
图5.3液晶显示流程图
5.4读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如下所示
图5.4读出温度流程图
第6章系统仿真
图6-1
第7章总结与体会
经过将近一周的单片机课程设计,最终完成了我的数字温度计的设计,虽然没有完全达到设计要求(特别是系统初始化过程中没有消除85.0的初始显示),但通过努力把程序弄懂修改好并且仿真实现了,还是很高兴的。
在本次设计的过程中,我发现很多的问题,虽然以前还做过类似的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,特别是这么长的程序,需要修改调试。
我发现在单片机的学习过程中,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我意识到在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路时我们应该大胆尝试小心求证。
在确定自己的想法后要进行一步步地仿真。
在此感谢我们的张国旭老师,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次简易数字温度计设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
主要参考资料
[1]肖看,李群芳.《单片机原理、接口及应用》清华大学出版社.2010
[2]楼然苗.《单片机课程设计指导》.北京航空航天出版社.2002
[3]孙育才.《MCS-51系列单片微型计算机及其应用》.东南大学出版社
[4]王法能.《单片机原理及应用》.科学出版社.2004
[5]李飞光.《单片机课程设计实例指导》.北京航空航天大学出版社.2004
附录
附录一.源程序代码
TEMP_ZHEQU24H;实测温度值存放单元
TEMPLEQU25H
TEMPHEQU26H
TEMPHCEQU29H;正、负温度值标记
TEMPLCEQU2AH
TEMPFCEQU2BH
LCD_XEQU2FH;LCD字符显示位置
LCD_RSEQUP2.5;LCD寄存器选择信号
LCD_RWEQUP2.6;LCD读写信号
LCD_ENEQUP2.7;LCD允许信号
DQEQUP3.2;DS18B20数据信号
ORG0000H
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H;将20H~2FH单元清零
MOVR1,#10H
CLEAR:
MOV@R0,A
INCR0
DJNZR1,CLEAR
LCALLSET_LCD
START:
LCALLRST;调用18B20复位子程序
LCALLMENU_OK;DS1820存在,调用显示正确信息子程序
LCALLTEMP_BJ;显示温度标记
JMPSTART2
START2:
LCALLRST;调用DS18B20复位子程序
MOVA,#0CCH;跳过ROM匹配命令
LCALLWRITE
MOVA,#44H;温度转换命令
LCALLWRITE
LCALLRST
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0BEH;读温度命令
LCALLWRITE
LCALLREAD;调用DS18B20数据读取操作子程序
LCALLCONVTEMP;调用温度数据BCD码处理子程序
LCALLDISPBCD;调用温度数据显示子程序
LCALLCONV;调用LCD显示处理子程序
SJMPSTART2;循环
;*********************显示温度标记子程序**********************
TEMP_BJ:
MOVA,#0CBH
LCALLWCOM
MOVDPTR,#BJ1;指针指到显示消息
MOVR1,#0
MOVR0,#3
BBJJ1:
MOVA,R1
MOVCA,@A+DPTR
LCALLWDATA
INCR1
DJNZR0,BBJJ1
RET
BJ1:
DB00H,"C"
;******************显示正确信息子程序***************
MENU_OK:
MOVDPTR,#M_OK1;指针指到显示消息
MOVA,#1;显示在第一行
LCALLLCD_PRINT
MOVDPTR,#M_OK2
MOVA,#2
LCALLLCD_PRINT
MOVDPTR,#M_OK3
MOVA,#3
LCALLLCD_PRINT
RET
M_OK1:
DB"OK4130220238",0
M_OK2:
DB"",0
M_OK3:
DB"DATE:
2016-1-26",0
;****************DS18B20复位子程序(初始化)******************
RST:
SETBDQ
NOP
CLRDQ
MOVR0,#6BH;主机发出延时复位低脉冲
MOVR1,#04H
TSR1:
DJNZR0,$
MOVR0,#6BH
DJNZR1,TSR1
SETBDQ;拉高数据线
NOP
NOP
NOP
TSR5:
MOVR0,#06BH
TSR6:
DJNZR0,$;时序要求延时一段时间
TSR7:
SETBDQ
RET
;*************将自定义字符写入LCD的CGRAM中*****************
STORE_DATA:
MOVA,#40H
LCALLWCOM
MOVR2,#08H
MOVDPTR,#D_DATA
MOVR3,#00H
S_DATA:
MOVA,R3
MOVCA,@A+DPTR
LCALLWDATA;写入数据
INCR3
DJNZR2,S_DATA
RET
D_DATA:
DB0CH,12H,12H,0CH,00H,00H,00H,00H
;******************DS18B20数据写入操作子程序*****************
WRITE:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRDQ;开始写入DS18B20总线要处于复位(低)状态
MOVR3,#07
DJNZR3,$;总线复位保持16微妙以上
RRCA;把一个字节DATA分成8个BIT环移给C
MOVDQ,C;写入一位
MOVR3,#3CH
DJNZR3,$;等待100微妙
SETBDQ;重新释放总线
NOP
DJNZR2,WR1;写入下一位
SETBDQ
RET
;***************DS18B20数据读取操作子程序********************
READ:
MOVR4,#4;将温度低位、高位、TH、TL从DS18B20中读出
MOVR1,#TEMPL;存入25H、26H、27H、28H单元
RE00:
MOVR2,#8
RE01:
CLRCY
SETBDQ
NOP
NOP
CLRDQ;读前总线保持为低
NOP
NOP
NOP
SETBDQ;开始读总线释放
MOVR3,#09;延时18微妙
DJNZR3,$
MOVC,DQ;从DS18B20总线读得一位
MOVR3,#3CH
DJNZR3,$;等待100微妙
RRCA;把读得的位值环移给A
DJNZR2,RE01;读下一位
MOV@R1,A
INCR1
DJNZR4,RE00
RET
;*******************温度值BCD码处理子程序******************
CONVTEMP:
MOVA,TEMPH;判温度是否零下
ANLA,#08H
JZTEMPC1;温度零上转
CLRC
MOVA,TEMPL;二进制数求补(双字节)
CPLA;取反加1
ADDA,#01H
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDCA,#00H
MOVTEMPH,A
MOVTEMPHC,#0BH;负温度标志
MOVTEMPFC,#0BH
SJMPTEMPC11
TEMPC1:
MOVTEMPHC,#0AH;正温度标志
MOVTEMPFC,#0AH
TEMPC11:
MOVA,TEMPHC
SWAPA
MOVTEMPHC,A
MOVA,TEMPL
ANLA,#0FH;乘0.0625
MOVDPTR,#TEMPDOTTAB
MOVCA,@A+DPTR
MOVTEMPLC,A;TEMPLCLOW=小数部