电子综合设计-基于单片机多功能数字时钟的设计(附完整程序)

合集下载

基于单片机的多功能数字钟的设计

基于单片机的多功能数字钟的设计

基于单片机的多功能数字钟的设计摘要:本设计论文介绍了用AT89C2051单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。

此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。

它的计时周期为12小时,显示满刻度为12时59分59秒99毫秒,另外应有校时功能。

电路由时钟脉冲发生器、时钟计数器、译码驱动电路和数字显示电路以及时间调整电路组成。

用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。

根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个12进制(时)的计数器。

构成秒、分、时的计数,实现计时的功能。

显示器件选用LED七段数码管。

在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。

针对数字钟会产生走时误差的现象,在电路中就设计有有校准时间功能的电路。

关键词:单片机;AT89C2051;数字钟;计时Based on SCM multi-purpose digital clock designAbstract:The paper mainly presents the hardware and software design of the digital clock using AT89C2051. The source program using assemble Language is given. This digital clock is a time-device, which can display "hour", "minute", "second". Its time period is 12 hours and the full scale of the display is 12 hours, 59 minutes, 59 seconds and 99 milliseconds and it has the function of time adjustment. The circuit consists of the clock pulse generator, the clock counter, decoding drive circuit, digital display circuit and the time adjustment circuit. It generates time standard signal using crystal oscillator, here is the quartz crystal oscillator. Because 60 seconds is 1 minute, 60 minutes is 1 hour and 24 hours is 1 day, we uses two counters of 60 parts and a counter of 12 part separately to constitute the count of percentage of second, second, minute, and hour. So it can realize time function. Display component selects seven-segment numerical tube LED. Driven by decoding output circuit, it can display showing clear and intuitive figures. Due to walking error of digital clock, we design time calibration circuit in the system.Key words:Single-chip microcomputer; AT89C2051; Digital clock; Time目录第1章绪论 (5)1.1 前言 (5)1.2 设计的目的及意义 (5)第2章数字钟的功能实现与设计方案 (6)2.1 数字钟的功能及设计要求 (6)2.2数字钟的实现形式 (6)2.3 方案的确定 (7)2.3.1 微处理器 (7)2.3.2 显示电路 (7)2.3.3 按键电路 (8)第3章数字钟的硬件系统设计 (9)3.1数字时钟的硬件系统框架 (9)3.2 数字时钟的主机电路设计 (9)3.2.1系统控制芯片CPU(AT89C2051)的选择 (9)3.2.2系统时钟电路设计 (14)3.2.3 系统复位电路设计 (16)3.2.4 按键与按钮电路设计 (17)3.2.5闹铃声光指示电路设计 (17)3.2.6 数字钟的显示电路设计 (17)3.3校时电路设计 (21)3.3.1校时原理 (22)3.3.2 国家授时中心 (22)3.3.3窗口比较器 (23)3.3.4 校时电路电路图 (24)3.4 电源设计 (24)第4章程序设计 (28)4.1 主控模块设计 (28)4.2基本现实模块设计 (29)4.3 当前编辑位闪烁功能的实现 (30)4.4时间设定模块设计 (30)4.5脉冲发生器原理与走时处理 (31)4.6 闹铃功能的实现 (32)第5章系统的调试及结果 (34)5.1 系统调试环境 (34)5.2 软件调试 (34)5.3硬件调试 (34)5.4调试结果 (34)结论 (35)致谢 (36)参考文献 (37)附录1:完整的汇编语言源程序 (38)附录2:系统设计原理图 (61)附录3:系统设计PCB图 (63)附录4:实物照片 (64)西南科技大学本科生毕业论文第1章绪论1.1前言计算机尤其是以微细加工技术支持的微型计算机技术飞速发展,其应用渗透到了各行各业。

毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]

毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]

程序仿真等全套设计,联系153893706第1章绪论二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。

第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。

商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软件,硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。

基本的要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C52是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

本文介绍了基于AT89C52单片机设计的电子万年历。

选题背景及研究的目的与意义设计的目的电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全)

基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。

对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。

数字钟的精度、稳定度远远超过老式机械钟。

在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。

在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。

数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。

关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

基于单片机的数字电子钟设计(含完整程序+PCB图)--课程设计

基于单片机的数字电子钟设计(含完整程序+PCB图)--课程设计

基于单⽚机的数字电⼦钟设计(含完整程序+PCB图)--课程设计基于单⽚机的数字电⼦钟设计(含完整程序+PCB图)--课程设计1 课题设计任务、功能要求及总体⽅案1.1 课题设计任务本课程设计选题⽬为:数字电⼦钟。

设计⼀个具有特定功能的电⼦钟。

1.2 功能要求设计的数字电⼦钟上电或按键复位后能⾃动显⽰系统提⽰符“P.”,进⼊时钟准备状态;第⼀次按数字电⼦钟启动/调整键,数字电⼦钟从0时0分0秒开始运⾏,进⼊时钟运⾏状态;再次按数字电⼦钟启动/调整键,则数字电⼦钟进⼊时钟调整状态,并且时间停⽌不动,此时可分别利⽤各调整键调整时、分、秒,调整结束后可按启动/调整键再次进⼊时钟运⾏状态。

1.3 设计总体⽅案介绍及⼯作原理说明本课程设计采⽤AT89S52单⽚机设计⼀个数字电⼦钟,通过两个4位LED数码管显⽰时、分、秒,并设有9个按键。

其中⼀个⽤于单⽚机的复位;⼀个为启动/调整键;两个分别为加,减键;其他键本课题暂不⽤。

电路分为5部分,分别为复位电路、键盘电路、时钟电路、显⽰电路和控制电路。

复位电路采⽤按键复位⽅式。

键盘电路采⽤独⽴式键盘。

时钟电路⽤12MHz的晶振产⽣时钟信号。

显⽰电路采⽤8个三极管驱动两个4位LED显⽰。

控制电路采⽤8位的AT89S52单⽚机作为CPU;原理是:时钟⽤T0为时钟秒加1中断,时间常数位50MS,每20次加1S,T0⽤为时间加1中断,时间常数为50MS,中断20次时间加1。

其设计框图如图1.1所⽰:复位电路AT89S52 显⽰时钟电路键盘电路下载电路图1.1 设计⽅案框图42 数字电⼦钟硬件系统的设计2.1 硬件系统各模块功能简要介绍2.1.1 复位电路复位是单⽚机的硬件初始化操作。

经复位操作后,单⽚机系统才能开始正常⼯作。

单⽚机上有复位引脚RST,⽤于外接复位电路,这⾥复位电路采⽤按键电平复位。

2.1.2 时钟电路单⽚机⼯作所需的同步时钟信号由以下两种⽅法获得:由单⽚机⽚内时钟电路结合外部晶振、电容产⽣和直接从单⽚机外部引⼊脉冲信号。

电子综合设计-基于单片机多功能数字时钟的设计(附完整程序)

电子综合设计-基于单片机多功能数字时钟的设计(附完整程序)

课题:基于51单片机的多功能数字时钟系统设计一、概述、设计思路该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,辅以闹钟模块,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。

本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。

二、系统组成与工作原理1、工作原理:本设计采用STC89C51单片机作为本次课程设计的控制模块。

单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。

以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。

2、总是设计框架图:图二:系统总体电路图三、单元电路的设计与分析整个电子时钟系统电路可分为六大部分:中央处理单元(CPU)、复位电路部分、显示部分、键盘输入部分、温度采集部分。

1、MCS-51单片机89S51各引脚功能介绍:VCC:89S51 电源正端输入,接+5V。

VSS:电源地端。

XTAL1:单芯片系统时钟的反相放大器输入端。

XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。

A T89S51RESET:89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

基于单片机的多功能数字钟的设计

基于单片机的多功能数字钟的设计

一、概述现代社会,时间被视为人们生活的重要组成部分。

而数字钟作为时间的一种展现形式,已经成为人们生活中不可或缺的一部分。

基于单片机的多功能数字钟设计,将为人们提供更加准确、便捷、多功能的时间展现方式,满足人们对时间的精准要求,同时也为人们的生活带来更多便利。

二、设计目标1. 实现精准的时间显示功能,包括时、分、秒的显示;2. 实现对日期的显示,包括年、月、日的显示;3. 实现多种报时功能,如定时报时、闹钟报时等;4. 实现多种显示效果,如渐变显示、闪烁显示等;5. 实现对时间的调整功能,包括校时、调整日期等;6. 实现对亮度的调节功能,适应不同环境下的使用需求。

三、设计思路1. 硬件设计1.1 硬件采用单片机作为核心控制器,通过外部晶振提供时钟信号;1.2 采用数码管作为显示设备,通过单片机控制数码管进行时间、日期的显示;1.3 通过按钮、旋钮等输入设备,实现时间调节、报时设置等操作;1.4 通过EEPROM等存储设备,实现时间、设置的存储和读取功能;1.5 通过光敏电阻等光敏传感器,实现对环境光强的检测,调节数码管显示亮度。

2. 软件设计2.1 设计合理的时钟系统,确保时间的准确显示;2.2 设计报时功能模块,实现定时报时、闹钟报时等功能;2.3 设计显示控制模块,实现数字、日期的显示效果控制;2.4 设计操作响应模块,实现对按钮、旋钮等输入设备的操作响应;2.5 设计存储管理模块,实现时间、设置数据的存储和读取功能;2.6 设计光敏控制模块,实现对数码管显示亮度的实时调节。

四、实现方法1. 硬件设计1.1 选择合适的单片机作为核心控制器,根据需要进行外围电路的设计;1.2 选择合适的数码管作为显示设备,设计驱动电路以及显示控制电路;1.3 选择合适的按钮、旋钮等输入设备,设计输入电路以及操作响应电路;1.4 选择合适的EEPROM芯片,设计存储管理电路实现数据的存储和读取;1.5 选择合适的光敏电阻或光敏二极管,设计光敏控制电路实现显示亮度的调节。

电子综合课程设计多功能数字电子时钟

电子综合课程设计多功能数字电子时钟

电子综合课程设计多功能数字电子时钟一、简介本项目为电子综合课程设计,设计一款多功能数字电子时钟。

该时钟具有显示时间、日期、温度、闹钟等多种功能,配备有定时开关机、夜光和音量调节等功能。

此外,该时钟外观简约且美观,设计师充分考虑到用户的使用需求,实现了人性化设计,易于操作,成为一款功能强大、实用性高、适用范围广的电子产品。

二、设计思路1.硬件设计时钟采用STM32F0308T6单片机作为主控芯片,用DS1302实时时钟芯片作为时钟源。

为了实现多种功能,我们在主控出增加了一个9612音频电路芯片,用作时钟的音量控制,以及闹钟的提示铃声。

此外,为了使时钟更好地适应使用场景,设计师还添加了光敏电阻实现夜光功能,铺上黄色的背光板后又实现了多种颜色的配合,能够适应不同场合的需求。

2.软件设计在软件方面,使用了C语言编程。

主要功能包括时间、日期、温度显示、闹钟、夜光和音量控制等。

其中,时间及日期的显示为主界面,在时钟界面下按下“menu”可以进入温度、夜光、音量调节、闹钟设置等模式,按下确定键可进入对设置的编辑,方便用户按照自己需求进行调整。

三、功能介绍1.时间、日期显示时钟在主界面下,可显示当前时间和日期,使用户随时了解到时间和日期的变化。

2.温度显示在“menu”界面下,可显示当前的温度,方便用户了解室内温度的变化。

3.闹钟设置在“menu”模式下,用户可通过设置闹钟时间来实现定时提醒的功能。

4.夜光当环境光线较暗时,时钟的背光板将亮起,以便用户观看时间。

5.音量调整可通过音量调节的按键对音量进行调整,以方便用户按照自己的需要进行调节。

6.定时开关机在控制位置,实现了产品的定时开关机功能,可自动开机,实现了对环境的节约。

四、总结该多功能数字电子时钟的设计工艺精良,功能强大、易于操作、实用性高、适用性广泛。

整个设计过程、选材及工艺都体现了电子产品的优越性。

在真正的市场环境下,这款多功能电子时钟具备广泛的市场适应性,在现代家居、办公室等各个场合都具有很好的应用前景。

电子综合设计-基于单片机多功能数字时钟的设计

电子综合设计-基于单片机多功能数字时钟的设计

电子综合设计-基于单片机多功能数字时钟的设计下面是一个基于单片机的多功能数字时钟的完整程序示例:```c#include <reg51.h>sbit LED = P2^0; // 数码管选择位sbit DIO = P2^1; // 数码管数据输入sbit CLK = P2^2; // 数码管时钟unsigned char code duanma[16] =0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段码unsigned char code weima[8] =0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位码unsigned int count = 0; // 计数//延时函数void delay(unsigned int n)unsigned int i, j;for (i = 0; i < n; i++)for (j = 0; j < 110; j++);}//数码管显示函数void display(unsigned char *nums) unsigned char i;for (i = 0; i < 8; i++) { // 逐位显示DIO = nums[i]; // 将段码赋值给DIO CLK=1;//时钟上升沿CLK=0;//时钟下降沿LED = weima[i]; // 选择位码delay(1); // 延时1msLED = 0xff; // 关闭显示}//复位时钟void resecount = 0;display(duanma);void maiwhile (1)display(duanma); // 显示数码管初始状态reset(; // 复位时钟while (1)reset(;}if (P1 == 0x0f) { // 检测P1口的按键状态delay(20); // 延时消抖if (P1 == 0x0f)delay(20); // 再次延时消抖if (P1 == 0x0f)count++; // 计数加一display(duanma); // 显示计数结果}}}}}```。

基于51单片机的多功能电子钟的设计

基于51单片机的多功能电子钟的设计

B-1 多功能电子钟设计报告组员:彭希灵、冯旭鑫、张正鹏完成时间:2016年5月9日目录1.摘要 (4)2.设计任务 (4)2.1基本要求 (4)2.2发挥部分 (4)3.方案论证与比较 (5)3.1显示部分 (5)3.2时钟部分 (5)3.3闹铃部分 (6)3.4温度采集部分 (6)4.总体方案 (6)4.1工作原理 (6)4.2总体设计 (6)5.系统硬件设计 (7)5.1 STC89C51单片机最小系统 (7)5.2时钟模块 (8)5.3 LCD液晶显示模块 (9)5.4闹钟响铃模块 (10)5.5温度测量模块 (10)6.系统软件设计 (11)6.1 main模块 (11)6.2 ds1302模块 (11)6.3 lcd12864模块 (12)6.4 key模块 (12)6.5 ringlock模块 (13)6.6 menu模块和DS18B20模块 (13)7.测试与结果分析 (13)8.总结 (14)参考文献 (14)附录一 (15)附录二 (16)1.摘要本设计采用LCD12864液晶屏幕显示系统,以STC89C52单片机为核心,由铃声响铃模块、DS1302时钟控制模块、LCD12864显示模块、键盘控制模块、菜单模块和DS18B20温度模块等功能模块组成。

基于题目的基本要求,本系统对时间显示、闹钟的设定和控制以及时间日期的设定进行了重点设计。

此外,还扩展了掉电存储、红外遥控、温度采集等功能。

本系统大部分功能由软件来实现。

在该设计中不仅成功的实现了题中的基本要求,多数发挥部分也得到了实现,而且还具有一定的创新功能。

2.设计任务2.1基本要求(1)准确计时,以数字形式显示年月、日、时、分、秒。

(2)小时以24小时计时形式,分秒计时为60进位,日期平年和闰年将自行更换。

(3)采用矩阵按键和4个独立按键对电子表进行控制,可进行闹钟设定、控制及时间日期的设定。

(4)闹钟功能:可任意设定闹钟时间,一旦走时到该时间,能以蜂鸣器发声、LED发光的形式告警提示。

基于单片机设计的多功能数字钟设计报告

基于单片机设计的多功能数字钟设计报告

题目:多功能数字钟一,设计目的1培养大学生动手能力,大体了解电路设计;2掌握电子设计初步知识;3培养团队合作能力;4掌握各芯片的逻辑功能及使用方法.5了解面板结构及其接线方法.6了解数字钟的组成及工作原理.7熟悉数字钟的设计与制作.8初步了解单片机的使用与编程.二,设计要求1.设计指标时间为24小时制;显示小时与分钟; (如下图);有校时功能,可以分别对小时及分钟进行单独校时;具有设置闹铃的功能,并且能控制闹铃的开关;具备闹铃就绪灯(闹铃调整好后,就绪灯亮),且具有蜂鸣功能(到所调闹铃响时间,蜂鸣器发出声音);电源为220V供电.,具有环境温度测量、电网电压、电网频率显示等功能;报警模块由报警蜂鸣器和带音乐芯片的扬声器等可实现闹铃控制和电网电压的过压、欠压报警功能。

2.设计要求画出电路原理图(或仿真电路图);元器件及参数选择;应用计算机完成电路仿真与调试;完成PCB文件生成与打印输出.3.制作要求应用提供元件,自行进行电路装配和调试,并能发现问题和解决问题.4.编写设计报告写出电路设计与整体制作的全过程,附上有关资料和图纸和心得体会.三,基本仪器清单20MHz普通示波器(双通道,外触发输入,有X轴输入,可选带Z轴输入)60MHz双通道数字示波器低频信号发生器(1Hz~1MHz)高频信号发生器(1MHz~40MHz)标准声音源声级校准器函数发生器低频毫伏表高频毫伏表普通频率计失真度测试仪直流稳压电源2米卷尺单相自耦调压器(>200W)单片机开发系统及EDA开发系统五位半数字万用表(电压表)四位半数字万用表四,主要元器件清单单片机最小系统板(仅含单片机芯片、键盘与显示装置、存储器、A/D、D/A)A/D、D/A转换器1MHz采样频率的8位A/D转换器运算放大器、电压比较器可编程逻辑器件及其下载板显示器件小型继电器康铜、锰铜电阻丝漆包线(直径不大于1mm)光电传感器温度传感器声音传感器扬声器DC/DC转换器设计方案我们设计的系统电路由实时时钟模块、环境温度检测模块、电网检测模块、报警模块等部分组成。

电子综合设计多功能数字钟报告(附完整程序代码)

电子综合设计多功能数字钟报告(附完整程序代码)

[电子系统设计]总结报告题目:多功能数字钟专业:电子信息科学与技术班级:2010级2班姓名:XXX指导教师:评分:2012年11月19日目录1项目计划 (1)1.1方案可行性 (1)1.1.1市场可行性分析 (1)1.1.2技术分析 (1)1.1.3法律分析 (1)1.2项目执行计划 (2)1.2.1工程进度图 (2)1.2.2工程进度表 (2)1.2.3工程预算 (2)2设计说明 (3)2.1基本设计思想 (3)2.2设计原理 (4)2.3系统结构框图 (4)2.4原理图 (5)2.5各单元模块设计原理 (5)2.5.1单片机最小系统 (5)2.5.2数码显示模块 (6)2.5.3闹铃模块 (7)2.5.4接口和外部控制模块 (8)2.5.5时钟模块 (8)2.6各单元模块设计流程及部分程序代码 (9)2.6.1各单元模块设计流程图 (9)2.6.2部分程序代码 (11)2.7时钟的操作流程 (11)3调试说明 (12)3.1生产工艺 (12)3.2调试准备工作 (12)3.3调试方法及步骤 (12)3.4调试数据 (13)3.4.1未安装芯片时的点参数 (13)3.4.2安装芯片后的点参数 (13)3.5调试结果 (14)3.6注意事项 (14)3.7可能遇到的问题及解决方案 (14)4总结 (15)5附录 (15)1项目计划1.1方案可行性1.1.1市场可行性分析多功能数字钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用,随着多功能数字钟在公共场合的应用和多功能数字钟数量的增多,多功能数字钟的功能和准确度更被人们所重视。

本多功能数字钟属于多功能数字钟,具有功能多,成本低的特点,制作一个多功能数字钟所需材料成本约为17元,人工成本约6元,而一个多功能数字钟市场价约为60,每个多功能数字钟可净收入约37元,现在市场上数字钟的需求量大,生产商寥寥无几。

基于单片机的多功能数字钟的设计本科毕业设计

基于单片机的多功能数字钟的设计本科毕业设计

本科毕业设计基于单片机的多功能数字钟摘要在21世纪社会的迅猛发展浪潮下,电子信息技术也有了快速的推广和应用。

在日常工作生活的快节奏下,时间占有着至关重要的位置。

也许人们不太在意,在各种各样的日常生活以及各类社会活动中,大家无时无刻地都在留意着时间的变化。

时间与人们的生活息息相关,而时间的计算方法发展至今已经演变成时钟和表。

本文所阐述的数字钟有多种功能,不仅能够准确的显示时间年月日、时分秒,还有对环境温度进行测量,闹钟设置,秒表计时,电子钟,MP3播放等功能。

相比于机械时钟,因为数字钟所采用的是数字电路技术来实现时、分、秒计时,有着更高的准确性和稳定性,而数字钟的结构与装置也更加科学与方便化。

本文主要介绍了基于单片机的多功能数字钟的设计,硬件电路包含时钟模块、温度检测模块、液晶显示模块、按键模块、电源模块,声音模块和复位电路,软件设计包含闹钟设计、秒表计时、电子书阅览、MP3播放等。

本设计的数字钟有:时间显示年月日、时分秒,闹钟,秒表计时,电子书,MP3等功能。

单片机与多功能数字钟的结合,不仅使得时间的测量更加准确稳定,对环境测试的温度也更加简单、方便、灵活,为我们的日常生活提供了更优质与方便的服务。

因此,单片机不仅有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。

关键词:单片机数字钟温度传感器Multi-function Digital Clock Based On MCUCai Bingnan(College of Engineering, South China Agricultural University, Guangzhou 510642, China) Abstract: The rapid development in the twenty-first Century social tide, electronic information technology has been rapid promotion and application. In their daily work life fast rhythm, time occupies a crucial position. Maybe people don't care too much, in a variety of daily life and all kinds of social activities, we every hour and moment are watching the change of time. The time of our lives, and the calculation method of time has evolved into a clock and watch. Digital clock is described in this paper has a variety of functions, not only can display the date when the minutes and seconds time, accurate, and measurement of environmental temperature, alarm clock, stopwatch, electronic clock, MP3 player and other functions. Compared to the mechanical clock, because the digital clock is used in the digital circuit technology to realize, when, seconds, has a higher accuracy and stability, and the structure and device of digital clock is more scientific and convenient.This paper mainly introduces the design of multi-function digital clock based on MCU, the hardware circuit consists of the clock module, temperature detecting module, liquid crystal display module, keyboard module, power module, voice module and a reset circuit, software design including alarm clock, stopwatch design, electronic book reading, MP3 player etc.. The design of the digital clock: time date display, minutes and seconds, alarm clock, stopwatch, e-books, MP3 etc.. Combined with the MCU and the multi-function digital clock, not only makes the measurement more accurate and stable time, environmental testing temperature is more simple, convenient, flexible, provides better quality and convenience to our daily life. Therefore, the single chip not only promoted the development of social productive forces and the improvement of social information-based degree, simultaneously also makes the modern electronic products to further improve the performance.Key words: SCM digital clock the temperature sensor目录1 前言 (1)1.1 课题的研究背景 (1)1.2 课题的开发目的 (1)2系统方案分析与选择论证 (2)2.1系统方案设计 (2)2.1.1主控芯片方案 (2)2.1.2 显示模块方案 (2)2.1.3 键盘模块方案 (2)2.1.4 温度模块方案 (2)2.2 系统最终方案 (3)3硬件电路设计 (3)3.1 单片机最小系统 (3)3.2 DS1302时钟模块的设计 (4)3.3 LCD1602显示模块的设计 (5)3.4 DS18B20温度模块的设计 (7)3.5 声音模块和按键控制模块的设计 (7)4 程序设计 (8)4.1 时间调整程序设计 (9)4.2 闹钟处理程序设计 (10)4.3 秒表计时程序设计 (10)4.4 音乐播放程序设计 (10)4.5 电子书程序设计 (12)5调试与调试结果 (12)5.1 硬件调试 (12)5.2 调试结果 (13)6 结论 (13)参考文献 (14)附录A电路原理图 (15)附录B设计程序 (16)致谢 (1)华南农业大学本科生毕业设计成绩评定表1 前言1.1 课题的研究背景在这个快节奏的年代,时间就是效益,就是金钱,因此准确的掌握时间和分配时间对人们来说至关重要。

基于51单片机的多功能电子时钟设计

基于51单片机的多功能电子时钟设计

单片机应用设计入门课程设计尹康2012029010010一. 题目利用51单片机设计一个电子时钟要求:能够用数码管显示小时、分钟、秒,各2位数字;系统应具有复位电路、电源电路等基本组成部分;能够进行时间设定;能够进行日期设定。

二. 方案设计1.系统框图直流电源复位电路独立按键控制部分STC89C51显示部分(8位共阴数码管)2.设计说明用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h 到了。

采用动态显示法实现LED显示:通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。

由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

该电子时钟由STC89C51,BUTTON,共阴数码管等构成,采用晶振电路作为驱动电路,晶振电路的晶振频率为12MHZ。

60秒为一分钟,60分钟为一小时,24小时为一天,又重00:00:00开始计时。

没有按键按键按下时,时钟正常运行。

当按下调节时钟按键change,时钟就会进入设置时间界面(时钟不会停止工作),重复按下change 键,系统状态在调整小时、调整分钟、正常显示之间切换。

按add或reduce键,就可以数值进行加1或减1操作。

三. 电路设计1.整体电路:2.8位共阴数码管电路:3.单片机系统:4.独立按键电路:5.晶振6.复位电路:7.电源电路:四. 程序设计#include<reg52.h> //包含单片机寄存的头文件sbit led1=P1^0; sbit led2=P1^2; sbit led5=P1^5; sbit du=P2^6;//段选sbit we=P2^7;//位选sbit s1=P3^4;sbit s2=P3^5;sbit s3=P3^6;sbit s4=P3^7;sbit beep=P2^3; sbit dot=P0^7; unsigned char shi,fen,miao,unit,keyv,key,av,ashi,afen,ami ao;void delay() //1ms{unsigned char a,b;for(b=102;b>0;b--)for(a=3;a>0;a--);}void delay5(void) //误差5ms{unsigned char a,b;for(b=15;b>0;b--)for(a=152;a>0;a--);}void delayhalf (void) //误差0.5s{unsigned char a,b,c;for(c=23;c>0;c--)for(b=152;b>0;b--)for(a=70;a>0;a--);}void display( unsigned char h,f,s){unsigned char codeduma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x77,0x38}; unsigned char codemawei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0 xbf,0x7f};unsigned char shiwan,wan,qian,bai,shi,ge;shiwan=h/10;wan=h%10;qian=f/10;bai=f%10;shi=s/10;ge=s%10;P0=duma[shiwan];du=1;du=0;P0=mawei[0];we=1;we=0;delay();P0=duma[wan];dot=1;du=1;du=0;dot=0;P0=mawei[1];we=1;we=0;delay();P0=duma[qian]; du=1;du=0;P0=mawei[2];we=1;we=0;delay();P0=duma[bai]; dot=1;du=1;du=0;dot=0;P0=mawei[3];we=1;we=0;delay();if(key!=1&&key!=2) {P0=duma[shi];du=1;du=0;P0=mawei[4];we=1;we=0;delay();P0=duma[ge];du=1;du=0;P0=mawei[5];we=1;we=0;delay();}if(key==1||key==2) {P0=duma[10];du=1;du=0;P0=mawei[4]; we=1;we=0;delay();P0=duma[11]; du=1;du=0;P0=mawei[5]; we=1;we=0;delay();}P0=0xff;we=1;we=0;}passtime(){if(unit==100) {miao++;unit=0;led1=!led1;led2=!led2; }if(miao==60) {fen++;miao=0;}if(fen==60) {shi++;fen=0;}if(shi==24) {shi=0;} }void InitTimer0(void)//10ms{TMOD = 0x01;TH0 = 0x0DC;TL0 = 0x00;EA = 1;ET0 = 1;TR0 = 1;unit=0;}void Timer0Interrupt(void) interrupt 1 {TH0 = 0x0DC;TL0 = 0x00;unit++ ;//add your code here! passtime();}void adjustment(void){if(s1==0){delay5();if(s1==0){while(!s1);amiao=0;key++;led5=0;if(key==5){key=0;TR0=1;led5=1;}}}//s1 countif(s2==0){delay5();if(s2==0){while(!s2);if(key==1)//alram{ashi++;if(ashi==24){ashi=0;}}if(key==2){afen++;if(afen==60){afen=0;}}//alramif(key==4)/////{miao=0;TR0=0;fen++;if(fen==60){fen=0;}}if(key==3)///{miao=0;TR0=0;shi++;if(shi==24){shi=0;}}}}//adj +///////////////////adj-if(s3==0) {delay5();if(s3==0){while(!s3);if(key==1)//alram{ashi--;if(ashi==-1){ashi=23;}}if(key==2){afen--;if(afen==-1){afen=59;}}//alramif(key==4)//{miao=0;TR0=0;fen--;if(fen==-1){fen=59;}}if(key==3)///{miao=0;TR0=0;shi--;if(shi==-1){shi=23;}}}}//adj -}void alarm(void){if(fen!=afen){av=0;}if(av==0){if(shi==ashi&&fen==afen){beep=0;delayhalf();beep=1;delayhalf();beep=0;delayhalf();beep=1;delayhalf();}}//av==0}********************************* 主函数*********************************void main(void){ashi=7;afen=0;InitTimer0();led2=0;while(1){if(keyv==0)//close display{if(s4==0){delay5();if(s4==0){while(!s4);keyv=1;av=1;}}}if(keyv==1){if(s4==0){delay5();if(s4==0){while(!s4); keyv=0; } }}//close displayif(keyv==0){adjustment();if(key!=1&&key!=2){display(shi,fen,miao);}if(key==1||key==2){display(ashi,afen,amiao);}}if(key==0||key==3||key==4){alarm();}}//while}五. 实物仿真六. 心得体会1.单片机,是集CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器,自20世纪70年代问世以来,以其极高的性价比,受到人们的重视和关注,应用很广、发展很快。

基于单片机的多功能数字时钟的设计

基于单片机的多功能数字时钟的设计

摘要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。

本次做的数字钟是以单片机为核心,它具有时,分,秒显示的功能,并且时,分,秒还可以调整。

此次设计电子数字钟是为了了解电子数字钟的原理,从而学会制作电子数字钟。

而且通过电子数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法。

通过它可以进一步学习与掌握单片机原理与使用方法。

关键词单片机控制显示调时目录第一章基于单片机的多功能数字时钟的构成与工作原理第二章数字时钟的系统硬件、软件电路的设计1、振荡电路的设计(1)、振荡器(2)、分频器2、计数电路的设计3、校时电路的设计(1)、电路的电路图(2)、电路工作原理(3)、对电路中所用的主要元件及功能介绍4、译码与显示电路的设计第三章数字时钟扩展功能的设计1、定时控制电路的设计(1)、设计电路(2)、电路的工作原理第四章数字时钟的组装与调试基于单片机的多功能数字时钟的设计第一章基于单片机的多功能秒表的构成与工作原理目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

下面是单片机的主要发展趋势。

单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

电子综合设计(附完整程序版)基于单片机多功能数字时钟1资料

电子综合设计(附完整程序版)基于单片机多功能数字时钟1资料

课题:基于51单片机的多功能数字时钟系统设计一、概述、设计思路该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,辅以闹钟模块,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。

本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。

二、系统组成与工作原理1、工作原理:本设计采用STC89C51单片机作为本次课程设计的控制模块。

单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。

以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。

2、总是设计框架图:图二:系统总体电路图三、单元电路的设计与分析整个电子时钟系统电路可分为六大部分:中央处理单元(CPU)、复位电路部分、显示部分、键盘输入部分、温度采集部分。

1、MCS-51单片机89S51各引脚功能介绍:VCC:89S51 电源正端输入,接+5V。

VSS:电源地端。

XTAL1:单芯片系统时钟的反相放大器输入端。

XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。

A T89S51RESET:89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课题:基于51单片机的多功能数字时钟系统设计一、概述、设计思路该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,辅以闹钟模块,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。

本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。

二、系统组成与工作原理1、工作原理:本设计采用STC89C51单片机作为本次课程设计的控制模块。

单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。

以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。

2、总是设计框架图:图二:系统总体电路图三、单元电路的设计与分析整个电子时钟系统电路可分为六大部分:中央处理单元(CPU)、复位电路部分、显示部分、键盘输入部分、温度采集部分。

1、MCS-51单片机VCC:89S51 电源正端输入,接+5V。

VSS:电源地端。

XTAL1:单芯片系统时钟的反相放大器输入端。

XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。

RESET:89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。

EA/Vpp:"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。

因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。

如果是使用8751 内部程序空间时,此引脚要接成高电平。

此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。

ALE/PROG:端口3的管脚设置:P3.0:RXD,串行通信输入。

P3.1:TXD,串行通信输出。

P3.2:INT0,外部中断0输入。

P3.3:INT1,外部中断1输入。

P3.4:T0,计时计数器0输入。

P3.5:T1,计时计数器1输入。

P3.6:WR:外部数据存储器的写入信号。

P3.7:RD,外部数据存储器的读取信号。

2、复位电路MCS-51单片机的复位是由外部的复位电路来实现的。

复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。

上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。

为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。

电路图如下:上电自动复位是通过外部复位电路的电容充电来实现的。

只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。

3、时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。

因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。

常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。

本文用的是内部时钟方式。

电路图如下:MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。

4、显示电路采用LCD显示,LCD显示具有丰富多样性,灵活性,电路简单、易于控制而且功耗小,对于信息量多的系统,是比较适合的,LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作室电流仅2.0mA/5.0V。

通过编程实现总动关闭屏幕能够更有效地降低功耗。

LCD1602分两行显示,每行可现实多达16个字符,其内部的字符发生器已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制。

5、按键电路按键的开关状态通过一定的电路转换为高、低电平状态。

按键闭合过程在相应的I/O 端口形成一个负脉冲。

闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。

抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。

为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。

本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。

电路图如下:P1.0口表示功能移位键,按键选择要调整的时十位、时个位、分十位或分个位。

P1.1口表示数字“+“键,按一下则对应的数字加1。

P1.2口表示数字“-”键,按一下则对应的数字减1。

P1.3口表示时间表的切换,程序默认为日常时间表,当按下该开关,使输入为低电平时,表示当前执行的是考试时间表,并有绿发光二极管显示。

再按键,使键抬起,输入维高电平时,表示当前执行的是日常作息时间表,用红发光二级管显示。

6、温度采集部分此部分选用DS18B20 传感器,主要由四部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH 和TL、配置寄存器。

有三个管脚:DQ 为数字信号输入/输出端;GND 为电源地;VDD 为外接供电电源输入端。

电源有两种接法:1)远端因入;2)寄生电源方式。

它是支持“一线总线”接口的温度传感器,测量温度范围为-55°C~+125°C,在-10~+85°C 范围内,可编程为9 位—12 位A/D 转换精度,工作电压在3V—5V 之间。

现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

###软件设计:#include <REG51.H>#include <intrins.h>//#include "LCD1602.h"//#include "DS1302.h"#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST = P1^5; //实时时钟复位线引脚sbit wireless_1 = P3^0;sbit wireless_2 = P3^1;sbit wireless_3 = P3^2;sbit wireless_4 = P3^3;sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbit Down = P2^2; //减法按钮sbit out = P2^3; //立刻跳出调整模式按钮sbit DQ = P1^0; //温度传送数据IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value; //温度值uchar TempBuffer[5],week_value[2];void show_time(); //液晶显示程序/***********1602液晶显示部分子程序****************///Port Definitions**********************************************************sbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数************************************************************************** unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1;_nop_();LcdEn=1; _nop_();LcdEn=0;return DBPort;}//向LCD写入命令或数据************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************************************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式************************************************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}////////////////////////////////////////////////////////////////////////////////////////////////// /***********DS1302时钟部分子程序******************/typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[11];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8Cvoid DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数){unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数){unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0; // Write1302(0x8e,0x00);DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组{unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //高三位取出读出乘⑩ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);}void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->DateString[0] = '2';Time->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{Time->DateString[0] = ' ';Time->DateString[1] = ' ';Time->DateString[2] = ' ';Time->DateString[3] = ' ';}Time->DateString[4] = '/';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{Time->DateString[5] = ' ';Time->DateString[6] = ' ';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' ';}if(hide_week<2){week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else{week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[]; {if(hide_hour<2){Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';}else{Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2){Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0'; }else{Time->TimeString[3] = ' ';Time->TimeString[4] = ' ';}Time->TimeString[5] = ':';if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0'; }else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' ';}Time->DateString[8] = '\0';}void Initial_DS1302(void) //时钟芯片初始化{unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}//----------------------//////////////////////////////////////////////////////////////////////// /***********ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4;}void temp_to_str() //温度数据转换成液晶字符显示{TempBuffer[0]=temp_value/10+'0'; //十位TempBuffer[1]=temp_value%10+'0'; //个位TempBuffer[2]=0xdf; //温度符号TempBuffer[3]='C';TempBuffer[4]='\0';}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}//////////////////////////////////////////////////////////////////////////////////////////////*延时子程序*/void mdelay(uint delay){ uint i;for(;delay>0;delay--){for(i=0;i<62;i++) //1ms延时.{;}}}void outkey() //跳出调整模式,返回默认显示{ uchar Second;if(out==0||wireless_1==1){ mdelay(8);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;while(out==0);while(wireless_1==1);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////// void Upkey()//升序按键{Up=1;if(Up==0||wireless_2==1){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp+1; //分数加1up_flag=1;if(temp>0x59) //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp+1; //小时数加1up_flag=1;if(temp>0x23) //超过23小时,清零temp=0;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp+1; //星期数加1up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp+1; //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp+1; //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp+1; //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0);while(wireless_2==1);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////// void Downkey()//降序按键{Down=1;if(Down==0||wireless_3==1){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==0x7f) //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=0x59; //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0);while(wireless_3==1);}}void Setkey()//模式选择按键{Set=1;if(Set==0||wireless_4==1){mdelay(8);count=count+1; //Setkey按一次,count就加1done=1; //进入调整模式while(Set==0);while(wireless_4==1);}}void keydone()//按键功能执行{ uchar Second;if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1;}Setkey(); //扫描模式切换按键switch(count){case 1:do //count=1,调整秒{outkey(); //扫描跳出按钮Upkey(); //扫描加按钮Downkey(); //扫描减按钮if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据{Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp|0x80); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_sec++; //位闪计数if(hide_sec>3)hide_sec=0;show_time(); //液晶显示数据}while(count==2);break;case 2:do //count=2,调整分{hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_min++;if(hide_min>3)hide_min=0;show_time();}while(count==3);break;case 3:do //count=3,调整小时{hide_min=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_hour++;if(hide_hour>3)hide_hour=0;show_time();}while(count==4);break;case 4:do //count=4,调整星期{hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>3)hide_week=0;show_time();}while(count==5);break;case 5:do //count=5,调整日{hide_week=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_day++;if(hide_day>3)hide_day=0;show_time();}while(count==6);break;case 6:do //count=6,调整月{hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_month++;if(hide_month>3)hide_month=0;show_time();}while(count==7);break;case 7:do //count=7,调整年{hide_month=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_year++;if(hide_year>3)hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break;}}void show_time() //液晶显示程序{DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符ReadTemp(); //开启温度采集程序temp_to_str(); //温度数据转换成液晶字符GotoXY(12,1); //液晶字符显示位置Print(TempBuffer); //显示温度GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value); //显示星期GotoXY(11,0);Print("Week"); //在液晶上显示字母weekDelay1ms(400); //扫描延时}main(){flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Init_DS18B20( ) ; //DS18B20初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示wireless_1=0;wireless_2=0;wireless_3=0;wireless_4=0;while(1){while(done==1)keydone(); //进入调整模式while(done==0){show_time(); //液晶显示数据flag=0;Setkey(); //扫描各功能键}}}功能实现图:(为完善出:闹钟设计还未实现,带编程)四、元器件明细表元器件名称参数备注单片机AT89S51(12MHZ)1晶体DRYSTAL 12MHZ1晶体DRYSTAL 32.768MHZ1温度测量芯片DS18B201五、调试所需的仪器设备基本测试仪器:万用电表、秒表、电源、温度表六、设计的难点和可能出现的问题1、设计难点:(1):温度设计模块的设计,(2):LCD显示模块的设计(3):闹铃设计模块的实现设计(4):单片机个功能模块的综合设计(5):电路总体设计,元器件选择及焊接,调试2、可能出现的问题:(1):温度显示,与实际偏差大(2):LCD显示模块的功能显示不正常(3):闹铃设计与其他时间功能设计冲突(4):软件程序设计功能不完善,系统无法正常运转七、预期达到的性能指标1、预期达到的性能指标:能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。

相关文档
最新文档