单片机课程设计数字温度计.docx
- 文档编号:24074301
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:21
- 大小:412.07KB
单片机课程设计数字温度计.docx
《单片机课程设计数字温度计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字温度计.docx(21页珍藏版)》请在冰豆网上搜索。
单片机课程设计数字温度计
单片机课程设计—数字温度计
1课题任务、功能要求说明及总体方案介绍
1.1课题目的
随着社会的发展,温度的测量及控制变得越来越重要。
本文采用单片机STC89S52设计了温度实时测量及控制系统。
单片机STC89S52能够根据温度传感器DS18B20所采集的温度在数码管上实时显示,通过控制从而把温度控制在设定的范围之内。
所有温度数据均通过4位数码管LED显示出来。
系统可以根据时钟存储相关的数据。
通过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。
1.2功能要求说明
设计一个具有特定功能的数字温度计。
该数字温度计上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
测量温度范围0℃~99℃,测量精度小数点后两位,可以通过开始和结束键控制数字温度计的工作状态。
1.3设计课题总体方案介绍及工作原理说明
1.3.1设计课题总体方案
(1)根据设计要求,选择AT89C52单片机为核心器件。
(2)温度检测器件采用DS18B20数字式温度传感器。
与单片机的接口为P3.6引脚。
(3)键盘采用独立式按键,由三个按键组成,分别是:
设置键(SET),加一建(+1),确认键(RET)。
(4)SET键(上下限温度设置键):
当该键按下时,进入上下限温度设置功能。
通过P0.1引脚接入。
(5)+1键(加一调整键):
在输入上下限温度时,该键按下一次,被调整位加一。
通过P0.2引脚接入。
(6)RET键(确认键):
当该键按下时,指向下一个要调整的位。
通过P0.3引脚接入。
1.3.2工作原理说明
本课题以是80S52单片机为核心设计的一种数字温度控制系统,利用温度传感器DS18B20可以直接读取被测温度值,进行转换的特性,模拟温度值经过DS18B20处理后转换为数字值,然后送到单片机中进行数据处理,并与设置的温度报警限比较,超过限度后通过扬声器报警。
同时处理后的数据送到LED中显示。
2硬件系统的设计
2.1课题硬件系统各模块功能简要介绍
硬件电路设计总体框图为图1:
图1
2.1.1主控制器
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
很适合便携手持式产品的设计使用。
2.2.2显示电路
显示电路采用四位共阳LED数码管,从P3口RXD,TXD串口输出段码。
2.2.3温度传感器
DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
•独特的单线接口仅需一个端口引脚进行通讯
•简单的多点分布应用
•无需外部器件
•可通过数据线供电
•零待机功耗
•测温范围-55~+125℃,以0.5℃递增。
华氏器件-67~+2570F,以0.90F递增
•温度以9位数字量读出
•温度数字量转换时间200ms(典型值)
•用户可定义的非易失性温度报警设置
•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图2所示,DQ为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
其电路图如图2所示.。
图2外部封装形式
在仿真软件中如图3所示
图3
DS18B20的测温原理如图4所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图4中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图4
在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:
首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。
考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:
表1.部分温度值对应的二进制温度数据
温度/℃
二进制表示
十六进制表示
+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
2.2课题电路原理图、PCB图、元器件布局图
见附录
3软件系统的设计
3.1课题软件系统各模块功能简要介绍
数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序,LED显示程序等。
系统的主程序主要用来初始化一些系统参数,对DS18B20的配置数据进行一系列的设定。
温度检测程序是对DS18B20的状态不断地查询,读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写,读取当前的温度值后,进行温度转化程序,对温度符号处理和温度值的BCD码处理,进行温度值正负的判定,将其段码送至显示缓冲区,以备定时扫描服务程序处理。
LED显示程序主要对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时,将符号显示位移入下一位。
3.2课题软件系统程序流程框图
图5
3.3课题软件系统程序清单
见附录一
4仿真结果、误差分析、设计体会
4.1课题的仿真结果
Proteus仿真结果
软件方面,在Proteus编译下进行,源程序编译及仿真调试。
在软件中选定传感器后可对其进行环境温度设置,如图6,将环境温度设为34.9。
图6
然后点击软件执行键,按操作步骤实施后,观察LED数码管示数,此时示数如图7。
图7
4.2硬件测试结果及分析
在硬件测试方面,检查电路板及焊接的质量情况,在检查无误后通电检查LED显示器。
其中DS18B20实物图为图8
图8
在室温下,LED显示器示数如图9,为56.0摄氏度
图9
用手盖住温度传感器后,LED显示器示数如图12,为8.0摄氏度。
比较可知,硬件调试结果也达到了要求。
4.3设计体会
这次课程设计检验了我所学的知识,也培养了我如何去把握一件事。
在设计的过程中,与同学相互讨论,相互学习,共同进步。
数字温度计课程设计是单片机课程知识综合应用的实践训练,通过本次课程设计,我体会到学好基本知识和方法最重要。
结束语
本次课设对我来说是一次难得的经历,首先是接触了仿真软件Proteus,在使用时经历了很多次失败,因为这款软件与以前使用的各种软件有很多不同,使用时不停出错,接线时由于元件放置不合理而接的杂乱无章;输入源程序时还较为顺利,显示结果比较满意。
其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要编制程序,其中历经不少曲折,最后我的收获是,编程一定要细心,针对每一个细节,稍有疏忽,程序就不能正常工作。
最后是单片机实践操作,由于DS18B20温度传感器灵敏度不太高,示数变化不大。
另外,我前期花了一些时间专门学习这块芯片,了解了DS18B20的工作原理的时序图。
在这次的实践与学习中,尽管期间困难重重,但我还是从中学习了不少新的知识与技能和解决困难的方法,也终于体验到了经历困难到最终获得成功的那种无以言表的喜悦之情,总之,本次课设是我收获最多的一次,也希望自己在以后的各项研究活动中能坚持这种精神。
致谢
通过这一阶段的努力,我的课程设计《数字温度计》终于完成了。
在大学阶段,我在学习上和思想上都受益非浅,这除了自身的努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的。
在我修改论文的过程中,王韧老师给我提供了许多资料,并对实践中出现的问题给予耐心的解答,在百忙之中仔细阅读,给出修改意见,在此对他表示感谢。
参考文献
【1】杨素行著.模拟电子技术基础(第二版).北京:
高等教育出版社,2006.
YangSuhang.Analogelectronictechnologyfoundation(secondedition).Beijing:
highereducationpress,2006
【2】阎石著.数字电子技术基础(第五版).北京:
高等教育出版社,2006.
YanShi.Digitalelectronictechnologybase(fifthedition).Beijing:
highereducationpress,2006.
【3】李全利,仲伟峰,徐军著.单片机原理及应用.北京:
清华大学社,2006.
LiQuanliZhongWeiFeng,XuJunzhu.Singlechipmicrocomputerprincipleandapplication.Beijing:
tsinghuauniversityclub,2006
【4】杨路明著.C语言程序设计教程(第2版).北京:
北京邮电大学出版社,2005.
YangLuming.Clanguageprogrammingtutorial(secondedition).Beijing:
Beijinguniversityofpostsandtelecommunicationspublishinghouse,2005
附录一源程序
#include
typedefunsignedcharuint8;
typedefunsignedintuint16;
typedefunsignedlonguint32;
uint8x;
uint32tvalue;
uint8keyflag=0;
uint8codetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//012346789
sbitDQ=P3^6;
//sbitDQ=P3^0;
//sbitdule=P2^6;
//sbitwele=P2^7;
sbitkey1=P1^0;
sbitled1=P3^0;//18B20初始化成功灯亮
voiddelay(uint16i)
{
while(i--);
}
/*******************************温度传感器***************************************/
voidinit_18b20()//18b20的初始化(复位)
{
DQ=1;//初始化DQ线
delay(8);
DQ=0;//将DQ拉低,开始初始化时序(下降沿)
delay(80);//DQ拉低,保持480~960微秒
DQ=1;
delay(14);//DQ拉高,保持60微秒
x=DQ;//初始化成功x为1
if(x==1)
led1=0;//初始化成功灯亮
}
voidwrite_18b20(uint8dat)//18b20写操作
{
uint8i;
for(i=0;i<8;i++)//一字节8位要写满
{
DQ=1;//初始化DQ线
delay(4);
DQ=0;//将DQ拉低,开始写操作时序,15us之内要将所需写的位送到DQ线上
DQ=dat&0x01;//从最低位取数时,要和0X01位与
delay(7);//将DQ拉低后15-60us间对总线采样
DQ=1;//写完后恢复
delay
(1);//两个写时序间至少需要1us的恢复期
dat>>=1;//将数据向右移一位,准备写入下一个数据
}
}
uint8read_18b20()//*****读操作*****
{
uint8i,dat2;
for(i=0;i<8;i++)//读一个字节的8位
{
DQ=1;//初始化DQ线
delay
(1);
dat2>>=1;//dat右移一位,使最高位空出
DQ=0;//将DQ拉低,开始读操作时序
delay
(1);//****注意不能延时太长,否则读数有误****
DQ=1;//将DQ拉高,使单片机检测18B20的输出电平
if(DQ==1)//如果检测到18B20的输出电平为1
dat2|=0x80;//将DQ线的1取出,写在dat2的最高位。
位或后最高位为1
delay(6);//两个读时序间至少需要1us的恢复期
}
return(dat2);//返回读出的八位数据
}
uint16read_temp()//读取温度值并转换
{
floattt;//float型含小数
uint8TH,TL;
init_18b20();//将DS18B20初始化
write_18b20(0xcc);//跳过读序列号
write_18b20(0x44);//启动温度转换
delay(500);//温度转换需要一点时间
init_18b20();
write_18b20(0xcc);//跳过读序列号
write_18b20(0xbe);//读取温度
TL=read_18b20();//先读的是温度值低位
TH=read_18b20();//接着读的是温度值高位
tvalue=TH;//高8位赋给16位的tvalue
tvalue<<=8;//左移8位
tvalue=tvalue|TL;//高、低位合并成为一个16位的数
/*if(tvalue<0x0fff)//判断正负
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}*/
tt=tvalue*0.0625;//乘上分辨率0.0625
tvalue=tt*100+0.5;//*10温度值扩大100倍,精确到1位小数,后一位再四舍五入
return(tvalue);//返回含有温度信息的16位数,前五位代表正负,00000表示正温度,11111表示负温度
//后11位代表温度,前7位为整数,最后四位为小数,这11位乘上0.0625得出的值就是实际温度
}//比如现在LSB的最低四位是0111,那么小数部分就是0.0625*7=0.4375,如果取1位小数乘上10,就是“4”,四舍五入还是4.
voiddisp_1820()//温度值显示
{
uint8a,b,c,d;
tvalue=read_temp();//读出温度
//d=tvalue/10000;//百位数(已扩大100,所以取10000的模)
a=tvalue%10000/1000;//温度十位数
b=tvalue%1000/100;//温度个位数
c=tvalue%100/10;//温度小数位
d=tvalue%10;//温度小数位
P2=0xf7;
P0=table[c];//显示十位
delay(500);
P2=0xfb;
P0=table[b]|0x80;//显示个位及小数点
delay(500);
P2=0xfd;
P0=table[a];//显示小数位
delay(500);
P2=0xfe;
P0=table[d];//显示小数位
//delay(500);
}
/*******************************温度传感器***************************************/
voiddisp_p()//p显示
{
P2=0xfe;
P0=0xf3;
delay(500);
}
voidkeyscan()//按键扫描函数
{
if(key1==0)//判断第一键是否按下
{
delay(1000);//延时0.01秒,消抖
if(key1==0)//再次判断第一键是否真的按下
{
keyflag=~keyflag;//如果真的按下
}
}
while(!
key1);//松手检测
}
voidmain()
{
delay(100);
while
(1)
{
keyscan();
if(keyflag)
disp_1820();//在数码管上显示温度值
else
disp_p();
}
附录二元件清单
数字温度计电路元器件清单
元器件名称
参数
数量
元器件名称
参数
数量
单片机
89S52
1
数码管
1
晶体振荡器
12MHz
1
电阻
13
电容
3
温度传感器
DS18B20
1
按键
1
附录三电路原理图
附录四PCB图
附录五元器件布局图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 数字 温度计