基于单片机的数字温度计设计兰州交通大学.docx
《基于单片机的数字温度计设计兰州交通大学.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计设计兰州交通大学.docx(18页珍藏版)》请在冰豆网上搜索。
基于单片机的数字温度计设计兰州交通大学
单片机原理及系统课程设计
评语:
考勤(10)
守纪(10)
过程(30)
设计报告(30)
答辩(20)
总成绩(100)
专业:
电气工程及其自动化
班级:
电气1103
姓名:
杨子
学号:
201109306
指导教师:
侯涛
兰州交通大学自动化与电气工程学院
2014年1月15日
1设计题目
基于单片机的数字温度计设计
2设计背景
温度是工业生产和科学研究的重要参量之一,温度的测量是个永恒的话题,覆盖范围广泛。
数字温度计可以利用在很多领域,在一些人不能直接进入的场所,利用单片机控制的数字温度计,可以准确地观测到其中的温度。
数字温度计就是一个典型的例子,但人们对它的要求越来越高,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
3设计原理
3.1设计方法
(1)分析设计目的,根据要求查阅相关硬件的资料,预设计多种方案,设计产品功能;
(2)根据设计要求,分析各方案的难易程度,比较他们的可操作性,进而基本确定设计方案(倾向选择硬件结构简单,可靠性强并且各部件市场使用率高的方案),选定相应的硬件设备,并进行硬件设计;
(3)根据搜索的相关材料,深入分析各部件的特性,绘制总程序流程,进行软件的初步设计,对软件功能模块化分割;
(4)根据模块的功能要求,绘制相应的流程图,再编写相应程序的设计和完成相关调试,以完成软件的基本设计;
(5)对产品进行调试、仿真。
运用Proteus进行硬件连接,再在Keilc平台下生成可执行文件,再装入单片机中。
进一步分析结果,修改硬件连接和软件程序,确定相关参数。
最终,通过多次的调试和修改以完成产品的设计要求。
3.2系统框图设计
温度计电路设计总体设计方框图如图1所示,主控制器采用单片机AT89C52,温度传感器采用DS18B20,用LCD1602数字显示器实现温度显示。
系统框图如图3-1所示。
图3-1系统框图
3.3系统电路原理图
本数字温度计是以单片机AT89C52为数据处理核心,运用DS18B20单总线数字式温度传感器进行温度采集,使用LCD1602对采集结果进行输出显示。
根据电路原理框图设计出电路原理图如图3-2所示,由温度传感器DS18B20给单片机提供温度转换过的温度电信号。
AT89C52是一种低电压,高性能CMOS8位单片机。
其片内含8kbytes的可反复擦写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),和片内置通用8位中央处理器(CPU)和Flash储存单元,功能强大AT89C52单片机适合于许多较为复杂控制应用场合。
DS18B20的数字温度计提供9至12位可编程设备温度读数。
信息被发送到从DS18B20通过1线接口,所以中央处理器与DS18B20只有一个一条口线连接。
为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个DS18B20可以同时存在于一条总线。
这使得温度传感器放置在许多不同的地方。
它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
图3-2系统设计原理图
在图3-2中,复位电路、控制电路加上单片机组成单片机最小应用系统,能够实现很多复杂的功能。
系统能实现温度的测量,显示温度等功能。
系统中按钮“↑”和“↓”能对所测温度进行调整,启动DS18B20的测温程序,再将采集到的数据传输至AT89C52内,锁存器74LS373稳定数据,最终由液晶显示LCD1602输出结果。
4仿真图
在课题中,在PROTEUS软件中对设计的硬件电路进行仿真。
PROTEUS软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及单片机的外围器件。
仿真图如图4-1所示。
图4-1数字温度计仿真图
5体会与总结
首先,关于硬件设计的认识。
硬件设计主要考虑两方面的问题,设计要求的实现:
根据电子元件的发展要求,我们要在可实现的前提下,选择硬件简单、集成度高、可靠性强的设计方案;设计的可操作性:
软件与硬件呈现互补关系,当硬件较为简单时,我们需要软件控制实现其功能,因此我们要选择集成度高,控制方法清晰、实际运用广泛的硬件。
其次,关于知识内容的学习。
通过本次课程设计,复习和巩固了单片机知识的有关内容;通过对具体问题的解决,加强了我们理论运用于实际的能力;修改和调试程序的过程中,进一步锻炼和提高了我们的逻辑思维能力。
然后,关于软件设计的认识。
由于产品软件功能的实现是个较为复杂的问题,通过课程设计我学习到了“化复杂为简单”的方法。
如果每次进行软件设计时,能够把一个复杂的功能划分成多个具体的模块功能,再逐一对模块具体分析和设计,便可以更高效、更清晰的解决问题。
最后,关于小组答辩和报告书写。
通过小组答辩:
一方面,培养自己的逻辑表达能力,为将来的毕业设计和答辩做铺垫;另一方面,通过听取其他同学的设计方案,我们可以在小组其他成员身上学习到很多,还可以取长补短、查缺补漏。
报告书写不仅可以让我们熟悉论文格式而且能够培养我们严谨的工作态度。
参考文献
[1]王思明、张金敏、张鑫等.单片机原理及应用系统设计[M].北京科学出版社,2012
[2]冯博琴、吴宁.微型计算机原理与接口技术[M].北京清华大学出版社,2007
[3]李守中.51单片机开发入门与经典实例[M].北京人民邮电出版社,2007
[4]李平.单片机入门与开发[M].北京机械工业出版社,2008
[5]胡汉才.单片机原理与接口技术[M].北京清华大学出版社,1996
附录:
;==================================================================
;单片机内存分配申明!
SIGNBIT00H
INEQUP3.3
DIVDLLDATA21H
DIVDLHDATA22H
DIVDHLDATA23H
DIVDHHDATA24H
DIVLDATA25H
DIVHDATA26H
TEMPLDATA27H
TEMPHDATA28H
TEMPER_HEQU29H
TEMPER_LEQU2AH
FLAG1EQU30H
LCD_CMD_WREQU8000H
LCD_DATA_WREQU8001H
LCD_BUSY_RDEQU8002H
LCD_DATA_RDEQU8003H
LCD_CLSEQU1
LCD_HOMEEQU2
LCD_SETMODEEQU4
LCD_SETVISIBLEEQU8
LCD_SHIFTEQU16
LCD_SETFUNCTIONEQU32
LCD_SETCGADDREQU64
LCD_SETDDADDREQU128
;=================主程序开始===============================
ORG0000H
LJMPSTART
ORG30H
START:
MOVSP,#60H
LCALLINIT;初始化液晶显示器
MAIN:
LCALLGET_TEMPER;调用读温度子程序
MOVA,TEMPER_H;读温度值高8位
JNBACC.7,M1;温度为正值则转移
SETBSIGN;设置温度值为负数
MOVA,TEMPER_L;求温度值的补码
CPLA
ADDA,#1
MOVTEMPER_L,A
MOVA,TEMPER_H
CPLA
ADDCA,#0
MOVTEMPER_H,A
SJMPM2
M1:
CLRSIGN;温度值为正数
M2:
MOVR2,TEMPER_H
MOVR3,TEMPER_L;待转换的温度值送R2R3
MOVR6,#03H
MOVR7,#0E8H;乘数1000送R6R7
LCALLDMUL;温度值*1000,结果在R4R5R6R7中
MOVA,#5
LCALLJIAFA;为实现四舍五入将乘的结果+5
MOVDIVDHH,R4
MOVDIVDHL,R5
MOVDIVDLH,R6
MOVDIVDLL,R7;运算结果送被除数单元
MOVDIVH,#0;除数为160
MOVDIVL,#160
LCALLCHUFA;得到乘10以后的温度值
MOVR6,DIVDLH
MOVR7,DIVDLL
LCALLH2B;
MOVA,#'T'
LCALLWRDATA;显示字母“T”
MOVA,#'='
LCALLWRDATA;显示字母“=”
JNBSIGN,M3;温度为正值则转移
MOVA,#'-'
LCALLWRDATA;显示负号
M3:
MOVA,R3
JZM31;不显示无效零
ORLA,#30H;将温度值转换为ASCII码
LCALLWRDATA
M31:
MOVA,R4
SWAPA
ANLA,#0FH
JZM32;不显示无效零
ORLA,#30H
LCALLWRDATA
SJMPM33
M32:
MOVA,R3
JZM33
MOVA,#'0'
LCALLWRDATA
M33:
MOVA,R4
ANLA,#0FH
ORLA,#30H
LCALLWRDATA
MOVA,#'.';显示小数点
LCALLWRDATA
MOVA,R5
SWAPA
ANLA,#0FH
ORLA,#30H
LCALLWRDATA
MOVA,R5
ANLA,#0FH
ORLA,#30H
LCALLWRDATA
MOVA,#0DFH;显示“°”
LCALLWRDATA
MOVA,#'C';显示“C”
LCALLWRDATA
MOVA,#20H;显示空格以便于清除上次显示在该位置的字符
LCALLWRDATA
MOVA,#2;显存地址指针清零,光标回到行首
LCALLWRCMD
MOVR5,#4
M4:
MOVR6,#250
M5:
LCALLD1MS
DJNZR6,M5
DJNZR5,M4
LJMPMAIN
;=================主程序结束===============================
;============================================================
;液晶显示器初始化
;============================================================
INIT:
MOVA,#30H;8位、1行、5*7字符方式
LCALLWRCMD
MOVA,#LCD_SETVISIBLE+4;打开显示
LCALLWRCMD
MOVA,#LCD_SETDDADDR;开始显示的位置在最左边
LCALLWRCMD
MOVA,#LCD_SETMODE+3;增量方式,光标移动
LCALLWRCMD
RET
CLS:
MOVA,#LCD_CLS
LCALLWRCMD
MOVA,#LCD_SETDDADDR;开始显示的位置在最左边
LCALLWRCMD
RET
WRCMD:
MOVDPTR,#LCD_CMD_WR
MOVX@DPTR,A
SJMPWTBUSY
WRDATA:
MOVDPTR,#LCD_DATA_WR
MOVX@DPTR,A
WTBUSY:
MOVDPTR,#LCD_BUSY_RD
MOVXA,@DPTR
JBACC.7,WTBUSY
RET
GET_TEMPER:
SETBIN
LCALLINIT_1820;先复位DS18B20
JBFLAG1,TSS2
RET;判断DS1820是否存在?
若不存在则返回
TSS2:
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLD1MS;DISPLAY
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200;
RET
INIT_1820:
SETBIN
NOP
CLRIN;主机发出延时537微秒的复位低脉冲
MOVR1,#3
TSR1:
MOVR0,#107
DJNZR0,$
DJNZR1,TSR1
SETBIN;然后拉高数据线
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBIN,TSR3;等待DS18B20回应
DJNZR0,TSR2
LJMPTSR4;延时
TSR3:
SETBFLAG1;置标志位,表示DS1820存在
LJMPTSR5
TSR4:
CLRFLAG1;清标志位,表示DS1820不存在
LJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBIN
RET
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRIN
MOVR3,#6
DJNZR3,$
RRCA
MOVIN,C
MOVR3,#23
DJNZR3,$
SETBIN
NOP
DJNZR2,WR1
SETBIN
RET
READ_18200:
MOVR4,#2;将温度高位和低位从DS18B20中读出
MOVR1,#TEMPER_L;
RE00:
MOVR2,#8;数据一共有8位
RE01:
CLRC
SETBIN
NOP
NOP
CLRIN
NOP
NOP
NOP
SETBIN
MOVR3,#9
RE10:
DJNZR3,RE10
MOVC,IN
MOVR3,#23
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
D1MS:
MOVR7,#80
DJNZR7,$
RET
DMUL:
MOVA,R3
MOVB,R7
MULAB
XCHA,R7
MOVR5,B
MOVB,R2
MULAB
ADDA,R5
MOVR4,A
CLRA
ADDCA,B
MOVR5,A
MOVA,R6
MOVB,R3
MULAB
ADDA,R4
XCHA,R6
XCHA,B
ADDCA,R5
MOVR5,A
MOVF0,C
MOVA,R2
MULAB
ADDA,R5
MOVR5,A
CLRA
MOVACC.0,C
MOVC,F0
ADDCA,B
MOVR4,A
RET
JIAFA:
ADDA,R7
MOVR7,A
CLRA
ADDCA,R6
MOVR6,A
CLRA
ADDCA,R5
MOVR5,A
CLRA
ADDCA,R4
MOVR4,A
RET
CHUFA:
MOVA,DIVH;除数为零?
ORLA,DIVL
JNZDIVD0
SETBOV;为零,置溢出标志
RET
DIVD0:
MOVTEMPL,#0
MOVTEMPH,#0
MOVB,#32
DIVD1:
CLRC
MOVA,DIVDLL
RLCA
MOVDIVDLL,A
MOVA,DIVDLH
RLCA
MOVDIVDLH,A
MOVA,DIVDHL
RLCA
MOVDIVDHL,A
MOVA,DIVDHH
RLCA
MOVDIVDHH,A
MOVA,TEMPL
RLCA
MOVTEMPL,A
XCHA,TEMPH
RLCA
XCHA,TEMPH
MOVF0,C
SUBBA,DIVL
MOVR7,A
MOVA,TEMPH
SUBBA,DIVH
ANLC,/F0
JCDIVD2
MOVTEMPL,R7
MOVTEMPH,A
INCDIVDLL
DIVD2:
DJNZB,DIVD1
CLROV
RET
H2B:
CLRA;BCD码初始化
MOVR3,A
MOVR4,A
MOVR5,A
MOVR2,#10H;转换双字节十六进制整数
HB3:
MOVA,R7;从高端移出待转换数的一位到CY中
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5;BCD码带进位自身相加,相当于乘2
ADDCA,R5
DAA;十进制调整
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
MOVR3,A
DJNZR2,HB3;处理完16bit
RET
END