温度采集报警系统的设计.docx
- 文档编号:5165037
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:155.55KB
温度采集报警系统的设计.docx
《温度采集报警系统的设计.docx》由会员分享,可在线阅读,更多相关《温度采集报警系统的设计.docx(23页珍藏版)》请在冰豆网上搜索。
温度采集报警系统的设计
课程设计
课程名称单片机课程设计
题目名称温度采集报警系统的设计
学生学院物理科学与工程技术学院
专业班级xx
学号1034301114
学生姓名xx
2013年11月12日
目录
一、设计任务与要求2
二、方案设计与论证2
1、单片机的选取2
2、温度传感器的选取2
3、显示器的选取2
4、温度采集显示系统电路的总体设计框图3
三、电路基本原理及单元电路设计3
四、调试和仿真:
7
六、总结9
七、附录10
温度采集报警系统的设计
一、设计任务与要求
1、可以显示被测的温度并存储
2、可以设置报警温度
3、到达报警温度时声光报警
二、方案设计与论证
1、单片机的选取
本系统采用简答的51单片机为控制核心优点突出,,它能够运行各种程序,综合考虑单片机的各部分资源,,且因为我们学习的是51单片机,因此此次设计选用AT89C51单片机作为核心处理器。
2、温度传感器的选取
方案一:
采用温度传感器AD590K。
AD590K具有较高精度和重复性,良好的非线性保证±0.1℃的测量精度。
加上软件非线性补偿可以实现高精度测量。
AD590将温度转化为电流信号,因此要加相应的调理电路,将电流信号转化为电压信号。
送入8位A/D转换器,可以获得255级的精度,基本满足题目要求。
方案二:
采用数字温度传感器DS18B20。
DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。
可直接与单片机通信,读取测温数据,电路简单。
基于以上分析和现有器件所限,温度采集模块选用方案二。
DS18B20能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果
3、显示器的选取
显示系统是单片机控制系统的重要组成部分,主要用于显示各种参数的值,常用的显示器有CRT、LED、LCD等。
方案一:
采用LED数码管显示。
颜色鲜艳,经济实惠,由于本设计显示的内容较多,过多地增加数码管显然不行,进行轮流显示则控制复杂,占用较多的I/O资源,加上数码管需要较多连线,使得电路复杂,功耗较大。
若采用Max7219驱动,可以减少占用的接口数目,但是数码管只能显示有限的数字和符号,不能直观地显示出本设计的内容。
方案二:
采用1604液晶显示。
其内置128个5*7点ASCII字符集,可以直观地显示出较多内容,利用该模块灵活的接口方式和简单、方便的操作指令,可构成较好人机交互图形界面,使得显示内容丰富,易于人机交流,并且节约了I/O口资源。
由于本设计要求用1604显示,在本设计中采用1604作为显示模块,不仅可以显示温度值,而且可以显示英文字符,比数码管具有明显的优越性,所以本系统采用方案二
4、温度采集显示系统电路的总体设计框图
如图1:
三、电路基本原理及单元电路设计
本设计使系统可以检测0~99℃范围内的温度,考虑到测温精度,设置显示数值精确到1℃,并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。
根据AT89C51的引脚特性,本设计中采用P2.0~P2.2和P0口作为1604的驱动引脚,P1.0~P1.3作为按键的输入,P1.4,P1.5分别作声光报警输出。
P1.7负责与DS18B20的IO连接。
RST作为复位输入,当振荡器工作时,RST引脚出现2个机器周期以上高电平使单片机复位。
XTAL1振荡器反相放大器及内部时钟发生器的输入端。
XTAL2振荡器反相放大器的输出端。
1、总电路图
如下图2示:
图2:
电路总图
2、晶振电路
瓷片电容C1、C2是用来驱动晶振Y1的,因为晶振的大小是16M,所以选用20P的电容,如下图3示。
图3:
晶振电路
3、复位电路
复位电路选用了1uF的电解电容和10K的电阻,如下图4示。
图4:
复位电路
4、按键电路电路
如下图5示:
图5:
按键电路
按键SET用来设置,BACK键用于返回,INC键用于调整,每按一次加一,MOVE键用于移动。
5、显示电路
显示采用16*4字符LCD,如下图6示
图6:
显示电路
5、蜂鸣器和发光二极管
如图7:
图7:
声光报警电路
三极管NPN采用9013是作为蜂鸣器的驱动的作用的,R6、R4作为限流电阻使用。
6、实现上述任务的控制器整体流程图
如图8所示:
图8:
整体流程图
四、调试和仿真:
1、调试
选划分系统的功能,按单元一个一个调试正确后,组成整个电路。
2、仿真
部分仿真图如下:
图10,主界面未报警
图11,主界面已报警
图12,设置界面
图13,设置成功界面
图14,设置不成功界面
六、总结
这次课程设计是自己第一次设计一个系统,包括前期的方案选取,原理图的绘制,程序的编写和PROTUES仿真等等,使我对之前的理论知识有了较好的巩固,同时也提高了自己的动手能力,然而也发现自己在理论知识方面存在很多不足,比如说,对单片机的中断控制系统的掌握还不够,和对LCD的菜单界面编程能力不足。
今后,我将更加努力地学习,提高自己的专业水平。
七、附录
1.1602接口程序
/****************************************
**filename:
1602.h
****************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineIOP0
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
voidcheck_busy(void);
voidwrite_cmd(ucharcom);
voidwrite_data(uchardat);
voidLCD_init(void);
voidwrite_str(ucharx,uchary,uchar*s);
voidlcd_test(void);
voiddelay(uint);
//1ms延时程序
voiddelay(uintj)
{
uchari;
for(;j>0;j--)
for(i=0;i<100;i++);
}
//查忙程序
voidcheck_busy(void)
{
uchardt;
do
{
dt=0xff;E=0;RS=0;
RW=1;E=1;dt=IO;
}while(dt&0x80);
E=0;
}
//写控制指令
voidwrite_cmd(ucharcom)
{
check_busy();
E=0;RS=0;RW=0;IO=com;
E=1;_nop_();E=0;
delay
(1);
}
//写数据指令
voidwrite_data(uchardat)
{
check_busy();
E=0;RS=1;RW=0;
IO=dat;E=1;_nop_();
E=0;delay
(1);
}
//数据指令
/*
ucharread_data(ucharaddress)
{
uchardat;
write_cmd(address);
check_busy();
//IO=0xff;
E=0;
delay(20);
RS=1;
RW=1;
delay
(1);E=1;dat=IO;delay(5);
_nop_();E=0;delay
(2);
returndat;
}
*/
//液晶屏初始化
voidLCD_init(void)
{
write_cmd(0x38);//8位总线,双行显示,5X7的点阵字符
write_cmd(0x0C);//开整体显示,光标关,无黑块
write_cmd(0x06);//光标右移
write_cmd(0x01);//清屏
delay
(1);
}
voidset_xy(ucharx,uchary)
{
if(x==0)x=0x80+y;
if(x==1)x=0xc0+y;
if(x==2)x=0x94+y;
if(x==3)x=0xd4+y;
write_cmd(x);
}
voidwrite_str(ucharx,uchary,uchar*s)
{
set_xy(x,y);
while(*s)
{
write_data(*s);
s++;
}
}
2.DS18B20接口程序
/****************************************
*文件名:
温度采集DS18B20.h
*描述:
该文件定义温度传感器件DS18B20相关函数。
************************************/
unsignedcharReadOneChar(void);
voidWriteOneChar(uchardat);
voidReadTemp(void);还回Temp[5]
#ifndefDS18B20_H
#defineDS18B20_H
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P1^7;//温度传送数据IO口
inttemp_value;//温度值
unsignedcharTemp[6];//存放温度的各个位的值
inttemp_dot;//温度小数部分
/*******ds18b20延时子函数(晶振12MHz***/
voiddelay_18B20(unsignedinti)
{
while(i--);
}
/**********ds18b20初始化函数************/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**********/
unsignedcharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节********/
voidWriteOneChar(uchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************读取ds18b20当前温度******/
voidReadTemp(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18B20(100);//thismessageisweryimportant
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
delay_18B20(100);
a=ReadOneChar();//读取温度值低位
b=ReadOneChar();//读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;//温度整数部分
temp_dot=a&0x0f;//温度小数部分
}
voidtemp_to_1602()//温度数据转换成液晶字符显示
{
ReadTemp();
Temp[0]=temp_value/10+'0';//十位
Temp[1]=temp_value%10+'0';//个位
Temp[2]='.';
Temp[3]=temp_dot*0.625+'0';
Temp[4]=0xdf;
Temp[5]='\0';
}
#endif
3.主程序
/***************************************
**filename:
BJQ.C
****************************************/
#include
#include"1602.h"
#include sbitKEY_SET=P1^0; sbitKEY_BACK=P1^1; sbitKEY_INC=P1^2; sbitKEY_MOVE=P1^3; sbitALART=P1^4; sbitSHK=P1^5; bitSET_FLAG=0;//SETflag,whenflag1isonSETmode bitOVER_FLAG=0; ucharCURRENT_MENU=0; ucharcodeMESSAGE[2][4]={"NO","YES"}; ucharcodeMENU1[]="*****Welcome******"; ucharcodeMENU2[]="****SETMODER****"; ucharcodeMENU3[2][20]={"**Setsucess! **","Yousetisilleage"}; ucharcodeWARING[]="WARING: "; ucharcodeTEM[]="TEMP: "; ucharcodeSET[]="->SET"; ucharcodeBACK[]="->BACK"; ucharcodeHIGHS[]="HIGHT: "; ucharcodeLOWS[]="LOW: "; ucharHIGHT=40,LOW=10; ucharmove,base; uchardis_temp[6]; bitMENU_FLAG3; voiddelay_100us(ucharx) { uchary; while(x--)for(y=0;y<100;y++); } voidbuzzer() { ALART=0; delay_100us(4); ALART=1; delay_100us(4); } voidlight() { uchari; for(i=0;i<20;i++) { buzzer(); SHK=0; } for(i=0;i<20;i++) { buzzer(); SHK=1; } } voiddisslove() { dis_temp[0]=HIGHT/100; dis_temp[1]=HIGHT/10%10; dis_temp[2]=HIGHT%10; dis_temp[3]=LOW/100; dis_temp[4]=LOW/10%10; dis_temp[5]=LOW%10; } voidassemble() { HIGHT=dis_temp[0]*100+dis_temp[1]*10+dis_temp[2]; LOW=dis_temp[3]*100+dis_temp[4]*10+dis_temp[5]; } voidkey_scan() { uchartem,adjust; if(KEY_BACK==0) { delay_100us(140); if(KEY_BACK==0) { LCD_init(); move=0; if(CURRENT_MENU! =0)CURRENT_MENU-=1; if(CURRENT_MENU==2)SET_FLAG=1; elseSET_FLAG=0; } while(! KEY_BACK); } if(KEY_SET==0) { delay_100us(140); if(KEY_SET==0) { LCD_init(); SET_FLAG=0; move=0; if(CURRENT_MENU==1) { assemble();//合成 if(HIGHT elseMENU_FLAG3=0; } if(CURRENT_MENU==0)disslove();//分解 if(CURRENT_MENU! =2)CURRENT_MENU+=1; elseCURRENT_MENU=0; } while(! KEY_SET); } if(KEY_INC==0) { delay_100us(140); if(KEY_INC==0&&SET_FLAG==1) { if(move==0)adjust=5; elseadjust=move-1; tem=dis_temp[adjust]; tem++; if(tem>9)tem=0; dis_temp[adjust]=tem; if(adjust<3)base=0xc7; elsebase=0x98; write_cmd(base+adjust); write_data(tem+'0'); write_cmd(base+adjust); } while(! KEY_INC); } if(KEY_MOVE==0) { delay_100us(140); if(KEY_MOVE==0) { if(CURRENT_MENU==1) { SET_FLAG=1; } if(SET_FLAG==1) { move++; if(move<4)base=0xc6; elsebase=0x97; write_cmd(base+move); if(move==6)move=0; } } while(! KEY_MOVE); } } voiddisplay() { if(CURRENT_MENU==0) { //LCD_init(); write_str(0,0,MENU1); write_str(1,0,TEM); write_str(1,8,Temp); write_str(2,0,WARING); write_str(2,8,MESSAGE[OVER_FLAG]); write_str(3,0,SET); } elseif(CURRENT_MENU==1) { if(! SET_FLAG) { write_str(0,0,MENU2); write_str(1,0,HIGHS); write_str(2,0,LOWS); write_str(3,0,SET); write_str(3,6,"->MOVE"); write_str(3,14,BACK); write_str(2,14,"+: INC"); set_xy(1,7); write_data(HIGHT/100+'0'); write_data(HIGHT/10%10+'0'); write_data(HIGHT%10+'0'); write_data(0xdf); write_data('C'); set_xy(2,7); write_data(LOW/100+'0'); write_data(LOW/10%10+'0'); write_data(LOW%10+'0'); write_data(0xdf); write_data('C'); write_cmd(0xc6); //write_cmd(0x0f); } else { write_cmd(0x0f); } } else { write_str(0,0,MENU3[MENU_FLAG3]); write_str(3,0,"->OK"); write_str(3,12,BACK); } } voidmain() { LCD_init(); while (1) { key_scan(); display(); temp_to_1602(); if(temp_value>HIGHT||temp_value { light(); OVER_FLAG=1; } elseOVER_FLAG=0; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 报警 系统 设计