基于51单片机的数字温度计设计说明文档格式.docx
《基于51单片机的数字温度计设计说明文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字温度计设计说明文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
在仿真软件中如下图所示:
DS18B20的测温原理图如下图所示:
在正常测温情况下,DS18B20的测温分辨力为0.5摄氏度,可采用下述方法获得高分辨率的温度测量结果。
:
首先用DS18B20提供的读暂存器指令(BEH)读出以0.5摄氏度为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再利用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。
考虑到DS18B20测量温度的整数部分以0.25、0.75摄氏度为进位界限的关系,实际温度Ts可以用下式计算:
Ts=(Tz-0.25)+(CD-Cs)/CD
六.系统整体硬件电路
根据设计要求与设计思路,硬件电路设计框图如下图所示,在仿真软件Proteus上完成,其中LED数码管以动态扫描法实现温度显示,由四个PNP型晶体管Q2,Q3,Q4,Q5和8个电阻组成。
基极与单片机的P1.0,P1.1,P1.2连接,DS18B20的数据I/O端与单片机P3.6引脚连接。
外部晶振为12MHZ。
七.系统程序设计
数字式温度计的应用程序主要包括主程序,温度检测程序,温度转换程序,LED显示程序等。
其思路如下图所示:
八.测量及其结果分析
1.Proteus仿真结果
软件方面,在Proteus编译下进行,源程序编译及仿真调试。
在软件中选定传感器后可对其进行环境温度设置,如下图,将环境温度设为34.9.
2.硬件测试结果
在硬件测试方面,检查电路板及焊接的质量情况,在焊接无误后通电检查LED显示器。
其中成品图如图所示:
通电后,室温下LED的示数如图所示
九.设计心得体会
本次实验对我们组来说是一次难得的经历,首先是第一次接触了仿真软件Proteus,在使用时经历了很多次失败,因为这款软件与以前使用过的软件有很大不同,使用时不停出错,接线时由于原件放置不合理而接的杂乱无章,输入源程序时还算顺利,显示结果比较满意。
其次是程序设计,我们在参考别人成功先例的基础上根据自己设计的需要进行编程,其中经历了不少曲折,最后我的收获是编程一定要细心,针对每一个细节,稍有疏忽程序就不能正常运行。
在这次的实践与学习中,尽管期间困难重重,但我们还是从中学习了不少新的知识和技能,也体会到了经历失败最终成功的喜悦。
总之,通过这次电工电子综合设计,我收获了很多,我希望自己在今后的各项研究工作中也坚持这种精神。
十.附录源程序
#include<
reg52.h>
#include<
intrins.h>
#define
uchar
unsigned
char
uint
int
sbit
DATA=P1^1;
//DS18B20接入口
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极字型码
inttemp;
//温度值
intss;
//中间的一个变量
intdd;
intj;
uchardatab;
//定时器中断次数
uchardatabuf[4];
//字型显示中间变量
intalarmH=320;
//默认报警值
intalarmL=100;
//定义开关的接入口
k1=P2^5;
//+
k2=P2^6;
//-
k3=P2^7;
//确认
k4=P2^4;
//切换
bell=P1^0;
//蜂鸣器
HLight=P1^2;
//正温指示灯
LLight=P1^3;
//负温度指示灯
warn=P1^4;
//报警指示灯
Red=P1^6;
//温度上限设置指示灯
Green=P1^7;
//温度下限设置指示灯
bitset=0;
//初始化
bitFlag=0;
//设置标志
intn;
//函数的声明区
voidkey_to1();
voidkey_to2();
voiddelay(uint);
voidkey();
voidShow();
//函数的定义区
/*延时子函数*/
voiddelay(uintnum)
{
while(num--);
}
//DS18b20温度传感器所需函数,分为初始化,读写字节,读取温度4个函数
Init_DS18B20(void)
//传感器初始化
ucharx=0;
DATA=1;
//DQ复位
delay(10);
//稍做延时
DATA=0;
//单片机将DQ拉低
delay(80);
//精确延时大于480us
//450
//拉高总线
delay(20);
x=DATA;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
ReadOneChar(void)
//读一个字节
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
{
//给脉冲信号
dat>
>
=1;
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
WriteOneChar(unsignedchardat)
//写一个字节
i>
i--)
DATA=dat&
0x01;
intReadTemperature(void)//读取温度
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//低位
b=ReadOneChar();
//高位
t=b;
t<
<
=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
void
display00()
//*********显示负值子函数
{
dd=-(temp-1);
buf[1]=dd/100;
buf[2]=dd/100;
buf[3]=dd%100/10;
buf[0]=dd%10;
//动态显示
for(j=0;
j<
5;
j++)
P2=0xff;
//初始灯为灭的
P0=0x00;
P2=0xfd;
//显示小数点
P0=0x80;
delay(100);
P2=0xf7;
//片选LCD1
P0=0x40;
P2=0xfb;
//片选LCD2
P0=table[buf[2]];
P2=0Xfd;
//片选LCD3
P0=table[buf[3]];
P2=0Xfe;
P0=table[buf[0]];
//片选LCD4
//显示正值子函数
display()
buf[1]=temp/1000;
//显示百位
buf[2]=temp/100%10;
//显示十位
buf[3]=temp%100/10;
//显示个位
buf[0]=temp%10;
//小数位
3;
j++)
delay(300);
//片选LCD1
P0=table[buf[1]];
voidkey()
//按键扫描子程序
if(k1!
=1)
if(k1!
while(k1!
{key_to1();
for(n=0;
n<
8;
n++)
Show();
if(k2!
while(k2!
{key_to2();
Show();
}
if(k3!
{
TR0=1;
//复位,开定时
temp=ReadTemperature();
if(k4!
delay(20);
while(k4!
=1);
set=!
set;
if(set==0)
{Red=0;
Green=1;
else{Green=0;
Red=1;
voidkey_to1()
TR0=0;
//关定时器
temp+=10;
if(temp>
=1100)
{temp=-550;
if(set==0)
{alarmH=temp;
else{alarmL=temp;
}
voidkey_to2()
//关定时器
temp-=10;
if(temp<
=-550)
{temp=1100;
{alarmH=temp;
else{alarmL=temp;
voidalarm(void)
alarmH||temp<
alarmL)
//bell=1;
//delay(50);
//bell=0;
Flag=1;
}else{Flag=0;
logo()//开机的Logo
P0=0x40;
delay(50);
P1=0xff;
//关闭显示
voidShow()
//显示函数,分别表示温度正负值
if(temp>
=0)
{HLight=1;
LLight=0;
display();
0)
{HLight=0;
LLight=1;
display00();
main()
TCON=0x01;
//定时器T0工作在01模式下
TMOD=0X01;
TH0=0XD8;
//装入初值
TL0=0XF0;
EA=1;
//开总中断
ET0=1;
//开T0中断
//T0开始运行计数
EX0=1;
//开外部中断0
for(n=0;
500;
n++)//显示启动LOGo"
----"
{bell=1;
warn=1;
logo();
Red=0;
while
(1)
key();
ss=ReadTemperature();
alarm();
//报警函数
if(Flag==1)
{bell=!
bell;
warn=!
warn;
//蜂鸣器滴滴响
else{bell=1;
warn=1;
voidtime0(void)interrupt1using1
//每隔10ms执行一次此子程序
TH0=0X56;
TL0=0XDC;
temp=ss;