单片机课程设计-作息时间控制器

更新时间:2024-05-19 06:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

河南理工大学

—电子设计综合训练报告

作息时间控制器

姓 名:李晓宇 付道义 学 号:310708020814

310708020810 专业班级:自动化07-8 指导老师:谭兴国

所在学院:电气工程与自动化学院

2010年7月 2 日

作息时间控制器

摘要

本设计是作息时间控制器,由单片机最小系统、按键模块、数码管显示模块、闹钟模块组成。采用单片机AT89S52与12MHZ晶振相连;通过按键K1、K2、K3、K4控制时间的校正、闹钟时间设定;数码管显示模块用来显示时间,显示格式为“时分”,并能够根据需要显示年、月、日,由数码管小数点闪动作为秒计数;闹钟模块进行到时提醒并作出相应动作:发光二极管闪亮,同时播放音乐。

本设计中,利用单片机定时器设计时间计时处理,采用单片机内部的T0定时器溢出中断来实现,工作在T1方式下,定时50微妙,则连续中断20次即为一秒,得到了我们所需时间的最小单位秒,60秒为一分,60分为一小时,24小时为一天,1、3、5、7、8、10、12月为31天,4、6、9、11月为30天,闰年二月为29天,非闰年二月为28天,12个月为一年。采用这种时间设计思想来进行时间设置。

在整个系统的设计中,单片机的P0口输出显示信号,P1口按键输入控制、P2口用来扫描,为动态显示、P3口闹钟模块。

该设计用C51编写程序,由于汇编语言的移植性比较差,而C语言则比较灵活。许多子函数都可以直接移植过去。

作息时间控制器

目录

摘要................................................................................................................................................... 1 目录................................................................................................................................................... 2 1概述................................................................................................................................................ 1

1.1 51单片机简介 ................................................................................................................ 1 1.2 设计要求及功能 .............................................................................................................. 1 1.3 本设计实现的功能 ......................................................................................................... 1 2 系统总体方案及硬件设计 ........................................................................................................... 2

2.1 系统总体方案框图 .......................................................................................................... 2 2.2 按键控制模块 .................................................................................................................. 3 2.3 时间显示模块 .................................................................................................................. 4 2.4 闹钟模块 ......................................................................................................................... 4 3软件设计 ........................................................................................................................................ 5

3.1 系统软件设计思想 ......................................................................................................... 5 3.2 系统主程序 ...................................................................................................................... 5 3.3 中断子程序 ...................................................................................................................... 6 3.4 按键扫描子程序 .............................................................................................................. 8 4 Proteus软件仿真 ........................................................................................................................... 9

4.1 Proteus软件简介 ............................................................................................................. 9 4.2 Proteus软件仿真 ........................................................................................................... 9 5课程设计体会 .............................................................................................................................. 13 参考文献: ..................................................................................................................................... 14 附1:源程序代码 .......................................................................................................................... 15 附2:系统原理图 .......................................................................................................................... 25

2

作息时间控制器

1概述

1.1 51单片机简介

单片微型计算机简称单片机,即把组成微型计算机的各个功能部件,如中央处理器、随机存储器、只读存储器、I/O接口电路、定时器/计数器以及串行通信接口等集成在一块芯片上,构成一个完整的微型计算机。

由于单片机主要面对的是测控对象,突出的是控制功能,所以它从功能和形态上来说都是应测控功能领域应用的要求而诞生的。随着单片机技术的发展,它在芯片内集成了许多面对测控对象的接口电路,如ADC、DAC、高速I/O口、脉冲宽度调制器、监视定时器等,这些接口电路已经突破了微型计算机传统的体系结构,所以单片机也成为微型控制。 51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。

1.2 设计要求及功能

本设计是作息时间控制器,其设计实现的功能主要有:使用4位七段显示器来显示现在的时间,显示格式为“时分”,由LED闪动作为秒计数表示。可以设定作息时间,并进行到时提示。能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。

1.3 本设计实现的功能

本设计实现的功能为:使用七段显示器显示时间,显示格式为“时分”,并可显示日期,显示格式为“月日”,年份单独显示。可以设定作息时间,进行到时提示,并作出相应动作:发光二极管闪亮,同时播放音乐。

1

作息时间控制器

2 系统总体方案及硬件设计

2.1 系统总体方案框图

按键控制模块单片机最小系统数码管显示模块闹钟模块

图2-1 系统方框图

本次设计实现的功能主要有:使用4位七段显示器来显示现在的时间,显示格式为“时分”,由LED小数点闪动作为秒计数表示。可以设定作息时间,并进行到时提示。能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。

由按键输入控制设置年月日以及当前时间、并可设置闹钟定时,时间到由蜂鸣器发出响声并作出相应动作:二极管闪亮,同时播放音乐。

2

作息时间控制器

2.2 按键控制模块

图2-2按键控制模块

按键控制模块主要有由四个按键组成:K1、K2、K3、K4、。其中K1的功能是模式切换键;K2的作用是加一;K3的作用是闹钟使能;K4的作用是减一。

当需要设定时间或是校正时间,即可按下模式切换键来进行。校正时间:按第一次K1键,进入小时校正状态,通过按K2、K4键进行小时校正,按一下K2键则加一,按一下K3键则减一;按第二次K1键,进入分校正状态,通过按K2、K4键进行分钟校正;按第三次K1键,进入小时设定状态,此时若不需要设置则不操作;按下第四次K1键,进入分钟设定状态,若此时不需要设置则不操作;按下第五次K1键进入月份校正状态,通过按K2、K4键进行月份校正;按下第六次K1键,进入日校正状态,通过按K2、K4键进行日校正;按下第七次K1键进入年份校正状态,通过按K2、K4键来进行年份校正;校正完毕后,再按一次K1键,则退出时间校正状态,并显示当前校正后的准确时间。设定时间:按第一次K1键进入小时校正状态,此时若不需要设置,则不操作;以此类推,到第三次按下K1键,进入小时设定状态,通过按K2、K4键进行小时设定;按下第四次K1键,进入分钟设定状态,通过按K2、K4键进行分钟设定,设定完毕后,按一下K3键(闹钟使能);继续按K1键,若不需要设置,则不操作,以此类推,到按最后一次K1键则退出时间设定状态并显示当前时间,当时间与我们设定的时间一致时,通过闹钟电路响声提示,若要关闭闹钟,此时再按一次K3键即可停止响声。

3

作息时间控制器

2.3 时间显示模块

1p0.0p0.1p0.2p0.3p0.4p0.50.60.723456789p2.0p2.1p2.2p2.3

图2-3显示模块

时间显示模块主要由四位数码管来显示,配合按键控制模块的校正与设定时间,相应的显示。时间正常显示时,LED每闪动60次,分钟自动加一;每六十分钟小时自动加一;每24小时天自动加一。

2.4 闹钟模块

图2-4闹钟音乐模块

闹钟模块快的主要功能:闹铃。当设定时间与当前时间一致时,则闹钟自动闹铃进行提示,同时二极管闪亮一分钟后,自动退出响铃状态,若按K3键,闹钟退出响铃状态。

4

作息时间控制器

3软件设计

3.1 系统软件设计思想

本系软件设计中,利用单片机定时器设计时间计时处理,采用单片机内部的T0定时器溢出中断来实现,工作在T1方式下,定时50微妙,则连续中断20次即为一秒,得到了我们所需时间的最小单位

该设计用C51编写程序,由于汇编语言的移植性比较差,而C语言则比较灵活。许多子函数都可以直接移植过去。在程序中除了有主函数外还包含许多子函数,如延时函数、按键扫描函数、初始化函数、时间显示函数、设定闹钟显示函数、设定日期显示函数、设定年份显示函数、月份选择函数、年份显示辅助函数。

3.2 系统主程序

在主控程序循环中主要工作为扫描是否有按键,若有按健则做相应的功能处理,同时也扫描显示器显示时间数据,并检查所设置的时间是否到了。时间计时处理程序是等过了1s后,则更新时间数据,将最新的时、分的数据转换为数字数据并显示在七段显示器上。

5

作息时间控制器

蜂鸣器初始化定时器初始化按键扫描判断标志位XX=0X=1、2X=3、4校正时间显示函数设定闹钟显示函数X=5、6X=7时间显示函数日期显示函数年份显示函数

图3-2主程序流程图

3.3 中断子程序

中断子程序的主要功能:提供时间基准。当连续中断20次时,即为一秒,此时秒加一;当秒值为60时,分钟加一,同时秒清零;当分钟值为60时,小时加一,同时分钟值清零;当小时为24时,天值加一,同时小时清零;由于每月天数不定,1、3、5、7、8、10、12月为31天,当计数到此类月份时,天值为32时,月值加一,同时天值为1;4、6、9、11月为30天,当计数到此类月份时,天值为31时,月值加一,同时天值为1;如果是闰年,则2月为29天,当计数到此类月份时,天值为30时,月值加一,同时天值为一;如果不是闰年,则2月为28天,当计数此类月份时,天值为29时,月值加一,同时天值为一;当月值为13时,则年值加一,同时月值为一。

6

作息时间控制器

设置定时器初值是否到一秒?Y秒变量加一Y是否到60秒?N返回主函数N秒值清零、分值加一Y是否到60分?N分值清零、小时加一Y是否到24小时?N小时清零、天值加一Y是否到一月?N天值为1、月值加一Y是否到一年?N月值为1、年值加一

图3-3定时器中断函数

7

作息时间控制器

3.4 按键扫描子程序

按键扫描子程序是程序计中相当重要的一部分。按键扫描子程序的功能是:扫描是否有按键按下,若有键按下,则执行相应功能。

是否有键按下?Y按键1模式按键切换处理按键2响应设定变量加一

图3-4按键扫描子程序

N返回按键3按键4相应设定变量减一闹钟使能 8

作息时间控制器

4 Proteus软件仿真

4.1 Proteus软件简介

Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有近20年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,Proteus能够很容易的为用户建立了完备的电子设计开发环境。 Proteus产品系列也包含了革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。不愧为一款非常优秀的单片机仿真软件。

Proteus组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。此系统受益于15年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“The Route to PCB CAD”。Proteus产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。

其功能模块:—个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真; ARES PCB设计. PROSPICE仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型.

》支持许多通用的微控制器,如PIC,***R,HC11以及8051.

》交互的装置模型包括:LED和LCD显示,RS232终端,通用键盘, 》强大的调试工具,包括寄存器和存储器,断点和单步模式 》IAR C-SPY和Keil uVision2等开发工具的源层调试 》应用特殊模型的DLL界面-提供有关元件库的全部文件

Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验

和工程应用间脱节的矛盾和现象。

4.2 Proteus软件仿真

初始界面:启动Proteus进行仿真时显示的初始化时间。初始界面仿真图如图4-2-1所示。

9

作息时间控制器

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-1时间显示仿真图

时间校正:当我们需要正确的显示时间即可进行时间校正,按一下K1即进入小时校正状态,通过K2加一或K4减一来进行小时校正,再按一次K1键即可进行分钟校正,校正原理同小时校正相同。其仿真图如图4-2-2所示。

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-2 时间校正仿真图

闹钟设定:当我们需要闹钟提醒时即可使用此功能,连续按三下K1键即可进入闹钟小时设定状态,通过K2键加一或K4键减一,进行小时设定,再按一次K1键即可进行分钟设定,其设定原理与小时设定原理相同,按一下K3键,则时间设定完毕,到时会自动响铃。

10

作息时间控制器

其仿真图如图4-2-3所示。

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-3闹钟设定仿真图

日期校正:当我们需要与当前日期保持一致时,则可以使用日期校正功能,连续按动五次K1键,则进入月份校正状态,通过K2加一键或K4减一键进行校正月份,再按一次K1键,则可进行日期校正,校正原理同月份校正原理相同。其仿真图如图4-2-4所示

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-4日期显示仿真图

年份校正:当我们需要保持年份与当前年份一一致时,则可以进行年份校正。连续按动七次K1键,即进入年份校正状态,通过K2加一键或K4减一键进行校正。其仿真图如图

11

作息时间控制器

4-2-5所示

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-5年份显示仿真图

闹钟响铃:当我们设定的时间与当前时间一致时,则闹钟就会自动响铃提示,与此同时发光二极管闪亮,一分钟后响铃停止,发光二极管熄灭,若在此期间按下闹钟使能键K3同样能使响铃停止,发光二极管熄灭。其仿真图如图4-2-6所示。

RP1RESPACK-81U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER

图4-2-6闹钟音乐播放仿真图

12

作息时间控制器

5课程设计体会

此次课程设计为期两个多星期,我们从中获益匪浅。本课程设计是《单片机原理与应用技术》的综合训练。从选题、确定方案、设计原理图、仿真、焊接的过程中,我们学到了很多,这对我们来说是一次将课本所学知识应用到具体实践中的一次考验。

虽然在这个过程中我们遇到了很多困难,编写程序需要一步一步并认真的调试,一个小小的错误都可导致整个程序的不可用;硬件仿真需要考虑硬件与软件的连调,才能保证硬件与软件协同工作。我们通过查阅资料、同学的帮助,最终基本解决这些问题,从而基本完成了课程设计的要求。在这个过程中我们学会了发现问题、分析问题并最终解决问题,为我们以后的工作和学习打下了一定的基础。

此次课程设计,也使我们发现了自己的缺点,课本所学知识与实践是有一定距离的,我们不仅要学好科学文化知识,更要积极的参与实践学习,真样才能有更大的收获,真正学到知识,要把理论与实际相结合,从而成为真正有用的人。

13

作息时间控制器

参考文献:

【1】 【2】 【3】 【4】

余发山 王福忠 徐州:中国矿业大学出版社2008年

[2]彭为,黄科,雷道仲.单片机典型系统设计实例讲解.2006年

[3]何立民.单片机应用技术选编.北京:北京航空航天大学出版社,2004. [4]杨刚,周群.电子系统设计与实践.北京:电子工业出版社,2004.

14

作息时间控制器

附1:源程序代码

#include #define uint unsigned int #define uchar unsigned char

uchar code a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//*************************************************************************************

sbit K1=P1^4; sbit K2=P1^5; sbit K3=P1^6; sbit K4=P1^7; sbit sd=P3^6; sbit BEEP=P3^7;

uchar m=5,h=20,sec=58,cnt=0,x,y,qian,bai,shi,ge; uchar set_h=12; uchar set_m=58; uchar month=7; uchar day=5; uchar th0_f; uchar tl0_f;

uint year=2010;

void delay(uchar t);//延时函数 void scankey(void); //按键扫描函数 void init(void); //初始化函数 void display(void);//显示函数

void set_time(void);//设定时间显示辅助函数 void set_day(void); //设定日期显示辅助函数 void m_choose(void); //月份选择函数 void bianhuan(void); //年份显示辅助函数 void bianhuan1(void);//时间显示辅助函数

changedata(uchar *song,uchar *diao,uchar *jie);音乐符号串解释函数 void play(uchar *songdata);//奏乐函数

//世上只有妈妈好

uchar code mamahao[]={

\ \ };

uchar code freq[36*2]={

0xA9,0xEF,//00220HZ ,1 //0

作息时间控制器

0x93,0xF0,//00233HZ ,1# 0x73,0xF1,//00247HZ ,2 0x49,0xF2,//00262HZ ,2# 0x07,0xF3,//00277HZ ,3 0xC8,0xF3,//00294HZ ,4 0x73,0xF4,//00311HZ ,4# 0x1E,0xF5,//00330HZ ,5 0xB6,0xF5,//00349HZ ,5# 0x4C,0xF6,//00370HZ ,6 0xD7,0xF6,//00392HZ ,6# 0x5A,0xF7,//00415HZ ,7 0xD8,0xF7,//00440HZ 1 //12 0x4D,0xF8,//00466HZ 1# //13 0xBD,0xF8,//00494HZ 2 //14 0x24,0xF9,//00523HZ 2# //15 0x87,0xF9,//00554HZ 3 //16 0xE4,0xF9,//00587HZ 4 //17 0x3D,0xFA,//00622HZ 4# //18 0x90,0xFA,//00659HZ 5 //19 0xDE,0xFA,//00698HZ 5# //20 0x29,0xFB,//00740HZ 6 //21 0x6F,0xFB,//00784HZ 6# //22 0xB1,0xFB,//00831HZ 7 //23 0xEF,0xFB,//00880HZ `1 0x2A,0xFC,//00932HZ `1# 0x62,0xFC,//00988HZ `2 0x95,0xFC,//01046HZ `2# 0xC7,0xFC,//01109HZ `3 0xF6,0xFC,//01175HZ `4 0x22,0xFD,//01244HZ `4# 0x4B,0xFD,//01318HZ `5 0x73,0xFD,//01397HZ `5# 0x98,0xFD,//01480HZ `6 0xBB,0xFD,//01568HZ `6#

0xDC,0xFD,//01661HZ `7 //35 };

//****************************** //音乐符号串解释函数

changedata(uchar *song,uchar *diao,uchar *jie) {

uchar i,i1,j;

char gaodi; uchar banyin;

16

作息时间控制器

uchar yinchang;//ò?3¤

uchar code jie7[8]={0,12,14,16,17,19,21,23};

*diao=*song; for(i=0,i1=0;;) {

gaodi=0; banyin=0; yinchang=4;

if((*(song+i)=='|') || (*(song+i)==' ')) i++;

switch(*(song+i)) {

case ',': gaodi=-12;i++; break;

case '`': gaodi=12;i++; break; }

if(*(song+i)==0) {

*(diao+i1)=0; *(jie+i1)=0; return; }

j=*(song+i)-0x30; i++; j=jie7[j]+gaodi;

yinc: switch(*(song+i)) {

case '#':

i++;j++; goto yinc;

case '-':

yinchang+=4; i++; goto yinc;

case '_':

17

作息时间控制器

yinchang/=2; i++; goto yinc;

case '.':

yinchang=yinchang+yinchang/2; i++;

goto yinc; }

*(diao+i1)=j;

*(jie+i1)=yinchang; i1++; } }

//****************************************** //奏乐函数

void play(uchar *songdata) {

uchar i,c,j=0; uint n;

uchar diaodata[40]; uchar jiedata[40];

changedata(songdata,diaodata,jiedata); TR1=1;

for(i=0;diaodata[i]!=0;i++) { tl0_f=freq[diaodata[i]*2]; th0_f=freq[diaodata[i]*2+1]; for(c=0;c

for(n=0;n<24;n++) {scankey(); if(y==0) { TR1=0; return; } display(); } }

TR1=0;

for(n=0;n<500;n++);

TR1=1;

18

作息时间控制器

}

TR1=0; }

void time0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; cnt++; if(y==1&&(set_h==h&&set_m==m))sd=~sd; else sd=1; if(cnt==20) { sec++; cnt=0; if(sec==60) { sec=0; m++; if(m==60) { m=0; h++; if(h==24) { h=0; day++; switch(month) { case 1:if(day==32){month++;day=1;}break; case 2:if(year%4==0){if(day==30){month++;day=1;}} else{if(day==29){month++;day=1;}}break; case 3:if(day==32){month++;day=1;}break; case 4:if(day==31){month++;day=1;}break; case 5:if(day==32){month++;day=1;}break; case 6:if(day==31){month++;day=1;}break; case 7:if(day==32){month++;day=1;}break; case 8:if(day==32){month++;day=1;}break; case 9:if(day==31){month++;day=1;}break; case 10:if(day==32){month++;day=1;}break; case 11:if(day==31){month++;day=1;}break; case 12:if(day==32){month++;day=1;}break; } if(month==13)

19

作息时间控制器

{ month=1; year++; } } } } if(x==0)bianhuan1(); } }

timer1() interrupt 3 {

TL1=tl0_f;TH1=th0_f; //调入预定值

BEEP=~BEEP; //取反音乐输出IO }

void main(void) { init(); while(1) { display(); scankey(); if(y==1&&(set_h==h&&set_m==m))play(mamahao); else BEEP=0; } }

void init(void) { BEEP=0; TMOD=0x11; TH0=0x3c; TL0=0xb0; ET0=1; TR0=1; ET1=1; TR1=0; EA=1; }

20

作息时间控制器

void display(void) { P2=0xfe; P0=a[qian]; if(x%2==1&&cnt>=10)P0&=0x00; delay(20); P2=0xfd; P0=a[bai]; if(x%2==1&&cnt>=10)P0&=0x00; else if(x==0&&cnt>=10)P0|=0x80; delay(20); P2=0xfb; P0=a[shi]; if(((x%2==0&&x!=0)||x==7)&&cnt>=10)P0&=0x00; delay(20); P2=0xf7; P0=a[ge]; if(((x%2==0&&x!=0)||x==7)&&cnt>=10)P0&=0x00; delay(20); }

void m_choose(void) { switch(month) { case 1:if(day==32)day=1;else if(day==0)day=31;break; case 2:if(year%4==0){if(day==30)day=1;else if(day==0)day=29;} else{if(day==29)day=1;else if(day==0)day=28;}break; case 3:if(day==32)day=1;else if(day==0)day=31;break; case 4:if(day==31)day=1;else if(day==0)day=30;break; case 5:if(day==32)day=1;else if(day==0)day=31;break; case 6:if(day==31)day=1;else if(day==0)day=30;break; case 7:if(day==32)day=1;else if(day==0)day=31;break; case 8:if(day==32)day=1;else if(day==0)day=31;break; case 9:if(day==31)day=1;else if(day==0)day=30;break; case 10:if(day==32)day=1;else if(day==0)day=31;break; case 11:if(day==31)day=1;else if(day==0)day=30;break; case 12:if(day==32)day=1;else if(day==0)day=31;break; } }

21

作息时间控制器

void set_time(void) { qian=set_h/10; bai=set_h; shi=set_m/10; ge=set_m; }

void set_day(void) { qian=month/10; bai=month; shi=day/10; ge=day; }

void bianhuan(void) { qian=year/1000; bai=year00/100; shi=year0/10; ge=year; }

void bianhuan1(void) { qian=h/10; bai=h; shi=m/10; ge=m; }

void scankey(void) { if(K1==0) { delay(20); if(K1==0) { while(K1==0); x++; if(x==3)set_time();

22

作息时间控制器

else if(x==5)set_day(); else if(x==7)bianhuan(); else if(x==8){x=0;bianhuan1();} } } if(K2==0) { delay(20); if(K2==0) { while(K2==0); switch(x) { case 0:break; case 1:h++;if(h==24)h=0;bianhuan1();break; case 2:m++;if(m==60)m=0;bianhuan1();break; case 3:set_h++;if(set_h==24)set_h=0;set_time();break; case 4:set_m++;if(set_m==60)set_m=0;set_time();break; case 5:day++;m_choose();set_day();break; case 6:month++;if(month==13)month=1;set_day();break; case 7:year++;bianhuan();break; } } }

if(K3==0) { delay(20); if(K3==0) { while(K3==0); y++; if(y==2)y=0; } } if(K4==0) { delay(20); if(K4==0) { while(K4==0); switch(x) {

23

作息时间控制器

case 0:break; case 1:h--;if(h==255)h=23;bianhuan1();break; case 2:m--;if(m==255)m=59;bianhuan1();break; case 3:set_h--;if(set_h==255)set_h=23;set_time();break; case 4:set_m--;if(set_m==255)set_m=59;set_time();break; case 5:day--;m_choose();set_day();break; case 6:month--;if(month==0)month=12;set_day();break; case 7:year--;bianhuan();break; } } } }

void delay(uchar t) //延时0.1毫秒{

uchar i; do {

for(i=0;i<23;i++) ;;;

} while(t--); }

24

作息时间控制器

附2:系统原理图

RP1RESPACK-81C133pFX1C233pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617CRYSTAL18XTAL2C3910uFRSTR310k293031PSENALEEA模式切换加一使能闹钟减一K1K2K3K412345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C5223456789D1LED-REDR2R12001kQ1NPNLS1SPEAKER 25

本文来源:https://www.bwwdw.com/article/hjm7.html

Top