温度采集报警系统的设计Word文档格式.docx
- 文档编号:18135902
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:155.55KB
温度采集报警系统的设计Word文档格式.docx
《温度采集报警系统的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《温度采集报警系统的设计Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
颜色鲜艳,经济实惠,由于本设计显示的内容较多,过多地增加数码管显然不行,进行轮流显示则控制复杂,占用较多的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<
intrins.h>
#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);
//写控制指令
voidwrite_cmd(ucharcom)
check_busy();
RW=0;
IO=com;
_nop_();
delay
(1);
//写数据指令
voidwrite_data(uchardat)
RS=1;
IO=dat;
//数据指令
/*
ucharread_data(ucharaddress)
{
uchardat;
write_cmd(address);
//IO=0xff;
delay(20);
dat=IO;
delay(5);
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
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
//拉高总线
delay_18B20(14);
x=DQ;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
/***********ds18b20读一个字节**********/
unsignedcharReadOneChar(void)
uchari=0;
uchardat=0;
for(i=8;
i>
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>
i--)
{
DQ=dat&
0x01;
delay_18B20(5);
DQ=1;
/**************读取ds18b20当前温度******/
voidReadTemp(void)
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
delay_18B20(100);
//thismessageisweryimportant
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//读取温度值低位
b=ReadOneChar();
//读取温度值高位
temp_value=b<
<
4;
temp_value+=(a&
0xf0)>
//温度整数部分
temp_dot=a&
0x0f;
voidtemp_to_1602()//温度数据转换成液晶字符显示
ReadTemp();
Temp[0]=temp_value/10+'
0'
;
//十位
Temp[1]=temp_value%10+'
//个位
Temp[2]='
.'
Temp[3]=temp_dot*0.625+'
Temp[4]=0xdf;
Temp[5]='
\0'
#endif
3.主程序
/***************************************
BJQ.C
reg51.h>
#include"
1602.h"
ds18b20.h"
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<
y++);
voidbuzzer()
ALART=0;
delay_100us(4);
ALART=1;
voidlight()
uchari;
20;
i++)
buzzer();
SHK=0;
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);
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)
if(KEY_SET==0)
LCD_init();
SET_FLAG=0;
move=0;
if(CURRENT_MENU==1)
assemble();
//合成
if(HIGHT<
LOW)MENU_FLAG3=1;
elseMENU_FLAG3=0;
}
if(CURRENT_MENU==0)disslove();
//分解
if(CURRENT_MENU!
=2)CURRENT_MENU+=1;
elseCURRENT_MENU=0;
KEY_SET);
if(KEY_INC==0)
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+'
);
KEY_INC);
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;
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,6,"
MOVE"
);
write_str(3,14,BACK);
write_str(2,14,"
+:
INC"
set_xy(1,7);
write_data(HIGHT/100+'
write_data(HIGHT/10%10+'
write_data(HIGHT%10+'
write_data(0xdf);
write_data('
C'
set_xy(2,7);
write_data(LOW/100+'
write_data(LOW/10%10+'
write_data(LOW%10+'
write_cmd(0xc6);
//write_cmd(0x0f);
else
write_cmd(0x0f);
write_str(0,0,MENU3[MENU_FLAG3]);
write_str(3,0,"
OK"
write_str(3,12,BACK);
voidmain()
while
(1)
key_scan();
display();
temp_to_1602();
if(temp_value>
HIGHT||temp_value<
LOW)
light();
OVER_FLAG=1;
elseOVER_FLAG=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 报警 系统 设计