简易数字温度计课程设计课程设计草稿.docx

上传人:b****5 文档编号:6433464 上传时间:2023-01-06 格式:DOCX 页数:21 大小:166.47KB
下载 相关 举报
简易数字温度计课程设计课程设计草稿.docx_第1页
第1页 / 共21页
简易数字温度计课程设计课程设计草稿.docx_第2页
第2页 / 共21页
简易数字温度计课程设计课程设计草稿.docx_第3页
第3页 / 共21页
简易数字温度计课程设计课程设计草稿.docx_第4页
第4页 / 共21页
简易数字温度计课程设计课程设计草稿.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

简易数字温度计课程设计课程设计草稿.docx

《简易数字温度计课程设计课程设计草稿.docx》由会员分享,可在线阅读,更多相关《简易数字温度计课程设计课程设计草稿.docx(21页珍藏版)》请在冰豆网上搜索。

简易数字温度计课程设计课程设计草稿.docx

简易数字温度计课程设计课程设计草稿

2.1.1方案一

由于本设计是测温电路,可以使用热敏电阻等器件利用其感温效应,在把随温度变化的电压或电流采集过来进行A/D转换之后,再利用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦,而且热敏电阻的线性度不高,测量精度。

方案一:

采用热敏电阻传感器。

利用热敏电阻随温度变化而显著变化,能直接将温度的变化转换为能量的变化,进而制成温度计。

但是其测温传感器比较复杂,而且不易通过编制程序来控制测温精度,增大系统设计的难度。

2.1.2方案二

直接使用数字温度传感器来测温,可以使用“一线总线”数字化温度传感器DS18B20。

此传感器可以直接读取被测温度值,只需进行简单转换,就可以得到所测环境的温度值。

显示电路采用串口移位静态显示方式,采用串入并出移位芯片74LS164和数码管来实现温度的显示。

2.1.3方案三

也是直接使用数字温度传感器DS18B20来测温,但显示电路采用动态扫描的方式来实现,电路简单,容易实现,节约成本。

第二种方案就是采用桥式电路,将一个热敏电阻作为电桥的桥臂。

温度的改变会引起热敏电阻阻值的变化,从而引起电桥的输出电压的变化,通过AD0809对电桥的输出电压进行采样,将得到数值进行工程量变换,最终通过四位数码管进行显示。

引脚排列

内部结构框图

DS18B20测温原理图

DS18B20的测温原理如图3.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。

系统对DS18B20的各种操作必须按协议进行。

操作协议为:

初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。

器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将最低温所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在最低温所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。

其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

 

DS18B20初始化子程序流程如图7所示:

图7DS18B20初始化子程序流程

 

3.DS18B20写子程序流程图如图8所示:

图8DS18B20写子程序流程图

 

4.DS18B20读子程序流程图如图9所示:

图9DS18B20读子程序流程图

 

温度LSB

温度MSB

TH用户字节1

TL用户字节2

配置寄存器

保留

保留

保留

CRC

 

TM

R1

R0

1

1

1

1

1

图5DS18B20的字节定义

DS18B20的分辨率定义如表1所示

表1分辨率设置表

R0

R1

分辨率

最大温度转移时间

0

0

9位

96.75ms

0

1

10位

187.5ms

1

0

11位

375ms

1

1

12位

750ms

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。

因此,在实际应用中要将分辨率和转换时间权衡考虑。

 

表2 一部分温度对应值表

温度/℃

二进制表示

十六进制表示

+125

0000011111010000

07D0H

+85

0000010101010000

0550H

+25.0625

0000000110010000

0191H

+10.125

0000000010100001

00A2H

+0.5

0000000000000010

0008H

0

0000000000001000

0000H

-0.5

1111111111110000

FFF8H

-10.125

1111111101011110

FF5EH

-25.0625

1111111001101111

FE6FH

-55

1111110010010000

FC90H

 

表2ROM指令集

指令

约定代码

功能

读ROM

33H

读DS18B20中的编码

符合ROM

55H

发出此命令后,接着发出64位ROM编码,访问单线总线上与该编辑相对应的DS18B20使之做出响应,为下一步对该DS18B20的读写作准备

搜索ROM

0F0H

用于确定挂接在同一总线上的DS18B20个数和识别64位ROM地址,为操作各器件作准备

跳过ROM

0CCH

忽略64位ROM地址,直接向DS18B20发送温度变换指令

告警搜索命令

0ECH

执行后,只有温度跳过设定值上限或下限的片子才能做出反应

表3RAM指令集

指令

约定代码

功能

温度转换

44H

启动DS18B20进行温度转换,结果存入9字节RAM中

读暂存器

0BEH

读暂存器9个字节内容

写暂存器

4EH

将数据写入暂存器的TH、TL字节

复制暂存器

48H

把暂存器的TH、TL字节写到EEPROM中

重调EEPROM

0B8H

把EEPROM中的TH、TL字节写到暂存器TH、TL字节

读供电方式

0B4H

启动DS18B20发送电源供电方式的信号给主CPU,寄生供电时发送“0”,外界电源供电发送“1”。

 

五、源程序:

/******************************************************************************

主程序名称:

主程序功能:

温度测控系统,两位数码管显示当前温度。

温度超出范围蜂鸣器报警

入口参数:

出口参数:

******************************************************************************/

HIG_MKEQU32H;最高温度阈值变量声明

LOW_MKEQU33H;最低温度阈值变量声明

TEM_LEQU34H;当前温度的低字节变量声明

TEM_HEQU35H;当前温度的高字节变量声明

TEM_NUMEQU36H;当前温度整数部分变量声明

FLAG1EQU00H;DS18B20存在标志位

DQEQUP3.7;单片机与DS18B20连接口

BZEQUP1.5;蜂鸣器与单片机的接口

ORG0000H

START:

MOVSP,#60H;堆栈指针初始化

SETBDQ

START1:

CLRBZ

MOVHIG_MK,#32

MOVLOW_MK,#18

LCALLINIT_1820

GON:

LCALLGET_TEMPER

LCALLTEM_COV

ACALLTEM_DISP

ACALLbaojing

AJMPGON

/******************************************************************************

子程序名称:

GET_TEMPER

子程序功能:

操作DS18B20,通过调用DS18B20的读写子程序,实现采集温度数据的功能

入口参数:

出口参数:

存放原始温度数据到34H和35H

******************************************************************************/

GET_TEMPER:

SETBDQ

GET_MK1:

LCALLINIT_1820;调用初始化子程序

JBFLAG1,GET_MK2;判断DS18B20是否初始化成功,

;FLAG1=1说明初始化成功

LJMPGET_MK1;初始化不成功则需继续重新初始化

GET_MK2:

LCALLYS50;调用延时50us子程序

MOVA,#0CCH

LCALLWRITE_1820

MOVA,#44H

LCALLWRITE_1820

GET_MK5:

NOP

CLRDQ

NOP

SETBDQ;发复位脉冲

MOVR7,#4

DJNZR7,$

CLRC

MOVC,DQ

JCGET_MK5;判断DS18B20是否复位成功

GET_MK3:

LCALLINIT_1820

JBFLAG1,GET_MK4

LJMPGET_MK3

GET_MK4:

LCALLYS50

MOVA,#0CCH

LCALLWRITE_1820

MOVA,#0BEH

LCALLWRITE_1820;发送读温度命令

LCALLREAD_1820;调用子程序读取温度数据

RET

/******************************************************************************

子程序名称:

INIT_1820

子程序功能:

初始化DS18B20

入口参数:

出口参数:

******************************************************************************/

INIT_1820:

SETBDQ

NOP

NOP

CLRDQ;发复位脉冲

ACALLYS500;调用延时500us子程序

SETBDQ

ORLP3,#0FFH;将P3口设为输入端口

ACALLYS50;等待50us

JNBDQ,TSR1;判断DS18B20是否复位成功

AJMPINIT_1820;重发复位脉冲

TSR1:

MOVR7,#6BH

TSR2:

DJNZR7,TSR2

SETBDQ;初始化结束,将DQ拉高

SETBFLAG1;DS18B20初始化成功标志

RET

/******************************************************************************

子程序名称:

YS50

子程序功能:

延时50us

入口参数:

出口参数:

******************************************************************************/

YS50:

MOVR7,#18H

DJNZR7,$

RET

/******************************************************************************

子程序名称:

YS500

子程序功能:

延时500us

入口参数:

出口参数:

******************************************************************************/

YS500:

MOVR7,#0F9H

DJNZR7,$

RET

/******************************************************************************

子程序名称:

WRITE_1820

子程序功能:

DS18B20写程序

入口参数:

A

出口参数:

******************************************************************************/

WRITE_1820:

MOVR2,#8;设置串行数据传送位数

CLRC

WRITE1:

CLRDQ;将DS18B20的DQ数据总线电平拉低

MOVR7,#8;延时>15us

DJNZR7,$

RRCA;写入一位数据

MOVDQ,C

MOVR7,#24;延时50us

DJNZR7,$

SETBDQ;设置为恢复状态

NOP;延时1us

DJNZR2,WRITE1;判断8位数据写入是否完成

RET

/******************************************************************************

子程序名称:

READ_1820

子程序功能:

DS18B20读程序

入口参数:

出口参数:

34H和35H单元

******************************************************************************/

READ_1820:

MOVR4,#2;设置读双字节次数

MOVR1,#34H;结果低8位存34H单元,高8位存35H单元

READ0:

MOVR2,#8;每次读取8位

MOVA,#00H

READ1:

CLRC

SETBDQ

NOP

NOP

CLRDQ;保持至少1us的低电平

NOP

SETBDQ;恢复高电平

MOVR7,#8;延时>15us

DJNZR7,$

MOVC,DQ;取一位数据

RRCA

MOVR7,#26

DJNZR7,$

DJNZR2,READ1;判断8位数据是否读完

MOV@R1,A;低8位数据读完,存入34H单元

INCR1;指向35H

DJNZR4,READ0;低8位数据读完,存入34H单元

SETBDQ;读取完毕,DQ拉高

NOP

NOP

RET

/******************************************************************************

子程序名称:

TEM_COV

子程序功能:

温度数据格式转换

入口参数:

TEM_H和TEM_L单元

出口参数:

TEM_NUM单元

******************************************************************************/

TEM_COV:

MOVA,TEM_L;取温度值低字节数据到A

ANLA,#0F0H

SWAPA;屏蔽低字节的低4位

MOVTEM_NUM,A;暂存TEM_NUM

TEM_COV3:

MOVA,TEM_H;取温度值高字节数据到A

ANLA,#0FH

SWAPA;屏蔽高字节的高4位

ORLA,TEM_NUM

MOVTEM_NUM,A;将温度转换结果存入TEM_NUM

MOVA,TEM_L;转换温度小数部分

ANLA,#0FH

MOVB,#10

MULAB

MOVB,#10H

DIVAB

MOVTEM_F,A;小数部分存入TEM_F单元

RET

/******************************************************************************

子程序名称:

TEM_DISP

子程序功能:

温度显示

入口参数:

TEM_NUM

出口参数:

******************************************************************************/

TEM_DISP:

MOVA,TEM_NUM

MOVB,#10

DIVAB

MOV38H,B;温度值的个位数存入37H单元

MOV39H,A;温度值的十位数存入38H单元

MOVR5,#02H;两位数字循环显示次数设置

MOVR0,#37H;指针R0指向个位显示首地址

MOVR3,#7FH;数码管动态显示位码初值设置

MOVDPTR,#TAB;共阴数码管段码表首地址

SCAN_1:

MOVA,@R0

MOVCA,@A+DPTR;查表取段码

CJNER0,#38H,SCAN_2;判断当前段选是否为个位

ORLA,#80H;各位显示小数点

SCAN_2:

MOVP0,A;输出段码到P0端口

INCR0;指向十位

MOVA,R3

MOVP2,A;输出位选

MOVR7,#0;动态显示256us延时

DJNZR7,$

RRA;修改位选

MOVR3,A

DJNZR5,SCAN_1;判断循环显示2位数码管是否完成

RET

TAB:

DB0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f

/******************************************************************************

子程序名称:

baojing

子程序功能:

温度超出范围,蜂鸣器报警

入口参数:

TEM_NUM

出口参数:

******************************************************************************/

baojing:

MOVA,TEM_NUM

CJNEA,HIG_MK,MAIN2

MAIN2:

JNCMAIN3;判断温度是否超过最高限度

SETBBZ;启动蜂鸣器

AJMPMAIN6

MAIN3:

CJNEA,LOW_MK,MAIN4;判断温度是否低于最低限度

MAIN4:

JNCMAIN5

SETBBZ;启动蜂鸣器

AJMPMAIN6

MAIN5:

CLRBZ

MAIN6:

RET

END

 

六、总结与体会

经过将近三周的单片机课程设计,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀!

在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。

但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。

而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。

所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。

通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1