温度报警器.docx
《温度报警器.docx》由会员分享,可在线阅读,更多相关《温度报警器.docx(19页珍藏版)》请在冰豆网上搜索。
温度报警器
1、远程温度报警器的功能与任务
1、数字远程温度报警器的功能指标要求及任务
1、功能指标要求
1.项目名称
项目名称:
设计制作远程温度报警器
2.项目要求
1)用keilC51、Proteux、EAXY下载软件作开发工具;
2)用AT89C51单片机作控制,采用串行通信方式传送数据。
3)主机LED作显示,显示时间、报警温度值。
4)从机LED显示,具有测试温度,高于20oC,低于0oC自动报警和传送温度数据的功能
5)信号距离8~10m
6)发挥扩充功能,如温度巡查,记录及读出报警时间、报警温度、报警位置,
清除报警数据、声音报警等。
2、任务
1)拟定总体设计制作方案;
2)拟定硬件电路;
3)编制软件流程图及设计相应源程序;
4)仿真调试远程温度报警器;
5)安装元件,制作远程温度报警器,调试功能指标;
6)完成项目评估。
2、总体设计思路
实现思路与框图设计
基本功能部分的实现思路是:
用一个AT89C51单片机从机,控制温度,读出数据,判断温度是否进行本地报警,发送温度数据及本地地址。
用一个AT89C51单片机作主机,控制时钟电路,读出温度数据,并显示时间,接受从机报警信号。
报警采用输出脉冲控制发光二极管实现。
采用DX18B20为单总线器件,可用一个单片机控制多个DX48B20,设计时可以用点对点双机通信构成多点温度测试报警器。
为了通信的稳定和数据的识别,用简单的通信协议:
主机、从机工作在通信方式1,波特率为9600bpx。
当温度超出正常范围,从机发送主机的编号(如06)主机发送答应信号(如主机编号06)从机接到应答后发送数据长度3,接着发送2字节尾部数据和本机编号(01),主机接送完温度数据和本机编号(3字节数)据后发送接收成功信号(如0f)。
从机受到接受成功信号后停止发送数
液晶显示
AT89C51
主机
时钟电路
电源电路
键盘
复位电路
通信
DS1302
DS18B20
电源电路
复位电路
时钟电路
数码管显
通信
AT89C51
从机
2
远程器温度报警器程序设计
发送程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7;
#defineduanP0
#defineweiP2
ucharmu;
ucharcodeseg_w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodeseg_d[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
/***************延时毫秒子函数****************/
voiddelay(uintmun)
{uintx,y;
for(x=mun;x>0;x--)
for(y=10;y>0;y--);
}
/*************延时微秒函数**********************/
voiddelay_ms(uinti)
{
while(i--);
}
/************ds18b20复位信号*****************/
reset()
{
DQ=1;
delay_ms(4);
DQ=0;
delay_ms(100);
DQ=1;
delay_ms(40);
}
/***************写八位子函数************/
voidwrite_byte(ucharval)
{uchari;
for(i=8;i>0;i--)
{
DQ=0;
DQ=val&0x01;
delay_ms(10);
DQ=1;
val>>=1;
}
}
/***********读八位函数*************/
uintread_byte()
{uchari;
ucharval=0;
for(i=8;i>0;i--)
{
DQ=0;
val>>=1;
DQ=1;
if(DQ)
{
val|=0x80;
}
delay_ms(10);
}
return(val);
}
/*************读温度子函数******************/
uintread_temp()
{
uchara,b;
uinttemp,tt;
reset();
write_byte(0xcc);
write_byte(0x44);
reset();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
temp=b;
temp<<=8;
temp=temp|a;
if(temp<0x0fff)
mu=0;
else
{temp=~temp+1;
mu=1;
}tt=temp*(0.0625);
temp=tt*10+0.5;
return(temp);
}
/********初始化****************/
voidinit_ser()
{
TMOD=0X20;
TL1=0XFD;
TH1=0XFD;
TR1=1;
SCON=0X50;
PCON=0X00;
}
/********发送一个字符************/
voidsend(ucharzf)
{
SBUF=zf;
while(TI!
=1);
TI=0;
}
/*****************扫描**********************/
voiddisplay(ucharbai,ucharshi,ucharge,uchardian,ucharzong)
{
if(zong>999)//高位消隐
{
wei=0xff;
duan=seg_d[bai];
wei=seg_w[3];
delay(10);
}
wei=0xff;
duan=seg_d[shi];
wei=seg_w[2];
delay(10);
wei=0xff;
duan=seg_d[ge]+0x80;
wei=seg_w[1];
delay(10);
wei=0xff;
duan=seg_d[dian];
wei=seg_w[0];
delay(10);
/***********主函数*************/
main()
{uinttemp;
ucharbai,shi,ge,dian,zong;
while
(1)
{
init_ser();
temp=read_temp();//读取温度
send(temp/10);//发送温度
zong=temp;
bai=temp/1000;
shi=temp%1000/100;
ge=temp%100/10;
dian=temp%10;
display(bai,shi,ge,dian,zong);
}
}
接收程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharbuf[]={0};
sbitRS=P2^5;//1602的数据/指令选择控制线
sbitRW=P2^6;//1602的读写控制线
sbiten=P2^7;//1602的使能控制线
ucharcodetable[]="dz1002—NO.2";
ucharcodetable1[]="0123456789c.";
#definelcd1602P0
ucharg,s,b;
sbitfm=P2^0;
sbitled=P2^1;
/*********延时子函数**************/
voiddelay(uintmun)
{uinti,j;
for(i=0;ifor(j=0;j<110;j++);
}
/********初始化****************/
voidinit_ser()
{
TMOD=0X20;
TL1=0XFD;TH1=0XFD;TR1=1;SCON=0X50;PCON=0X00;
}
/********接收一个字符************/
voidjieshou()
{while(!
RI);
buf[0]=SBUF;RI=0;
b=buf[0]/100;
s=buf[0]%100/10;
g=buf[0]%10;}
/******************1602写命令函数*******************/
voidlcd_xm(ucharcom)
{
RS=0;//选择指令寄存器
RW=0;//选择写
lcd1602=com;
delay
(1);
EN=1;
EN=0;
}
/******************1602写数据函数********************/
voidlcd_xs(uchardat)
{
RS=1;//选择数据寄存器
RW=0;//选择写
lcd1602=dat;
delay
(1);
EN=1;
EN=0;
}
/******************1602初始化函数************************/
voidlcd_init()//1602初始化函数
{
lcd_xm(0x38);
lcd_xm(0x0c);
lcd_xm(0x06);
lcd_xm(0x01);
}
/*************二极管收到显示部分****************************/
voidLED_XS()
{
led=0;
delay(100);
led=1;
}
/***************蜂鸣器接收蜂鸣部份**************************/
voidfenming()
{
fm=0;
delay(10);
fm=1;
delay(10);
LED_XS();
fm=0;
delay(50);
fm=1;
delay(50);
LED_XS();
fm=0;
delay(100);
fm=1;
delay(100);
LED_XS();
fm=0;
delay(200);
fm=1;
delay(200);
LED_XS();
}
/*************主函数*****************/
voidmain()
{
ucharn,m=0;
lcd_init();//液晶初始化
init_ser();
while
(1)
{jieshou();
lcd_xm(0x80);
for(m=0;m<16;m++)
{lcd_xs(table[m]);}
lcd_xm(0x80+0x44);
lcd_xs(table1[s]);
lcd_xs(table1[g]);
lcd_xs(table1[10]);
lcd_xs(table1[12]);
lcd_xs(table1[b]);
lcd_xs(table1[11]);n=1;
if(g<=2)
{while(n--)fenming();
}
}
}
3、原理图设计
远程器温度报警器原理图设计
4、程序设计
远程器温度报警器程序设计
5、仿真
仿真模型与结果
发送仿真模型
接收仿真模型
6、元器件的安装
安装效果图
7、远程温度报警器调试
调试
指标
1.报警和温度显示
2.串口通信
调试方法步骤
步骤:
1.利用KeiluVixixon2的调试功能,根据错误提示,双击提示找到错误代码,排除各种语法错误。
2通过对端口、子函数入口参数赋值、变量赋值,对存储空间、端口数据、变量数据进行观察,以单步调试的方式调试子程序和主程序。
3.编译成.HEX文件。
4.用Proteux按原理图电路,放置元件电阻(res、pullup)、电容(cap)、晶振(cryxtal)、AT89C51、DS18B20、数码管、液晶(LM016L)、发光二极管(LED)、二极管(BAX16)、、按键(button)、电位器(PTO-HK)、电源、地等。
设计仿真模型图,设置好元件属性,以发光二极管指示开锁继电器状态进行仿真调试。
5.仿真调试成功后,按原理图把元件安装焊接在实验板上,下载程序,并进行静态和动态检测。
6.烧录,hex文件到AT89C51芯片,运行程序,如不能运行,先排除各种故障(供电、复位、时钟、内外存储空间选择、软硬件端口分配是否一致等)。
7.测试远程温度报警器功能、性能分析测试是否达到性能指标。
8.如没有达到性能指标,根据性能指标,调整电路或元件参数、优化程序,重新调试、编译、下载、运行程序、测试性能指标。
调试
数据
记录
主机温度显示:
14°c从机温度显示:
14°c
主机温度显示:
20°c从机温度显示:
20°c
主机温度显示:
45°c从机温度显示:
45°c
结果及分析
在本次的的制作远程温度报警器过程中,初步掌握了对串口通信的使用和DX18B20的使用,并对单片机的了解更加的多了。