数字式温度测量电路设计Word格式.docx
- 文档编号:7491351
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:24
- 大小:111.35KB
数字式温度测量电路设计Word格式.docx
《数字式温度测量电路设计Word格式.docx》由会员分享,可在线阅读,更多相关《数字式温度测量电路设计Word格式.docx(24页珍藏版)》请在冰点文库上搜索。
环境控制、设备或过程控制、测温类消费电子产品等。
本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。
主控制器即单片机部分,用于存储程序和控制电路;
LED显示部分是指四位共阴极数码管,用来显示温度;
传感器部分,即温度传感器,用来采集温度,进行温度转换;
复位部分,即复位电路。
测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。
本设计能完成的温度测量范围是-55°
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;
跳至定时器T0执行中断服务程序
ORG0013H;
外中断1中断入口
DB00H,00H,00H,00H,00H,00H,00H;
跳至INTEX1执行中断服务程序
ORG001BH;
定时器T1中断入口地址
中断返回(不开中断)
ORG0023H;
串行口中断入口地址
两位数码管来显示温度,显示范围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;
然后拉高数据线
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:
结束
RET
****************************************
读出转换后的温度值
GET_TEMPER:
SETBTEMPDIN;
LCALLINIT_1820;
先复位DS18B20
JBFLAG1,TSS2
RET;
判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
CLRP3.6;
DS18B20已经被检测到!
!
MOVA,#0CCH;
跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;
发出温度转换命令
*****************************************
这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
显示温度
准备读温度前先复位
MOVA,#0BEH;
发出读温度命令
LCALLREAD_18200;
将读出的温度数据保存到35H/36H
*******************************************
写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOVR2,#8;
一共8位数据
CLRC;
C清0
/
NOP;
WR1:
MOVR3,#6;
DJNZR3,$
RRCA;
数据右移
MOVTEMPDIN,C;
写入一位数据
MOVR3,#23;
拉高数据端口
DJNZR2,WR1;
判断是否写完
处理温度BCD码子程序
CONVTEMP:
MOVA,TEMPH;
ANLA,#80H;
判断最高位
JZTEMPC1;
判断温度是否在零下?
温度值补码变成原码
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;
ANLA,#0FH;
乘0.0625
MOVDPTR,#TEMPDOTTAB;
MOVCA,@A+DPTR;
MOVTEMPLC,A;
TEMPLCLOW=小数部分BCD
计算整数位温度BCD值
ANLA,#0F0H;
SWAPA;
ORLA,TEMPL;
MOVTEMPER_L,A;
//
LCALLHEX2BCD1;
调用单字节十六进制转BCD子程序
************************************
ORLA,TEMPHC;
TEMPHCLOW=十位数BCD
MOVTEMPHC,A;
TEMPLCHI=个位数BCD
ORLA,TEMPLC;
MOVA,R7;
JZTEMPOUT;
ANLA,#0FH;
SWAPA;
MOVR7,A;
TEMPHCHI=百位数BCD
ORLA,R7;
TEMPOUT:
RET;
小数部分分码表
TEMPDOTTAB:
DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB06H,07H,08H,08H,09H,09H;
显示区BCD码温度值刷新子程序
温度暂存器内的2字节中,高字节的低半字节和低字节的高半字节组成一个字节,
这个字节的二进制值转换为十进制后,就是温度值的百、十、个位值,而剩下的低字节化为
十进制后,就是温度值的小数部分.
DISPBCD:
MOVA,TEMPLC;
温度数据移入显示寄存器
取低字节的低4位(小数部分)
MOVBUF1,A;
小数部分放入寄存器
取低字节的高4位(个位数)
MOVBUF2,A;
个位数放入寄存器
取高字节的低4位(十位数)
MOVBUF3,A;
十位数放入寄存器
取高字节的高4位(百位数)
MOVBUF4,A;
百位数放入寄存器
CJNEA,#10H,DISPBCD0;
百位数=0?
SJMPDISPOUT;
最高位为0和正数的符号位都不显示
DISPBCD0:
JNZDISPOUT;
十位数是0?
MOVBUF4,0AH;
符号位不显示
MOVBUF3,A;
十位数显示符号
DISPOUT:
:
RET;
单字节十六进制转BCD
HEX2BCD1:
MOVB,#100;
十六进制->
BCD
DIVAB;
B=A%100
R7=百位数
MOVA,#10;
XCHA,B;
B=A%B
ORLA,B;
X8表示第7位需要异或运算
X5表示第4位需要异或运算
X4表示第3位需要异或运算
1表示第0位需要异或运算
CRC8CAL:
PUSHACC;
MOVR7,#08H;
CRC8LOOP1:
XRLA,B;
RRCA;
MOVA,B;
JNCCRC8LOOP2;
XRLA,#18H;
CRC8LOOP:
MOVB,A;
POPACC;
RRA;
DJNZR7,CRC8LOOP1;
******************************************
读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
拉高数据端口
拉低数据端口
MOVR3,#9;
延时
RE10:
DJNZR3,RE10;
MOVC,TEMPDIN;
读出数据
RE20:
DJNZR3,RE20;
数据右移一位
DJNZR2,RE01;
是否读完一个字节?
MOV@R1,A;
INCR1;
读下一字节
LCALLCRC8CAL;
数据验证
DJNZR4,RE00;
9字节数据是否读完?
验证数据放入A中
JNZREAD_OUT;
验证出错则不改变温度值
MOVTEMPL,TEMPER_L;
温度数据的低字节放入寄存器
MOVTEMPH,TEMPER_H;
温度数据的高字节放入寄存器
READ_OUT:
显示子程序
DISPLAY:
MOVDPTR,#NUMTAB;
指定查表启始地址
MOVR0,#4;
显示4位数据
DP11:
MOVR1,#20;
显示1000次
DPLP:
SETBP3.1;
小数点不亮
MOVA,BUF4;
取百位数
JZLOOP0
查百位数的7段代码
MOVP1,A;
送出百位的7段代码
CLRP3.3;
开百位显示
ACALLDL1ms;
显示1ms
SETBP3.3;
关百位显示
LOOP0:
MOVA,BUF3;
取十位数
查十位数的7段代码
送出十位的7段代码
CLRP3.2;
开十位显示
SETBP3.2;
关十位显示
MOVA,BUF2;
取个位数
查个位数的7段代码
ADDA,#80H
送出个位的7段代码
CLRP3.1;
小数点亮
开个位显示
ACALLDL1ms;
关个位显示
MOVA,BUF1;
取小位数
查小位数的7段代码
送出小位的7段代码
CLRP3.0;
开小位显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字式 温度 测量 电路设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)