多点温度监测系统.docx
《多点温度监测系统.docx》由会员分享,可在线阅读,更多相关《多点温度监测系统.docx(23页珍藏版)》请在冰豆网上搜索。
.
.
...
电子设计自动化
实 训 报 告
题
目:
多点温度监测系统
学生姓名:
宋安邦
学生学号:
2104020685
学
院:
工学院
专
业:
电子信息工程
班
级:
2011级
指导教师:
林君 副教授
.
.
优质资料.
.
一、实训目的和意义
通过对多点温度检测系统的设计,可以更深入的了解MC5.2单片机的特点以及应用技巧,对单片机的应用可以温习其中的结构以及原理。
而且proteus的强大功能也能通过此次试验反应出来,熟悉其界面的风格以及各种应用,又重新的认识了proteus在单片机方面的强大功能。
二、实训设计容要求
1.实现4点温度实时采集,温度传感器采用DS18B20
2.采用LCD1602显示4个采集点温度
3.具有温度上下限报警功能:
上限90°C,下限20°C
4.声音和光报警2种模式:
光报警采用4只发光LED;
声音报警采用扬声器,报警音调采用2KHz方波。
三、系统设计1.方案设计
8052
采集温度 显示温度
系统处理
2.硬件电路设计
是否高于90C°
是 或低于20C°
相应的报警(灯光或蜂鸣器)
(1)工作原理:
(a)通过四个温度采集器采集数字温度输入到单片机的p2.0~p2.3口。
(b)初始化LCD1602使1602能够接受数据,并分配其显示位置,此处采用两行两列式显示。
(c)单片机读取信号。
(d)单片机向LCD1602写信号,并延时。
(e)判断是否有数据高于90度或低于20度,如果有点亮相应的led,并启动蜂鸣器。
(2)硬件系统组成
(a)0C52
(b)晶振电路
(c)复位电路
(d)LED灯电路
(e)LCD1602
(f)温度检测ds18b20
3.软件设计
(1)时间的设定:
从此采用中断T0方式延时,而且是基本单位,无论蜂鸣器还是led,或是显示温度都用到此延时程序。
延时程序如下:
voidtmpDelay(intnum)
{
while(num--);
}
voidTime0(void)interrupt1using0
{
sound=~sound;TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
}
(2)信号的读入与写出:
读字节程序如下unsignedcharReadOneChar1()//
{
unsignedchari=0;unsignedchardat1=0;
for(i=8;i>0;i--)
{
DQ1=0;//给脉冲信号dat1>>=1;
DQ1=1;//给脉冲信号if(DQ1)
dat1|=0x80;tmpDelay(4);
}
return(dat1);
一共读四个字节,接下来是写字节程序如下voidWriteOneChar1(unsignedchardat1)//
{
unsignedchari=0;for(i=8;i>0;i--)
{
DQ1=0;
DQ1=dat1&0x01;tmpDelay(5);
DQ1=1;
dat1>>=1;
}
注意度字节的返回值。
读取温度
unsignedintReadtemp1()//
{
unsignedchara=0;unsignedcharb=0;unsignedintt=0;floattt=0;Init_DS18B201();
WriteOneChar1(0xCC);WriteOneChar1(0x44);Init_DS18B201();
WriteOneChar1(0xCC);WriteOneChar1(0xBE);a=ReadOneChar1();
b=ReadOneChar1(); //
t=b;t<<=8;
t=t|a;tt=t*0.0625;t=tt*10;
if((t>900)|(t<200))
{
LED1=0;
EA=1;
TR0=1;
}
else
{
LED1=1;
EA=0;
TR0=0;
}
return(t); }
(3)蜂鸣器以及led的显示程序如下
voiddelay(ucharz)
{ ucharx,y;for(x=1000;x>1;x--)
for(y=z;y>1;y--);
}
voidwrite_(uchar) //写命令函数
{ lcdrs=0;
P0=;
delay(5);lcden=1;delay(5);lcden=0; }
voidwrite_date(uchardate) //写数据函数
{ lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0; }
voidinit_lcd() //初始化函数
{ lcden=0; //默认开始状态为关使能端,见时序图lcdrw=0; //选择状态为写
write_(0x0f);
write_(0x38); //显示模式设置,默认为0x38,不用变。
write_(0x01); //显示清屏,将上次的容清除
write_(0x0c); //显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪
write_(0x06); //设置光标状态默认0x06,为读一个字符光标加1.write_(0x80); //设置初始化数据指针
for(i=0;i<16;i++)
.
.
...
{ //显示Thetemperaturewrite_date(t0[i]);delay(0);
}
write_(0x80+0x40);for(i=0;i<16;i++)
{ //显示is Cwrite_date(t1[i]);delay(0);
}
}
(4)程序流程图如下图所示:
开始
初始化
读取温度
是否大于90度
点亮相应
的led,启动蜂鸣器
否
是否小于20度
. 优质资料.
点亮相应
的led,启动蜂鸣器.
.
.
.
...
否
显示温度
结束
四、调试方法及步骤
1.用软件调试工具先调试设计好的程序,方法是打开调试工具后新建
项目,设计开发环境,选择单片机种类,建立 .c,然后加载到环境中,编写程序,生成 HEX,把他放虚拟单片机中,调试。
2出现错误,就要修改错误,编译全部通过后再接外围硬件电路,接上仿真头,硬件电路供电后再开启仿真头,然后正确设置好仿真器,最后全速运行,查看硬件电路显示结果是否与原设计思想一致。
3.显示结果正确后结束仿真,先停止运行程序,再关掉仿真头开关,最后断电,撬开仿真器。
五、结果与讨论.
查看结果是否与自己想的一样,如果不一样,可以向同学和老师讨教,如果一样就记录下。
六、实训心得
通过本次试验学会了如何使用虚拟工具来进行单片机的编辑,通过写c语言又温习了以前的所学,回味看单片机和c语言的魅力。
通过调试程序锻炼了个人的耐心恒,恒心,毅力,和理论联系实际的能力通过学习使得懂得了开发工具的使用,多了一门吃饭的的本领,多了一门学
.
.
优质资料.
.
习其他学科的实践基础。
经过这次实训课程设计,我学到了很多书本上没有的,比较实际、实用的东西,学会了怎样将理论知识运用到实际设计当中,对实验设备和设计软件的使用和分析问题解决问题的能力也有了很大的提高。
同时也明白了电路焊接和作品调试时,需要更多的耐心。
通过这次实训课程设计,不仅可以在专业上可以学到更多的知识,同时也对平时的学习和工作中产生了影响,那就是认认真真的去完成每一件事。
附录(程序清单)
#include // 包含52单片机寄存器定义的头文件
/**************************************************程序功能:
LCD1602显示温度
***************************************************/#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P2^6; //数据命令选择控制sbitlcdrw=P2^5; //读/写选择控制
sbitlcden=P2^7; //使能信号sbitLED1=P1^0;
sbitLED2=P1^1;sbitLED3=P1^2;sbitLED4=P1^3;sbitsound=P1^4;
ucharcodet0[]="T1:
T2:
";
ucharcodet1[]="T3:
T4:
";ucharcodedigital[]="0123456789";
sbitDQ1=P2^0; //定义温度DS18B20接口,详情见原理图sbitDQ2=P2^1; //定义温度DS18B20接口,详情见原理图sbitDQ3=P2^2; //定义温度DS18B20接口,详情见原理图sbitDQ4=P2^3; //定义温度DS18B20接口,详情见原理图uchari;
/*****************************************函数功能:
DS18B20相关函数
*****************************************/voidtmpDelay(intnum)//延时函数
{
while(num--);
}
voidTime0(void)interrupt1using0
{
sound=~sound;
TH0=(65536-5000)/256;//定时器T0的高8位重新赋初值TL0=(65536-5000)%256;//定时器T0的高8位重新赋初值
}
voidInit_DS18B201()//初始化ds1820
{
unsignedcharx=0;
DQ1=1; //DS复位tmpDelay(8);//稍做延时
DQ1=0; //单片机将DS拉低tmpDelay(80);//精确延时大于480usDQ1=1; //拉高总线tmpDelay(14);
x=DQ1; //稍做延时后如果x=0则初始化成功x=1则初始化失败tmpDelay(20);
}
voidInit_DS18B202()//初始化ds1820