单片机课程设计论文数字温度计.docx
《单片机课程设计论文数字温度计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计论文数字温度计.docx(33页珍藏版)》请在冰点文库上搜索。
![单片机课程设计论文数字温度计.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/64af950d-a28b-4519-8a46-ae13e37e24fc/64af950d-a28b-4519-8a46-ae13e37e24fc1.gif)
单片机课程设计论文数字温度计
电控学院
单片机课程设计报告
院(系):
电气与控制工程学院
专业班级:
姓名:
学号:
指导教师:
2013年7月17日
数字温度计设计
【摘要】:
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以通过键盘设置上下报警温度当温度不在设置范围内时,可以报警。
【关键字】:
DS18B20;STC89C52;四位一体数码管;报警;
【引言】:
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机STC89C52RC,测温传感器使用DS18B20,用4位一体共阴数码管以串口传送数据,实现温度显示,能准确达到以上要求。
1基本要求
1.1设计题目
数字温度计设计
1.2设计任务
利用单片机和集成温度传感器设计一个可以直接显示温度值的数字温度计并要求达到一定的测量精度。
1.3本设计应达到要求
⑴硬件设计:
根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。
⑵软件设计:
根据温度测量及显示功能要求,完成控制软件的编写与调试。
⑶功能要求:
至少利用3位数码管进行测量值的显示(也可用液晶显示器相应内容),温度测量范围:
-20℃~100℃。
1.4扩展功能
根据实际情况自由添加附加功能,如设置温度的上下限报警功能,利用语音或声光报警等。
1.5设计说明书(论文)
设计说明书应表明设计思想和所使用的设计方法,主要内容包括:
①系统简介、整体功能说明、各功能模块说明(附图)及系统使用说明;
②设计还需要改进的地方及设计的心得体会;
③参考文献:
包括参考书、资料、网站等,按标准格式列出(可参考教材最后的参考文献引用格式);
④附录:
系统总体原理图及源程序。
2课程设计内容
2.1设计任务目的
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本次课程设计的目的就是通过本次课程设计使我们更加熟练单片机技术的使用,将单片机理论知识融入于生产应用。
使我们学有所用,学以致用!
2.2设计任务要求
根据设计要求,确定设计任务的总纲领:
利用单片机和集成温度传感器设计一个可以直接显示温度值的数字温度计。
设计要求:
(1)硬件设计:
根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。
(2)软件设计:
根据温度测量及显示功能要求,完成控制软件的编写与调试;
(3)功能要求:
至少利用3位数码管进行测量值的显示(也可用液晶显示器相应内容),温度测量范围:
-20℃~100℃;
(4)扩展功能:
根据实际情况自由添加附加功能,如设置温度的上下限报警功能,利用语音或声光报警等。
2.3方案设计
因为本设计的核心就是温度的采集,故而首先考虑温度的采集方案即温度采集电路的选择。
2.3.1温度采集电路的选择
(1)温度采集电路方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
(2)温度采集电路方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路与软件设计都比较简单,传感精度也明显更高。
故采用了方案二为本次数字温度计设计的大致方案。
2.3.2单片机的选择
选择完温度采集电路的设计,则考虑此次设计电路的核心单片机。
单片机的选择主要是AT系列和STC系列的选择。
依照的原则是:
满足所需功能的前提下,尽量选择低成本单片机。
由于AT系列51单片机是USA的产品,功能少,速度慢,RAM/ROM小,性能不够稳定。
而且一些AT系列的单片机已经停产。
相比STC系列单片机高性能,功能齐全,速度高,RAM/ROM大,价格低廉、下载程序方便等优点。
毫无疑问。
我们选择了STC系列常用的且价格较低的单片机STC89C52RC。
2.3.3显示电路的取决
单片机确定后。
主要仅剩下显示电路的设计。
关于显示电路。
我们采用了四位一体八段共阴数码管。
符合课程设计的要求。
2.3.4报警部分电路分析
在测温场所我们往往需要对高、低温进行报警,而且需要根据不同情况随时调节报警温限,这就需要设计键盘电路来进行报警参数设置。
根据分析需要设计三个按键的键盘,即模式切换、加键,减键。
2.4系统框图
该系统可分为以下七个模块:
(1)控制器:
采用单片机STC89C52对采集的温度数据进行处理;
(2)温度采集:
采用DS18B20直接向控制器传输12位二进制数据;
(3)温度显示:
采用了4个LED共阴极七段数码管显示实际温度值;
(4)门限设置:
主要实现模式切换及上下门限温度的调节;
(5)报警装置:
采用发光二极管和嗡鸣器进行报警,低于低门限或高于高门限均使其二极管发光嗡鸣器发出报警声音;
(6)复位电路:
对整个系统进行复位;
(7)时钟振荡模块:
为整个系统提供统一的时钟周期。
2.5重要器件及其相关参数
2.5.1单片机STC89C52
P0.0~P0.7:
通用I/O引脚或数据低8位地址总线复用地址;
P1.0~P1.7:
通用I/O引脚;
P2.0~P2.7:
通用I/O引脚或高8位地址总线复用地址;
P3.0~P3.7:
通用I/O引脚或第二功能引脚(RxD、TxD、
INT0、INT1、T0、T1、WR、RD);
XTAL1、XTAL2:
外接晶振输入端;
RST/Vpd:
复位信号输入引脚/备用电源输入引脚;
Vcc:
接+5V电源;
Vss:
地端。
图2STC89C52引脚图
2.5.2温度传感器DS18B20
(1)DS18B20内部结构框图如图2所示:
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器内部高速RAM结构如图3所示。
用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
图4 DS18B20字节定义
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
表1DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
(2)DS18B20的测温原理:
器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
(3)通过单线总线端口访问DS1820的协议如下:
•初始化
•ROM操作命令
•存储器操作命令
•执行/数据
DS1820需要严格的协议以确保数据的完整性。
协议包括几种单线信号类型:
复位脉冲、存在脉冲、写0、写1、读0和读1。
所有这些信号,除存在脉冲外,都是由总线控制器发出的。
和DS1820间的任何通讯都需要以初始化序列开始,初始化序列见图11。
一个复位脉冲跟着
一个存在脉冲表明DS1820已经准备好发送和接收数据(适当的ROM命令和存储器操作命令)
当总线上只有一个器件时,DS18B20读温度的流程为:
复位→发0CCHSKIPROM命令→发44H开始转换命令→延时→复位→发0CCHSKIPROM命令→发0BEH读存储器命令→连续读出两个字节数据(即温度)→结束。
ØConvertT[44h]
这条命令启动一次温度转换而无需其他数据。
温度转换命令被执行,而后DS1820保持等待状态。
如果总线控制器在这条命令之后跟着发出读时间隙,而DS1820又忙于做时间转换的话,DS1820将在总线上输出“0”,若温度转换完成,则输出“1”。
如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。
ØReadScratchpad[BEh]
这个命令读取暂存器的内容。
读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)
字节读完。
如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
(4)DS18B20温度传感器与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源,其接电源与单片机连接方式如图4。
另一种是寄生电源供电方式。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
3硬件电路设计
3.1主板电路
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,上下限报警调整电路,单片机主板电路等,如图5所示。
图5中有三个独立式按键可以分别调整温度计的上下限报警设置,图中蜂鸣器可以在被测温度不在上下限范围内时,发出报警鸣叫声音。
图5中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
3.2显示电路
显示电路采用的是四位一体八段共阴数码管。
四位一体八段数码管最大的有点是免去了各个数码管间的复杂的连接电路。
本设计中,将八段数码管的A-DP,8个段选端分别接到单片机的P0~0-P0~7管脚。
1-4,4个位选端分别连接到单片机的P2~0-P2~3管脚。
3.3报警参数调节电路
门限中的三个按键,分别为模式切换按键、加按键、减按键;模式切换按键接P1~0,加按键接P1~1,减按键接P1~2。
3.4蜂鸣器报警电路
报警电路中,超过高门限或者低于低门限时发光二极管被点亮蜂鸣器,其余时刻光二极管均熄灭、蜂鸣器不响;蜂鸣器报警接P1~4。
3.5温度采集电路
DS18B20温度采集电路中,需要注意的是DQ上需要一个上拉电阻,一般为4.7KΩ左右。
DQ接P2~6。
4系统软件设计
4.1读取数据的流程图
DSl8820的主要数据元件有:
64位激光LaseredROM,温度灵敏元件和非易失性温度告警触发器TH和TL。
DSBl820可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生(电容)电源为止。
此外,还可外接5V电源,给DSl8820供电。
DSl8820的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。
下图读取数据流程图。
图6读取数据流程图
4.2温度数据处理程序的流程图
读出温度数据后,temp的低四位为温度的小数部分,可以精确到0.0625℃,temp的中间8位为温度的整数部分,temp的高四位全部为1表示负数,全为0表示正数。
所以先将数据提取出来,分为三个部分:
小数部分、整数部分和符号部分。
小数部分进行显示时要使用另外的查询表,与整数显示查询表有所不同。
因为本次课程设计只要求测试的温度范围为0~70℃,所以符号位S必为0,软件设计中则默认所测数据为正,从而不设符号位判定。
为0
为0
图7温度数据处理程序的流程图
4.3模式切换流程图
使用模式值st来标记不同模式,st=1时,表示在正常温度模式,st=2,表示在高门限模式,st=3表示在低门限模式,每次按下一次模式切换键,st+1,待其加至4时,将该值返回至1。
从而形成了模式键不断按下,三种模式循环切换的情况。
防抖在这里是十分关键的。
因为此处的按键是按下然后又返回为按了一次。
所以按下时,则进入程序,为了防止机械抖动等不确定情况,延时恰当的一段时间后再次检测是否确实按下。
若确实按下,则对模式进行切换。
切换后,延时等待按键返回高位,返回高位后,再次延时消除抖动,再次检验,确定按键返回高位后,退出程序。
图8模式切换流程图
5软件仿真
电路图连接:
严格按照硬件设计中已有的单片机系统的连接方式和自己补充的电路的连接方式进行仿真,要最贴近实际电路,才能更准确的得到仿真结果。
图9系统电路图
图10高门限下数码管显示
图11低门限下数码管显示
6实际连接与最终结果
图12实物图
7设计心得体会
[软件调试]:
[硬件焊接]:
通过本次课程设计我学到了好多东西,原来我的单片机知识并不扎实,不论软件还是硬件都不好,不过在这次实习中,通过亲自动手,发现了很多不会的问题,也加深了对这些知识的认识。
在课程设计之前,我们在书上网上查找了许多资料,最终确定了此次课设的电路图。
在调试过程中,我们的板子出现了许多问题,举例如下:
问题1:
连接好线路,数码管不亮
解决办法:
我们猜测可能线路板有虚焊,就将线路板检查了一遍,最后是将数码管给拆了,重新焊接了一遍。
问题2:
蜂鸣器响,数码管不亮
解决办法:
通过同学的帮助,我们最后发现是单片机的问题,
问题3:
连接好线路,数码管乱码。
解决办法:
本次课程设计的电路图是参考网上的,不知道是否正确,就用仿真试做了一下,发现仿真结果是正确的,就照图焊接了。
连好线路,发现数码管出现乱码现象,通过询问同学,在网上查找资料,知道了是数码关没有驱动,就给4个位选线路分别焊接了三极管(9014),因为数码管是共阴的。
问题4:
数码管显示2559
解决办法:
分析得知,这个可能是由于温度传感器没有采集到数据,即可能是因为软件编程有问题也可能是硬件焊接,我们找来同学的板子,将我们的52单片机与同学焊接的板子相连接,发现数码管有显示,明白了是板子的问题,之后将与温度串关起相连的线路仔细检查,部分线路重新焊接。
在课设中,我深深感受到团队合作的重要性。
这次课设对于我们来说是比较困难的,但是俗话说三个臭皮匠顶个诸葛亮,虽说我们只有两人,但我们分工明确,互相讨论互相学习互相帮组,遇到不会的问题积极解决,请教同学,在最后的调试过程中,同学功不可没,帮组我们尽快找到问题,解决问题。
此次设计,我们收获不小,这为我们大四的毕业设计打下了基础。
8参考文献
单片机原理及应用柴钰
附录
附录1:
元件清单
1、STC89C52单片机最小系统1个
2、DS18B20温度传感器1个
3、4位一体共阴数码管1个
4、9014三极管5个
5、蜂鸣器1个
6、按键3个
7、电阻22016个
8、发光二极管2个
9、电阻470K3个
10、导线若干
14、万用板10*151片
15、4.7K9脚排阻1个
附录2:
程序清单
/********************************************************************
*文件名:
温度采集DS18B20.c
*描述:
该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来。
***********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedisdataP0//段码输出口
#definediscanP2//扫描口
#definejump_ROM0xCC
#definestart0x44
#defineread_EEROM0xBE
sbitDQ=P2^6;//DS18B20数据口
ucharst=1;
uinttemp;
uinti;
floattt;
uinth;
uinttemp;
ucharr;
charhigh=40,low=15;
sbitbeep=P1^3;//LED报警
sbitbeep1=P1^4;//LED报警
ucharpp;
sbitkey1=P1^0;//模式切换键
sbitkey02=P1^1;//加键
sbitkey03=P1^2;//减键
unsignedcharTMPH,TMPL;
ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//温度小数部分用查表法
ucharcodedis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-""H""L""C"
ucharcodescan_con[4]={0x08,0x04,0x02,0x01};//列扫描控制字
uchardatatemp_data[2]={0x00,0x00};//读出温度暂放
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为140US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay_1()
{
inti,j;
for(i=0;i<=10;i++)
for(j=0;j<=2;j++)
;
}
/********************************************************************
*名称:
delay()
*功能:
延时函数
*输入:
无
*输出:
无
***********************************************************************/
voiddelay(uintN)
{
inti;
for(i=0;i;
}
/********************************************************************
*名称:
Delay_1ms()
*功能:
延时子程序,延时时间为1ms*x
*输入:
x(延时一毫秒的个数)
*输出:
无
***********************************************************************/
voidDelay_1ms(uinti)//1ms延时
{
ucharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/********************************************************************
*名称:
Reset()
*功能:
复位DS18B20
*输入:
无
*输出:
无
***********************************************************************/
ucharReset(void)
{
uchardeceive_ready;
DQ=0;
delay(29);
DQ=1;
delay(3);
deceive_ready=DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
*名称:
read_bit()
*功能:
从DS18B20读一个位值