单片机报告温度采集.docx
《单片机报告温度采集.docx》由会员分享,可在线阅读,更多相关《单片机报告温度采集.docx(14页珍藏版)》请在冰豆网上搜索。
单片机报告温度采集
数字化产品设计报告
专业:
嵌入式系统
班级:
姓名:
指导教师:
哈尔滨工业大学华德应用技术学院
2010年12月9日
姓名:
周铁
班级:
0891141
学号:
14
课题编号:
02
课题名称:
基于DS18B20的温度采集系统
基本功能:
设计实现基于DS18B20的温度采集系统,并要求实现使用LCD1602显示采集到的温度。
扩展功能:
实现多路温度采集及显示。
成绩:
评审老师:
一、需求分析:
1.应用场合
该设计可应用于各种地点的温度测量,测量温度在-55~125度之间,可以实现多点测试。
2.设计目的
1)掌握DS18B20数字温度传感器的工作原理和使用方法;
2)掌握对18B20转换数据进行处理的方法;
3)熟练单片机在实际中的基本应用方法;
4)提高自身的动手能力。
3.立题意义
通过这个实验,希望能够对动手能力有所帮助,能够在实际中做到对单片机的基础应用,将课程所学初步应用到实际中,自己动手设计一个属于自己的开发板。
二、硬件设计方案
用AT89S52控制DS18B20,读取数据,并对DS18B20转换后的数据进行处理,最后在数码管上显示DS18B20的温度。
在设计中用到单片机最小系统:
复位电路以及时钟(晶振)电路、DS18B20温度传感器、共阴极7段数码管显示系统。
复位电路:
复位是单片机的初始化操作,目的是使CPU以及各个寄存器处于一个确定的初始状态。
分为手动复位方式和上电自动方式。
时钟电路:
51单片机的时钟信号可由芯片内部的震荡电路产生,也可以由外部产生。
DS18B20:
DS18B20数字温度传感器是达拉斯半导体公司生产的1——Wire器件,即单总线器件,它与传统的热敏电阻不同的是,它可以直接将被测温度转换成串行数字信号供主机处理,并且根据具体要求,通关简单的编程实现9位温度度数。
具有线路简单,体积小的特点。
它有三个引脚(如图1.1):
GND脚:
接地;
DQ脚:
数据输入输出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,也可以向器件提供电源(注:
需要在该引脚出加一个上拉电阻)
VDD:
可选的VDD引脚,接电源。
在工作于寄生电源时,必须接地。
图1.1温度传感器仿真图
7段共阴极数码管:
用于显示采集到的温度数据给用户。
七段数码管有四个片选信号点,分别控制四个7段数码管显示(如图1.2),另外八个引脚接受数据显示段码。
由此实现数码管的显示。
图1.27段共阴极数码管仿真图
三、软件设计方案(*画流程图、写出算法分析)
首先初始化设置,设置常量,再进行对DS18B20进行初始化,之后进行温度采集,给DS18B20一个温度转换命令实现温度转换,读取转换的温度值,通过数据处理,将处理后的数据传送到数码管中显示出来,实现温度的采集与显示。
流程图:
1)主程序流程图(如图1.3)
2)DS18B20复位子程序流程图(如图1.4)
3)读温度值子程序(如图1.5)
4)写DS18B20命令子程序(如图1.6)
5)读温度子程序流程图(如图1.7)
N
Y
图1.3主程序流程图图1.4DS18B20复位子程序流程图
图1.5读温度值子程序流程图1.6写命令子程序流程图
N
Y
图1.7读温度子程序流程图
四、系统调试
在设计中,用到了ProteusISIS与Keil软件联合仿真系统,在手动焊接电路后用到了捎写电路以及捎写程序软件。
在课堂上所学的仿真器材在本课程设计中得到了正确的应用。
五、总结
问题1:
在程序中DS18B20的初始化总是不成功。
解决办法:
由于DS18B20对程序的时序要求严格,在延时程序中没有注意到这一点导致出错,经过老师指点,顺利解决问题。
问题2:
无法读取DS18B20中的数据。
解决办法:
由于在电路中没有在DS18B20的DQ引脚加上上拉电阻,在上拉电阻加上后完成数据采集。
问题3:
数码管显示不正常。
解决办法:
由于对真实的数码管了解不够,不知道哪个引脚是干什么的,经过老师指点以及查找资料找到了测试引脚的方法,最后自己用万用表测出各个引脚的作用。
总结:
通过本次课程设计,加强了我的动手操作能力,将课堂上所学的知识应用到实践中来,并且了解了DS18B20数字温度传感器的工作原理和使用方法,掌握了对DS18B20转换数据进行处理的方法,在实践过程中也练习了IO口的输入输出方式,熟练的掌握了数码管显示数据的方法,在两周的学习中,让我学到了在课堂上没有学到的东西,学会的自我学习的方法,在查找资料自我分析以及跟同学的讨论,加上老师的悉心教导,使我顺利的完成的本次课程设计,感觉受益匪浅。
在以后的学习生活中,我希望能够多几次这样的实训,这样能够增强我的动手能力,而且使我对动手实践产生了浓厚的兴趣。
附录1:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^4;
unsignedcharflag,presence;//负数标志
ucharcodescan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodetable[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40,0x39,0x00};
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,
0x07,0x08,0x08,0x09,0x09};
uchardispbuf[8];
uchartemper[2];
ucharx=1;
//ucharx=0;
voiddelay(unsignedintus)reentrant
{
while(us--);
}
//延时函数
voidreset(void)
{
DQ=1;
//delay(8);
DQ=0;
delay(90);
DQ=1;
delay(14);
x=DQ;
delay(20);
DQ=1;
}
//复位函数
ucharreadbyte(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//从1820中读一个字节
voidwritebyte(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//向1820中写入一个字节
voidreadtemp(void)
{
uchara=0,b=0;
reset();
while(x==0)
{
if(x==0)
reset();
elsebreak;
}
writebyte(0xcc);
writebyte(0x44);
reset();
writebyte(0xcc);
writebyte(0xbe);
a=readbyte();
b=readbyte();
if(b>0x0f)
{
a=~a+1;
if(a==0)
b=~b+1;
elseb=~b;
flag=10;
}
elseflag=12;
temper[0]=a&0x0f;
a=a>>4;
temper[1]=b<<4;
temper[1]=temper[1]|a;
}
//读取实时温度
voidscandisp()
{
unsignedchari,value;
for(i=0;i<6;i++)
{
P3=0xff;
value=table[dispbuf[i]];
if(i==3)
value|=0x80;
P0=value;
P3=scan[i];
delay(50);
}
}
//动态扫描显示函数
voidmain()
{
uchartemp=10,temp1;
while
(1)
{
readtemp();
temp1=temper[0];
temp=temper[1];
if(flag==10)
dispbuf[0]=flag;
else
dispbuf[0]=temp/100;
dispbuf[3]=ditab[temp1];
dispbuf[2]=temp%10;
temp=temp/10;
dispbuf[1]=temp%10;
scandisp();
}
}
附录2: