基于μPD78F0485单片机实验盒的闹钟设计与实现【源码】
- 格式:doc
- 大小:227.50 KB
- 文档页数:25
单片机闹钟设计程序报告1. 引言闹钟作为人们日常生活中的常用物品,不仅有叫醒人们起床的功能,还可以作为提醒的工具。
随着科技的进步,单片机闹钟逐渐取代了传统的机械闹钟,成为人们生活中不可或缺的一部分。
本报告旨在介绍一个基于单片机的简单闹钟设计程序。
2. 设计方案本设计方案使用了单片机和数码管作为主要硬件,通过对单片机的编程,实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
2.1 硬件设计硬件方面,本设计基于某型号的单片机和数码管。
单片机通过相关的引脚与数码管相连,通过控制引脚的电平来显示不同的数字。
2.2 软件设计软件方面,本设计使用C语言编程实现。
主要的功能包括获取当前时间、显示时间、设置时间、设置闹钟时间、闹钟触发检测、蜂鸣器报警等。
3. 程序实现3.1 初始化设置在程序的开始部分,需要对单片机进行初始化设置。
包括设置引脚的输入输出模式、设置计时器、设置中断等。
3.2 时间显示为了实现时间显示的功能,我们需要通过单片机的计时器来不断获取当前时间,并将其转换为时、分、秒的格式。
然后通过数码管显示出来。
3.3 时间设置通过给单片机的某个引脚接入按钮,实现时间设置功能。
当按钮被按下时,单片机进入时间设置模式。
此时,用户可以通过另外的按钮来逐个调整时、分、秒的数值。
3.4 闹钟时间设置类似于时间设置,闹钟时间设置也需要通过按钮来实现。
用户可以按下对应的按钮来设置闹钟的时、分,设置完毕后,单片机会将设置的时间保存起来。
3.5 闹钟触发检测在每一次时间显示的循环中,程序都会检测当前时间是否与闹钟时间相符。
如果相符,则触发闹钟,蜂鸣器开始报警。
3.6 蜂鸣器报警通过单片机的一个输出引脚,连接到蜂鸣器,实现蜂鸣器的报警功能。
当闹钟触发时,单片机会给对应的引脚输出一个高电平,从而使蜂鸣器发声。
4. 总结通过对单片机闹钟设计程序的实现,我们成功实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
基于单片机的电子闹钟的设计摘要:本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃功能的电子闹钟。
当前电子钟开发手段采用了较多的分立元器件,不仅占用很大空间而且利用率比较低。
单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。
本设计应用单片机STC12C5A16AD芯片作为核心,由LCD1602液晶屏显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精度高,操作简单,编程容易。
关键词:电子闹钟,单片机,C语言编程1 绪论单片机是微型机的一个主要分支,就其组成和功能而言,一块单片机芯片就是一台计算机。
单片机具有如下特点:1集成度高、体积小、有很高的可靠性;有优异的性能价格比;2控制功能强;3低功耗、低电压,便于生产便携式产品;4外部总线增加了I2C、SPI等串行总线方式,进一步缩小了体积,简化了结构;5单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。
所以单片机的应用非常广泛,在智能仪表、机电一体化、实时控制、分布式多机系统以及人们的生活中均有用武之地。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思路和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种用软件代替硬件的控制技术,是对生产控制技术的一次革命。
利用单片机的智能性,可方便地实现具有智能的电子钟设计。
单片机均具有时钟振荡系统,利用系统时钟借助微处理器的定时器/计数器可实现电子钟功能。
然而系统时钟误差较大,电子钟的积累误差也可能较大,所以可以通过误差修正软件加以修正,或者在设计中加入高精度时钟日历芯片,以精确时间。
另外很多功能不同的单片机是兼容的,这就更便于实现产品的多功能性。
由于单片机具有货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,性价比高等诸多优点,故采用单片机作为本设计的硬件基础。
江西理工大学南昌校区毕业设计(论文)题目:基于单片机定时闹钟系统设计系别:信息工程系专业:电气自动化技术班级:09自动化2班学生:贺明波学号:09321229指导教师:刘秋平职称:助教摘要随着科技的快速发展和生活水平的不断提高,人们对时钟的精确度和实用性要求越来越高。
本文采用AT89S52单片机,通过DS1302日历芯片进行定时,并通过LCD1602液晶进行显示。
通过C语言程序编写,将设计出更准确定时、更省电的数字时钟。
单片机数字时钟具有设置时间、日期、星期的基本功能,并且能够显示年、月、日、时、分、秒、星期。
单片机数字钟不管在性能还是在样式上都发生了质的变化,实践证明单片机数字时钟具有更加准确性、精密性等功能。
关键字:数字时钟;DS1302;LCD1602;AT89S52AbstractIn daily life, time is science, technology and everyday life is one of the most basic physics, we often deal with temporal clocks, such as hand watch, wall clock, even on a computer program, the clock on the phone can be generalized a clock display on the clock, along with the rapid development of technology and the continuous improvement of living standards, people on the clock's accuracy and practical demand is higher and higher. Based on the single chip microcomputer principle, USES the monolithic integrated circuit AT89S52 series, through the hardware circuit and software production procedure formulation, will design a more accurate timing, electricity -saving digital clock, SCM in performance or digital clock no matter in style have undergone a qualitative change, digital clock has proved microcontroller more accuracy, precision sex etc. Function.Key Words:Digital clock ; DS1302; LCD1602;目录第一章引言 (1)1.1单片机的发展史 (1)1.2 单片机的应用 (1)1.3 单片机发展趋势 (2)1.4 数字时钟方案论证比较 (3)1.4.1 数字电路与单片机性能比较 (3)1.4.2数码管与LCD液晶显示性能比较 (4)1.4.3单片机编程时钟与时钟芯片性能比较 (4)第二章系统的硬件设计与实现 (6)2.1 系统概述 (6)2.2模块电路的设计 (7)2.2.1时钟电路 (7)2.2.3 复位电路与晶振电路 (11)2.3 总体电路图设计 (11)第三章系统的软件设计与实现 (13)3.1 程序功能 (13)3.2 编程思路 (13)3.3 程序设计流程图 (13)3.3.1 DS1302软件设计流程图 (14)3.3.2 LCD1602程序序流程图 (16)3.4写入显示数据到LCD子程序模块设计 (17)3.5时间闹铃设置流程 (18)第四章仿真软件Proteus ISIS使用方法简单介绍 (19)4.1 简介 (19)4.2 简单项目设计过程 (20)4.3仿真执行 (24)4.3.1一般仿真 (24)第五章系统组装与调试 (26)5.1 硬件系统的组装与调试 (26)5.2 软件调试 (27)总结 (29)参考文献 (30)附录1单片机定时闹钟程序源代码 (41)致谢 (41)第一章引言1.1单片机的发展史单片机是在一块硅片上集成了各种部件的微型计算机。
摘要这个设计时基于AT89C2051设计的电子时钟,通过对硬件资源和软件的编写,初步了解设计的思路以及实现过程。
电子闹钟是采用电子电路实现对时、分、秒进行数字显示的装置,广泛应用于个人家庭、医院、车站、码头、办公室等公共场所,成为人们日常生活中不可缺少的必需品。
本设计基于单片机技术原理,以AT89SC2051作为核心控制器,通过硬件电路的制作及软件程序的编制,设计制作了一种利用四位LED数码管动态扫描显示时间的电子闹钟系统。
整个电子闹钟系统主要由时间显示模块、时间设置、闹铃模块、闹钟响应模块。
可实现时间显示、时间调整、闹钟设置和整点闹铃功能,具有制作简单、调整方便、稳定性好、便于扩展等特点。
电子时钟还通过对比实际的数字电子时钟,来校正和调整,从而找出误差的来源,尽可能的减少误差,是系统可以达到实际数字电子时钟允许的误差范围内。
关键词:单片机AT89SC2051、电子闹钟、LED动态显示目录摘要 (I)1.引言 (1)2 系统设计 (1)2.1设计要求 (1)2.2总设计方案 (1)2.2.1 系统实现 (2)3系统硬件电路设计 (2)3.1时钟电路设计 (3)3.2显示模块的设计 (4)3.3按键模块的设计 (5)3.4复位电路设计 (5)3.5闹铃的设计 (6)3.6发光二极管闪烁电路设计 (6)4 软件设计 (7)4.1程序流程 (7)4.1.1主程序 (8)4.1.2 时钟走时模块 (9)4.1.3时间设置模块 (10)4.1.4闹钟设置模块 (11)4.1.5 奏乐模块 (11)5 系统测试 (15)5.1硬件调试 (15)5.2软件调试 (15)6 结论 (15)附录 (15)附录1器件清单 (15)附录2调试仪器 (16)附录3原理图和PCB图 (16)附录4实物 ............................................... 错误!未定义书签。
附录5程序清单 ........................................... 错误!未定义书签。
基于单片机的定时闹钟设计设计定时闹钟是人们日常生活中常见的需求之一,而单片机技术的发展为定时闹钟的实现提供了可行的解决方案。
本文将介绍基于单片机的定时闹钟设计。
一、研究背景及意义在现代社会中,时间是人们日常生活中非常重要的一个因素。
为了更好地规划时间和提高生活效率,人们需要定时提醒自己进行各种活动。
闹钟作为定时提醒的工具,在人们的日常生活中扮演着不可替代的角色。
而基于单片机的定时闹钟实现具有高精度、多功能等优点,因此备受人们青睐。
二、技术方案设计本文设计的基于单片机的定时闹钟主要由三部分组成:时钟电路、单片机控制电路和显示电路。
1. 时钟电路时钟电路采用RTC芯片,可以提供高精度的时间计量。
RTC芯片内部自带晶振,保证了较高的时钟精度。
时钟电路主要功能为提供当前时间,包括小时、分钟和秒。
2. 单片机控制电路单片机控制电路是实现定时闹钟的核心部分。
程序流程如下:①初始化:单片机启动后,需要对RTC芯片和闹钟设定进行初始化,包括设定当前时间和设定闹钟时间。
②计时函数:单片机开启定时器,在每秒钟时钟信号来临时,计时器会进行一次计数。
③闹钟判断:单片机判断当前时间是否等于闹钟设定时间,如果相等,则触发闹钟事件,启动蜂鸣器提示。
④按键设置:单片机可以通过按键进行时间设置和闹钟设置,包括增加或减少小时、分钟和秒数,并将设置信息保存至RTC芯片内存中。
3. 显示电路显示电路采用数码管进行显示,使用单片机控制输出数据。
数码管分为小时显示、分钟显示和秒显示,可以满足不同的显示需求。
三、实验结果分析通过实验结果可以发现,本文设计的基于单片机的定时闹钟可以准确地显示时间和定时提醒。
同时,可以通过按键进行时间和闹钟的设置,并存储至RTC芯片内部,保证了时间和闹钟的持久性。
四、结论及展望基于单片机的定时闹钟设计具有实用性和可行性,可以提高人们生活的效率和品质。
然而,本设计在信号筛选和抗干扰能力方面还有一定的改进空间,需要通过更深入的研究来进一步完善。
基于μPD78F0485单片机实验板的实时时钟程序设计与实现专业:计算机科学与技术班级: 11级学号:姓名:基于μPD78F0485单片机实验板的实时时钟程序设计与实现1实验环境硬件:PC、µPD78F0485单片机。
软件:Windows7操作系统、开发环境支持软件NEC Electronics Microcomputer、Microsoft Visio绘图2功能描述a)液晶屏可切换显示日期和时间。
b)具有日期和时间校对功能。
c)用LED1~LED12模拟秒针走动。
d)有闹钟功能。
3总体设计3.1显示设计a)在LCD上显示年月日,分别用两位数表示年月日。
年的值从00~99;月的值从01~12;日的值如果是2月,闰年为01~29,平年为01~28,其他月份大月为01~31,小月为01~30。
13.12.10年月日图 3.1.1年月日的显示b)在LCD上显示星期时分,分别用两位数表示星期时分。
星期的值从00~06,其中00表示星期天,其它的则一一对应;时采用24小时制,其值从00~23;分的值从00~59。
01.12.00星期时分图 3.1.2星期时分的显示c)在LCD上显示时分秒。
时采用24小时制,其值从00~23;分的值从00~59;秒的值从00~59。
12.00.00时分秒图 3.1.3时分秒的显示3.2时间显示切换设计设置一个全局变量i,初值为0。
每按一下KEY1,i的值加一。
当i = 0,1,2,3时,LCD 显示年月日。
当i = 4,5,6时,LCD显示星期时分。
当i = 7时,LCD显示时分秒。
当i >7 时,i自动变为0。
3.3日期和时间校对设计通过前面设置的全局变量i和KEY3来实现。
当i = 1时,每按一下KEY3,年的值就加一,直到大于99时自动变为00。
当i = 2时,每按一下KEY3,月的值就加一,直到大于12时自动变为01。
当i = 3时,每按一下KEY3,日的值就加一,直到大于当月天数时自动变为01。
基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
基于单片机电子闹钟的设计电子闹钟是一种基于单片机技术的智能设备,可以通过设置闹钟时间来提醒人们起床、上班或者进行其他活动。
本文将介绍基于单片机的电子闹钟的设计过程和实现功能。
首先,我们选择一款适合作为控制核心的单片机芯片。
常用的单片机有51系列和AVR系列,其中51系列的代表性芯片是STC89C52,AVR系列的代表性芯片是ATmega16、我们可以根据具体需求选择适合的芯片。
其次,我们需要设计电子闹钟的硬件电路。
主要包括时钟电路、显示电路、按键输入电路和报警电路。
时钟电路通过晶体振荡器产生准确的时钟信号,显示电路通过数码管或液晶屏显示时间等信息,按键输入电路用来设置闹钟和调整时间,报警电路则用来发出可听到的声音提醒。
在硬件设计完成之后,我们还需要编写单片机的软件程序。
首先,我们需要初始化各个硬件模块,包括时钟模块、IO口模块和定时器模块等。
然后,我们需要编写定时中断函数,用来更新显示时间。
接下来,我们需要编写按键处理函数,用来设置闹钟和调整时间。
最后,我们需要编写报警函数,通过发出蜂鸣器的声音来提醒。
设计的基本功能包括:设置时间、设置闹钟、调整时间、调整闹钟、报警功能等。
用户可以通过按键输入来设置时间和闹钟,并且可以通过按键调整时间和闹钟的设置。
当闹钟时间到达时,蜂鸣器会发出声音提醒用户。
同时,数码管或液晶屏会显示当前的时间。
为了提高闹钟的实用性,我们还可以添加一些其他功能。
例如,可以加入温湿度传感器来测量当前的环境温度和湿度,并在数码管或液晶屏上显示。
还可以加入闹铃音乐的选择功能,让用户可以选择自己喜欢的音乐作为报警铃声。
总之,基于单片机的电子闹钟设计涉及到硬件电路设计和软件程序编写两个方面。
通过合理设计硬件电路和编写完善的软件程序,可以实现各种实用的功能。
电子闹钟可以帮助人们准时起床、上班或进行其他活动,提高人们的时间管理能力和生活质量。
单片机闹钟实训单片机闹钟实训是一门常见的电子实训课程,它既有一定的理论基础,也充满了实际操作和编程项目。
在这篇文章中,我将向大家介绍单片机闹钟实训的一般步骤和实验流程。
一、实验背景和介绍:闹钟是我们日常生活中不可缺少的一项功能,通过设置时间和提醒音响起提醒我们进行一些必要的活动。
单片机闹钟实训就是利用单片机控制器和相关电路,实现一个基础的闹钟功能。
二、实验目的:1.了解单片机的基本原理和编程方法;2.掌握单片机与外围设备(LED、蜂鸣器等)的连接和控制方法;3.实现一个基本的闹钟功能,包括时间设置、闹钟设置、报警功能等。
三、实验器材和器件:1.单片机开发板或单片机模块;2.电脑;3.面包板;4.LED灯,用于显示时间和闹钟设置;5.蜂鸣器,用于报警。
四、实验步骤:1.硬件连接:首先,我们需要将单片机开发板和外部器件连接起来。
具体地,我们可以使用面包板将开发板和LED、蜂鸣器等器件进行连接。
需要注意的是,我们要按照单片机的引脚定义来进行正确的连接。
2.软件编程:接下来,我们需要对单片机进行编程。
可以使用C语言、汇编语言或者基于图形化编程软件进行编程。
这里,我将介绍一种常用的方法——C语言编程。
首先,我们需要编写一个主程序,用于控制总体的流程。
主程序可以包含两个子程序,分别用于获取当前时间和进行闹钟设置。
其中,获取当前时间的子程序可以调用系统的时钟函数,而进行闹钟设置的子程序可以通过按键输入等方式实现。
其次,我们需要编写一个报警子程序。
报警子程序可以通过控制蜂鸣器的高低电平产生声音。
可以设置不同的报警频率和持续时间。
最后,我们需要编译和下载程序到单片机中。
编译和下载的具体方法可以参考所使用的开发环境和开发工具的说明书。
3.测试和调试:在编程完成后,我们需要进行测试和调试。
首先,我们可以通过设置时间和闹钟来测试程序的基本功能。
当闹钟时间到达时,蜂鸣器应该会响起。
其次,我们还可以通过模拟不同的情况来测试程序的稳定性和鲁棒性。
校园自动打铃器作息时钟摘要本文介绍了以AT89S51单片机为控制核心的自动打铃器产品,该电路具有时钟功能,可通过产品的上的设置键对要报警的时间点逐个的设置进去,打玲器只要走到设置好的时间就能报警。
输出效果由报警模块与显示模块组成,显示模块主要采用数码管来显示时间,让人们可以看到自动打铃器的时间是否与我们生活的时间一致,如果有误差则可以通过按键对时间进行调整。
该打铃器是一种电路比较简单,功能完善,且比较实用的自动打铃器。
它不但可以适用于学校及企业工厂等场所。
关键字:单片机自动控制数码显示调整目录一.引言 (3)二.方案比较 (4)2.1方案一基于数模电路的自动打铃器 (4)2.2方案二基于A T89S51控制的自动打铃器 (5)三.硬件电路设计 (5)3.1微控制器 (5)3.2振荡电路 (6)3.3复位电路 (6)3.4控键电路 (7)3.5显示电路 (8)3.6报警电路 (9)四.软件系统设计 (10)4.1主程序设计 (10)4.2定时1mS子程序设计 (10)4.3显示子程序设计 (10)4.4软件抗干扰设计 (11)五.系统调试与测试 (13)5.1软件仿真 (13)5.2硬件电路安装 (14)5.2.1单片机振荡电路安装 (14)5.2.2单片机复位电路安装 (14)5.2.3单片机控键电路安装 (14)5.2.4单片机显示电路安装 (15)5.2.5单片机报警电路安装 (15)5.2.6整机电路安装与调试 (15)结束语............................................................................................................. 错误!未定义书签。
参考文献.. (16)附录1:总设计原理图 (17)附录2:源程序 (18)一.引言打铃器是一种广泛应用于企业和学校单位。
就以对学校单位而言,自动打铃器是为了对了广大师生的作息时间做更好的管理,它一种学校必备电子设备,也是一种逐渐成型的电子产品,打铃器多为小规模集成电路构成,其性能单一,工作起来不够理想。
《嵌入式系统应用技术基础》实验报告(二)基于μPD78F0485单片机实验盒的闹钟设计与实现专业:软件工程班级:09级学号:2009888888姓名:大神(一)设计环境及使用工具1.1硬件:1)PC:用于完成代码的设计及设计文档的制作;2)µPD78F0485单片机:接受来自PC的处理程序,并通过实验盒中的不同部件显示出来。
1.2软件:1)Windows7 操作系统:从开始设计到结束,使用自己的电脑,程序不需要提取出来,省区每次实验结束后都必须与原来的程序进行更新操作,方便了很多;2)开发环境支持软件NEC Electronics Microcomputer:在此软件中进行设计、执行与修改;3)Microsoft Visio 绘图:设计实验的流程图,使之更加调理;4)图片处理器:使用图片,将不容易表达的内容通过图片的方式表现出来,更加直观;5)其它辅助软件。
1.3参考书籍:嵌入式系统设计基础——单片机原理及应用。
(二)需求分析2.1需求简介:随着电子技术飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。
电子表已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使电子表具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的电子表集成电路芯片出售,价格便宜、使用也方便,但鉴于电子表电路的基本组成包括了数字电路的主要组成部分,因此进行电子表的设计是必要的,用汇编语言和C语言设计电子表显示程序,要求根据输入程序显示电子表设计方案。
研究电子表及扩大其应用,有着非常显示的意义。
2.2设计大体思路:鉴于目前的条件,设计完成的程序只能在实验盒上进行,因此必须发挥实验盒的作用。
通过LCD显示数字,通过LED灯表现需要显示的数字,通过按键控制LED和LCD。
2.3所设计程序名称为:nao2.4运行在µPD78F0485单片机上,实验盒上表现。
2.5主要功能为:a)显示当前时间和当前日期,可调整时间和日期b)显示当前的温度c)显示闹钟的时间和日期,可调整闹钟时间和日期d)显示铃声类型,LED的闪烁类型,可调e)显示多长时间报时,可调f)倒计时g)用LED灯显示LCD上的数字,在黑暗情况下也可知道此时的时间和日期(三)设计方案3.1设计要求:a) 要求使用单片机的端口功能(通过LED灯体现)、A/D转换功能、液晶显示功能、按键中断功能、外部中断功能、8位定时器50的定时器功能、实时计数器功能、蜂鸣器输出功能。
b) 自己设计1中要求所使用功能的分配和功能的如何使用。
c) 要求有总体设计描述及流程图和各个功能模块设计描述及流程图。
d) 提交设计报告纸质版和电子版各一份,再单独提交一份电子版的源程序代码文件(在记事本下编辑的.C文件,要有足够的注释)。
3.2预期设计方案及控制说明:(1)此电子闹钟主要功能:a)在LCD上显示当前时间,并可通过按键对其进行调整否开启闹铃星期时分秒b)在LCD上显示当前日期,并通过按键可对其进行调整2011年12月14日c)显示当前的室温23°e)在LCD上显示闹钟时间,决定是否开启闹钟,并可通过按键对其进行调整开启闹铃星期时分秒f) 在LCD上显示闹钟日期,并通过按键可对其进行调整2011年12月14日g)此程序设计了3种铃声,可开启或关闭铃声类型是否开启(1表示开启,0表示关闭)h)按多长时间报时,开启或关闭每隔1小时报时报时关闭i) 倒计时设置倒计时间为2小时,通过按键5确认后进行J)当闹铃响时或报时时显示的LED图案闪烁图案类型是否开启(2)LED及按键的控制说明:红:LED1 LED4 LED7 LED10 中间灯黄:LED2 LED5 LED8 LED11绿:LED3 LED6 LED9 LED12KEY1:主要控制模式的显示。
在LCD上显示时间,还是日期,还是铃声类型等,并可通过LED1~~LED9表示出来。
如:程序运行后,自动进入当前时间,LED1亮,通过KEY1键切换不同的模式,按一下,显示当前日期,同时LED1灭,LED2亮;不断的按下KEY1,逐次显示9种显示模式,LED1到LED9依次点亮;再进入模式1……KEY2:主要控制当前模式下的可更改情况。
如:程序运行后,将模式调至闹钟时间,第一次按下后,中间灯亮,调整星期,再次按下后LED10亮调至时,再次按下后LED11亮调整分,再次按下后调至秒……KEY3:加1KEY4:减1KEY5:确认键KEY6:将当前模式LCD上显示的数字通过LED表现出来。
如模式当前时间为1315:2343 即当前闹钟开启,星期三,时间为15时23分43秒。
当按下KEY6后,将数字依次通过LED1到LED12表现,1表示LED1亮,5表示LED~LED5亮,依次类推……LED10: 年时LED11:月分LED12:日秒中间灯:星期(四)程序设计(包括程序结构表、程序流程图)表1电子闹钟程序结构表图1 电子闹钟程序流程图(五)设计中遇到的主要问题及解决办法a)问题:(1)编成能力还是很差;但较上次有一定的提高(2)LCD的数据显示:还是无法弄懂数据的显示规则,通过询问学长,初步了解了数据显示的理论;从开始看到在LCD上显示出来0~~9,用时2小时,当天下午做实验还是有一定的成就感的;如:Pokeb是一个地址一个地址的,pokew是一次显示两位地址;pokew(addr,0x0600); 高地址在左,显示为1同一地址中数据的高位与低位,是从COM3到COM0的;(3)预期实验中,LCD上显示的时间中间有“:”,一秒一秒的闪,但实时计数器了解不是很熟,导致现在也无法实现;但为了能在调整时间日期时知道是调整的哪一个,此程序通过LED10、LED11、LED12、中间灯来表现,同样可以达到效果;(4)在数据缓存中存数据时,总是需要相同的位数,有点浪费空间,暂时没有解决;b)解决方法:(1)继续加大代码编写,先从模仿开始;(2)对知识的掌握一定要深,要知道原理的机制,不然换一种情况就不知道怎么弄了。
(六)总结及展望(1)上次实验完全参考指导书18.2内容,无多少改进;实在是代码编写能力不行。
期末实验设计,一定要自己亲自编写,不管结果如何,努力了就可以。
通过一个月的学习与实验,并在老师与学长不惜辛苦的情况下,课程设计初露原形。
虽然有部分预期设计的内容(如倒计时)没有实现,但基本的电子闹钟是可以运行的;(2)代码编写能力是基础,不能很好的编成,就不能将学到的嵌入式功能运用自如;需要进一步提高代码编写能力,希望能在以后实验中完善其它功能;(3)通过本次为期一个月的课程设计,增强了对程序编辑和运行的了解,明确了它们各自的功能及具体的运用情况。
在子程序设计时,应仔细考虑哪些寄存器是必须保存的。
在设计中注意学习中断指令及中断向量的适用场所,因此应该在以后的学习中进一步的学习,使功能更好的体现。
这次期末设计,对单片机及系统软件从理论上到实践上有了一个转变。
为此特别感谢老师及学长的辛勤指教,如果没有你们的支持,现在也不可能编出我目前编的这么长得代码。
(七) 程序清单#pragma sfr#pragma NOP#pragma access#pragma DI#pragma EI#pragma rot#pragma interrupt INTKR OnKeyPress#pragma interrupt INTRTC half_sec_INTERRUPTunsigned int numbercode[10]={0x070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x07 0b};//0x0100// 0 1 2 3 4 5 6 7 8 9 :unsigned int addr;unsigned char i=1;//1显示当前时间,2显示当前日期,3显示温度,4显示闹钟日期,5显示闹钟时间,6显示铃声,7显示报时间隔,8倒计时,9灯闪烁图案unsigned char m1=0,m2=0,m4=0,m5=0,m6=0;//在某一模式下调整时间日期unsigned char n=0;//使?调整的成为闪烁状态unsigned int j=0;//定义中断INTRTC标志变量unsigned char KEY=0;//定义全局变量KEYunsigned int buf1[8];//当前时间缓冲区unsigned int buf2[8];//当前日期unsigned int buf3[8];//温度unsigned int buf4[8];//闹钟日期unsigned int buf5[8];//闹钟时间unsigned int buf6[8];//铃声unsigned int buf7[8];//报时unsigned int buf8[8];//倒计时unsigned int buf9[8];//灯unsigned int ling=0;//是否开启铃声unsigned int lingsheng=0;//铃声的调调unsigned int half_second=0,second=0,minute=0,hour=0; //初始化使0.5秒单元=0,秒单元=0,分单元=0,小时单元=0unsigned int day=1,week=1,month=1,year=2011; //初始化使日单元=1,星期=1,月单元=1,年单元=2011unsigned int half_second1=0,second1=0,minute1=0,hour1=0; //初始化使0.5秒单元=0,秒单元=0,分单元=0,小时单元=0unsigned int day1=1,week1=1,month1=1,year1=2011; //初始化使日单元=1,星期=1,月单元=1,年单元=2011unsigned int temp; //临时变量void time();void noise();void playbit();void freshddisplaybuffer(void);void maohao(void);void Delay();void delay1(int k);void delay_short();void delay_long();void InitKey_INTKR(void);void InitLed();void LightOneLed(unsigned char ucNum);void LightTheOhterLed(unsigned char ucNum);void LightLeds(unsigned char *pNum,unsigned char ucCnt);void LightOff();unsigned char gCurrentScheme=0;unsigned char gFlag=1;//有按键按下时,标志为0;//===================================================== void delay(){unsigned char i,j;for(i=0;i<=10;i++)for(j=0;j<=10;j++);}void delay1(int k){int i,j;for(i=0;i<=k;i++)for(j=0;j<k;j++);}void delay_long(){int i,j;for(i=0;i<=200;i++)for(j=0;j<=200;j++);}void delay_short(){int i,j;for(i=0;i<=200;i++)for(j=0;j<=10;j++);}//=================================================== void InitKey_INTKR(void)//按键初始化{PM4=0x3F;PU4=0x3F;KRM=0x3F;KRMK=0;}//===================================================void initlcd()//lcd初始化{PFALL = 0x0F;LCDC0 = 0x45;LCDMD = 0x10;LCDM = 0xC0;}//=================================================== void InitLed()//led初始化{PM13=0XF0;PM14=0XF0;PM15=0XF0;PM3.4=0;PM3.3=0;//蜂鸣器P3.3=0;//打开}//===================================================void LightOff()//熄灭灯{P13=0;P14=0;P15=0;}void LightTheOherOff(){P3.4=0;P15.1=0;P15.2=0;P15.3=0;}//=================================================== void LightOneLed(unsigned char ucNum)//点亮灯{switch(ucNum){case 0:case 1:case 2:case 3:P13=(unsigned char)1<<(ucNum);break;case 4:case 5:case 6:case 7:P14=(unsigned char)1<<(ucNum -4);break;case 8:case 9:case 10:case 11:P15=(unsigned char)1<<(ucNum -8);break;default :break;}}void LightTheOhterLed(unsigned char ucNum){switch(ucNum){case 0: P3.4=(unsigned char)1;break;//星期case 1: P15.1=(unsigned char)1;break;//日秒case 2: P15.2=(unsigned char)1;break;//月分case 3: P15.3=(unsigned char)1;break;//年时default:break;}}//=================================================== void LetOneLing(unsigned char ucNum)//响一种调调铃声{switch(ucNum){case 0:break;case 1:{CKS=0XE0;delay1(80);CKS=0XC0;delay1(0);BZOE=0;delay1(40);CKS=0XC0;delay1(60);BZOE=0;delay1(60);CKS=0XA0;delay1(50);BZOE=0;delay1(80);CKS=0XE0;delay1(60);BZOE=0;delay1(60);CKS=0XE0;BZOE=0;delay1(60);}break;//铃声1 case 2:{CKS=0X80;delay_short();BZOE=0;CKS=0XA0;delay_short();BZOE=0;CKS=0XC0;delay_short();BZOE=0;CKS=0XE0;delay_short();BZOE=0;}break;//铃声2 case 3:{CKS=0X80;delay_long();BZOE=0;CKS=0XA0;delay_long();BZOE=0;CKS=0XC0;delay_long();BZOE=0;CKS=0XE0;delay_long();BZOE=0;}break;//铃声3default:break;}}//===================================================void noise()//闹铃启动{if(ling==1){if(year1==year&&month1==month&&day1==day&&hour1==hour&&minute1==minute&&se cond1==second){if(lingsheng==1) LetOneLing(1);if(lingsheng==2) LetOneLing(2);if(lingsheng==3) LetOneLing(3);}}if(ling==0){}}//===================================================void duan(){RTCMK = 0;OSCSELS = 1;RTCCL = 0;RTCC0 = 0x01;RTCE = 1;}//===================================================void half_sec_INTERRUPT(){DI();if (j==0){pokeb(0xFA53,0x01);j++;time();freshddisplaybuffer(); playbit();//j++;}else{pokeb(0xFA53,0x00);j--;time();freshddisplaybuffer(); playbit();//j--;}EI();}//===================================================void OnKeyPress(void)//按键变化{DI();gFlag=0;switch(P4 & 0x3F){case 0x3E:gCurrentScheme=0;LightOff();i++;LightOneLed(i-1);if(i==10){i=1;LightOff();}break;case 0x3D://处于闪烁状态,,,,m是全局变量,但出于不同的模式下gCurrentScheme=1;if(i==1){LightTheOherOff();m1++;if(m1==1)LightTheOhterLed(0);if(m1==2)LightTheOhterLed(1);if(m1==3)LightTheOhterLed(2);if(m1==4)LightTheOhterLed(3);if(m1==5){m1=1;LightTheOhterLed(0);}}if(i==2){//在亮灯情况下,改变的模式是?确的,但LED15.3是长亮的LightTheOherOff();m2++;if(m2==1)LightTheOhterLed(1);if(m2==2)LightTheOhterLed(2);if(m2==3)LightTheOhterLed(3);if(m2==4){m2=1;LightTheOhterLed(1);}}if(i==4){LightTheOherOff();m4++;if(m4==1)LightTheOhterLed(1);if(m4==2)LightTheOhterLed(2);if(m4==3)LightTheOhterLed(3);if(m4==4){m4=1;LightTheOhterLed(1);}}if(i==5){LightTheOherOff();m5++;if(m5==1)LightTheOhterLed(0);if(m5==2)LightTheOhterLed(1);if(m5==3)LightTheOhterLed(2);if(m5==4)LightTheOhterLed(3);if(m5==5){m5=1;LightTheOhterLed(0);}}if(i==6){LightTheOherOff();m6++;if(m6==1)LightTheOhterLed(1);if(m6==2)LightTheOhterLed(2);if(m6==3){m6=1;LightTheOhterLed(1);}}break;case 0x3B://加1gCurrentScheme=2;if (i==1)//当前时间{if (m1==1) week++;if (week==8)week=1;freshddisplaybuffer(); playbit();if (m1==2) hour++;if(hour==24)hour=0;freshddisplaybuffer(); playbit();if (m1==3) minute++;if(week==60)week=0;freshddisplaybuffer(); playbit();if (m1==4) second++;if(second==60)second=0;freshddisplaybuffer(); playbit();}if (i==2)//当前日期{if (m2==1)year++;if(year==2100)year=2000;freshddisplaybuffer(); playbit();if (m2==2)month++;if(month==13)month=1;freshddisplaybuffer(); playbit();if (m2==3){day++;if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(day==32)day=1;}if(month==4||month==6||month==9||month==11){if(day==30)day=1;}if(month==2){if((year%4==0 && year%100!=0)||(year%400==0)){if(day==30){day=1;}}else{if(day==29){day=1;}}}}}freshddisplaybuffer(); playbit();if (i==4)//闹钟日期{if (m4==1)year1++;if(year1==2100)year1=2000;freshddisplaybuffer(); playbit();if (m4==2)month1++;if(month1==13)month1=1;freshddisplaybuffer(); playbit();if (m4==3){day1++;if(month1==1||month1==3||month1==5||month1==7||month1==8||month1==10||mont h1==12){if(day1==32)day1=1;}if(month1==4||month1==6||month1==9||month1==11){if(day1==30)day1=1;}if(month1==2){if((year1%4==0 && year1%100!=0)||(year1%400==0)){if(day1==30){day1=1;}}else{if(day1==29){day1=1;}}}}}freshddisplaybuffer(); playbit();if (i==5)//当前时间{if (m5==1) week1++;if (week1==8)week1=1;freshddisplaybuffer(); playbit();if (m5==2) hour1++;if(hour1==24)hour1=0;freshddisplaybuffer(); playbit();if (m5==3) minute1++;if(week1==60)week1=0;freshddisplaybuffer(); playbit();if (m5==4) second1++;if(second1==60)second1=0;freshddisplaybuffer(); playbit();}if (i==6)//铃声调调m6=1和是否开启铃声m=2{if (m6==1)lingsheng++;if(lingsheng==1)LetOneLing(1);freshddisplaybuffer(); playbit();if(lingsheng==2)LetOneLing(2);freshddisplaybuffer(); playbit();if(lingsheng==3)LetOneLing(3);freshddisplaybuffer(); playbit();if(lingsheng==4)lingsheng=1;freshddisplaybuffer();playbit();LetOneLing(1);if (m6==2) //开1关0ling++;if(ling==1)freshddisplaybuffer(); playbit();if(ling==0){BZOE=0;freshddisplaybuffer(); playbit();}if(ling==2)ling=0;freshddisplaybuffer(); playbit();}break;case 0x37://减1gCurrentScheme=3;if (i==1){if (m1==1) week--;if (week==0)week=7;freshddisplaybuffer(); playbit();if (m1==2) hour--;if(hour==-1)hour=23;freshddisplaybuffer(); playbit();if (m1==3) minute--;if(minute==-1)minute=59;freshddisplaybuffer(); playbit();if (m1==4) second--;if(second==-1)second=59;freshddisplaybuffer(); playbit();}if (i==2){if (m2==1)year--;if(year==1999)year=2100;freshddisplaybuffer(); playbit();if (m2==2)month--;if(month==0)month=12;freshddisplaybuffer(); playbit();if (m2==3){day--;if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(day==0)day=31;}if(month==4||month==6||month==9||month==11){if(day==0)day=30;}if(month==2){if((year%4==0 && year%100!=0)||(year%400==0)){if(day==0){day=29;}}else{if(day==0){day=28;}}}}}freshddisplaybuffer(); playbit();if (i==4){if (m4==1)year1--;if(year1==1999)year1=2100;freshddisplaybuffer(); playbit();if (m4==2)month1--;if(month1==0)month1=12;freshddisplaybuffer(); playbit();if (m4==3){day1--;if(month1==1||month1==3||month1==5||month1==7||month1==8||month1==10||mont h1==12){if(day1==0)day1=31;}if(month1==4||month1==6||month1==9||month1==11){if(day1==0)day1=30;}if(month1==2){if((year1%4==0 && year1%100!=0)||(year1%400==0)){if(day1==0){day1=29;}}else{if(day1==0){day1=28;}}}}}freshddisplaybuffer(); playbit();if (i==5){if (m5==1) week1--;if (week1==0)week1=7;freshddisplaybuffer(); playbit();if (m5==2) hour1--;if(hour1==-1)hour1=23;freshddisplaybuffer(); playbit();if (m5==3) minute1--;if(minute1==-1)minute1=59;freshddisplaybuffer();playbit();if (m5==4) second1--;if(second1==-1)second1=59;freshddisplaybuffer(); playbit();}if (i==6)//铃声调调m6=1和是否开启铃声m=2{if (m6==1)lingsheng--;if(lingsheng==1)LetOneLing(1);freshddisplaybuffer(); playbit();if(lingsheng==2)LetOneLing(2);freshddisplaybuffer(); playbit();if(lingsheng==3)LetOneLing(3);freshddisplaybuffer(); playbit();if(lingsheng==0)lingsheng=3;freshddisplaybuffer();playbit();LetOneLing(1);if (m6==2) //开1关0ling--;if(ling==1)freshddisplaybuffer(); playbit();if(ling==0){BZOE=0;freshddisplaybuffer(); playbit();}if(ling==-1)ling=1;freshddisplaybuffer(); playbit();}break;case 0x2F:gCurrentScheme=4;break;case 0x1F:gCurrentScheme=5;break;default:break;}EI();}//===================================================unsigned int m_days(unsigned int mmonth){unsigned int days;if((mmonth==4)||(mmonth==6)||(mmonth==9)||(mmonth==11))days=30; //4,6,9,11月为30天else if(mmonth==2){if((year%4==0 && year%100!=0)||(year%400==0))days=29; //瑞年2月为29天elsedays=28; //平年2月为28天}elsedays=31; //1,3,5,7,8,10,12月为31天return(days);}//===================================================void time(){if(j!=0) //0.5秒标志到了吗?{j=0;// pokeb(0xFA53,0x01);half_second++;if(half_second%2==0) //判断到了1秒了吗?{second++;if(second>=60) //秒大于60时,分加1{second=0;minute++;if(minute>=60) //分大于60时,时加1{minute=0;hour++;if(hour>=24) //时大于24时,天加1{hour=0;day++;temp=m_days(month); //判断该月是多少天if(day>=temp){day=1;month++;if(month>=13) //月大于12后年加1{month=1;year++;}}}}}}}}//===================================================void freshddisplaybuffer(void){buf1[0]=numbercode[ling]; //当前时间的显示码放入当前时间的?码显示缓存区buf1[1]=numbercode[week];buf1[2]=numbercode[hour/10];buf1[3]=numbercode[hour%10];buf1[4]=numbercode[minute/10];buf1[5]=numbercode[minute%10];buf1[6]=numbercode[second/10];buf1[7]=numbercode[second%10];buf2[0]=numbercode[(year/100)/10]; //当前日期的显示码放入当前日期的?码显示缓存区buf2[1]=numbercode[(year/100)%10];buf2[2]=numbercode[(year%100)/10];buf2[3]=numbercode[(year%100)%10];buf2[4]=numbercode[month/10];buf2[5]=numbercode[month%10];buf2[6]=numbercode[day/10];buf2[7]=numbercode[day%10];/*buf3[0]=numbercode[0]; //温度的显示码放入温度的?码显示缓存区buf3[1]=numbercode[0];buf3[2]=numbercode[0];buf3[3]=numbercode[0];buf3[4]=numbercode[0];buf3[5]=0x0000;buf3[6]=0x0000;buf3[7]=0x0000;buf3[8]=0x0000;buf3[9]=0x0000;*/buf4[0]=numbercode[ling]; //闹钟日期的显示码放入当前日期的?码显示缓存区buf4[1]=numbercode[week1];buf4[2]=numbercode[(year1%100)/10];buf4[3]=numbercode[(year1%100)%10];buf4[4]=numbercode[month1/10];buf4[5]=numbercode[month1%10];buf4[6]=numbercode[day1/10];buf4[7]=numbercode[day1%10];buf5[0]=numbercode[ling]; //闹钟时间的显示码放入闹钟时间的?码显示缓存区buf5[1]=numbercode[week1];buf5[2]=numbercode[hour1/10];buf5[3]=numbercode[hour1%10];buf5[4]=numbercode[minute1/10];buf5[5]=numbercode[minute1%10];buf5[6]=numbercode[second1/10];buf5[7]=numbercode[second1%10];buf6[0]=numbercode[lingsheng%10]; //铃声的显示码放入铃声的?码显示缓存区buf6[1]=0x0000;buf6[2]=0x0000;buf6[3]=0x0000;buf6[4]=0x0000;buf6[5]=0x0000;buf6[6]=0x0000;buf6[7]=numbercode[ling%10];/*buf7[0]=numbercode[]; //报时的显示码放入报时的?码显示缓存区buf7[1]=numbercode[];buf8[0]=numbercode[]; //倒计时的显示码放入倒计时的?码显示缓存区buf8[1]=numbercode[];buf8[2]=numbercode[];buf8[3]=numbercode[];buf8[4]=numbercode[];buf8[5]=numbercode[];buf8[6]=numbercode[];buf9[0]=numbercode[]; //灯闪烁的显示码放入灯闪烁的?码显示缓存区buf9[1]=numbercode[];*/}//===================================================void playbit(){unsigned int dp=0; //dp为显示位?计?unsigned int b[8]; //显示输出缓存区unsigned int LCD_addr; //定义LCD地址LCD_addr=0xFA40; //初始化LCD地址为0xFA40 while(dp<8) //位?值依次在LCD屏上显示一趟{switch(i){case 1: b[dp]=buf1[dp];break; //当前时间case 2: b[dp]=buf2[dp];break; //case 3: b[dp]=buf3[dp];break; //case 4: b[dp]=buf4[dp];break; //case 5: b[dp]=buf5[dp];break; //case 6: b[dp]=buf6[dp];break; //case 7: b[dp]=buf7[dp];break; //case 8: b[dp]=buf8[dp];break; //case 9: b[dp]=buf9[dp];break; //}pokew(LCD_addr,b[dp]); //显示器位控制码送位入控制存储单元LCD_addr=LCD_addr+2;if(LCD_addr>=0xFA54){LCD_addr=0xFA40;}dp++; //显示位计?加1 }}//===================================================//--------------------------------------------------------------void Scheme_0(void){time();noise();//闹铃启动,若ling==1 响freshddisplaybuffer();// maohao();playbit();LightOneLed(i-1);}//--------------------------------------------------------------void main (){InitLed();InitKey_INTKR();//按键初始化initlcd();//LCD初始化duan();EI();while(1){switch (gCurrentScheme){case 0:gFlag=1;Scheme_0();break;case 1:gFlag=1;Scheme_1();break;case 2:gFlag=1;Scheme_2();break;default:break;}}}。