中文摘要 ········································································································································ I 英文摘要 ······································································································································· II
1 绪论 ·········································································································································· 1
1.1 课题背景 ······················································································································ 1 1.2 方案概述 ······················································································································ 1
2 系统的总体设计·············································································································· 3
2.1 系统可行性论证 ······································································································ 3
2.1.1 需求分析 ·············································································································· 3 2.1.2 时钟模块设计 ······································································································ 3
2.2 系统总体方案············································································································ 4
2.2.1 系统的硬件构成 ································································································· 4 2.2.2 系统的软件构成 ································································································· 4
3 系统的硬件 ························································································································· 5
3.1 系统的主控单元构成 ···························································································· 5
3.1.1 单片机ATS52简介 ······················································································· 5 3.1.2 主要功能及特性 ································································································· 6 3.1.3 管脚图管脚说明 ································································································· 7 3.1.4 复位电路 ·············································································································· 9 3.1.5 震荡电路 ············································································································ 10 3.1.6 芯片擦除 ············································································································ 11
3.2 时钟芯片简介 ·········································································································· 11
3.2.1 DS1302引脚及相关功能 ················································································ 11 3.2.2 DS1302内部结构 ····························································································· 13 3.2.3 DS1302读写时序说明 ···················································································· 13
1
4系统仿真与硬件制作 ································································································· 15
4.1 软件仿真 ···················································································································· 15 4.2 硬件制作 ···················································································································· 16
5 系统软件介绍 ················································································································· 17
5.1 数码管刷新程序介绍 ·························································································· 17 5.2 按键扫描程序·········································································································· 18
6 系统调试与成果············································································································ 19
6.1 调试 ······························································································································ 19 6.2 系统测试 ···················································································································· 19
6.2.1 按键的测试 ········································································································ 19 6.2.2 插座定时时间测试 ··························································································· 19
6.3 系统误差分析·········································································································· 20
7 总结与展望 ······················································································································· 21
结束语 ·········································································································································· 22 致谢 ················································································································································ 22 参考文献 ····································································································································· 24 附录1 ··········································································································· 25 附录2 ··········································································································· 36
2
1 绪论
现有的电源插座一般为普通插座,只负责电源转接,不能实现智能控制。因而不能有效的实现智能化控制。而一些专用设备上可以实现智能化控制,而此时的控制系统和专用设备联系比较紧密,无法实现大面积推广。
本设计主要是解决普通家电的智能化控制。电源分为多路输出,可以实现分别控制或者统一控制。具有实时时钟功能,可以对每一路设置启动和停止时间以及运行时间周期,并实时显示时钟。本发明为电源自动控制装置,本发明涉及到家电电源控制的实现方法,主要用于需要定时开关的动力装置上,可以人为设定开启和关闭时间,不需要人为监控,实现智能化控制。
1.1 课题背景
随着人类社会的发展进步,不可再生资源的枯竭,现代化高效能的设备使用,人们越来越注重资源的节省和时间的统筹安排。
电视机的待机功耗一般都是10W左右,很多人晚上看完电视只是让电视机处于待机状态,一晚上按8小时算,也是需要七八十瓦的功耗,一个月差不多3度电。而现在几乎每家都有电视机,可以想象每年要有多少电能被浪费„„
现在的家用电热水器一般都没有定时开机和关机功能,假如我们需要六点出门,九点钟回来,而回来就希望有热水洗澡,如果六点钟开始烧水的话,九点钟会烧得很热,而且会浪费电能,试想如果我们能有一个智能家电控制系统, 不仅可以节约很多电能,还可以根据个人情况统筹安排时间。
1.2 方案概述
针对以上的问题,我们设计了这款智能家电控制系统,该系统的最大特点是智能化,可以根据个人需要随意设置电源的开关时间,该方案也适用于园艺定时浇水之类的控制系统。该系统需具备以下功能:
1、利用单片机设计一定时开关,在24小时内的时间里能预先设定定时范围,每天周而复始地控制用电器具的自动开启和关闭。 2、要求最少能控制两路220V/10A的交流负载。 3、产品的成本应尽量低,不能超过35元。
4、产品的功能应尽量多,最少应具有时间显示和校正、定时显示和设置等功能。
1
5、产品的质量应可靠、安全。具体性能指标如下: 供电电源:220V 50Hz 功率消耗:<2W 使用环境温度:-10至40度 最大负载电流:>10A 负载功率:2500W(250V 10A)
定时范围:1分钟至23小时59分任意设定 最小设定单位:1分钟 最小设定间隙:1分钟 定时精度:1分钟 工作方式:连续工作制 可定时次数:不少于1次,可以同时控制两个插座;
2 系统的总体设计
2.1 方案可行性论证
2.1.1 需求分析
随着现代社会人们生活水平的日益提高,及建设节约型社会口号的提出人们
2
节能的意识越来越强,于是定时插座就应运而生了。
2.1.2 时钟模块设计
方案一:采用单片机本身的定时器,根据振荡频率来算时间,虽然这样价格最低廉,但是时间走的不精确,断电数据也会丢失。
方案二:采用DS12C877时钟芯片,此芯片内置锂电,断电数据不会丢失。但是DS12C877电路比较复杂同时价格比较昂贵。
方案三:采用DS1302时钟芯片,此时钟芯片能产生准确的时间、年、月、日等,外加一块锂电池能保证断电后能保证数据部丢失,具有DS12C877的功能,同时电路简单,价格低廉。
综上所述,综合价格与功能等因素,因此我们采用方案三。
图2.1 DS1302的连接电路图
1、VCC为主电源接5V,C1为滤波电容;2、X1、X2外接32.768K的晶振; 3、5、6、7脚分别与控制器相联,注意外部4.7K上拉电阻;
4、备用电源脚,注意是3.3V,DS1302要求备用电源电压稍微低于主用电源; DS1302的具体操作的大致过程,就是将各种数据写入DS1302的寄存器,以设置它当前的时间以及格式
【1】
。然后使DS1302开始运作,DS1302时钟会按
照设置情况运转,再用单片机将其寄存器内的数据读出。
2.2 系统总体方案
2.2.1 系统的硬件构成
系统总体分为软件部分和硬件部分两部分构成。
硬件部分由主控芯片部分、继电器控制部分、数码管显示部分、DS1302时钟
控制部分、音乐播放部分、电源部分、指示部分组成。总体框图如下:
3
主控部分(单片机) 为电路提供能量 图2.2系统总体框图
控制控制信息采集信息采集 显示部分 电源部分 蜂鸣器 继电器 DS1302时2.2.2 系统的软件构成
系统软件组成主要分为时钟芯片DS1302信息的实时采集、数码管显示、继
电器的控制,时间的设定等几部分组成。具体详细程序见附录Ⅰ。
3 系统主要芯片介绍
3.1 系统的主控单元构成
系统的主控单元由ATS52及其最小工作系统构成,主要功能是控制系统的总体,是系统的核心,相当于系统的大脑和心脏。其电路图如下:
4
图3.1系统主控单元
3.1.1 单片机ATS52简介
ATS52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器
【2】
。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51
产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得ATS52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
3.1.2 主要功能及特性
ATS52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,ATS52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止与MCS-51单片机产品兼容
5
【3】
。
8K字节在系统可编程Flash存储器 1000次擦写周期 全静态操作:0Hz~33Hz 三级加密程序存储器 32个可编程I/O口线 三个16位定时器/计数器 八个中断源
全双工UART串行通道 低功耗空闲和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 掉电标识符
3.1.3 管脚图管脚说明
图3.2 ATS52引脚图
VCC:供电电压。
GND:接地。
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8
6
个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在 flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器
能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如表3-1所示。 在flash编程和校验时,P1口接收低8位地址字节
【4】
。
表3.1 P1口的第二功能
引脚号 第二功能 P1.0 P1.1 P1.5 P1.6 P1.7 T2(定时器/计数器T2的外部计数输入),时钟输出 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) MOSI(在系统编程用) MISO(在系统编程用) SCK(在系统编程用) P2口:P2口为一个内部上拉电阻的8 位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的 管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给 出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高 八位地址信号和控制信号
【5】
。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口作为ATC51的一些特殊功能口,如表3-2所示:
表3.2 P3的特殊功能
7
口管脚 P3.0 RXD P3.1 TXD P3.2 /INT0 P3.3 /INT1 P3.4 T0 P3.5 T1 P3.6 /WR P3.7 /RD 备选功能 (串行输入口) (串行输出口) (外部中断0) (外部中断1) (记时器0外部输入) (记时器1外部输入) (外部数据存储器写选通) (外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期 输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个 ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA /VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定 为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出
【6】
。
8
3.1.4 复位电路
为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即 4.75~5.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器 稳定工作时,复位信号才被撤除,微机电路开始正常工作
【7】
。
目前为止,单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路;(4)看门狗型复位电路。
电路图如下:
图3.3 复位电路
3.1.5 振荡电路
电路图如下:
9
图3.4 晶振电路
晶振是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低 的频率是串联谐振,较高的频率是并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶 振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄, 所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容等效输入电容,这个不能忽略。
【8】
,请注意一般IC的引脚都有
3.1.6 芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并
保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此 外,ATC51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,
10
计 数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所有其它芯片功能。
3.2时钟芯片简介
3.2.1 DS1302引脚及相关功能
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/
日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES复位(2)I/O数据线(3)SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低保持数据和时钟信息时功率小于1mWDS1302是由DS1202改进而来增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器
【9】
。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表
等产品领域下面。将主要的性能指标作一综合:
★实时时钟具有能计算2100年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力;
★318位暂存数据存储RAM ★串行I/O口方式使得管脚数量最少 ★宽范围工作电压2.0-5.5V ★工作电流2.0V时,小于300nA
★读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式
★8脚DIP封装或可选的8脚SOIC封装根据表面装配 ★与TTL兼容Vcc=5V ★可选工业级温度范围-40+85
★双电源管用于主电源和备份电源供应上是DS1302的一些全面的预览,以下为DS1302管脚图:
11
图3.5 DS1302
图3.6 DS1302引脚图
VCC2:主用电源引脚;
X1、X2:DS1302外部晶振引脚; GND:地; RST:复位引脚;
I/O:串行数据引脚,数据输出或者输入都从这个引脚; SCLK:串行时钟引脚; VCC1:备用电源;
3.2 .2 DS1302的内部结构
DS1302的内部结构:
12
图3.7 DS1302的内部结构
3.2.3 DS1302读写时序说明
DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如下图。
图3.8 DS1302的控制字
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0):指示操作单元的地址;
位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如下图。
13
图3.9 DS1302的读写时序图
DS1302是DALLAS公司的涓流充电时钟芯片, DS1302工作时功耗很低、保持数据和时钟信息功耗小于1mW,仅用一节电池就能唱时间保持数据。
所以总的来说DS1302的操作分2步(显示部分属于液晶显示的内容,不属于DS1302本身的内容),但是在讲述操作时序之前,我们要先看看寄存器:寄存器样式.jpg上图是DS1302的寄存器样式,我们看到:1、第7位永远都是12、第6位,1表示RAM,寻址内部存储器地址;0表示CK,寻址内部寄存器;3、第5到第1位,为RAM或者寄存器的地址;最低位,高电平表示RD:即下一步操作将要“读”;低电平表示W:即下一步操作将要“写”。(与AT24C02寄存器类似,这点要理解好)
4 系统仿真与硬件制作
4.1 软件的仿真
Proteus软件是英国Labcenter Electronics公司出版的EDA工具软件(该软件
中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键
14
切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。 本系统在制作硬件之前首先用Proteus软件对系统进行了仿真测试,确保系统的可靠性及实物的成功率。其仿真图如下:
图4.1
4.2 硬件的制作
经过软件仿真实验成功后对系统进行了实物的制作。在制作的过程中应该注意一下几点:
1、要注意元器件的布局,因为电路比较复杂,为了连接线方便要提前对元
器件进行布局,同时布局好了实物做出来也比较美观;
2、在焊接的过程中一定要检查好器件的引脚,尤其是数码管的引脚一定不
要焊接错。同时还要注意二极管、继电器、蜂鸣器、USB头电解电容等器件的正负极不要接错;
15
3、要注意P0口需要外接上拉电阻; 4、单片机的31引脚要接到地;
5、焊接完成后要进行排查,主要是用万用表检测电源和地之间是否短路等,
如果没有错误了在插芯片,在插芯片时引脚的位置一定不要插反。
5 系统软件介绍
系统软件部分主要有按键控制部分,时钟信息采集部分,数码管显示部分,继电器控制部分组成,其程序流程图如下:
16
图 5.1 系统的软件流程图
5.1 数码管刷新程序介绍
数码管是显示的当前的实时时间或者设定时间,随着时间的推移或者按键对
【10】
设定时间的调整数码管显示的时间要实时更新才能正常显示,此部分程序
如下:
void show_flash(void) { LED_IO = Led_buf[0]; LED1 = 0; delay_ms(4); LED1 = 1; LED_IO = Led_buf[1]; LED2 = 0; delay_ms(4); LED2 = 1; LED_IO = Led_buf[2]; LED3 = 0; delay_ms(4); LED3 = 1; LED_IO = Led_buf[3]; LED4 = 0; delay_ms(4); LED4 = 1; }
5.2 按键扫描程序
系统通过按键来对时间进行校正及对插座开始结束时间的设定,由于按键会
17
有机械性的都抖动,因此需要在程序中加入防抖动程序。
int8 scan_key(void) { int8 val=-1; if (KeyIn1 == 0) { val = 1; //while (KeyIn1 == 0); //等待按键抬起 } else if (KeyIn2 == 0) { val = 2; //while (KeyIn2 == 0);//等待按键抬起 } else if (KeyIn3 == 0) { val = 3; //while (KeyIn3 == 0);//等待按键抬起 } return val; }
18
6 调试与结果
6.1 调试
在调试过程中,曾遇到以下问题:
1) 当硬件连接无误,在系统启动后数码管不显示,系统没有反应,这种情况有以下几种可能:第一,硬件电路中存在虚焊,或电路接线焊错;第二,芯片插反了导致电路短路;第三,数码管电路焊接错误。
遇到这种情况首先要用万用表检查芯片的供电电压是否为5V,如果不是就检查供电电路有没有问题。如果两端有电压就看看芯片插反没有。
2) 系统启动数码管显示不正常,这有可能是背光调节电位器阻值不合适,需要调节一下控制背光的10K电位器。
3) 系统显示不稳定,这有可能是电压不稳定,或者ATS52芯片的31引脚EA引脚没有接高电平。
6.2 系统测试
6.2.1 按键的测试
时间校正:打开电源,显示实时时间,按手动校正“按键2”,对小时加,按手动校正“按键3”,对分钟加。
定时时间的调整:按下手动校正“按键1”,按一下,第一路插座的红色指示灯亮,是对第一路插座定时开始时间的设定,再按手动校正“按键2”,小时加,按手动校正“按键3”,分钟加。再按手动校正“按键1”,绿色指示灯亮,是对第一路插座结束时间的设定,设定方法同开始时间;再按依次按手动校正“按键1”对第二路插座开始、结束时间进行设定,方法同第一路插座。
如果其中一个按键不能使用就用万用表检查是否存在虚焊,是否和地接触完好等。在调试初期,按键每按下一次数字跳动好几次,在检查硬件没有问题后检查程序,在程序上面加了防抖动的程序,问题解决。
19
6.2.2 定时设定测试
通过按键设置定时时间,插座供电有开始和结束时间,经测定定时开始11:20,定时结束时间12:31,时间开始时指示灯亮,定时结束,播放音乐,并自动断电。
6.3 系统误差分析
本系统的误差来源主要有:
1) DS1302时钟芯片本身的问题,这个可以通过测试,测试出在一定时间内时间误差是多少,在系统程序中调节弥补误差。
2) 系统的外围器件像晶振等带来的误差,这种情况要求我们在焊接的时候元器件布局要合理,保证线路质量,最大程度的减少误差。
20
7 总结与展望
经过软件硬件的结合调试,最后搭建成了一个由单片机控制的带时钟显示功能的定时插座,经检测工作状态良好,达到了预期的效果。总之,系统存在以下优点和一些需要改进的地方。
1、系统带有时钟芯片,并有电池供电,可以准确显示实时时间。 2、按键少,操作简单; 3、带有音乐提醒功能。
4、数码管太大,如果批量生产时可采用小的液晶屏;
5、继电器有电火花,有一定的使用寿命;
6、如果电路对功率等有要求可以加上功率显示电路;
7、本系统是用USB供电的,实际应用不方面,可考虑使用降压电路。 目前市场上的定时插座产品种类繁多,在导师的帮助下,我做完了这个毕业设计,总的来说,我只做到了最基本的要求。在设计制作过程中遇到了很多问题,比如由于对于元器件的不熟悉导致了把执行电路中元件的正负极弄反了。导致自己走了很多弯路,浪费了很多时间等等。这些都是我以后工作的经验。定时类插座的研究还要继续下去,我所做的东西体积还不够小,而且负载的功率也不能达到很大,插座本身消耗的功率也没有降到最低。在将来研究过程中,
【11】
主要
目标应是与通信等其他学科联系起来,研究出来功能更加齐全,更智能,比如可以防雷,可以防触电,能声控或光控,甚至是远程控制,并且使用周期长,价格低廉,承受的负载高,自身消耗小的定时插座。
21
结束语
在毕业设计过程中,用到了很多原来学过的知识,不断地翻看原来的教材,巩固了在大学4年内学过的知识,尤其是单片机和模拟电子方面的知识,不仅拓宽了知识面,还强化了自己的综合性、实际性。通过实验使自己掌握了应用单片机的基本技能,培养了动手能力,观察能力,分析和解决实际问题的能力,巩固、加深理论课知识,增加感性认识,进一步加深对单片机应用的理解,提高对单片机的应用能力和编程设计,提高对常见单片机设计及电路故障的分析和判断能力;进一步加深对单片机应用的理解,提高对单片机的应用能力和编程设计。同时,获得了很丰富的软件调试经验,加强了我的实际编程能力,也让自己更加的知道了自己在知识领域里的不足和缺陷。
由于时间太仓促,经验仍不足,理论方面也相应的存在不足,加上条件有限,本设计仍存在着一些方面的问题,个人技能也有待提高。理论知识还要巩固加强。
22
致 谢
冬天的孕育是春天的收获,在这奋斗的季节里请允许我怀着感恩的心向那些在我的学业上、生活中给予我帮助和鼓励的人们表示衷心的谢意!
所谓厚积薄发,论文是大学四年所学知识的整合,所以首先,我要感谢大学所有教授过我知识的教风不同的老师们。更应该感谢我的导师XXX,X老师渊博的知识,严谨的教学态度以及诲人不倦的精神将永远激励着我,成为我学习的榜样,有了他的指导才使我的论文得以顺利完成!还有实验中心的周伟老师,单位研发部的闫诚鲁工程师,他们在我软件编程、硬件制作的过程中给予我了很大的帮助。在此谨向X老师、X老师和闫工及其他关心我教育我的老师、同事表示衷心的感谢和诚挚的敬意!
我尤其要感谢我的父母,他们为我上大学付出了很多,吃了很多苦,我才能顺利完成学业,今天我终于学有所成,要特别感谢我的父母!还有我的朋友们,在枯燥的时候我们相互鼓励、共同前进,在知识海洋里的任意遨游使我发现着文字的美丽,分享着痛苦与快乐,创造着我们共同的胜利时刻。
最后,我要感谢辛勤养育我的亲人们,帮我克服了懒惰加快了论文进程。 总之,论文的完成,让我体会到了成功的喜悦,也希望你们能陪我一起分享,并祝愿亲朋好友,各位老师们万事如意!再向大家道一声“谢谢” !
23
参考文献
[1] 李群芳,肖看.单片机原理、接口及应用.北京:清华大学出版社,2006 [2] 戢卫平等.单片机系统开发实例经典.北京:冶金工业出版社,2005 [3] 侯俊杰.深入浅出MFC(第二版).武汉:华中科技大学出版社,2007
[4] 李朝青.单片机原理及接口技术(第三版).北京:北京航空航天大学出版社,2005,58- [5] 谭浩强.C程序设计(第三版).北京:清华大学出版社,2005,37-47,92-108 [6] 黄庆华.单片机开发技术与实训.北京:电子工业出版社,2006
[7] 于京.51系列单片机C程序设计与应用方案.北京:中国电力出版社,2004 [8] 沙占友.单片机外围电路设计.北京.电子工业出版社,2006 [9] 戴佳.51单片机C语言设计实例精讲.北京:电子工业出版社,2007 [10] 周坚.单片机C语言轻松入门.北京:北京航空航天大学出版社,2008 [11] 唐晓强. 中国通信产业研究 http://www.drcnet.com/html-document/guoyan
24
附录1
系统源程序如下:
/*
* 定时插座 */
/***************************************************** * 文件名:music.C
* 功能:播放音乐,定时器T0产生音调,定时器T1控制节拍。 * 说明:2011-04-14
*****************************************************/
#include #define A 0xEFA3 // 110.000Hz A #define As 0xF08E // 116.1Hz A# #define B 0xF16C // 123.471Hz B #define c 0xF23D // 130.813Hz c #define cs 0xF303 // 138.591Hz c# #define d 0xF3BE // 146.832Hz d #define ds 0xF46E // 155.563Hz d# #define e 0xF514 // 1.814Hz e #define f 0xF5B1 // 174.614Hz #define fs 0xF5 // 184.997Hz f# #define g 0xF6D1 // 195.998Hz g #define gs 0xF755 // 207.652Hz g# #define a 0xF7D1 // 220.000Hz a #define as 0xF847 // 233.082Hz a# #define b 0xF8B6 // 246.942Hz b #define c1 0xF91F // 261.626Hz c1 (C) #define c1s 0xF982 // 277.183Hz c1# #define d1 0xF9DF // 293.665Hz d1 #define d1s 0xFA37 // 311.127Hz d1# #define e1 0xFA8A // 329.628Hz e1 #define f1 0xFAD9 // 349.228Hz f1 #define f1s 0xFB23 // 369.994Hz f1# #define g1 0xFB68 // 391.995Hz g1 #define g1s 0xFBAA // 415.305Hz g1# #define a1 0xFBE9 // 440.000Hz a1(标准音) #define a1s 0xFC24 // 466.1Hz a1# #define b1 0xFC5B // 493.883Hz b1 #define c2 0xFC8F // 523.251Hz c2 #define c2s 0xFCC1 // 5.365Hz c2# #define d2 0xFCEF // 587.330Hz d2 #define d2s 0xFD1B // 622.2Hz d2# 25 #define e2 0xFD45 // 659.255Hz e2 #define f2 0xFD6C // 698.456Hz f2 #define f2s 0xFD91 // 739.9Hz f2# #define g2 0xFDB4 // 783.991Hz g2 #define g2s 0xFDD5 // 830.609Hz g2# #define a2 0xFDF4 // 880.000Hz a2 #define a2s 0xFE12 // 932.328Hz a2# #define b2 0xFE2D // 987.767Hz b2 #define c3 0xFE48 // 1046.500Hz c3 #define c3s 0xFE60 // 1108.730Hz c3# #define d3 0xFE78 // 1174.660Hz d3 #define d3s 0xFE8E // 1244.510Hz d3# #define e3 0xFEA3 // 1318.510Hz e3 #define f3 0xFEB6 // 1396.910Hz f3 #define f3s 0xFEC9 // 1479.980Hz f3# #define g3 0xFEDA // 1567.980Hz g3 #define g3s 0xFEEB // 1661.220Hz g3# #define a3 0xFEFA // 1760.000Hz a3 #define a3s 0xFF09 // 18.660Hz a3# #define b3 0xFF17 // 1975.530Hz b3 #define T 1000 unsigned char TH0_Reload; unsigned char TL0_Reload; extern uint8 Led_buf[4]; typedef struct { unsigned int frq; //频率对应的计时初值 unsigned int dly; //时长 }struct_tbl; code struct_tbl Table[]= // { {e1,T}, {g1,T/2+T/4}, {a1,T/4}, {c2,T/2+T/4}, {d2,T/4}, {a1,T/4}, {c2,T/4}, {g1,T/2}, {g2,T/2+T/4}, {c3,T/4}, {a2,T/4}, {g2,T/4}, {e2,T/4}, {g2,T/4}, {d2,T*2}, {d2,T/2}, {d2,T/4}, {e2,T/4}, {b1,T/2}, {a1,T/2}, 26 {g1,T/2+T/4}, {a1,T/4}, {c2,T/2}, {d2,T/2}, {e1,T/2}, {c2,T/2}, {a1,T/4}, {g1,T/4}, {a1,T/4}, {c2,T/4}, {g1,T*2}, {e2,T/2+T/4}, {g2,T/4}, {b1,T/2}, {d2,T/2}, {a1,T/4}, {c2,T/4}, {g1,T+T/2}, {e1,T/4+T/8}, {g1,T/8}, {e1,T/2}, {g1,T/4+T/8}, {a1,T/8}, {b1,T/4}, {d2,T/4}, {a1,T+T/2}, {g1,T/4}, {a1,T/4}, {c2,T/2+T/4}, {d2,T/4}, {g2,T/2}, {e2,T/2}, {d2,T/2}, {e2,T/4}, {d2,T/4}, {c2,T/2}, {a1,T/4}, {g1,T/4}, {e1,T}, {c2,T}, {a1,T/4+T/8}, {c2,T/8}, {a1,T/4}, {g1,T/4}, {e1,T/4}, {g1,T/4}, {a1,T/4}, {c2,T/4}, {g1,T*4}, {0,T}, {0,T}, 27 {0,0} //结束标志 }; extern int8 scan_key(void); extern void show_flash(void); /**************************************************** *名称:Delay() *功能:利用定时器1延时,t为1延时1mS,为2延时2mS... *入口参数:t 延时参数 ****************************************************/ int8 ddelay(unsigned int t) { uint16 tt; while(t--!=0) { TH1=0xFC; // TL1=0x66; //定时1mS TR1=1; //开启T1 while(!TF1); //等待T1溢出 TR1=0; //关闭T1 TF1=0; //清除溢出标志位 tt = t%16; if (tt == 0) { LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED_IO = Led_buf[0]; LED1 = 0; } else if (tt == 1) { LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED_IO = Led_buf[1]; LED2 = 0; } else if (tt == 8) { LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED_IO = Led_buf[2]; LED3 = 0; } else if (tt == 12) { LED1 = 1; LED2 = 1; LED3 = 1; 28 LED4 = 1; LED_IO = Led_buf[3]; LED4 = 0; } if (scan_key() != -1) { BeepIO = 1; while (scan_key() != -1); return 1; } } return 0; } /**************************************************** *名称:timer0() *功能:定时器0中断服务程序 *入口参数:无 ****************************************************/ void timer0() interrupt 1 { TR0=0; TH0=TH0_Reload; TL0=TL0_Reload; TR0=1; BeepIO = ~BeepIO; } /**************************************************** *名称:play() *功能:播放一个音符 *入口参数:aa T0初始值,bb 音符时长 *出口参数:无 ****************************************************/ int8 play(unsigned int aa, unsigned int bb) { TR0=1; TH0_Reload=aa>>8; //高八位初始值 TL0_Reload=aa; //低八位初始值 if (ddelay(bb)) //延时 return 1; TR0=0; if (ddelay(20)) //每个音符之间的间隔 return 1; return 0; } /**************************************************** *名称:main() *功能:播放一段乐曲 ****************************************************/ void play_music(void) { unsigned char tmp=0; //第几个音符 29 TMOD=0x11; EA=1; ET0=1; TH0=0xF7; TL0=0xD1; TR0=1; while(Table[tmp].frq!=0) { if (play(Table[tmp].frq,Table[tmp].dly)) { TR0=0; return; } tmp++; } } /* * 字符数据 */ #include \"word.h\" //*****************************Music****************************************************** //梁祝 code uint8 Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x02, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 30 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03, 0x15,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x04, 0x18,0x03, 0x18,0x03, 0x17,0x04, 0x18,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x04, 0x1B,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x03, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x18,0x02, 0x18,0x03, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x02, 0x18,0x03, 0x16,0x02, 0x17,0x02, 0x15,0x03, 0x00,0x03 }; #include \"main.h\" #include \"DS1302.h\" #include \"word.h\" #include \"buzz.h\" TIME time; Codeuint8Ledcode[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; uint8 Led_buf[4], Led_n=0, Tmp_min, Menu=0, Alarm_hour[4], Alarm_min[4]; extern void play_music(void); /* * 延时程序 */ 31 void delay(uint16 n) { while (n--); } /* * 毫秒延时程序 */ void delay_ms(uint16 n) { uint8 m=120; //延时1ms while (n--) while (m--); } /* * 初始化IO */ void IO_init(void) { LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; SW1 = 1; SW2 = 1; } /* * 关闭数码管显示 */ void show_close(void) { LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; } /* * 按键扫描 */ int8 scan_key(void) { int8 val=-1; if (KeyIn1 == 0) { val = 1; //while (KeyIn1 == 0); //等待按键抬起 } else if (KeyIn2 == 0) { val = 2; //while (KeyIn2 == 0);//等待按键抬起 } else if (KeyIn3 == 0) 32 { val = 3; //while (KeyIn3 == 0);//等待按键抬起 } return val; } /* * 数码管显示 */ void show_time(uint8 hour, uint8 min) { Led_buf[0] = Ledcode[hour/10]; Led_buf[1] = Ledcode[hour%10]; Led_buf[2] = Ledcode[min/10]; Led_buf[3] = Ledcode[min%10]; } /* * 数码管刷新 */ void show_flash(void) { LED_IO = Led_buf[0]; LED1 = 0; delay_ms(4); LED1 = 1; LED_IO = Led_buf[1]; LED2 = 0; delay_ms(4); LED2 = 1; LED_IO = Led_buf[2]; LED3 = 0; delay_ms(4); LED3 = 1; LED_IO = Led_buf[3]; LED4 = 0; delay_ms(4); LED4 = 1; } main() { int8 key_val=-1, flag=1, key_tmp, i; bit a1_flag=0, a2_flag=0; IO_init();//初始化IO //set_time((uint8 *)&time); read_time((uint8 *)&time);//读时间 show_time(time.hour, time.min);//显示时间 Tmp_min = time.min;//更新暂存秒 while(1) 33 { key_tmp = scan_key();//按键扫描 if (key_val != key_tmp) { key_val = key_tmp; flag = 1; } if (key_val != -1)//判断键值 { while (1) { if (flag == 1) { if (key_val == 1) //切换界面 { Menu++; if (Menu >= 5) Menu = 0; if (Menu == 0) { read_time((uint8 *)&time);//读时间 show_time(time.hour, time.min);//显示时间 Tmp_min = time.min; } else { show_time(Alarm_hour[Menu-1], Alarm_min[Menu-1]);//显示定时时间 } LED_1 = 1; //刷新LED指示灯 LED_2 = 1; LED_3 = 1; LED_4 = 1; switch (Menu) { case 1: LED_1 = 0; break; case 2: LED_2 = 0; break; case 3: LED_3 = 0; break; case 4: LED_4 = 0; break; default: break; } } else if (key_val == 2)//调整小时 { if (Menu == 0) { time.hour++; if (time.hour >= 24) time.hour = 0; show_time(time.hour, time.min);//显示时间 set_time((uint8 *)&time);//设定时间 } else { Alarm_hour[Menu-1]++; if (Alarm_hour[Menu-1] >= 24) 34 Alarm_hour[Menu-1] = 0; show_time(Alarm_hour[Menu-1], Alarm_min[Menu-1]);//显示定时时间 } } else if (key_val == 3)//设定分钟 { if (Menu == 0) { time.min++; if (time.min >= 60) time.min = 0; show_time(time.hour, time.min);//显示时间 set_time((uint8 *)&time);//设定时间 } else { Alarm_min[Menu-1]++; if (Alarm_min[Menu-1] >= 60) Alarm_min[Menu-1] = 0; show_time(Alarm_hour[Menu-1], Alarm_min[Menu-1]);//显示定时时间 } } } flag = 0; key_tmp = scan_key();//按键扫描 if (key_val != key_tmp) { key_val = key_tmp; flag = 1; } if (Menu == 0) //当前时间界面 break; show_flash(); } } read_time((uint8 *)&time);//读时间 if (Tmp_min != time.min) { show_time(time.hour, time.min);//显示时间 Tmp_min = time.min; a1_flag = 0; a2_flag = 0; } // 定时判断 for (i=0; i<4; i++) { if (time.hour == Alarm_hour[i]) { if (time.min == Alarm_min[i]) { switch (i) 35 { } } } } show_flash(); } } case 0: SW1 = 0; break; case 1: SW1 = 1; if (a1_flag == 0) { play_music(); a1_flag = 1; BeepIO = 1; } break; case 2: SW2 = 0; break; case 3: SW2 = 1; if (a2_flag == 0) { play_music(); a2_flag = 1; BeepIO = 1; } break; default: break; 36 附录2 系统电路图: 37 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务