logo资料库

基于51单片机的24小时定时控制系统.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
姓 名: 学 号: 专 业: 余 明 永 E01214308 网络工程 完成时间: 2014/12/31
基于 51 单片机的 24 小时定时控制系统 E01214308 余明永 安徽大学 计算机科学与技术学院, 安徽 合肥 230061 摘 要 :定时开关控制器在工业方面的自动控制,办公场所的电器控制等有着极为广泛的用途;本文 利用 89C51 单片机的定时器计数器时钟电路设计一套 24 小时范围内的定时控制系统;可方便的实现对家庭 电器和工业方面的自动控制;该定时开关控制器具有简单易制、价格低廉、控制时间可精确到秒等优点,还可以实 时显示时间,具有较高的应用价值。 关键字 :单片机 时钟 定时 控制 开关 Timing Control System of 24h Designing Based on 51MCU E01214308 YU Ming-yong Department of Computer Science and Technology, Anhui University, Hefei 230601, China Abstract: Automatic control timing controller has a very wide range of uses in the industry and office applicant control. In this paper, we designed the timing control system including a set of 24 hours within the scope of using the timer counter clock circuit based on mcs-51; It can realize the automatic control of household appliances and industrial aspects very conveniently; the timing switch controller has the very simple and easy preparation, and it is also very cheap, It can control the time very accurately to seconds. Also show the time on time. This application is of great value. Keywords: MCU; Clock; Timing; Control; Switch 0 引言 电子定时器在家用电器中经常用于延 时自动关机、定时。延时自动关机可用于: 收音机、电视机、录音机、催眠器、门灯、 路灯、汽车头灯、转弯灯以及其他电器的延 时断电及延时自停电源等。定时可用于:照 相定时曝光、定时闪光、定时放大、定时调 速、定时烘箱、冰箱门开定时报警、水位定 时报警、延时催眠器、延时电铃、延时电子 锁、触摸定时开关等。例如:空调中的定时 器,在工作一段时间之后便能自动切断电源 停止工作。夏季夜间使用,入睡前先顶好时 间,等睡熟后到了预定时间,空调自动关机。 方便节能。定时器除了应用于家用电器外, 还广泛地用于工业农业生产和服务设施,甚 至军事等。单片机的定时器是单片机里最 “活跃”的部件之一,很多程序、应用系统都 离不开定时器。由于定时器的应用与单片机 的其他硬件相关,存在着一定的复杂性。而定 时器也是单片机应用中解决某类复杂问题 的最为有效的方法,应用非常广泛。本文设计 了基于单片机系统的一个简单的定时开关
控制系统。可以灵活的承载多方面有定时控 制需求的设备的控制。 2 硬件系统设计 硬件系统设计采用所学习单片机开发 板的设计电路做些简要的修改,并添加继电 器电路,电路原理图见图二。独立按键与单 片机 K1,K2,K3,K4 分别与 51 单片机的 P3^0,P3^1,P3^2,P3^3 口相接。K3 采用 中断方式按下切换实时时间的设置状态和 运行状态;K4 切换选择显示实时时间,定 时开时间点,定时关时间点,在定时时间点 1 整体方案设计 整个系统由 51 单片机,时钟电路,复 位电路,独立按键,显示电路,报警器以及 继电器等部分组成[1](结构图如图一)。定时 开关控制系统设计主要以 STC89C51 单片机 为核心[2], 通过 DS1302 进行精准的时间 控制[3],独立按键控制设置实时时间以及定 时开、关时间,由 8 个 8 段 LED 数码管显 示实时的系统时间,并实现交互的设置开关 定时时间。报警器用蜂鸣器当到定时时间时 蜂鸣器发出十秒左右报警声以提示用户。继 电器、 受控电器插座及受控电器组成一个 执行机构, 当定时时间到时, 单片机向继 电器输出一个高电平使继电器工作,继电器 常开触点闭合接通受控电器插座, 使受控 电器通电加以工作, 从而完成定时开关电 器的功能。[4] 图二 定时开关系统硬件结构图 可进行设置改变定时时间;K1 在设置状态 下起作用,进行选择设置时分秒;K2 在设 置状态下起作用对设置项的值进行加一。显 示时间 的八个 LED 八段数 码管通过 一个 图一 定时开关系统构成图 74138 译码器进行选择,数码管输入口通过
74573 与单片机 P0 口相连;138 译码器的输 法进入设置状态。程序设计的流程图如图 入口为 P2^2,P2^3,P2^4。本系统采用了 三。 两个 LED 灯区分设置选项,两灯都不亮数 码管显示为实时时间,两灯亮一灯为开关关 闭定时时间,两灯全亮为开关开启定时时 间,占用 P2^0,P2^1 两个接口。蜂鸣器报 警装置接单片机 P1^5 口,通过 P1^5 口的高 低电平不断变化产生交流信号使蜂鸣器发 声。继电器与单片机的 P1^0 口相接,输出 1 时继电器使电源接通控制电器正常工作, 输出 0 时继电器使电源断开控制电器停止工 作。 3 软件系统设计 定时开关控制软件实现较为简单,主程 序主要是在单片机的控制下,对键盘的输入 信息进行存储分析,驱动 LED 数码管显示 出相关信息,并通过对比分析定时时间与时 钟,控制继电器的通、断,从而达到控制电 器通断电。在这个过程中,单片机首先进行 初始化,显示值初始化、继电器断开、以及 单片机振荡频率的校准等。单片机每执行一 次循环对定时时间和时钟进行一次比较。[5] 为了实现时钟走时与所在地时间一致 和满足要求,设定了时钟设置和定时设置的 功能。时钟设置和定时设置都在主函数里的 while 循环中实现,对于设置的按键采用扫 面检测的方法,而进入设置状态是用中断方 图三定时开关系统设计流程图 程序初始化后,设置定时器 T0 工作在 方式 1 用于计时,同时设置开关定时时间, 执行显示程序。当定时时间设置好后,系统 不断的查询定时时间到否,定时开关开时间 到时 P1^0=1,继电器闭合,受控电器工作, 同时是控制蜂鸣器报警变量设置时间值,使 蜂鸣器控制 P1^5 电平高低不断交替变化产 生交流信号使蜂鸣器报警。在程序执行过程 中中断 0 控制着定时器的启动和暂停,当暂 停时可修改实时时钟的时间,程序查询检查 K1 和 K2 按键是否按下,K1 选择设定位“时、 分、秒”,K2 设置当前选择的设定位数值加 一。K4 切换显示模式:实时时钟,定时关
时 间 , 定 时 开 时 间 。 在 模 式 切 换 时 对 应 unsigned char ReSet=1; LED1,LED0 显示灯改变,实时时钟两灯都 /**************************************** 灭,定时关时间显示一个灯,定时开时间显 示两个灯。在定时开关状态下即可由 K1,K2 键设置定时的时间值,K1,K2 的功能与实时 * 函 数 名 * 函数功能 * 输 入 * 输 出 : main : 主函数 : 无 : 无 时钟设置相同。 具体软件实现代码如下: #include sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; unsigned char Time=0; //用来计时间的值 #define DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit LED0=P2^0; sbit LED1=P2^1; sbit Beep=P1^5; sbit Switch=P1^0; unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x 6d,0x7d,0x07,0x7f,0x6f};//0123456789 unsigned char Num=0; unsigned int disp[8]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x 3f,0x3f}; unsigned char hour=0,minit=0,second=0; unsigned char Thour[2]={0,0},Tminit[2]={0,0},Tsecond[2] ={0,0}; unsigned char Count=0;//设定选择设置项 unsigned char SetPlace;//设置位选择 unsigned int CT=0;//设定值闪烁控制 void Delay1ms(unsigned int c); void TimerConfiguration(); void Int0Configuration(); void Int1Configuration(); **************************************/ void main(void) { unsigned char i=0; unsigned char m; unsigned BCT=0;//报警时长设定 Switch=0; TimerConfiguration(); Int0Configuration(); Int1Configuration(); while(1) { if(Count==0) { if(TR0==0) { CT++; if(CT>2000)CT=0; if(K1==0) //检测 按键K2是否按下 { 抖动 if(SetPlace>=3) Delay1ms(10); //消除 if(K1==0) SetPlace++; SetPlace=0; { } while((i<50)&&(K1==0)) //检测按键是 否松开 { Delay1ms(10);
i++; } i=0; } if(K2==0) //检测 Delay1ms(10); //消除 if(K2==0) { Delay1ms(10); i++; } i=0; } } //数值转换为LED数码管显示 if(SetPlace==0&&CT>1000) disp[7] = 0; disp[6] = 0; { } else { { } else { } else { second++; disp[7] = DIG_CODE[second%10]; disp[6] = DIG_CODE[second/10]; minit++; } disp[5] = 0X40; if(SetPlace==1&&CT>1000) disp[4] = 0; disp[3] = 0; { } else { disp[4] = DIG_CODE[minit%10]; disp[3] = DIG_CODE[minit/10]; hour++; } disp[2] = 0X40; if(SetPlace==2&&CT>1000) { } else { disp[1] = 0; disp[0] = 0; disp[1] = 按键K3是否按下 { 抖动 if(SetPlace==0) if(second>=60) second=0; if(SetPlace==1) if(minit>=60) minit=0; if(hour>=24) hour=0; } } while((i<50)&&(K2==0)) //检测按键是 DIG_CODE[hour%10]; 否松开 disp[0] = { DIG_CODE[hour/10];
} } else//设定定时时间 { //设置定时点 m=Count-1; CT++; { Tminit[m]=Tminit[m]+1; if(Tminit[m]>=60) if(CT>2000)CT=0; Tminit[m]=0; if(K1==0) //检测按键 K2是否按下 { } else { Delay1ms(10); //消除抖动 if(K1==0) Thour[m]=Thour[m]+1; { } SetPlace++; if(SetPlace>=3) if(Thour[m]>=24) SetPlace=0; Thour[m]=0; } } while((i<50)&&(K1==0)) while((i<50)&&(K2==0)) //检测按键是否松开 //检测按键是否松开 Delay1ms(10); i++; { } i=0; } if(K2==0) //检测按键 K3是否按下 { Delay1ms(10); //消除抖动 if(K2==0) { if(SetPlace==0) { Delay1ms(10); i++; { } i=0; } //数值转换为LED数码管显示 if(SetPlace==0&&CT>1000) { } else { disp[7] = 0; disp[6] = 0; disp[7] = Tsecond[m]=Tsecond[m]+1; DIG_CODE[Tsecond[m]%10]; disp[6] = if(Tsecond[m]>=60) DIG_CODE[Tsecond[m]/10]; Tsecond[m]=0; } else if(SetPlace==1) } disp[5] = 0X40; if(SetPlace==1&&CT>1000) { disp[4] = 0;
disp[3] = 0; } else { disp[4] = DIG_CODE[Tminit[m]%10]; disp[3] = DIG_CODE[Tminit[m]/10]; } disp[2] = 0X40; { } BCT--; Beep= 1; Delay1ms(1); Beep= 0; Delay1ms(1); } //--显示时钟--// DIG=0; //消隐 if(SetPlace==2&&CT>1000) switch(Num) //位选,选择点亮的 disp[1] = 0; disp[0] = 0; { } else { 数码管, { case(7): LSA=0;LSB=0;LSC=0; break; case(6): LSA=1;LSB=0;LSC=0; break; disp[1] = case(5): DIG_CODE[Thour[m]%10]; LSA=0;LSB=1;LSC=0; break; disp[0] = case(4): DIG_CODE[Thour[m]/10]; LSA=1;LSB=1;LSC=0; break; } } case(3): LSA=0;LSB=0;LSC=1; break; //检测是否到设定的时间 case(2): if(TR0==1) { LSA=1;LSB=0;LSC=1; break; case(1): if(hour==Thour[1]) LSA=0;LSB=1;LSC=1; break; if(minit==Tminit[1]) case(0): LSA=1;LSB=1;LSC=1; break; if(second==Tsecond[1]) } { DIG=disp[Num]; //段选,选择显示的 为4000报警时长十秒钟左右 } Switch=1; 数字。 BCT=4000; //值 Num++; if(Num>7) Num=0; if(hour==Thour[0]) if(minit==Tminit[0]) } } if(second==Tsecond[0]) /**************************************** { } Switch=0; BCT=2000; * 函 数 名 * 函数功能 * 输 入 * 输 出 : Delay1ms() : 延时1ms : c : 无 if(BCT>0) **************************************/
分享到:
收藏