智能定时控制模块的设计_第1页
智能定时控制模块的设计_第2页
智能定时控制模块的设计_第3页
智能定时控制模块的设计_第4页
智能定时控制模块的设计_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

智能定时控制模块的设计摘要因国家经济的快速发展,技术的不断更新,定时控制技术早已应用到各种场合上,通过对时间精确控制。本课题设计了一款基于单片机的智能定时控制系统,采用STC89C52单片机为主控芯片,DS1302为时钟芯片,外围扩展液晶显示电路,AT24C02存储电路,继电器控制电路,指示灯电路,按键电路。DS1302能够防止时间掉电丢失,以及AT2402防止断电时定时时间数据丢失。经过多次测试,设计最终能够实现定时开启、定时关闭,系统显示当前日期时间,以及当前系统的工作状态,按键能够设置对开启时间关闭时间进行控制,当开启时间到达时,继电器开关闭合,指示灯开启指示当前继电器处于闭合状态,当关闭时间到达时,继电器断开,指示灯熄灭当前继电器处于断开状态。关键词:STC89C52,DS1302,定时控制,AT2402目录摘要 附录A原理图附录B源程序#defineucharunsignedchar#defineuintunsignedint//头函数#include<reg52.h>#include<AT24C02.h>#include<Ds1302.h>#include<Lcd.h>#include<Data.h>#include<intrins.h>#include<Key.h>sbitJDQ=P3^6; //继电器//开机时分秒ucharOS=0,OF=0,OM=0;//关机时分秒ucharClS=0,ClF=0,ClM=0;//模式ucharMode=0;//调整位光标ucharModes=0;//键盘ucharK=0;//主函数voidmain(){ //屏幕初始化 Init_LCD(); //时钟初始化 Ds1302_Init(); //EEPROM初始化 initeeprom(); //时钟初始化 //Ds1302_Write_Time(); //写 /*delay_LCD(20); write_add(0x01,OS); delay_LCD(20); write_add(0x02,OF); delay_LCD(20); write_add(0x03,OM); delay_LCD(20); write_add(0x04,ClS); delay_LCD(20); write_add(0x05,ClF); delay_LCD(20); write_add(0x06,ClM);*/ //读24c02内部数据 delay(10); OS=read_add(0x01); delay(10); //延时的目的是为了读取数据更稳定 OF=read_add(0x02); delay(10); OM=read_add(0x03); delay(10); ClS=read_add(0x04); delay(10); ClF=read_add(0x05); delay(10); ClM=read_add(0x06); while(1) //进入循环 { Ds1302_Read_Time(); //读取时间 //判断是否开启 if(OS<ClS)//开机时间小于关机时间 { if(time_buf1[4]>OS&&time_buf1[4]<ClS)//当前时间的小时在开关机时间的小时中间时 { Mode=1; //打开继电器变量置1 } elseif(time_buf1[4]==OS) //当前时间的小时等于开机时间的小时时 { if(time_buf1[5]>OF) //当小时相等时,就判断分钟。当前分钟是否大于开机的分钟 { Mode=1; //变量置1 } elseif(time_buf1[5]==OF&&time_buf1[6]>=OM)//当前分钟不大于开机分钟时判断当前秒是否大于开机秒 { Mode=1; //变量置1 } else //不符合的话 { Mode=0; //变量清零,后续程序会关闭继电器 } } elseif(time_buf1[4]==ClS) //当前时间的小时是否等于关机小时 { if(time_buf1[5]<ClF) //当前时间的分钟是否小于关机分钟 { Mode=1; //继电器打开变量置1,后续程序会打开继电器 } elseif(time_buf1[5]==ClF&&time_buf1[6]<=ClM)//当前时间的分等于关机分,则判断秒的状态 { Mode=1; //变量置1 } else //超出时间 { Mode=0; //关闭继电器变量清零 } } else //在其他时间时 { Mode=0; //关闭继电器变量清零 } } elseif(OS==ClS) //开机和关机的小时相同 { if(OF<ClF) //判断开机分钟是否小于关机分钟 { if(time_buf1[4]==OS) //当前时间的小时如果小于开机时间的小时 { if(time_buf1[5]>OF&&time_buf1[5]<ClF) //当前的分如果大于开机分,当前分小于关机分 { Mode=1; //变量置1 } elseif(time_buf1[5]==OF&&time_buf1[6]>=OM) //当前分如果等于开机分,当前秒大于等于开机秒 { Mode=1; //变量置1 } elseif(time_buf1[5]==ClF&&time_buf1[6]<ClM)//当前分等于关机分,当前秒小于关机秒 { Mode=1; //变量置1 } else //其他情况, { Mode=0; //变量清零 } } else //不在时间内, { Mode=0; //关闭继电器变量清零 } } elseif(OF==ClF) //开机分等于关机分 { if(time_buf1[4]==OS&&time_buf1[5]==OF) //当前时等于开机时,当前分等于开机分 { if(OM<ClM) //开机秒小于关机秒 { if(time_buf1[6]>=OM&&time_buf1[6]<ClM) //当前秒大于等于开机秒,当前秒小于关机秒 { Mode=1; //变量置1 } else //其他时间 { Mode=0; //变量清零 } } elseif(OM=ClM) //开机秒和关机秒相同 { if(time_buf1[6]==OM) //当前秒等于开机秒 { Mode=1; //开 } } elseif(OM>ClM) //开机秒大于关机秒 { if(time_buf1[6]<OM&&time_buf1[6]>=ClM) //当前秒小于开机秒,当前秒大于等于关机秒 { Mode=0; //变量清零 } else //其他时间 { Mode=1; //变量置1 } } } else //其他时间 { Mode=0; //变量清零 } } elseif(OF>ClF) //开机分大于关机分 { if(time_buf1[4]==OS) //当前时等于开机时 { if(time_buf1[5]>ClF&&time_buf1[5]<OF) //当前分大于关机分,当前分小于开机分 { Mode=0; //变量清零 } elseif(time_buf1[5]==OF&&time_buf1[6]<OM) //当前分等于开机分,当前秒小于开机秒 { Mode=0; //变量清零 } elseif(time_buf1[5]==ClF&&time_buf1[6]>=ClM)//当前分等于关机分,当前秒大于等于关机秒 { Mode=0; //变量清零 } else //其他时间 { Mode=1; //变量置1 } } else //其他时间 { Mode=1; //变量置1 } } } elseif(OS>ClS) //开机时大于关机时 { if(time_buf1[4]<OS&&time_buf1[4]>ClS) //当前时小于开机时,当前时大于关机时 { Mode=0; //变量清零 } elseif(time_buf1[4]==OS) //当前时等于开机时 { if(time_buf1[5]<OF) //当前分小于开机分 { Mode=0; //变量清零 } elseif(time_buf1[5]==OF&&time_buf1[6]<OM) //当前分等于开机分,当前秒小于开机秒 { Mode=0; //变量清零 } else //其他时间 { Mode=1; //变量置1 } } elseif(time_buf1[4]==ClS) //当前时等于关机时 { if(time_buf1[5]>ClF) //当前分大于关机分 { Mode=0; //变量清零 } elseif(time_buf1[5]==ClF&&time_buf1[6]>ClM) //当前分等于关机分,当前秒大于关机秒 { Mode=0; //变量清零 } else //其他时间 { Mode=1; //变量置1 } } else //其他时间 { Mode=1; //变量置1 } } //开机状态下控制LED继电器 if(Mode==1) //变量为1 { JDQ=0; //打开继电器 } else //变量为0 { JDQ=1; //关闭继电器 } LCD_Write_Time(time_buf1,Mode); //时间及状态显示 K=Key(); //键盘函数返回键值 //时间调整 if(K==3) { K=0; //按键标志清零 write_com(0x0F); //闪烁开启 write_com(0x80+0x40+7); //闪烁对应位置 Modes=0; //变量清零 //不为跳出 while(Modes!=6) //变量不等于6 { K=Key(); //键盘函数返回键值 //光标移动 if(K==3) //S3键按下 { Modes++; //设置位置加 //光标 switch(Modes) //判断是设置哪里 { //秒 case0: { write_com(0x80+0x40+7); //选中秒位置,闪烁 break; } //分 case1: { write_com(0x80+0x40+4); break; } //时 case2: { write_com(0x80+0x40+1); break; } //年 case3: { write_com(0x80+3); break; } //月 case4: { write_com(0x80+6); break; } //日 case5: { write_com(0x80+9); break; } } } //时间+ elseif(K==1) //加按键按下 { //相应+ switch(Modes) { //秒++ case0: { time_buf1[6]++; //秒加 if(time_buf1[6]>=60) //秒最大加到59 time_buf1[6]=0; //清零 break; //调出switch } //分++ case1: { time_buf1[5]++; if(time_buf1[5]>=60) time_buf1[5]=0; break; } //时++ case2: { time_buf1[4]++; if(time_buf1[4]>=24) time_buf1[4]=0; break; } //年++ case3: { time_buf1[1]++; if(time_buf1[1]>=100) time_buf1[1]=0; break; } //月++ case4: { time_buf1[2]++; if(time_buf1[2]>=13) time_buf1[2]=1; break; } //日++ case5: { time_buf1[3]++; if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1) //根据年月计算出当前最大的日期 time_buf1[3]=1; break; } } //星期更新 time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//根据年月日信息计算得出星期数据 //时间及状态显示 LCD_Write_Time(time_buf1,Mode); //光标 switch(Modes) { //秒 case0: { write_com(0x80+0x40+7); break; } //分 case1: { write_com(0x80+0x40+4); break; } //时 case2: { write_com(0x80+0x40+1); break; } //年 case3: { write_com(0x80+3); break; } //月 case4: { write_com(0x80+6); break; } //日 case5: { write_com(0x80+9); break; } } } //时间- elseif(K==2) { //相应- switch(Modes) { //秒-- case0: { time_buf1[6]--; if(time_buf1[6]>=60) time_buf1[6]=59; break; } //分-- case1: { time_buf1[5]--; if(time_buf1[5]>=60) time_buf1[5]=59; break; } //时-- case2: { time_buf1[4]--; if(time_buf1[4]>=24) time_buf1[4]=23; break; } //年-- case3: { time_buf1[1]--; if(time_buf1[1]>=100) time_buf1[1]=99; break; } //月-- case4: { time_buf1[2]--; if(time_buf1[2]==0||time_buf1[2]>=13) time_buf1[2]=12; break; } //日-- case5: { time_buf1[3]--; if(time_buf1[3]==0||time_buf1[2]>=32) time_buf1[3]=YDay(time_buf1[1],time_buf1[2]); break; } } //星期更新 time_buf1[7]=Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]); //时间及状态显示 LCD_Write_Time(time_buf1,Mode); //光标 switch(Modes) { //秒 case0: { write_com(0x80+0x40+7); break; } //分 case1: { write_com(0x80+0x40+4); break; } //时 case2: { write_com(0x80+0x40+1); break; } //年 case3: { write_com(0x80+3); break; } //月 case4: { write_com(0x80+6); break; } //日 case5: { write_com(0x80+9); break; } } } } //初始化 Init_LCD(); //写时间 Ds1302_Write_Time(); //显示 LCD_Write_Time(time_buf1,Mode); } //时间调整OVER //开启时间调整 elseif(K==4) { //开启时间显示 Init_LCD_ONTime(); Modes=0; //显示 LCD_time(OS,OF,OM); //显示时间的时分秒 write_com(0x0f); write_com(0x80+0x40+11);//秒位置闪烁 while(Modes!=3) { //键盘函数返回键值 K=Key(); if(K==4) { Modes++; //秒 if(Modes==0) { write_com(0x80+0x40+11); } //分 elseif(Modes==1) { write_com(0x80+0x40+8); } //时 elseif(Modes==2) { write_com(0x80+0x40+5); } } //++ elseif(K==1) { //秒++ if(Modes==0) { OM++; if(OM>=60) OM=0; } //分++ elseif(Modes==1) { OF++; if(OF>=60) OF=0; } //时++ elseif(Modes==2) { OS++; if(OS>=24) OS=0; } //显示 LCD_time(OS,OF,OM); //秒 if(Modes==0) { write_com(0x80+0x40+11); } //分 elseif(Modes==1) { write_com(0x80+0x40+8); } //时 elseif(Modes==2) { write_com(0x80+0x40+5); } } //-- elseif(K==2) { //秒-- if(Modes==0) { OM--; if(OM>=60) OM=59; } //分-- elseif(Modes==1) { OF--; if(OF>=60) OF=59; } //时-- elseif(Modes==2) { OS--; if(OS>=24) OS=23; } //显示 LCD_time(OS,OF,OM); //秒 if(Modes==0) { write_com(0x80+0x40+11); } //分 elseif(Modes==1) { write_com(0x80+0x40+8); } //时 elseif(Modes==2) { write_com(0x80+0x40+5); } } } delay(10); write_add(0x01,OS); //将设置好的数据保存到24c02中 delay(10); //延时的作用是为了读取24c02更稳定 write_add(0x02,OF); delay(10); write_add(0x03,OM); delay(10); write_add(0x04,ClS); delay(10); write_add(0x05,ClF); delay(10); write_add(0x06,ClM); Init_LCD(); }//开启时间调整 //关闭时间调整 elseif(K==5) { //关机时间 Init_LCD_OFFTime(); Modes=0; //显示 LCD_time(ClS,ClF,ClM); write_com(0x0f); write_com(0x80+0x40+11); while(Modes!=3) { //键盘函数返回键值 K=Key(); if(K==5) { Modes++; //秒 if(Modes==0) { write_com(0x80+0x40+11); } //分 elseif(Modes==1) { write_com(0x80+0x40+8); } //时 elseif(Modes==2) { write_com(0x80+0x40+5); } } //++ elseif(K==1) { //秒++ if(M

温馨提示

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

评论

0/150

提交评论