简易数字温度计课程设计课程设计草稿.docx
《简易数字温度计课程设计课程设计草稿.docx》由会员分享,可在线阅读,更多相关《简易数字温度计课程设计课程设计草稿.docx(21页珍藏版)》请在冰豆网上搜索。
简易数字温度计课程设计课程设计草稿
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进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。
所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与