温度采集报警系统的设计.docx

上传人:b****5 文档编号:5165037 上传时间:2022-12-13 格式:DOCX 页数:23 大小:155.55KB
下载 相关 举报
温度采集报警系统的设计.docx_第1页
第1页 / 共23页
温度采集报警系统的设计.docx_第2页
第2页 / 共23页
温度采集报警系统的设计.docx_第3页
第3页 / 共23页
温度采集报警系统的设计.docx_第4页
第4页 / 共23页
温度采集报警系统的设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

温度采集报警系统的设计.docx

《温度采集报警系统的设计.docx》由会员分享,可在线阅读,更多相关《温度采集报警系统的设计.docx(23页珍藏版)》请在冰豆网上搜索。

温度采集报警系统的设计.docx

温度采集报警系统的设计

 

课程设计

 

课程名称单片机课程设计

题目名称温度采集报警系统的设计

学生学院物理科学与工程技术学院

专业班级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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1