基于单片机的定时插座设计-精品内容摘要:

,一般情况下它们大多工作在 5V 甚至更低。 驱动电流在 mA 级以下。 而要把它用于一些大功率场合,比如继电器驱动,显然是不行的。 所以就要有一个环节来衔接,这个环节就是所谓的“功率驱动”。 继电器驱动就是一个典型的、简单的功率驱动 环节。 图中三极管 8050 有两个作用:一个是起放大作用,一个是起开关作用(严格来讲开关作用是放大作用的极限情况)。 P1 处连接的是单片机的 口。 口给出高电平时,三极管处于导通状态,并起放大作用,这样,继电器就能得到足够的驱动电流来正常工作。 当 口给出低电平时,三极管不工作,继电器因没电流通过而不工作。 二极管 4148 起到保护作用。 发光二极管 LED0 用于指示继电器是处于导通状态(灯亮)还是处于断开状态(灯灭)。 继电器驱动电路如图 所示。 第 17 页 图 继电器驱动电路 键盘电路 本设 计采用了独立键盘设计,只是用了 5 个独立案件与单片机 IO 口连接,利用简单的逻辑方式实现了人机交互界面。 该界面操作简单,便于控制。 人机界面在软件设计板块中将详细介绍。 独立键盘电路如图 所示。 图 键盘电路 插座电源控制电路 由于电源的通断并不频繁所以本设计才用了价格相对较低的继电器做为插座电源的控制电路器件。 由单片机的一个 I/O 口经过三极管控制继电器的通断,从而控制插座的通断电。 插座电源控制电路如图 所示。 第 18 页 图 插座电源控制电路 报警电路 本设计报警电路由单片机 I/O 口经三极管控制蜂鸣器进行报警。 报警电路如图。 图 报警电路 第 19 页 第五章 系统软件设计 本章详细介绍了各个模块的软件设计流程以及部分源代码,包括了时钟程序、人机界面以及主程序。 开发环境 STC89C51 单片机软件开发平台为 Keil uvision4 C51,仿真环境为 Protues,下载软件为 STC_ISP。 Keil C51 是 美国 Keil Software 公司出品的 51 系列兼容单片机 C 语言软件开发系统,与汇编相比, C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( uVision)将这些部分组合在一起。 运行Keil 软件需要 WIN9 NT、 WIN20 WINXP 等操作系统。 Protues 软件是英国 Labcenter electronics 公司出版的 EDA 工具软件。 它不仅具有其它EDA 工具软件的仿真功能,还能仿真单片机及外围器件。 它是目前最好的仿真单片机及外围器件的工具。 虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。 Proteus 是世界上著名的 EDA 工具 (仿真软件 ),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到 PCB 设计,真正实现了从概念到产品的完整设计。 是目前世界上唯一将电路仿真软件、 PCB 设计软件和虚拟模型 仿真软件三合一的设计平台,其处理器模型支持 8051 、 HC11 、PIC10/12/16/18/24/30/DsPIC3 AVR、 ARM、 8086 和 MSP430 等, 2020 年即将增加 Cortex和 DSP 系列处理器,并持续增加其他系列处理器模型。 在编译方面,它也支持 IAR、 Keil和 MPLAB 等多种编译。 STCISP 是一款 单片机 下载编程烧录 软件 ,是针对 STC 系列单 片机而设计的,可下载 STC89 系列、 12C2052 系列和 12C5410 等系列的 STC 单片机,使用简便,现已被广泛使用。 各模块程序设计 主程序流程图 在本次设计中,主程序主要是在单片机的控制下,建立人机操作界面,对设定时间进行储存分析,驱动液晶显示出相关信息,并通过对比分析定时时间与时钟,控制继电器的通、断,从而达到控制插座的通、断电。 在这个过程中,单片机首先进行初始化,包括设置单片机各个端口的方向,各个变量的初始化,液晶显示初始化、继电器断开以及单片机振荡频率的校准等。 整个系统软件设计 的流程图如图 所示。 第 20 页 开 始液 晶 、 定 时 器 初 始 化建 立 人 机 界 面进 入 键 盘 循 环 扫 描键 值 判 断 与 控 制定 时 时 间 与 现 实 时 间 对 比通 断 电 判 断 通 电断 电 图 主程序流程图 main() { TMOD=0x01。 ET0=1。 TR0=1。 EA=1。 shi=1,fen=0,miao=0,a=1,b=1,c=0,d=0,e=0,f=0。 power=0。 //开电源 lcd_init()。 // 初始化 LCD delay(1)。 disp_later(0,0,1SET 2AL 3SAL,16)。 //显示第一个界面 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 while(1) { if(teep==0) //每秒变化一次 { disp_time(6,1,shi,fen,miao)。 } 第 21 页 if(miao==60) { miao=0。 fen++。 if(fen==60) { fen=0。 shi++。 if(shi==24) { shi=0。 } } } if(k1==0) //设置现在时间 { EA=0。 lcd_cmd(0x01)。 //清屏 disp_later(0,0,K2:H K3:M K4:O,14)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 while(1) { while(k2==0) { delay(10)。 if(k2==1) { shi++。 if(shi==24) shi=0。 disp_time(6,1,shi,fen,miao)。 } } while(k3==0) { delay(10)。 第 22 页 if(k3==1) { fen++。 if(fen==60) fen=0。 disp_time(6,1,shi,fen,miao)。 } } if(k4==0) { EA=1。 lcd_cmd(0x01)。 //清屏 disp_later(0,0,1SET 2AL 3SAL,16)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 break。 } } } if(k2==0) //显示闹铃时间 { lcd_cmd(0x01)。 disp_later(0,0,start:,6)。 //显示:开始时间 disp_time(6,0,a,b,c)。 disp_later(0,1,delay:,6)。 //显示:持续时间 disp_time(6,1,c,d,e)。 delay(500)。 lcd_cmd(0x01)。 //清屏 disp_later(0,0,1SET 2AL 3SAL,14)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 } while(k3==0) //设置闹铃时间 { delay(10)。 if(k3==1) { 第 23 页 lcd_cmd(0x01)。 //清屏 disp_later(0,0,K2:H K3:M K4:O,14)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,a,b,c)。 while(1) { while(k2==0) { delay(10)。 if(k2==1) { a++。 if(a==24) a=0。 disp_time(6,1,a,b,c)。 } } while(k3==0) { delay(10)。 if(k3==1) { b++。 if(b==60) b=0。 disp_time(6,1,a,b,c)。 } } if(k4==0) { lcd_cmd(0x01)。 //清屏 disp_later(0,0,1SET 2AL 3SAL,16)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 break。 } } } 第 24 页 } if(k4==0) { lcd_cmd(0x01)。 disp_later(0,0,start:,6)。 //显示:开始时间 disp_time(6,0,a,b,c)。 disp_later(0,1,delay:,6)。 //显示:持续时间 disp_time(6,1,d,e,f)。 delay(10)。 while(k4==1) { while(k1==0) { delay(10)。 if(k1==1) { a++。 if(a==24) a=0。 disp_time(6,0,a,b,c)。 } } while(k2==0) { delay(10)。 if(k2==1) { b++。 if(b==60) b=0。 disp_time(6,0,a,b,c)。 } } while(k3==0) { delay(10)。 if(k3==1) { 第 25 页 d=d+5。 if(d==60) { d=0。 c++。 if(c==24) c=0。 } disp_time(6,1,c,d,e)。 } } if(k4==0) { ling=1。 nao()。 power=0。 //开电源 disp_later(0,0,1SET 2AL 3SAL,16)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 break。 } } } if(ling==1) { if(shi==a+c) { if(fen==b+d) { power=1。 //关电源 lcd_cmd(0x01)。 //清屏 disp_later(0,0,TIME OVER,9)。 nao()。 nao()。 nao()。 lcd_cmd(0x01)。 //清屏 第 26 页 disp_later(0,0,1SET 2AL 3SAL,16)。 disp_later(0,1,TIME:,5)。 disp_time(6,1,shi,fen,miao)。 ling=0。 } } }。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。