数字式温度测量电路设计.docx
《数字式温度测量电路设计.docx》由会员分享,可在线阅读,更多相关《数字式温度测量电路设计.docx(24页珍藏版)》请在冰点文库上搜索。
数字式温度测量电路设计
“电子信息工程专业方向”课程设计报告
课题名称:
数字式温度测量电路设计
班级学号
学生姓名
专业电子信息工程
系别电子与电气工程学院
指导教师专业方向课程设计指导小组
电子与电气工程学院
一、设计目的:
a)培养理论联系实际的正确设计思想,训练综合运用已学过的理论和生产实际知识去分析和解决工程实际问题的能力。
b)学习较复杂的电子系统设计的一般方法,了解和掌握模拟、数字电路等知识解决电子信息方面常见实际问题的能力,由学生自行设计、自行制作和自行调试。
c)进行基本技术技能训练,如基本仪器仪表的使用,常见元器件的识别、测量、熟练运用的能力,掌握设计资料、手册、标准和规范以及使用仿真软件、实验设备进行调试和数据处理等。
d)培养学生的创新能力。
二、技术指标及要求
1、主要部分采用中、大规模集成电路芯片;
2、可用于远距离温度测量;
3、整机功耗低;
4、测量范围-50°C~+128°C;
5、误差小于<0.2℃;
6、非线性度<0.2%;
7、稳压输出:
0-10v
8、步进电压值:
1v
9、输出纹波电压:
小于等于10mv
10、输出电流:
1.5A
三、设计思路
整体设计应包含温度传感器,V/F转换电路,计数寄存器。
译码驱动电路,显示单元以及时基与控制逻辑等。
本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器18B20,单片机AT89S52,,四位共阴极数码管一个,电容电阻若干。
18B20支持“一线总线”接口,测量温度范围-50°C~+128°C。
在-10~+85°C范围内,精度为±0.5°C。
18B20的精度较差为±2°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。
主控制器即单片机部分,用于存储程序和控制电路;LED显示部分是指四位共阴极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路。
测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
本设计能完成的温度测量范围是-55°C~+128°C,由于能力有限,不能实现报警功能
四、软件设计
1、系统总体方案设计
本次课程设计采用的是protues软件仿真,用Keil软件进行编译。
Protues软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
软件部分由主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
开始
初始化
调显示子程序
得出温度总子程序
返回
图1主程序流程
2、主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图3-1所示。
3、读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图3-2所示
图2读出温度子程序流程
3、二进制转换BCD码命令子程序
二进制转换BCD码命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
二进制转换BCD码命令子程序流程图,如图4
图4二进制转换BCD码流程图
4、计算温度子程序
将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图5所示。
图5 测量温度流程图
5、温度数据显示子程序
显示数据子程序主要是对显示缓冲器中的示数据进行刷新操作,查表送段码至LED,开位码显示,采用动态扫描方式。
6、实验仿真
图6
系统仿真图如图6所示,没有加上复位电路和时钟电路,这是protues的一个缺陷,在没有全部电路的情况下依然能够进行仿真。
调试结果分析:
本次数字温度计能够比较精确的测量一般温度,测量范围是-55~128,并且能够测出小数。
7、系统原理图
复位电路时钟电路
显示电路
单片机设计
P0口上拉电阻温度传感器
五、源程序代码
;*************************************************
;DS18B20的读写程序,数据脚P3.4*
;显示数据通过P1口传输,P3.0控制小数位的显示*
;P3.1控制个位的显示,P3.2控制十位的显示*
;P3.3控制百位的显示,P3.1控制小数点的显示*
;显示温度-55到+125度,显示精度为0.1度*
;显示采用4位LED共阴显示测温值*
;*************************************************
TEMPER_LEQU40H;用于保存读出温度的低8位
TEMPER_HEQU41H;用于保存读出温度的高8位
FLAG1EQU38H;是否检测到DS18B20标志位
TEMPLEQU30H;用于保存读出正确温度值的低8位
TEMPHEQU31H;用于保存读出正确温度值的高8位
TEMPHCEQU32H;温度转换寄存器低8位
TEMPLCEQU33H;温度转换寄存器高8位
BUF1EQU34H;显示缓冲寄存器小数位
BUF2EQU35H;显示缓冲寄存器个数位
BUF3EQU36H;显示缓冲寄存器十数位
BUF4EQU37H;显示缓冲寄存器百数位
TEMPDINBITP3.4;数据脚定义
DINBITP3.1;小数点控制
;**********************************************
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;中断返回(不开中断)
;**********************************************
;两位数码管来显示温度,显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;无需乘于0.0625系数
;**********************************************
MAIN:
MOVSP,#50H;设置堆栈
MOVP1,#0FFH;
LPTEMP:
LCALLGET_TEMPER;调用读温度子程序
LCALLCONVTEMP;温度BCD码计算处理子程序
LCALLDISPBCD;显示区BCD码温度值刷新子程序
MOVP0,TEMPLC
MOVP2,TEMPHC
;*************************************
LCALLDISPLAY;调用数码管显示子程序
;*************************************
AJMPLPTEMP;循环
;*************************************
;这是DS18B20复位初始化子程序
;*************************************
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;DS1820不存在
TSR3:
SETBFLAG1;置标志位,表示DS1820存在
CLRP3.7;检查到DS18B20就点亮P3.7LED
LJMPTSR5
TSR4:
CLRFLAG1;清标志位,表示DS1820不存在
CLRP3.1
LJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBTEMPDIN;结束
RET
;****************************************
;读出转换后的温度值
;****************************************
GET_TEMPER:
SETBTEMPDIN;
LCALLINIT_1820;先复位DS18B20
JBFLAG1,TSS2
RET;判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
CLRP3.6;DS18B20已经被检测到!
!
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
;*****************************************
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
;*****************************************
LCALLDISPLAY;显示温度
;*****************************************
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200;将读出的温度数据保存到35H/36H
RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC;C清0
SETBTEMPDIN;/
NOP;/
NOP;/
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码温度值刷新子程序
;**************************************
;温度暂存器内的2字节中,高字节的低半字节和低字节的高半字节组成一个字节,
;这个字节的二进制值转换为十进制后,就是温度值的百、十、个位值,而剩下的低字节化为
;十进制后,就是温度值的小数部分.
;**************************************
DISPBCD:
MOVA,TEMPLC;温度数据移入显示寄存器
ANLA,#0FH;取低字节的低4位(小数部分)
MOVBUF1,A;小数部分放入寄存器
MOVA,TEMPLC;取低字节的高4位(个位数)
SWAPA;
ANLA,#0FH;
MOVBUF2,A;个位数放入寄存器
MOVA,TEMPHC;取高字节的低4位(十位数)
ANLA,#0FH;
MOVBUF3,A;十位数放入寄存器
MOVA,TEMPHC;取高字节的高4位(百位数)
SWAPA;
ANLA,#0FH;
MOVBUF4,A;百位数放入寄存器
MOVA,TEMPHC;
ANLA,#0F0H;
CJNEA,#10H,DISPBCD0;百位数=0?
SJMPDISPOUT;
;*************************************
;最高位为0和正数的符号位都不显示
;*************************************
DISPBCD0:
MOVA,TEMPHC;
ANLA,#0FH;
JNZDISPOUT;十位数是0?
MOVA,TEMPHC;
SWAPA;
ANLA,#0FH;
MOVBUF4,0AH;符号位不显示
MOVBUF3,A;十位数显示符号
DISPOUT:
:
RET;
;*************************************
;单字节十六进制转BCD
;*************************************
HEX2BCD1:
MOVB,#100;十六进制->BCD
DIVAB;B=A%100
MOVR7,A;R7=百位数
MOVA,#10;
XCHA,B;
DIVAB;B=A%B
SWAPA;
ORLA,B;
RET;
;*************************************
;X8表示第7位需要异或运算
;X5表示第4位需要异或运算
;X4表示第3位需要异或运算
;1表示第0位需要异或运算
*************************************
CRC8CAL:
PUSHACC;
MOVR7,#08H;
CRC8LOOP1:
XRLA,B;
RRCA;
MOVA,B;
JNCCRC8LOOP2;
XRLA,#18H;
CRC8LOOP:
RRCA;
MOVB,A;
POPACC;
RRA;
PUSHACC;
DJNZR7,CRC8LOOP1;
POPACC;
RET;
;******************************************
;读DS18B20的程序,从DS18B20中读出9个字节数据
;开始的两个字节为温度数据
;******************************************
READ_18200:
MOVR4,#9;将温度高位和低位从DS18B20中读出
MOVR1,#TEMPER_L;低位存入40H(TEMPER_L),高位存入41H(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;9字节数据是否读完?
MOVA,B;验证数据放入A中
JNZREAD_OUT;验证出错则不改变温度值
MOVTEMPL,TEMPER_L;温度数据的低字节放入寄存器
MOVTEMPH,TEMPER_H;温度数据的高字节放入寄存器
READ_OUT:
RET
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
MOVDPTR,#NUMTAB;指定查表启始地址
MOVR0,#4;显示4位数据
DP11:
MOVR1,#20;显示1000次
DPLP:
SETBP3.1;小数点不亮
MOVA,BUF4;取百位数
JZLOOP0
MOVCA,@A+DPTR;查百位数的7段代码
MOVP1,A;送出百位的7段代码
CLRP3.3;开百位显示
ACALLDL1ms;显示1ms
SETBP3.3;关百位显示
LOOP0:
SETBP3.1;小数点不亮
MOVA,BUF3;取十位数
MOVCA,@A+DPTR;查十位数的7段代码
MOVP1,A;送出十位的7段代码
CLRP3.2;开十位显示
ACALLDL1ms;显示1ms
SETBP3.2;关十位显示
MOVA,BUF2;取个位数
MOVCA,@A+DPTR;查个位数的7段代码
ADDA,#80H
MOVP1,A;送出个位的7段代码
CLRP3.1;小数点亮
CLRP3.1;开个位显示
ACALLDL1ms;显示1ms
SETBP3.1;关个位显示
SETBP3.1;小数点不亮
MOVA,BUF1;取小位数
MOVCA,@A+DPTR;查小位数的7段代码
MOVP1,A;送出小位的7段代码
CLRP3.0;开小位显示