51单片机温度报警器毕业设计说明书_第1页
51单片机温度报警器毕业设计说明书_第2页
51单片机温度报警器毕业设计说明书_第3页
51单片机温度报警器毕业设计说明书_第4页
51单片机温度报警器毕业设计说明书_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计说明书题目:51单片机温度报警器产品设计工艺设计方案设计√类型:学生姓名:学号:学院:电子信息工程学院专业:应用电子班级:电子1331班学校指导教师:企业指导教师:2016年4月16日

摘要该毕业设计是利用是单片机STC89C51和温度传感器DS18B20以及数码管制作一个基本51单片机温度报警器。温度是一个很重要的物理量,它与人类的生活息息相关,温度传感器DS18B20它是一种直接数字的温度传感器,使用方便。设计温度报警器具有显示温度功能和高温报警及低温报警功能。温度报警器还有一个省电功能,数据保存在单片机内部EEPOM里,进入设置界面后,如果没有键被按下时,系统在15秒后自动退出设置界面。关键词:温度报警;STC89C51;DS18B20;数码管目录1.引言 32.方案设计 32.1单片机的最小系统 42.2温度测量 42.3温度设置 52.4模块显示 53.系统软件设计 54.1程序结构分析 64.2系统程序框架图 65.安装步骤 66.结论 6参考文献 6致谢 7附录:部分源程序 71.引言温度是一个很重要的物理量,它与人类的生活息息相关,利用单片机实时对温度传感器DS18B20进行检测,并进行数据处理。将测量实际环境温度通过数码管显示,通过按键可以设置高、低报警值,当检测温度高于设定的报警值时,蜂鸣器报警,报警红灯闪烁;当检测温度低于设定的报警值时,蜂鸣器报警,报警黄灯闪烁。温度报警器还有一个省电功能,数据保存在单片机内部EEPOM里,进入设置界面后,如果没有键被按下时,系统在15秒后自动退出设置界面。2.方案设计该系统主要由四部分组成:DS18B20温度测量、按键温度设置、测量温度显示及单片机最小系统。系统方框图如图2.0所示。图2.0温度报警器系统方框图2.1单片机的最小系统使用STC89C51单片机作为整个系统的核心,它的最小系统是由单片机、复位电路、振荡电路、P0口的上拉电阻、电源和地组成。单片机的最小系统原理图如图2.1所示。图2.1温度报警器单片机最小系统电路图2.2温度测量使用数字温度芯片DS18B20测量实际温度,输出信号全数字化,便于单片机控制处理,省去了传统测量很多外围电路的温度监测方法。温度传感DS18B20有三个引脚,一个接电源正,一个接电源的负,另一个与单片机进行通讯。DS18B20接线图如图2.2所示。图

2.2DS18B20测量电路图2.3温度设置温度设置是通过键盘输入设定报警温度值,键盘输入由四个按钮组成,一个重置按钮,一个确认键,一个加,一个减按钮。按键与单片机的P2.0、P2.1、P2.2、P2.3相连接。接线原理图如图2.3所示。图

2.3按键与单片机接线电路图2.4模块显示温度报警器的实际测量温度采用数码管显示,数码管的位通过PNP三极管基极与P3.0、P3.1、P3.2、P3.3相连,数码管的段与单片机的P1端口相连。显示接线电路图如图2.4所示。图2.4温度报警器显示电路图3.系统软件设计4.1程序结构分析4.2系统程序框架图5.安装步骤1.检查元件的好坏布局、焊接各元件焊完后编程调试6.结论温度报警,通过实时检测温度传感器DS18B20信号送到单片机,单片机对DS18B20的数据处理。通过按钮可以设置高、低报警值,当检测到的温度高于设定的报警值时,蜂鸣器报警,报警红灯闪烁;当检测到的温度低于设定的报警值时,蜂鸣器报警,报警黄灯闪烁,具有断电保存功能,和数据保存在单片机内部EEPOM,同时还有省电功能,进入设置界面,如果15秒没有键按下,系统自动退出设置界面。设计功能基本完成。参考文献[1]曹巧媛主编.单片机原理及应用(第二版).北京:电子工业出版社,2002[2]全国大学生电子设计竞赛组委会编.第五届全国大学生电子设计竞赛获奖作品选编(2001),北京:北京理工大学出版社,2003[3]何力民编.单片机高级教程.北京:北京航空大学出版社,2000[4]金发庆等编.传感器技术与应用.北京机械工业出版社,2002[5]刘坤、宋戈、赵洪波、张宪栋编.51单片机C语言应用开发技术大全,北京:人民邮电出版社,2008[6]谭浩强著.C程序设计.北京:清华大学出版社,2007;[7]王忠飞,胥芳.MCS-51单片机原理及嵌入式系统应用[M].西安:西安电子科技大学出版社,2007.P268-273[8]PeterVanDerLinden著,徐波译.C专家编程,人民邮电出版社,2003致谢在说明书的写作过程中遇到了无数的困难和障碍,都在同学的帮助和老师的指导下克服了困难。尤其要强烈感谢我的毕业设计指导老师—李桂平老师,她对我进行了无私的指导和帮助,不厌其烦的帮助进行说明书的修改和改进。感谢我的同学和朋友,在我写设计说明书的过程中给予我了很多素材,还在此撰写和排版的过程中提供热情的帮助。感谢民政职业技术学院三年来对我的培养和教育。感谢电子学院所有的专业老师。附录:部分源程序#include<reg52.h>#include"eepom52.h"#defineucharunsignedchar#defineuintunsignedint//数码管段选定义012345 6 7 8 9 ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码//数码管位选定义ucharcodesmg_we[]={0xef,0xdf,0xbf,0x7f};uchardis_smg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; ucharsmg_i=3;//显示数码管的个位数sbitdq=P2^4; //18b20IO口的定义sbitbeep=P2^5;//蜂鸣器IO口定义uchara_a;uinttemperature;//bitflag_300ms;ucharkey_can; //按键值的变量ucharmenu_1;//菜单设计的变量uintt_high=300,t_low=100;bitflag_lj_en; //按键连加使能bitflag_lj_3_en; //按键连3次连加后使能加的数就越大了ucharkey_time,flag_value;//用做连加的中间变量bitkey_500ms;ucharflag_clock;ucharzd_break_en,zd_break_value;//自动退出设置界面/***********************1ms延时函数*****************************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/***********************小延时函数*****************************/voiddelay_uint(uintq){ while(q--);}/***********************数码显示函数*****************************/voiddisplay(){ uchari; for(i=0;i<smg_i;i++) { P3=smg_we[i]; //位选 P1=dis_smg[i]; //段选 delay_1ms(1); P3=0xff; //位选 P1=0xff; //消隐 } }/******************把数据保存到单片机内部eepom中******************/voidwrite_eepom(){ SectorErase(0x2000); byte_write(0x2000,t_high%256); byte_write(0x2001,t_high/256); byte_write(0x2002,t_low%256); byte_write(0x2003,t_low/256); byte_write(0x2055,a_a); }/******************把数据从单片机内部eepom中读出来*****************/voidread_eepom(){ t_high=byte_read(0x2001); t_high<<=8; t_high|=byte_read(0x2000); t_low=byte_read(0x2003); t_low<<=8; t_low|=byte_read(0x2002); a_a=byte_read(0x2055);}/***********************18b20初始化函数*****************************/voidinit_18b20(){ bitq; dq=1; //把总线拿高 delay_uint(1); //15us dq=0; //给复位脉冲 delay_uint(80); //750us dq=1; //把总线拿高等待 delay_uint(10); //110us q=dq; //读取18b20初始化信号 delay_uint(20); //200us dq=1; //把总线拿高释放总线}/*************写18b20内的数据***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //写数据是低位开始 dq=0; //把总线拿低写时间隙开始 dq=dat&0x01;//向18b20总线写数据了 delay_uint(5); //60us dq=1; //释放总线 dat>>=1; } }/*************读取18b20内的数据***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把总线拿低读时间隙开始 value>>=1; //读数据是低位开始 dq=1; //释放总线 if(dq==1) //开始读写数据 value|=0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } returnvalue; //返回数据}/*************读取温度的值读出来的是小数***************/uintread_temp(){ uintvalue; ucharlow; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA=0; low=read_18b20(); //读温度低字节 value=read_18b20();//读温度高字节 EA=1; value<<=8; //把温度的高位左移8位 value|=low; //把读出的温度低位放到value的低八位中 value*=0.625; //转换到温度值小数 returnvalue; //返回读出的温度带小数}/*************定时器0初始化程序***************/voidtime_init() { EA=1; //开总中断 TMOD=0X01; //定时器0、定时器1工作方式1 ET0=1; //开定时器0中断 TR0=1; //允许定时器0定时}/****************独立按键处理函数************************/voidkey(){ staticucharkey_new=0,key_old=0,key_value=0; if(key_new==0) { //按键松开的时候做松手检测 if((P2&0x0f)==0x0f) key_value++; else key_value=0; if(key_value>=10) { write_eepom(); key_value=0; key_new=1; flag_lj_en=0; //关闭连加使能 flag_lj_3_en=0; //关闭3秒后使能 flag_value=0; //清零 } } else { if((P2&0x0f)!=0x0f) key_value++;//按键按下的时候 else key_value=0; if(key_value>=7) { key_value=0; key_new=0; flag_lj_en=1; //连加使能 zd_break_en=1;//自动退出设置界使能 zd_break_value=0;//自动退出设置界变量清零 } } key_can=20; if(key_500ms==1) { key_500ms=0; zd_break_en=1;//自动退出设置界使能 zd_break_value=0;//自动退出设置界变量清零 key_new=0; key_old=1; } if((key_new==0)&&(key_old==1)) { switch(P2&0x0f) { case0x0e:key_can=4;break; //得到k1键值 case0x0d:key_can=3;break; //得到k2键值 case0x0b:key_can=2;break; //得到k3键值 case0x07:key_can=1;break; //得到k4键值 } } key_old=key_new; }/****************按键处理数码管显示函数***************/voidkey_with(){ if(key_can==4) { menu_1++; if(menu_1>=3) { menu_1=0; } if(menu_1==0) { dis_smg[0]=smg_du[temperature%10]; //取温度的小数显示 dis_smg[1]=smg_du[temperature/10%10]&0x7f;//取温度的个位显示 dis_smg[2]=smg_du[temperature/100%10]; //取温度的十位显示 smg_i=3; } if(menu_1==1) { dis_smg[0]=smg_du[t_high%10]; //取小数显示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_high/100%10]; //取low十位显示 dis_smg[3]=0x89; smg_i=4; } if(menu_1==2) { dis_smg[0]=smg_du[t_low%10]; //取low小数显示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_low/100%10]; //取十位显示 dis_smg[3]=0xc7; smg_i=4; } } if(menu_1==1) //设置高温报警 { if(key_can==3) { if(flag_lj_3_en==0) t_high++; //按键按下未松开自动加三次 else t_high+=10; //按键按下未松开自动加三次之后每次自动加10 if(t_high>990) t_high=990; dis_smg[0]=smg_du[t_high%10]; //取小数显示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_high/100%10]; //取十位显示 dis_smg[3]=0x89; //H } if(key_can==1) { if(flag_lj_3_en==0) t_high--; //按键按下未松开自动加三次 else t_high-=10; //按键按下未松开自动减三次之后每次自动减10 if(t_high<=t_low) t_high=t_low+1; dis_smg[0]=smg_du[t_high%10]; //取小数显示 dis_smg[1]=smg_du[t_high/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_high/100%10]; //取十位显示 dis_smg[3]=0x89; //H }// write_eepom(); } if(menu_1==2) //设置低温报警 { if(key_can==3) { if(flag_lj_3_en==0) t_low++; else t_low+=10; if(t_low>=t_high) t_low=t_high-1; dis_smg[0]=smg_du[t_low%10]; //取小数显示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_low/100%10]; //取十位显示 dis_smg[3]=0xc7; //L } if(key_can==1) { if(flag_lj_3_en==0) t_low--; else t_low-=10; if(t_low<=10) t_low=10; dis_smg[0]=smg_du[t_low%10]; //取小数显示 dis_smg[1]=smg_du[t_low/10%10]&0x7f;//取个位显示 dis_smg[2]=smg_du[t_low/100%10]; //取十位显示 dis_smg[3]=0xc7; //L }// write_eepom(); } }/****************报警函数***************/voidclock_h_l(){ if((temperature<=t_low)||(temperature>=t_high)) { flag_clock=1; } else { flag_clock=0; beep=1; } }voidmain(){ temperature=read_temp(); //先读出温度的值 time_init();//初始化定时器 read_eepom(); if(a_a==0xff) //新的单片机初始单片机内问EEPOM { t_high=300; t_low=100; a_a=1; write_eepom(); } delay_1ms(650); temperature=read_temp(); //先读出温度的值 dis_smg[0]=smg_du[temperature%10]; //取温度的小数显示 dis_smg[1]=smg_du[temperature/10%10]&0x7f;//取温度的个位显示 dis_smg[2]=smg_du[temperature/100%10]; //取温度的十位显示 w

温馨提示

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

评论

0/150

提交评论