温度传感器实验设计
成都理工大学工程
技术学院
单片机课程设计报告
数字温度计设计
摘要
在这个信息化高速发展的时代,单片机作为一种最经典的微控制器,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,作为自动化专业的学生,我们学习了单片机,就应该把它熟练应用到生活之中来。本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。本文设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。
关键词:单片机,数字控制,数码管显示,温度计,DS18B20,AT89S52。
目录
1概述............................................................................................................................. 4
1.1设计目的........................................................................................................... 4 1.2设计原理........................................................................................................... 4 1.3设计难点........................................................................................................... 4 2 系统总体方案及硬件设计...................................................... 错误!未定义书签。
2.1数字温度计设计方案论证............................................................................... 4
2.2.1 主控制器.............................................................................................. 5 2.4 系统整体硬件电路设计.................................................................................. 7 3系统软件设计............................................................................................................. 8
3.1初始化程序....................................................................................................... 8 3.2读出温度子程序............................................................................................... 9 3.3读、写时序子程序......................................................................................... 10 3.4 温度处理子程序............................................................................................ 11 3.5 显示程序........................................................................................................ 12 4 Proteus软件仿真...................................................................................................... 13 5硬件实物................................................................................................................... 14
6课程设计体会…………………………………………………………………………………...15
附录1:....................................................................................................................... 14 附录2:………………………………………………………………………………..21
1概述
1.1设计目的
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,可广泛用于食品库、冷库、粮库、温室大棚等需要控制温度的地方。目前,该产品已在温控系统中得到广泛的应用。
1.2设计原理
本系统是一个基于单片机AT89S52的数字温度计的设计,用来测量环境温度,测量范围为-50℃—110℃度。整个设计系统分为4部分:单片机控制、温度传感器、数码显示以及键盘控制电路。整个设计是以AT89S52为核心,通过数字温度传感器DS18B20来实现环境温度的采集和A/D转换,同时因其输出为数字形式,且为串行输出,这就方便了单片机进行数据处理,但同时也对编程提出了更高的要求。单片机把采集到的温度进行相应的转换后,使之能够方便地在数码管上输出。LED采用三位一体共阳的数码管。
1.3设计难点 此设计的重点在于编程,程序要实现温度的采集、转换、显示和上下限温度报警,其外围电路所用器件较少,相对简单,实现容易。
2 系统总体方案及硬件设计
2.1数字温度计设计方案论证 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
2.2总体设计框图
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用3位共阴LED数码管以串口传送数据实现温度显示。
图1 总体设计框图
2.2.1 主控制器
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,适合便携手持式产品的设计使用。 AT89S52单片机芯片具有以下特性:
1)指令集合芯片引脚与Intel公司的8052兼容; 2)4KB片内在系统可编程FLASH程序存储器; 3)时钟频率为0~33MHZ;
4)128字节片内随机读写存储器(RAM); 5)6个中断源,2级优先级; 6)2个16位定时/记数器; 7)全双工串行通信接口; 8)监视定时器; 9)两个数据指针;
2.2.2 显示电路
2.2.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20的性能特点如下:
1.全数字温度转换及输出。 2.先进的单总线数据通信。
3.最高12为\位分辨率,精度可达±0.5摄氏度。 4.12位分辨率时的最大工作周期为750毫秒。 5.可选择寄生工作方式。
6.检测温度范围为+55℃~+125℃(-67℉~+257℉)。 7.内置EEPROM,限温报警功能。
8.64位光刻ROM,内置产品序列号,方便多机链接。 9.多样封装形式,便于不同硬件系统。
若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过 ROM 指令、执行温度转换存储器操作指令、等待 500uS 温度转换时间。紧接着执行第二个周期为复位、跳过 ROM指令、执行读 RAM 的存储器操作指令、读数据
2.3 DS18B20温度传感器与单片机的接口电路
2.4 系统整体硬件电路设计 2.4.1 主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,单片机主板电路如图5 所示:
图5 单片机主板电路
2.4.2 显示电路
图6 温度显示电路
3 系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。 3.1初始化程序
复位:首先我们必须对 DS18B20 芯片进行复位,复位就是由控制器(单片机)给 DS18B20单总线至少 480uS 的低电平信号。当 18B20 接到此复位信号后则会在 15~60uS 后回发一个芯片的存在脉冲。
图7 初始化程序流程图
3.2读出温度子程序
读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少1us的低电平,表示读时间的起始。随后在总线被释放后的15us 中 DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起
始信号。读出温度子程序的主要功能是读出RAM中的2字节,读出温度的低八位和高八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示
图8 读温度程序流程图
3.3读、写时序子程序
读写的程序是本次设计中的重点和难点,通过我们对其时序的分析,从而写出高
效的程序。
写时序子程序流程图
读时序子程序流程图
3.4 温度处理子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图11所示
图11 温度处理程序流程图
3.5 显示程序
此函数实现的对数码管显示的处理,其亮点在于可以直接对数码管进行操作,其本身是个两变量函数,第一个变量是要开通的位选,第二个变量是要显示的数据,这样我们可以直接方便而又简单直观的对数码管进行操作。程序流程图如图12。
4 Proteus软件仿真
6 课程设计体会
通过为时2周的单片机课程设计,在老师的知道和帮助下我我和我的搭档共同完成数值温度级的设计学习。其中包扩了程序的学习与修改,程序的仿真,电路的仿真以及实体电路的搭建,使之可以初略的读出温度值。通过这次课程设计我学到了许多的知识,了解了DS18B20的使用和接线的方法,了解了数码管的显示原理。学会了单片机程序写入的方法,更加熟悉了单片机的一些常用管脚的功能。
同时,在课程设计的过程中,我也发现了自己很多的不足之处,一些单片机用到的汇编指令不熟悉。也暴露了在单片机理论课上学到的知识掌握的不好。还有一点就是理论与实际的联系对我们学习和掌握单片机是非常有帮助的。
参考文献
[1]DS18b20数据手册。
[2] 求是科技编著8051系列单片机C程序设计完全手册北京: 人民邮电出版社, 2006
[3] 余发山,王福忠.单片机原理及应用技术.徐州:中国矿业大学出版社,2003
附录1:
程序
DQ BIT P3.7 ; 1 wire line DP BIT P2.0
swpH equ 0d2H swpL equ 0ffH WDLSB DATA 30H ; WDMSB DATA 31H ;
;*************************************************************** ORG 0000H LJMP MAIN ORG 000BH
LJMP TMR0 ; Timer0 isr
;******************************************************** ; Timer0 Interrupt Service Routine TMR0: MOV TH0,#swpH ;轮流送温度值的高低两位到数码管.swph为0d2H MOV TL0,#swpL JB 21H,DSL JB 22H,DSL1 MOV P0,43H
ORL P0,#01000000B ; 十位位选 SETB P2.0;小数点不亮 SJMP EXIT DSL:
MOV P0,42H
ORL P0,#00100000B ; 个位位选 CPL P2.0 ;个位后面小数位亮 SJMP EXIT1 DSL1:
MOV P0,41H
ORL P0,#00010000B ;小数位位选 SETB P2.0 ;小数点不亮 SJMP EXIT2 ;DSL2:
; MOV P0,40H ;ORL P0,#10000000B ;SETB P2.0 ;SJMP EXIT3 EXIT:
CPL 21H ; 21h取反,即21h=1 RETI EXIT1:
CPL 22H ; 22h=1 CPL 21H ;21h=0 RETI EXIT2:
; CPL 23H ; CPL 22H ;22h=0 RETI ; Main program MAIN: TOINIT:
CLR EA
MOV TMOD,#01H MOV TH0,#swpH MOV TL0,#swpL SETB EA SETB ET0 SETB TR0
;*********************************************************** ;41H-43H清零
MOV R2,#3 MOV R0,#41H OVER:
MOV @R0,#00H INC R0
DJNZ R2,OVER ;OVER执行完 LOOP:
LCALL DSWD SJMP LOOP
;********************************************************** ; Read a temperature from the DS18B20 DSWD:
LCALL RSTSNR ; Init of the DS18B20 JNB F0,KEND
MOV R0,#0CCH ;要写的数给R0 LCALL SEND_BYTE ;调用写程序 MOV R0,#44H
LCALL SEND_BYTE ; Send a Convert Command (送一个温度转换指令) SETB EA ;延迟
MOV 48H,#1 ;1us SS2:
MOV 49H,#255 ;1us SS1:
MOV 4AH,#255 ;1us SS0:
DJNZ 4AH,SS0 ;2us/次,255*2 DJNZ 49H,SS1 ;2us/次,255次
DJNZ 48H,SS2 ;2us 总时间 1+1+(1+255*2+2)*255+2 CLR EA ;进入读时序禁用任何中断 LCALL RSTSNR JNB F0,KEND
MOV R0,#0CCH LCALL SEND_BYTE
MOV R0,#0BEH
LCALL SEND_BYTE ; Send Read Scratchpad command LCALL READ_BYTE ; Read the low byte from scratchpad MOV WDLSB,A ; Save the temperature (low byte) LCALL READ_BYTE ; Read the high byte from scratchpad MOV WDMSB,A ; Save the temperature (high byte) LCALL TRANS12 KEND:
SETB EA RET
;********************************************************** ;
TRANS12:
MOV A,30H ;30H存从1820取的温度值 ANL A,#0F0H ;取WDLSB高4为(低位置0) MOV 3AH,A MOV A,31H
ANL A,#0FH ;取WDMSB的低4位(高位置0)
ORL A,3AH ;将WDLSB的高4为与WDMSB的低4位组合 SWAP A ;高低位互换 A温度 MOV B,#10 ;转换为10进制
DIV AB ;A/B A为商 B为余数 MOV 42H,B ;B为个位 42H中放个位 MOV b,#10 DIV ab
MOV 43H,B ;43十位 MOV A,30H ANL A,#0FH
MOV DPTR,#tab1 MOVC A,@a+DPTR MOV 41H,A RET
;************************************************* ; Send a byte to the 1 wire line 写 SEND_BYTE: ;
MOV A,R0
MOV R5,#8 ;设置写位个数 SEN3: CLR C
RRC A ;把一个字节data(A)分成8个bit环移给 C JC SEN1
LCALL WRITE_0 ;等待60us SJMP SEN2 SEN1: LCALL WRITE_1
SEN2: DJNZ R5,SEN3 ;写下一位 RET
;************************************************* ; Read a byte from the 1 wire line 读 READ_BYTE:
MOV R5,#8 READ1: LCALL READ RRC A
DJNZ R5,READ1 MOV R0,A RET
;************************************************* ; Reset 1 wire line 初始化 RSTSNR: SETB DQ NOP NOP
CLR DQ ;发送一复位脉冲 MOV R6,#250
DJNZ R6,$ ;保持低电平500us MOV R6,#50 DJNZ R6,$
SETB DQ ;释放总线 MOV R6,#15
DJNZ R6,$ ;释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待30us
CALL CHCK ; MOV R6,#60
DJNZ R6,$ ;发出存在脉冲(低电平持续120 us) SETB DQ RET
;*************************************************
; low level subroutines判断DQ位是否被拉高,如已经拉高,则l低,否则,将其拉高 CHCK: MOV C,DQ JC RST0 SETB F0 ; SJMP CHCK0 RST0: CLR F0 ; CHCK0: RET
;************************************************* WRITE_0:
CLR DQ ;总线复位等待60us MOV R6,#30 DJNZ R6,$ SETB DQ RET
;************************************************* WRITE_1:
CLR DQ ;复位 NOP NOP NOP NOP NOP
SETB DQ ;释放总线 MOV R6,#30
DJNZ R6,$;等待56Us RET
;*************************************************
READ: SETB DQ ; NOP NOP
CLR DQ NOP NOP
SETB DQ ; NOP NOP NOP NOP NOP NOP NOP
MOV C,DQ MOV R6,#23 DJNZ R6,$ RET
;********************************************** DELAY10: MOV R4,#20 D2: MOV R5,#30 DJNZ R5,$ DJNZ R4,D2 RET
tab1: DB 00H,01H,01H,02H,02H,03H,03H,04H DB 05H,06H,06H,07H,07H,08H,08H,09H END:
附录2 LS Byte
MS Byte