温度采集报警系统的设计_第1页
温度采集报警系统的设计_第2页
温度采集报警系统的设计_第3页
温度采集报警系统的设计_第4页
温度采集报警系统的设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 课 程 设 计 课程名称 单片机课程设计 题目名称 温度采集报警系统的设计 学生学院 物理科学与工程技术学院 专业班级 xx 学 号 1034301114 学生姓名 xx 2013年11 月12日目录一、设计任务与要求2二、方案设计与论证21、单片机的选取22、温度传感器的选取23、显示器的选取24、温度采集显示系统电路的总体设计框图3三、电路基本原理及单元电路设计3四、调试和仿真:7六、总结9七、附录1024 / 25文档可自由编辑打印温度采集报警系统的设计一、设计任务与要求1、可以显示被测的温度并存储2、可以设置报警温度3、到达报警温度时声光报警二、方案设计与论证1、单片机的选取本系统采

2、用简答的51单片机为控制核心优点突出,它能够运行各种程序,综合考虑单片机的各部分资源,且因为我们学习的是51单片机,因此此次设计选用AT89C51单片机作为核心处理器。2、温度传感器的选取方案一:采用温度传感器AD590K。AD590K具有较高精度和重复性,良好的非线性保证±0.1的测量精度。加上软件非线性补偿可以实现高精度测量。AD590将温度转化为电流信号,因此要加相应的调理电路,将电流信号转化为电压信号。送入8位A/D转换器,可以获得255级的精度,基本满足题目要求。    方案二:采用数字温度传感器DS18B20。DS18B20为数字式

3、温度传感器,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据,电路简单。 基于以上分析和现有器件所限,温度采集模块选用方案二。DS18B20能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果3、显示器的选取显示系统是单片机控制系统的重要组成部分,主要用于显示各种参数的值,常用的显示器有CRT、LED、LCD等。方案一:采用LED

4、数码管显示。颜色鲜艳,经济实惠,由于本设计显示的内容较多,过多地增加数码管显然不行,进行轮流显示则控制复杂,占用较多的I/O资源,加上数码管需要较多连线,使得电路复杂,功耗较大。若采用Max7219驱动,可以减少占用的接口数目,但是数码管只能显示有限的数字和符号,不能直观地显示出本设计的内容。 方案二:采用1604液晶显示。其内置128个5*7点ASCII字符集,可以直观地显示出较多内容,利用该模块灵活的接口方式和简单、方便的操作指令,可构成较好人机交互图形界面,使得显示内容丰富,易于人机交流,并且节约了I/O口资源。 由于本设计要求用1604显示,在本设计中采用1604作

5、为显示模块,不仅可以显示温度值,而且可以显示英文字符,比数码管具有明显的优越性,所以本系统采用方案二4、温度采集显示系统电路的总体设计框图如图1:AT89C51电源电路复位及晶振电路键 盘温度采集电路显示电路报警电路图1:系统电路的总体设计框图三、电路基本原理及单元电路设计 本设计使系统可以检测099范围内的温度,考虑到测温精度,设置显示数值精确到1,并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。根据AT89C51的引脚特性,本设计中采用P2.0P2.2和P0口作为1604的驱动引脚,P1.0P1.3作为按键的输入,P1.4,P1.5分别作声光报警输出。P1

6、.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键用于调整,每按一次加一,MOV

7、E键用于移动。5、 显示电路显示采用16*4 字符LCD,如下图6示图 6:显示电路5、 蜂鸣器和发光二极管如图7:图 7:声光报警电路三极管NPN采用9013是作为蜂鸣器的驱动的作用的,R6、R4作为限流电阻使用。6、 实现上述任务的控制器整体流程图如图8所示:图 8:整体流程图 四、调试和仿真:1、调试选划分系统的功能,按单元一个一个调试正确后,组成整个电路。2、仿真部分仿真图如下:图10,主界面未报警图11,主界面已报警图12,设置界面图13,设置成功界面图14,设置不成功界面六、总结这次课程设计是自己第一次设计一个系统,包括前期的方案选取,原理图的绘制,程序的编写和PROTUES仿真等

8、等,使我对之前的理论知识有了较好的巩固,同时也提高了自己的动手能力,然而也发现自己在理论知识方面存在很多不足,比如说,对单片机的中断控制系统的掌握还不够,和对LCD的菜单界面编程能力不足。今后,我将更加努力地学习,提高自己的专业水平。七、附录1.1602接口程序/*.h*/#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define IO P0sbit RS=P20;sbit RW=P21;sbit E=P22;void check_busy(void);void write_cmd(u

9、char com);void write_data(uchar dat);void LCD_init(void);void write_str(uchar x ,uchar y,uchar *s);void lcd_test(void);void delay(uint); /1ms延时程序void delay(uint j)uchar i;for(;j>0;j-) for(i=0;i<100;i+);/查忙程序void check_busy(void)uchar dt;dodt=0xff;E=0;RS=0;RW=1;E=1;dt=IO;while(dt&0x80);E=0;

10、/写控制指令void write_cmd(uchar com)check_busy();E=0;RS=0;RW=0;IO=com;E=1;_nop_();E=0;delay(1);/写数据指令void write_data(uchar dat)check_busy();E=0;RS=1;RW=0;IO=dat;E=1;_nop_();E=0;delay(1);/数据指令/*uchar read_data(uchar address) uchar dat;write_cmd(address);check_busy();/IO=0xff;E=0;delay(20);RS=1;RW=1;delay(

11、1);E=1;dat=IO;delay(5);_nop_();E=0;delay(2);return dat;*/液晶屏初始化void LCD_init(void)write_cmd(0x38);/8位总线,双行显示,5X7的点阵字符write_cmd(0x0C);/开整体显示,光标关,无黑块write_cmd(0x06);/光标右移write_cmd(0x01);/清屏delay(1);void set_xy(uchar x,uchar y) if(x=0) x=0x80+y; if(x=1) x=0xc0+y; if(x=2) x=0x94+y; if(x=3) x=0xd4+y; wri

12、te_cmd(x);void write_str(uchar x,uchar y,uchar*s)set_xy(x,y);while(*s)write_data(*s);s+;2.DS18B20接口程序/* 文件名 : 温度采集DS18B20.h* 描述 : 该文件定义温度传感器件DS18B20相关函数。*/unsigned char ReadOneChar(void);void WriteOneChar(uchar dat);void ReadTemp(void);还回Temp5#ifndef DS18B20_H#define DS18B20_H#define uint unsigned i

13、nt#define uchar unsigned charsbit DQ = P17; /温度传送数据IO口int temp_value; /温度值unsigned char Temp6; / 存放温度的各个位的值int temp_dot ; /温度小数部分 /*ds18b20延时子函数(晶振12MHz */ void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0;

14、 /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i>0;i-) DQ = 0; / 给脉冲信号 dat>>=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); re

15、turn(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i>0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; /*读取ds18b20当前温度*/void ReadTemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作

16、WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4; /温度整数

17、部分 temp_dot=a&0x0f; /温度小数部分 void temp_to_1602() /温度数据转换成液晶字符显示 ReadTemp(); Temp0=temp_value/10+'0' /十位 Temp1=temp_value%10+'0' /个位 Temp2='.' Temp3=temp_dot*0.625+'0' Temp4=0xdf; Temp5='0'#endif3.主程序/*/#include<reg51.h>#include"1602.h"#inclu

18、de<ds18b20.h"sbit KEY_SET=P10;sbit KEY_BACK=P11;sbit KEY_INC= P12;sbit KEY_MOVE=P13;sbit ALART=P14;sbit SHK=P15;bit SET_FLAG =0; /SET flag,when flag 1 is on SET modebit OVER_FLAG=0;uchar CURRENT_MENU=0;uchar code MESSAGE24="NO ","YES"uchar code MENU1="* Welcome *&quo

19、t;uchar code MENU2="* SET MODER *"uchar code MENU3220="* Set sucess! *","You set is illeage"uchar code WARING="WARING:"uchar code TEM="TEMP:"uchar code SET="->SET"uchar code BACK="->BACK"uchar code HIGHS="HIGHT:"uc

20、har code LOWS =" LOW :"uchar HIGHT=40,LOW=10;uchar move,base;uchar dis_temp6;bit MENU_FLAG3;void delay_100us(uchar x) uchar y; while(x-) for(y=0;y<100;y+); void buzzer() ALART=0; delay_100us(4); ALART=1; delay_100us(4);void light() uchar i; for(i=0;i<20;i+) buzzer(); SHK=0; for(i=0;i

21、<20;i+) buzzer(); SHK=1; void disslove() dis_temp0=HIGHT/100; dis_temp1=HIGHT/10%10; dis_temp2=HIGHT%10; dis_temp3=LOW/100; dis_temp4=LOW/10%10; dis_temp5=LOW%10;void assemble() HIGHT=dis_temp0*100+dis_temp1*10+dis_temp2; LOW=dis_temp3*100+dis_temp4*10+dis_temp5;void key_scan() uchar tem,adjust;

22、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; else SET_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 < LOW)

23、MENU_FLAG3=1; else MENU_FLAG3=0; if(CURRENT_MENU=0) disslove(); /分解if(CURRENT_MENU!=2) CURRENT_MENU+=1;else CURRENT_MENU=0; while(!KEY_SET); if(KEY_INC=0) delay_100us(140); if(KEY_INC=0&&SET_FLAG=1) if(move=0) adjust=5; else adjust= move-1; tem=dis_tempadjust; tem+; if(tem>9) tem=0; dis_t

24、empadjust=tem; if(adjust<3) base=0xc7; else base=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; else base=0x97; write_cmd(base+move); if(move=6) move=0; while(!KEY_MOVE);void display() 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,MESSAGEOVER_FLAG); write_str(3,0,S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论