基于DS18B20的温度采集显示系统的设计 推荐Word格式.docx
- 文档编号:22273946
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:32
- 大小:534.56KB
基于DS18B20的温度采集显示系统的设计 推荐Word格式.docx
《基于DS18B20的温度采集显示系统的设计 推荐Word格式.docx》由会员分享,可在线阅读,更多相关《基于DS18B20的温度采集显示系统的设计 推荐Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
六、课程设计进度安排
周次
工作日
工作内容
第
一
周
1
布置课程设计任务,查找相关资料
2
熟悉相关芯片及使用方法
3
完成总体设计方案
4
画出硬件原理图及程序流程图
5
完成硬件接线,编写程序并调试
二
编写程序并调试
编写程序并调试及准备课程设计报告
完成课程设计报告并于下午两点之前上交
答辩
本课题共需两周时间
七、课程设计考核办法
本课程设计满分为100分,从课程设计平时表现、课程设计报告及课程设计答辩三个方面进行评分,其所占比例分别为20%、40%、40%。
2.设计方案
本次的课题设计要求是基于DS18B20的温度采集显示系统,该系统要求包含温度采集模块、温度显示模块和键盘输入模块及报警模块。
其中温度采集模块所选用的是DS18B20数字温度传感器进行温度采集,温度显示模块用的四位八段共阴极数码管进行温度的实时显示,键盘输入模块采用的是按钮进行温度的设置,报警模块用的是LED灯光报警。
具体方案见图2-1。
图2-1总体设计方案
3.硬件设计方案
3.1最小系统的设计
本次设计单片机采用的是AT89C51系列的,它由一个8位中央处理器(CPU),4k
字节Flash
闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个串行I/O口及中断系统等部分组成。
其结构如图3-1所示:
图3-1AT89C51系列单片机引脚排列
图3-2单片机最小系统接线图
图3-2为单片机最小系统的接线图,其中C1、C2均选用20PF的,晶振X1用的是11.0592MHZ的。
晶振电路中外接电容C1,C2的作用是对振荡器进行频率微调,使振荡信号频率与晶振频率一致,同时起到稳定频率的作用,一般选用10~30pF的瓷片电容。
并且电容离晶振越近越好,晶振离单片机越近越好。
晶振的取值范围一般为0~24MHz,常用的晶振频率有6MHz、12MHz、11.0592MHz、24MHz等。
晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。
图3-2中C3,R1及按键构成了最小系统中的复位电路,本次设计选择的是手动按钮复位,手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮。
当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
在单片机最小系统中还要将EA的非接高电平,如图3-2也有体现出来。
3.2LED发光报警电路
P1.7
图3-3LED发光报警电路
图3-3为LED报警电路的接法,其中一根线接单片机的8号P1.7口,另外一根接地。
当温度超过预设温度值时LED灯被接通发光报警。
3.3DS18B20的简介及在本次设计中的应用
3.3.1DS18B20的外部结构及管脚排列
DS18B20的管脚排列如图3-4所示:
DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
图3-4DS18B20的引脚排列及封装
3.3.2DS18B20的工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3-5所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3-5DS18B20测温原理图
3.3.3DS18B20的主要特性
(1)适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电;
(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温;
(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃;
(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;
(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;
(8)测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力;
(9)负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
3.3.4DS18B20的测温流程
图3-6DS18B20的测温流程图
3.3.5DS18B20与单片机的连接
P3.7
图3-7DS18B20与单片机的连接电路图
如上图为DS18B20温度传感器与单片机之间的接法,其中2号接单片机的17号P3.7接口。
DS18B20通过P3.7口将采集到的温度实时送入单片机中。
3.4报警温度的设置
P2.5
P2.6
P2.7
图3-8报警温度的设置电路
图3-8为报警温度的设置电路,其中K1,K2,K3分别接到单片机的P2.5,P2.6,P2.7口。
其中K1用于报警温度设定开关,K2用于报警温度的设置时候的加温度(每次加一),K3用于报警温度的设置时的减温度(每次减一)。
实现了报警温度的手动设置。
3.5数码管显示
3.5.1数码管工作原理
图3-9数码管的引脚排列及结构
图3-9为数码管的外形及引脚排列和两种接法(共阴极和共阳极)的结构图。
共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。
通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。
通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字形编码。
字型码各位定义为:
数据线D0与a字段对应,D1与b字段对应……,依此类推。
如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;
如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮。
如要显示“0”,共阳极数码管的字型编码应为:
11000000B(即C0H);
共阴极数码管的字型编码应为:
00111111B(即3FH)。
依此类推,可求得数码管字形编码如表3-5所示。
表3-5数码管字符表
显示数字
共阴顺序小数点暗
共阴逆序小数点暗
共阳顺序小数点亮
共阳顺序小数点暗
Dpgfedcba
16进制
abcdefgDp
00111111
3FH
11111100
FCH
40H
C0H
00000110
06H
01100000
60H
79H
F9H
01011011
5BH
11011010
DAH
24H
A4H
01001111
4FH
11110010
F2H
30H
B0H
01100110
66H
19H
99H
01101101
6DH
10110110
B6H
12H
92H
6
01111101
7DH
10111110
BEH
02H
82H
7
00000111
07H
11100000
E0H
78H
F8H
8
01111111
7FH
11111110
FEH
00H
80H
9
01101111
6FH
11110110
F6H
10H
90H
显示的具体实施是通过编程将需要显示的字型码存放在程序存储器的固定区域中,构成显示字型码表。
当要显示某字符时,通过查表指令获取该字符所对应的字型码。
3.5.2数码管显示电路
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P2.0
P2.1P2.2
P2.3
图3-10四位八段数码管动态显示电路
图3-10为本次设计所用到的四位八段数码管动态显示,其中段选接到单片机的P0口,位选接到单片机的P2口的低四位。
其中P0口也接的有上拉电阻,图中未标示出来,会在下面的总体电路中标示出来。
采用的是动态显示方式。
3.6硬件电路总体设计
图3-11为本次设计的硬件总体设计图,其中利用K1,K2,K3处进行报警温度的设置,然后有DS18B20进行实时温度采集,并在数码管上同步显示,若采集到的温度达到或者超过预设的报警温度,则LED灯会发光报警,若低于该报警温度,则不会报警。
图3-11硬件电路总体设计图
4.软件设计方案
4.1主程序介绍
4.1.1主程序流程图
本次设计首先对程序进行初始化,然后打开报警温度设定开关,对报警温度进行设定,确认设定值后,DS18B20温度传感器进行温度采集并送入单片机中,单片机将传感器所检测到的温度同步显示在数码管上,并且与设置的报警温度进行比较,若达到或者超过报警温度时,LED灯发光报警,如果没有达到,则继续进行温度采集。
图4-1主程序流程图
4.1.2主流程的C语言程序
main()
{
ALERT=0;
LED=0;
flag=0;
sheding=30;
disdata=0xff;
//初始化端口
discan=0xff;
for(h=0;
h<
4;
h++)//开机显示“8888”scan();
{display[h]=8;
}
ow_reset();
//开机先转换一次
write_byte(0xcc);
//skipROM
write_byte(0x44);
//发转换命令
500;
h++)//开机显示“8888”两秒
{scan();
}
display[0]=0;
display[1]=0;
display[2]=0;
display[3]=0;
flag2=0;
while
(1)
{
if(flag==0&
&
flag2>
1)//温度显示界面
{
LED1=0;
if(display[1]+display[2]*10>
=sheding)//比较
{
ALERT=1;
//报警
}
else
ALERT=0;
}
if(flag==0&
1)
{
read_temp();
//读出温度数据
work_temp();
//处理温度数据
ge=display[3];
shi=display[2];
if(K1==0)
flag2++;
//flag2=0时为初始界面flag2=1时为设定
if(flag2>
flag2=2;
if(flag==0)//flag=0时温度显示flag=1设定显示
flag=1;
elseif(flag==1)
flag=0;
LED=~LED;
key_delay(20);
if(flag==1)
sheding=30;
ge=0;
shi=3;
//display[0]=ge;
//个位设定好的温度用于显示
//display[2]=shi;
//十位
if(flag==1)
LED1=1;
if(K2==0)//++
{
ge++;
if(ge>
9)
{
ge=0;
shi++;
if(shi>
shi=0;
}
sheding=ge+shi*10;
key_delay(20);
if(K3==0)//--
ge--;
if(ge<
0)
ge=9;
shi--;
if(shi<
shi=9;
display[1]=ge;
display[2]=shi;
}
for(h=0;
h++)//显示温度两秒
scan();
}
4.2部分子程序
4.2.1DS18B20复位子程序
流程图如图4-2所示:
图4-2DS18B20复位子程序
DS18B20复位子的C语言程序如下:
ow_reset(void)
{
charpresence=1;
while(presence)
DQ=1;
_nop_();
DQ=0;
delay(50);
//延时550毫秒
delay(6);
presence=DQ;
delay(45);
presence=~DQ;
4.2.2写DS18B20命令子程序
流程图如图4-3所示:
图4-3写DS18B20命令子程序
写DS18B20命令的C语言程序如下:
voidwrite_byte(ucharval)//向1-WIRE总线上写一字节
uchari;
for(i=8;
i>
0;
i--)
DQ=val&
0x01;
//最低位移出
val=val/2;
//右移1位
delay
(1);
}
4.2.3读温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,验有错时,不进行温度数据的改写。
其程序流程图如图4-4所示
DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预期的目的,同时,要注意读进来的是高位在后低位在前,共有12位数,小数4位,整数7位,还有一位符号位。
图4-4读温度子程序
读温度的C语言程序如下:
read_temp()
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
4.2.4计算温度子程序
流程图如图4-5所示:
图4-5计算温度子程序
计算温度的C语言程序如下:
work_temp()
ucharn=0;
if(temp_data[1]>
127)
temp_data[1]=(255-temp_data[1]);
temp_data[0]=(255-temp_data[0]);
n=1;
}//负温度求补码
display[4]=temp_data[0]&
0x0f;
display[0]=ditab[display[4]];
display[4]=((temp_data[0]&
0xf0)>
>
4)|((temp_data[1]&
0x0f)<
<
4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!
display[3]){display[3]=0x0a;
display[2]){display[2]=0x0a;
}}//最高位为0时不显示
if(n){display[3]=0x0b;
}//负温度是最高为显示“-”
4.2.5显示扫描过程子程序
流程图如图4-6所示:
图4-6显示扫描过程子程序
显示扫描的C语言程序如下:
scan()
chark;
for(k=0;
k<
k++)//4位LED扫描控制
disdata=dis_7[display[k]];
if(k==1){DIN=0;
}//当K=1时,P0^7为低电平显示小数点
discan=scan_con[k];
//列扫描
delay(30);
discan=0xFF;
5.基于DS18B20的温度采集显示系统的调试
运行后,按下K1键,开始进入报警温度设置过程,按下K2则温度增加一度,按下K3则温度减少一度,刚开始调试时,由于接的LED报警灯是高电平点亮,程序一运行时,AT89C51给各个引脚都是高电平,所以LED灯一运行就会发光,违背了超过报警温度才发光的要求,所以在子程序中加上了一条开始时将LED所连引脚置0的程序。
之后运行过程中又发现按下报警温度的设置键K1,K2,K3都不是很灵敏,有时按下的时间太短甚至会没有反应,经过与小组成员讨论,发现是由于按键没有进行消抖,在显示扫描子程序中加入了延时函数进行按键的消抖,这一问题也得到了解决。
图5-1温度实时显示且未超过报警温度25摄氏度时LED没有发光报警
图5-2温度实时显示且超过实时报警温度25摄氏度LED发光报警
图5-3实时显示负温度
6.收获和体会
在这一次的课程设计过程,我收获了很多,无论是在理论知识方面,还是理论联系实际的操作方面。
因为已经一个学期没有学习单片机这门课程,很多知识不太清楚,加上以前的基础知识也不是很牢固,对于Proteus和Keil软件的使用也生
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于DS18B20的温度采集显示系统的设计 推荐 基于 DS18B20 温度 采集 显示 系统 设计