温度检测显示报警报告.docx
《温度检测显示报警报告.docx》由会员分享,可在线阅读,更多相关《温度检测显示报警报告.docx(15页珍藏版)》请在冰点文库上搜索。
温度检测显示报警报告
五邑大学
单片机课程设计报告
题目:
温度检测显示报警
院系
专业
学号
学生姓名
指导教师
一、设计任务与要求
(1)设计任务
基于AT89C51单片机设计温度检测报警,可以实时采集周围的温度信息进行显示,并且可以根据应用环境不同设定不同的报警上下限。
(2)设计要求
1.实时温度检测并显示其对应的值。
2.具有温度报警功能。
3.可以设报警置温度上下限。
(3)实用价值与理论意义
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度。
在控制领域中,对温度的控制有着举足轻重的作用。
例如陶瓷的烧烤,只有控制住温度的适度,才能制作出一件完美的艺术品,否则只是一件废品;还有如酿酒的过程,也需要对温度进行控制。
可见,在生活的许多方方面面都有着对温度进行感知和控制的需要。
而本次设计的温度检测报警系统是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。
该系统实现了对温度的自动监测,为设备的正常运行提供了条件,在工业中具有一定的实用价值和广泛的应用前景。
系统硬件设计
二、系统电路图设计
(1)系统电路设计框图
AT89C51
单
片
机
3、设计方案原理
通过温度传感器对空气进行温度采集,将采集到的温度信号传输给单片机,再由单片机控制数码管显示,并比较采集温度大于设定的报警温度,若大于设定的的报警温度单片机就会驱动报警电路进行报警。
温度报警装置主要单片机,时序电路,温度采样电路,报警电路,温度显示电路,电源输入电路,驱动电路等组成。
DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
报警原理
报警控制电路由IO口控制PNP三级管驱动蜂鸣器发出声响,当温度大于20度是IO口将对PNP的基极产生一个低电平,此时PNP起开关作用闭合蜂鸣器发出声响。
4、元器件清单
AT89c511个
排阻R=10K1个
四段八位数码管1个共阴极
温度传感器DS18B201个
电阻R1=10K1个
R2=1K1个
R3=2K1个
R4=2001个
三极管PNP1个
蜂鸣器1个
晶体振荡器1个11.0592MHZ
电容C1=33up
C2=33up
C3=10up
开关1个
五、系统模块图(硬件设计)
(1)AT89C52模块图
(2)温度传感器模块图
(3)蜂鸣器模块图
(4)共阴数码管模块图
(5)单片机晶振模块图(6)复位模块图
六、温度报警器PCB图
七、程序设计
见附录
八、设计总结
一开始按照电路图用面包板来连接电路的时候都连了三次才成功,第一次在三极管那里分不清楚基级,集电极和发射极而弄错;第二次是没有注意电容的正负极;直到第三次连接才真正的把电路图连接好。
然后焊接完所有元器件,做成电路板后,烧写程序进去了,只能显示,却不能正常报警,一开始我检查原件器,发现蜂鸣器模块上的PNP用错了,换回正确的来,还是不行,于是就检查程序,改了好几个地方,最后才发现是我自己的蜂鸣器坏了,换一个新的上去。
最后再次检查元器件有没有问题,还有元器件有没有接错,最后成功了。
做成功一个作品需要不断努力,不断尝试。
多听取别人的意见和坚持,你就离成功不远了。
九、参考文献
孙涵芳《单片机原理及应用》【M】科学出版社,修订版;李朝青《单片机原理及接口技术》第三版,北京航空航天大学出版社
附录:
程序如下
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P3^4;//defineinterface
sbitfm=P1^0;
uinttemp;//variableoftemperature
ucharflag1;//signoftheresultpositiveornegative
unsignedcharcodetable[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,///////////////////////////////////////////////////////////////////////
0x45,0xdf,0xc7};
unsignedcharcodetable1[]={0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,////////////////////////////////////////////////////////////////////////////
0x65,0xff,0xe7};
voiddelay(uintcount)//delay
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:
串口初始化,波特率9600,方式1///////
voidInit_Com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
voiddsreset(void)//sendresetandinitializationcommand
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//readabit
{
uinti;
bitdat;
DS=0;i++;//i++fordelay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//readabytedate
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtmpwritebyte(uchardat)//writeabytetods18b20
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//write0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//DS18B20beginchange
{
dsreset();
delay
(1);
tmpwritebyte(0xcc);//addressalldriversonbus
tmpwritebyte(0x44);//initiatesasingletemperatureconversion
}
uinttmp()//getthetemperature
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;//twobytecomposeaintvariable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
returntemp;
}
voidreadrom()//readtheserial
{
ucharsn1,sn2;
dsreset();
delay
(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
voiddelay10ms()//delay
{
uchara,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
voiddisplay(uinttemp)//显示程序
{
ucharA1,A2,A2t,A3,ser;
//ser=temp/10;
//SBUF=ser;
if(temp>250||temp<150)fm=0;//温度判断
elsefm=1;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
P0=table[A1];//显示百位
P2=0xdf;
delay
(1);
P0=table1[A2];//显示十位
P2=0xbf;
delay
(1);
P0=table[A3];//显示个位
P2=0x7f;
delay
(1);
}
voidmain()
{
uchara;
Init_Com();
do
{
tmpchange();
//delay(200);
for(a=10;a>0;a--)
{display(tmp());
}
}while
(1);
}