用AT89C51与DS1302做的万年历c语言编程

合集下载

单片机实训报告万年历

单片机实训报告万年历

一、实训目的随着科技的发展,单片机在各个领域的应用越来越广泛。

本次实训旨在通过万年历的设计与实现,让学生深入了解单片机的编程与应用,提高学生的实践能力和创新意识。

通过万年历的设计,使学生掌握单片机的基本原理、编程技巧以及相关外设的使用。

二、实训内容本次实训以AT89C51单片机为核心,结合DS1302时钟芯片、LCD1602液晶显示屏和独立键盘,设计并实现一个具有年、月、日、星期、时分秒显示以及闰年判断功能的万年历。

三、实训步骤1. 需求分析- 显示当前日期和时间,包括年、月、日、星期、时分秒。

- 判断闰年,正确显示2月的天数。

- 允许用户通过按键调整日期和时间。

- 具有电源掉电保护功能,保证数据不丢失。

2. 硬件设计- 核心模块:AT89C51单片机- 时钟模块:DS1302时钟芯片,提供精确的日期和时间。

- 显示模块:LCD1602液晶显示屏,用于显示日期、时间和星期。

- 按键模块:独立键盘,用于调整日期和时间。

- 电源模块:锂电池,提供稳定的电源。

3. 软件设计- 主程序:负责初始化硬件、读取时间、显示时间和日期、处理按键输入等。

- 时钟模块:读取DS1302芯片中的时间,并进行处理。

- 显示模块:将时间、日期和星期显示在LCD1602液晶显示屏上。

- 按键处理模块:根据按键输入调整日期和时间。

4. 程序编写- 使用C语言进行程序编写,利用Keil软件进行编译和烧录。

5. 调试与测试- 对程序进行调试,确保功能正常。

- 对万年历进行测试,验证其准确性。

四、实训结果经过设计、编程、调试和测试,成功实现了万年历的功能。

万年历能够准确显示当前日期和时间,并具有闰年判断功能。

用户可以通过按键调整日期和时间,且在电源掉电的情况下,万年历仍能保持时间。

五、实训心得1. 实践出真知:通过本次实训,深刻体会到理论知识与实践应用相结合的重要性。

只有将所学知识运用到实际项目中,才能真正掌握单片机的编程与应用。

51单片机万年历实验DS1302可按键设置时钟

51单片机万年历实验DS1302可按键设置时钟

*选择设置加 1。
* 注意

*******************************************************************************
/
#include<reg51.h> #include"lcd.h" #include"ds1302.h"
sbit K1=P3^1; sbit K2=P3^0; sbit K3=P3^2; sbit K4=P3^3;
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{ if(K1==0)
//检测按键 K1 是否按下
{ Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace; void Delay10ms(void); //误差 0us
/******************************************************************************

基于89C52单片机和DS1302的万年历设计

基于89C52单片机和DS1302的万年历设计

基于89C52单片机和DS1302的万年历设计摘要古人依靠日冕、漏刻记录时间,而随着现代科技的发展,电子万年历已经成为日渐流行的日常计时工具。

本文研究的万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、1602液晶屏显示。

系统主要由单片机控制电路,显示电路以及校正电路三个模块组成。

本文阐述了系统的硬件工作原理,所应用的各个接口模块的功能以及其工作过程,论证了设计方案理论的可行性。

系统程序采用C语言编写,经Keil软件进行调试后在Proteus软件中进行仿真测试,可以显示年、月、日、星期、时、分、秒,并具有校准功能和与即时时间同步的功能。

实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:万年历单片机DS1302 lcd1602目录第一章前言............................................................................................. 错误!未定义书签。

1.1引言(课题研究的意义) (1)1.2本课题主要的研究工作 (1)1.2.1研究内容 (1)1.2.2论文章节安排 (2)1.3本章小结 (2)第二章单片机的概述 (3)2.1单片机的定义和特点 (3)2.1.1单片机的定义 (3)2.1.2单片机的特点 (3)2.2单片机的发展现状和趋势 (3)2.3编程语言的选择 (4)2.4本章小结 (4)第三章设计要求和方案论证 (5)3.1设计要求 (5)3.2单片机芯片的选择方案和论证 (5)3.3显示模块选择方案和论证 (5)3.4时钟芯片的选择方案和论证 (6)3.5电路设计最终方案决定 (6)3.6本章小结 (6)第四章系统的硬件设计与实现 (7)4.1电路设计框图 (7)4.2系统硬件概述 (7)4.3主要单元电路的设计 (7)4.3.1 STC89C52单片机简介 (7)4.3.2单片机主控制模块的设计 (10)4.3.3时钟电路模块的设计 (11)4.3.4独立式键盘设计 (13)4.3.5显示模块的设计 (13)4.4本章小结 (15)第五章系统的软件设计 (16)5.1程序流程图 (16)5.1.1系统总流程图 (16)5.1.2时钟程序流程图 (16)5.1.3液晶显示程序流程图 (17)5.2程序的设计 (18)5.2.1读写DS1302程序 (18)5.2.2液晶显示程序 (19)5.3本章小结 (19)第六章结束语 (20)致谢词 (21)参考文献 (22)附录一:系统电路图 (23)附录二:系统程序 (24)第一章前言1.1引言(课题研究的意义)万年历是我国古代传说中最古老的一部太阳历。

数字万年历设计(80c51单片机、时钟芯片ds1320)

数字万年历设计(80c51单片机、时钟芯片ds1320)

多功能数字万年历设计摘要:本设计是一种基于AT89C52单片机控制的数字万年历设计。

它具有多项显示和控制功能:能用LCD实时显示当前年、月、日、星期、时间;可对时间进行调整;具有闹铃及整点报时功能;可显示万年历等功能。

并且它以单片机的 C51 语言进行软件设计,增加了程序的可读性和可移植性,便于扩展和更改。

本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

关键词:单片机万年历时钟电路DS1302 C51Abstract:The design is a single-chip microcomputer 51 based on the number of calendar control design. It has a number of display and control functions: real-time use LCD displays the current year, month, day, week, time; may be time to adjust; with alarm as well as the whole point timekeeping function; calendar function displays. And the C51 it single-chip software design language, an increase of procedures to improve the readability and portability, ease of expansion and change.based on a microcontroller based on the will to achieve calendar of a multi-functional electronic clock designThereby achieve studying and understanding the relevant directives SCM in all aspects of the application. By main control AT89C51、clock circuit DS1302、display circuit、keystroke circuit and restore circuit componented to achieve clock calendar display function can be carried out hours seconds of the show and real-time of the show and real-time temperature display.Keywords : Single-chip clock circuit calendar DS1302 C51 language引言多功能数字万年历已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、医院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

基于AT89C51电子万年历的设计

基于AT89C51电子万年历的设计

本文提出了一种基于AT89C51单片机的万年历设计方案,该方案以AT89C51单片机作为主控核心,与时钟芯片DS1302、DS18B20温度传感器、按键、LCD显示等模块组成硬件系统。

在硬件系统中设有5个独立按键和一个LCD显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、选择时间等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势 具有广阔的市场前景。

AbstractIn this paper, a calendar is designed based on AT89C51 MCU.The proposal uses a single-chip microcomputer AT89C51 as the Master Control chip. The hardware system makes up of the clock chip DS1302,temperature sensor DS18B20, buttons, LCD display modules. Hardware system has five independent buttons and a LCD display, which can display a wealth of information. In accordance with the needs of users, time can be calibrated at any time, chosen the time and so on. To sum up this calendar has some advantages, for example easy to read, showing intuitive, feature-rich, circuit simplicity, low cost. In line with the electronic instrumentation of the development trend, the calendar has the broad market prospects.摘要.............................................................................................................................. I Abstract .......................................................................................................................... I 目录........................................................................................................................... I I 第一章绪论.. (1)1.1 课题的背景 (1)1.2 电子万年历的应用 (1)1.3 技术指标和要求 (1)第二章总体方案 (2)2.1 系统基本方案选择和论证 (2)2.2 系统设计结构图 (4)第三章硬件设计 (5)3.1 系统硬件概述 (5)3.2 系统的模块电路设计 (5)3.3 总硬件设计 (13)第四章软件设计 (14)4.1 软件设计方案 (14)4.2 各模块分析 (14)第五章系统调试 (20)5.1 硬件调试 (20)5.2 软件仿真联调 (26)5.3 功能仿真效果 (28)5.4 调试心得 (31)第六章结论与展望 (32)致谢 (33)参考资料 (34)附录Ⅰ:电子万年历原理图仿真图 (35)附录Ⅱ:电子万年历原理图 (36)附录Ⅲ:元件清单 (37)附录Ⅳ:源程序清单 (38)第一章绪论1.1 课题的背景在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。

基于单片机的万年历制作

基于单片机的万年历制作

基于DS1302和AT89C51的万年历制作一、题目分析以及器件选择1、设计要求:电子万年历(a)、基本功能要求:1>能够正确进行日历记录和显示2>能够输入设定年份3>能够通过按键进行日历的调整4>能够测试出温度2、方案选择:1>时钟芯片的选择在这个系统中,最重要的就是时钟芯片的选择,在电子时钟设计中,常用的时钟芯片有DS1302、DS1216、DS1643、DS1302。

每种芯片的主要功能基本相同,只是在引脚数量、备用电池的安装方式、计时精度和扩展功能等方面略有不同。

DS12877与DS1216芯片都有内嵌式锂电池作为备用电源:X1203引脚少,没有嵌入式锂电池,跟DS1302芯片功能相似,只是相比较之下,X1203与AT89S51搭配使用时占用I/O口较多。

DS1643为带有全功能实时时钟的非易失性型SRAM,集成了非易失性型SRAM、实时时钟、晶振、电源掉电控制电路和锂电池电源,BCD码表示的年、月、日、星期、时、分、秒,带闰年补偿。

同样。

DS1643拥有28只管脚,硬件连起来占用微处理器I/O口较多,不方便系统功能拓展和维护。

故而从性价比和货源上考虑,本设计采用实时时钟芯片DS1302。

2>显示器件的选择显示器件的选择范围很广,成本最低的就是采用八位数码管进行显示,但是使用八位数码管,经过评估和计算需要至少八个,这占用了太大的空间,而且很不美观。

第二个选择就是使用液晶,采用12864大液晶是普遍的选择,但是成本太高,而且函数调用不便,程序较长,因此从节约成本的角度考虑,使用小液晶1602进行设计。

3>设计评估本次设计完成了基本要求规定那个的所有内容,能够正确进行日历记录和显示、能够输入设定年份、能够通过按键进行日历的调整、能够进行整点报时、每年1月1日进行新年报时。

二、DS1302简介1、总体概述图一:DS1302外部引脚DS1302是一种高性能、低功耗的实时时钟芯片,附加有31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可以采用突发方式,一次传送多个字节的时钟信号或RAM数据。

基于51单片机的万年历_毕业设计

基于51单片机的万年历_毕业设计

基于51单片机的万年历中文摘要本设计万年历以AT89C51为控制中心,与温度传感器DS18B20,时钟芯片DS1302综合应用为一体,不仅能够准确显示时间、日期,闹钟设置,环境温度测量及温度高低温报警等功能。

单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。

单片机与数字万年历相结合,用于时间显示,温度测试等不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被检测数值的技术指标,从而能够大大提高产品的质量和数量。

关键词:单片机,温度传感器,C语言,液晶显示ABSTRACTThis design USES AT89C51 as calendar control center, and the temperature sensor DS18B20, the clock DS1302 chip integrated application as a whole, and not only be able to accurately display the time, date, alarm, the environment temperature measurement and high temperature, low temperature alarm functions.SCM is a collection of CPU, RAM, ROM, I/O interface and interrupt system is one of the devices, only require additional power can be used for vibration and grain is the process of digital information and control. Single-chip microcomputer and digital calendar, combining for time to show, temperature testing has not only control convenient, simple and flexible configuration advantages, and which could increase the technical index of the tested value, which can greatly improve the quality of the products and quantity.Key words:Single-chip microcomputer, Temperature Sensor,C language,Liquid crystal displ目录第一章前言 (4)1.1系统开发背景及现状 (4)1.2 系统开发的目的 (4)第二章总体设计 (5)2.1 本设计实现的功能和要求 (5)2.2 设计的选择方案和论证 (5)2.2.1单片机芯片的选择方案和论证 (5)2.2.2显示模块选择方案和论证 (5)2.2.3 时钟芯片的选择方案和论证 (6)2.3.4 温度传感器的选择方案与论证 (6)2.3总体设计框图 (6)第三章硬件设计 (8)3.1 主要元器件介绍 (8)3.1.1 单片机简介 (8)3.1.2 传感器DS18B20介绍 (9)3.1.3 LCD1602液晶显示介绍 (10)3.2 各模块设计 (11)3.2.1 主控制电路 (11)3.2.2 LCD1602显示模块设计 (12)3.2.3 DS18B20温度传感器模块 (13)3.2.4 键盘输入模块设计 (13)3.2.5 蜂鸣器模块设计 (13)3.2.6 DS1302时钟电路模块 (14)第四章软件设计 (16)第五章安装与调试 (18)5.1 安装制作 (18)5.2 硬件调试 (18)5.2.1布线的原则与焊接 (18)5.2.2 硬件调试与测试 (19)5.3 软件调试 (19)5.3.1 软件测试仪器 (19)5.3.2 软件调试与测试 (19)5.4 联调 (20)5.5测试结果分析与结论 (21)第六章总结 (22)参考文献 (23)附录A (24)附录B (26)致谢 (28)第一章前言1.1系统开发背景及现状当今世界,知识更新的速度越来越快。

基于AT89C51单片机的多功能电子万年历的设计论文

基于AT89C51单片机的多功能电子万年历的设计论文

基于AT89C51单片机的多功能电子万年历的设计AT89C51 SCM-BASED ELCTRONIC DESIGN CALENDAR毕业论文学院名称泸州职业技术学院系部名称电子工程系专业名称应用电子技术2012年12月10日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,利用proteus仿真,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

万年历采用直观的数字显示,可以在1602上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字:AT89C51;电子万年历; DS1302;1602目录摘要 (01)第一章绪论 (03)1.1 课题研究的背景 (03)1.2课题解决的主要容 (03)第二章系统的总体设计 (04)2.1系统硬件电路设计 (04)2.1.1系统硬件结构 (04)2.2单片机及其附属电路 (05)2.2.1 MCS-51系列单片机 (05)2.1.2 MCS-51系列单片机的工作条件电路 (08)2.1.3 DS1302 (09)2.1.4 LCD1602显示电路 (10)2.1.5调节电路 (12)第三章系统的软件设计 (12)3.1主程序 (12)3.2 LCD1602的驱动程序 (13)3.3 DS1302的驱动程序 (14)第四章万年历的设计结论 (14)4.1 万年历工作原理 (14)4.2 万年历结构原理图 (15)致 (16)参考文献 (16)附录 (17)附录【1】仿真图片 (17)附录【2】程序代码................................. 17-25第一章绪论1.1 课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

基于单片机的万年历设计

基于单片机的万年历设计

物理与电子工程学院2011级本科课程设计摘要电子万年历是一种非常广泛的日常计时工具,它不仅能够对时间技术,还能够对日期、温度、湿度等进行显示,所以在现代社会受到广泛应用。

本设计是一个基于AT89C51单片机的多功能日历显示系统,本设计能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还具有日期调整、时间校准以及温度采集等功能。

系统所用的时钟日历芯片DS13O2和数字式温度传感器DS18B2O具有高性能、低功耗、接口简单的特点,使本系统电路简化,编程方便,同时功能也很强。

釆用AT89C51单片机的万年历系统可以很好的改善传统采用模拟电路引起的计时不准确,不可靠,一致性差等问题。

本文设计是用单片机为主控制,通过电路仿真而实现的。

在Proteus7软件绘制硬件电路原理图,用Keil软件进行编程与调试,最终生成hex文件,载入单片机,从而实现仿真效果。

本文设计经过最终调试,能够正确显示年、月、日、周、时、分、秒以及温度等所需信息,并能正常使用对日期与时间的调整与校正功能。

系统使用16O2LCD 液晶屏显示信息,界面简洁、直观、易于操作。

关键词:万年历;单片机:AT89C51; DS1302: DS18B20目录1引言 (1)1.1研究的目的和意义 (1)1.2本系统主要研究的内容 (1)2系统方案论证 (2)2. 1控制部分的选择方案与论证 (2)2. 2显示部分的选择方案与论证 (2)2. 3时钟芯片的选择方案与论证 (2)2.4温度传感器的选择方案与论证 (3)2.5电路设计最终方案系统原理及总体结构图 (3)3系统设计 (4)3.1系统硬件仿真原理图 (4)3.2单片机89C51控制模块的设计 (4)3.3 LCD液晶显示模块设计 (7)3. 4 DS1302时钟模块的设计 (9)3.5 DS18B20温度采集模块的设计 (12)4系统调试 (15)4.1硬件调试 (15)4.2软件调试 (15)5结论 (15)参考文献 (16)物理与电子工程学院2011级本科课程设讣17物理与电子工程学院2011级本科课程设计1引言人类的日常生活离不开时间,任何具有周期变化的自然现象都可用来测量时间。

基于AT89C51单片机的多功能电子万年历的设计

基于AT89C51单片机的多功能电子万年历的设计

. . .. . . 单片机应用系统设计课题:基于AT89C51单片机的多功能电子万年历的设计姓名:班级:学号:指导老师:日期:.. .专目录一.绪言 (3)二.系统总体方案设计 (3)三.硬件系统设计: (4)四.系统软件设计 (5)五.设计总结 (8)六.参考文献 (8)七.附录 (9)一.绪论随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。

由其是单片机技术的应用产品已经走进了千家万户。

电子万年历的出现给人们的生活带来的诸多方便。

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。

万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。

因此,研究万年历及扩大其应用,有着非常现实的意义。

本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。

二.系统总体方案设计1.系统设计硬件框图2.实现的基本原理在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给2.硬件原理图四.系统软件设计仿真过程1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。

3、检查所画电路运行图,确保没有错误以后,加载源程序。

4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。

基于DS1302的日历时钟c程序

基于DS1302的日历时钟c程序
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
}
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j+*********************************************
函数功能:延时若干毫秒
bit BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据

基于51单片机的电子日历

基于51单片机的电子日历

南昌工程学院Nanchang Institute of Technology课程设计题目电子日历的设计制作学生姓名班级学号指导教师日期2014 年 1 月 2 日技术交流:群:99133698QQ:1294976338南昌工程学院课程设计摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

万年历采用直观的数字显示,可以在LCD上同时显示年、月、日、星期、时、分、秒,还具有时间校准等功能;并能按月显示当月的日历表。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字AT89C51;电子万年历; DS1302目录摘要 (I)第一章绪论 (2)1.1 课题研究的背景 (2)1.2课题的研究目的与意义 (2)1.3课题解决的主要内容 (2)第二章系统的总体设计 (4)2.1系统方案的构想与确定 (4)2.2 器件的选用 (4)2.3 系统框图设计 (5)第三章系统硬件的设计 (6)3.1 单片机最小系统 (6)3.1.1 51单片机 (6)3.1.2 复位及时钟震荡电路 (7)3.2 DS1302模块 (8)3.1.1 DS1302时钟芯片 (8)3.1.2 时钟模块电路 (10)3.3 液晶显示模块 (10)3.4 闹钟提醒模块 (11)3.5 矩阵键盘电路 (11)第四章系统的软件设计 (12)4.1 主程序 (12)4.2 闹钟提醒程序 (13)第五章系统仿真及调试 (14)5.1 日历显示模式仿真调试 (14)5.2 时间调整模式仿真调试 (15)结论 (16)参考文献 (17)附录I 原理图 (18)附录II 主程序代码 (19)第一章绪论1.1 课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片)

电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片)

*************学校毕业设计论文论文题目:电子万年历系部:自动控制系专业:自动化班级:2007级03班学生姓名:***学号:*********指导教师:***2010年 4月 15 日目录摘要 (3)绪论 (5)第1章设计要求与方案论证 (7)1.1 引言 (7)1.2 功能要求 (7)1.3方案论证 (7)第2章系统硬件电路设计 (11)2.1 电路设计 (11)2.2 系统硬件概述 (15)2.3主要单元电路的设计 (15)第3章系统的软件设计 (22)3.1程序设计 (22)3.2程序设计流程图 (22)第4章结束语 (24)参考文献 (26)附录一(电路原理图)…………………………………………..……………附录二(程序清单) (27)摘要随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。

为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

该电子万年历主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、LED动态扫描显示屏显示。

AT89C51单片机是由Atmel 公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。

此外,该电子万年历还具有时间校准等功能。

关键词:时钟电路;时钟芯片DS1302;LED动态扫描;单片机AT89C51;MAX7219;AbstractWith the society, science and technology, mankind learned that time, from the view of the sun, to the present electronic clock pendulum clock, continuous research and innovation. Observation time inthe same time, be able to understand other human beings is closely related to information, such as temperature, week, date and so on, the birth of the electronic calendar, and it set the time, date, week and temperature-in-one, with easy to read, intuitive display functional diversity, and many other advantages of simple circuit with the electronic instrumentation of the development trend of the.market prospects are broadThe main use of the electronic calendar AT89C51 single-chip microcomputer as the main core, provided by the DS1302 clock chip clock, DS18B20 the temperature chip acquisition transition temperature, LED display shows the dynamic scan. AT89C51 single-chip microcomputer is introduced by Atmel Corporation, a small power consumption, voltage can be selected 4 ~ 6V power supply voltage; DS1302 clock chip is introduced DALLAS fine with trickle charge function of current low-power real-time clock chip, which can of the year, month, day, week, hour, minute, second for time, also has multiple functions, such as a leap year compensation, and long life of the DS1302, a small error; DS18B20 temperature chip is a digital temperature sensor with a measurement accuracy high, a simple circuit to connect the characteristics of such sensors only need a data cable for data transmission; digital LED display is used to display LCD screen, can display year, month, day, week, hour, minute, second and temperature, etc. information. In addition, the electronic calendar is also a time-calibration functions.Keywords: clock circuit; clock chip DS1302; LED dynamic scanning; single-chipAT89C51;MAX7219绪论随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

四川省高等教育自学考试电子工程专业毕业论文论文题目_基于AT89C51单片机万年历的设计专业________电子工程_______________ 学生姓名________________________准考证号__________________指导老师_______________________2011年08 月23 日摘要自古人们就懂得了怎么样算时间,打草结、挂麻絏、划笔画等。

现在社会的日益进步时间变得更加的珍贵。

传统的钟表误差大、使用寿命不长、要经常的更改时间。

显示不直观,给人们带来了许多的不便。

科技的快速发展,很好的解决的问题。

而多功能电子万年历能很好的解决这些问题,万年历采用软、硬件结合,误差小、使用寿命长,采用直观的数字显示,简捷明了。

本文介绍了基于AT89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

运用单片机实现公历农历之间的转换,电子闹钟,计时器和对指定日期的查询等功能。

万年历采用液晶显示LCD-12864显示,可以同时显示年、月、日、周几、时、分、秒,农历。

综上所述此电子晚年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景关键字:AT89C51;电子万年历;DS1302 ;公农历转换;电子闹钟;计时器;日期查询目录1 绪论 (5) (5) (5) (5)2 系统的总体设计 (6) (6)器件的选用 (7)单片机的选用 (7)LCD 液晶显示器12864 选用及工作原理 (8)LCD液晶显示概述 (8)LCD模块接口说明 (9)LCD 模块主要硬件构成说明 (9)LCD 指令说明 (11)LCD 读写时序图 (11)LCD 软件初始化 (13)应用举例 (15)公农历转换 (17)3 系统硬件的设计 (20) (20) (20)AT89C51单片机 (20)3. AT89C51单片机与MCS-51完全兼容 (23)实时时钟芯片 DS1302 (25)4 系统的软件设 (29)程序流程图 (30)主程序 (31)读取日期和时间程序 (32)显示子程序 (33) (34)5 PROTEUS使用 (34) (34)ISIS对电子万年历的硬件电路设计 (35)ISIS进行电子万年历的仿真测试 (38)结论 (39)致谢 (40)参考文献 (41)程序 (42)一绪论课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

基于AT89C51单片机的多功能电子万年历的设计

基于AT89C51单片机的多功能电子万年历的设计

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。

随着人们的生活水平的提高和生活节奏加快,对时间的要求也越来越高,精准数字计时的消费需求也就越来越多。

二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。

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

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

第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。

国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。

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

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

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

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

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

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

95年出现在中国市场。

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

1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。

(绝对正确)单片机使用DS1302设计万年历

(绝对正确)单片机使用DS1302设计万年历

#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define AM(X)X#define PM(X)(X+12)#define DS1302_SECOND 0x80#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK0x8a#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8c#define DS1302_RAM( X ) (0xc0+(x)*2)#define out P0bit key_flag1=0;sbit DS1302_CLK=P2^6;sbit DS1302_IO=P2^7;sbit DS1302_RST=P2^5;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0,week_add;uint int_time=0;void delay(uint j)//1ms延时子程序{uchar i=250;for(;j>0;j--){while (i--);i=249;while (i--);i=250;}}void check_busy(void){uchar dt;do{dt=0xff;E=0;RS=0;RW=1;E=1;dt=out;}while (dt&0x80);E=0;}void write_command(uchar com){check_busy();E=0;RS=0;RW=0;out=com;E=1;_nop_();E=0;delay(1);}void write_data(uchar dat){check_busy();E=0;RS=1;RW=0;out=dat;E=1;_nop_();E=0;delay(1);}void lcd_initial(void){write_command(0x38);write_command(0x0c);write_command(0x06);write_command(0x01);delay(1);}void string(uchar ad,uchar *s){write_command(ad);while(*s>0){write_data(*s++);}}/*********DS1302********/typedef struct SYSTEM_TIME{uchar Second;uchar Minute;uchar Hour;uchar Week;uchar Day;uchar Month;uchar Year;uchar DateString[9];uchar TimeString[9];}SYSTEMTIME;SYSTEMTIME adjusted;void DS1302InputByte(uchar d)//时钟写入一字节{uchar i;ACC=d;for(i=8;i>0;i--){DS1302_IO=ACC0;DS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}uchar DS1302OutputByte(void) //时钟读取一字节{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=DS1302_IO ;DS1302_CLK=1;DS1302_CLK=0;;}return(ACC) ;}void Write1302(uchar ucAddr,uchar ucDa){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr);DS1302InputByte(ucDa);DS1302_CLK=1 ;DS1302_RST=0;}uchar Read1302(uchar ucAddr){uchar ucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0X01);ucData=DS1302OutputByte();DS1302_CLK=1;DS1302_RST=0;return(ucData);}uchar *DateToBCD(SYSTEMTIME *Time){uchar D[8];D[0]=Time->Second/10<<4+Time->Second%10;D[1]=Time->Minute/10<<4+Time->Minute%10;D[2]=Time->Hour/10<<4+Time->Hour%10;D[5]=Time->Week/10<<4+Time->Week%10;D[4]=Time->Month/10<<4+Time->Month%10;D[3]=Time->Day/10<<4+Time->Day%10;D[6]=Time->Year/10<<4+Time->Year%10;return D;}void DS1302_SetProtect(bit flag)//是否写保护{if(flag)Write1302(0x8E,0x80);elseWrite1302(0x8E,0x00);}void DS1302_SetTime(uchar Address ,uchar value)//设置时间函数{DS1302_SetProtect(0);Write1302(Address,((value/10)<<4|(value%10)));}void DS1302_GetTime(SYSTEMTIME *Time) //获取时间{uchar ReadValue;ReadValue=Read1302(0x81);Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //将BCD码转换为十进制数ReadValue=Read1302(0x83);Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);ReadValue=Read1302(0x85);Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);ReadValue=Read1302(0x87);Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);ReadValue=Read1302(0x8b);Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);ReadValue=Read1302(0x89);Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);ReadValue=Read1302(0x8d);Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); }void DateToStr(SYSTEMTIME *Time) //将日期信息转换为字符串{Time->DateString [ 0 ]= Time->Year/10+'0';Time->DateString [ 1 ]= Time->Year%10+'0';Time->DateString [ 2 ]='-';Time->DateString [ 3 ]= Time->Month/10+'0';Time->DateString [ 4 ]= Time->Month%10+'0';Time->DateString [ 5 ]='-';Time->DateString [ 6 ]= Time->Day/10+'0';Time->DateString [ 7 ]= Time->Day%10+'0';Time->DateString [ 8 ]='\0';}void TimeToStr(SYSTEMTIME *Time) //将时间信息转换为字符串{Time->TimeString [ 0 ]= Time->Hour/10+'0';Time->TimeString [ 1 ]= Time->Hour%10+'0';Time->TimeString [ 2 ]=':';Time->TimeString [ 3 ]= Time->Minute/10+'0';Time->TimeString [ 4 ]= Time->Minute%10+'0';Time->TimeString [ 5 ]=':';Time->TimeString [ 6 ]= Time->Second/10+'0';Time->TimeString [ 7 ]= Time->Second%10+'0';Time->TimeString [ 8 ]='\0';}void Initial_DS1302(void){uchar Second;Second=Read1302(DS1302_SECOND);if(Second&0x80){DS1302_SetTime(DS1302_SECOND,0);}}void DS1302_TimeStop(bit flag){uchar Data ;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND,Data|0x80);elseWrite1302(DS1302_SECOND,Data&0x7F); }uchar *WeekToStr(SYSTEMTIME Time){uint i;uchar *z;i=Time.Week;switch(i){case 1:z="sun";break;case 2:z="mon";break;case 3:z="tue";break;case 4:z="wen";break;case 5:z="thu";break;case 6:z="fri";break;case 7:z="sat";break;}return z;}int key_scan(){int i=0;uint temp;P1=0xf0;delay(40);temp=P1;if(temp!=0xf0){i=1;}else{i=0;}return i;}uchar key_value(){uint v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'};uint temp,n=0,m=0;uchar value;P1=0xfe;temp=P1;if(temp!=0xfe)m=0;P1=0xfd;temp=P1;if(temp!=0xfd)m=1;P1=0xfb;temp=P1;if(temp!=0xfb)m=2;P1=0xf7;temp=P1;if(temp!=0xf7)m=3;P1=0xef;temp=P1;if(temp!=0xef)n=0;P1=0xdf;temp=P1;if(temp!=0xdf)n=1;P1=0xbf;temp=P1;if(temp!=0xbf)n=2;value=v[m][n];return value;}void adjust(void){if (key_scan()&&key_flag1)switch(key_value()){case'0':sec_add++;break;case'1':min_add++;break;case'2':hou_add++;break;case'3':day_add++;break;case'4':mon_add++;break;case'5':yea_add++;break;case'6':week_add++;break;default:break;}adjusted.Second+=sec_add;adjusted.Minute+=min_add;adjusted.Hour+=hou_add;adjusted.Day+=day_add;adjusted.Month+=mon_add;adjusted.Year+=yea_add;adjusted.Week+=week_add;if(adjusted.Second>59){adjusted.Second=adjusted.Second%60;adjusted.Minute++;}if(adjusted.Minute>59){adjusted.Minute=adjusted.Minute%60;adjusted.Hour++;}if(adjusted.Hour>23){adjusted.Hour=adjusted.Hour%24;adjusted.Day++;}if(adjusted.Week>7){adjusted.Week=adjusted.Week%7;}if(adjusted.Day>31)adjusted.Day=adjusted.Day%31;if(adjusted.Month>12)adjusted.Month=adjusted.Month%12;if(adjusted.Year>100)adjusted.Year=adjusted.Year%100;}void changing(void) interrupt 0 using 0{if(key_flag1)key_flag1=0;elsekey_flag1=1;}void showtime(){uint i;uchar p1[]="D:",p2[]="T:";SYSTEMTIME T;lcd_initial();Initial_DS1302();EA=1;EX0=1;IT0=1;while(1){string(0x80,p1);string(0xc0,p2);DS1302_GetTime(&T);adjusted.Second=T.Second;adjusted.Minute=T.Minute;adjusted.Hour=T.Hour;adjusted.Day=T.Day;adjusted.Month=T.Month;adjusted.Year=T.Year;adjusted.Week=T.Week;for(i=0;i<9;i++){adjusted.DateString[i]=T.DateString[i];adjusted.TimeString[i]=T.TimeString[i];}adjust();DateToStr(&adjusted);TimeToStr(&adjusted);string(0x82,adjusted.DateString);string(0x8b,&WeekToStr(adjusted));string(0xc2,adjusted.TimeString);delay(100);//break;}}void main( ){showtime();}。

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

//写的时候,是低电平改变数据,上升沿送入数据//读的时候,是低电平读入数据,下降沿使得从设备把数据放到总线上//读的时候,是低电平读,但没有读出,提供下降沿使得从设备把数据放到总线上#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit rs=P2^4;sbit rw=P2^5;sbit en=P3^6;sbit reset=P3^3;sbit sclk=P3^0;sbit io=P3^1;uchar str1[]="date of today is:";uchar init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年//void delay(){uchar j;for(j=250;j>0;j--);}//-------------------液晶模块-----------------//void en_toggle(){en=0;//_nop_();delay();en=1;delay();// _nop_();en=0;} //注意必须加延时,否则会出问题的void is_ready(){P2=0x00;//设置为输入口 //注意:现实中应该送0xffrs=0;rw=1;en=1;while(bflag);en=0;}void write_cmd(uchar cmd){is_ready();rs=0;rw=0;P2=cmd;en_toggle();_nop_();}void write_data(uchar indata){is_ready();rs=1;rw=0;P2=indata;en_toggle();_nop_();}void write_str(uchar addr,uchar *p){uchar i;write_cmd(addr);while(p[i]!='\0'){write_data(p[i]);i++;}}void write_position(uchar row,uchar col) {uchar p;if(row==1){p=0x80+col-1;write_cmd(p);}else{p=0xc0+col-1;write_cmd(p);}}void init_lcd(){write_cmd(0x38);write_cmd(0x0c);write_cmd(0x06);write_cmd(0x01);//清屏幕}//------------液晶模块结束---------------------//-----------ds1302模块开始-------------------//注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据//读写时都是从第0位开始void write_byte(uchar inbyte){uchar i;for(i=8;i>0;i--){sclk=0; //写的时候低电平改变数据if(inbyte&0x01)io=1;elseio=0;sclk=1; //写的时候高电平,把数据写入ds1302_nop_();inbyte=inbyte>>1;}}uchar read_byte() //sclk的下跳沿读数据{uchar i,temp=0;io=1; //设置为输入口for(i=7;i>0;i--){sclk=0;if(io==1)temp=temp|0x80;elsetemp=temp&0x7f;sclk=1; //产生下跳沿temp=temp>>1;}return (temp);}//----------往ds1302的某个地址写入数据------------- void write_ds1302(uchar cmd,uchar indata){reset=1;write_byte(cmd);write_byte(indata);reset=0;sclk=0;}//----------读ds1302某地址的的数据----------------- uchar read_ds1302(uchar addr){uchar backdata;reset=1;write_byte(addr);backdata=read_byte();//先写地址,然后读数据reset=0;sclk=0;return (backdata);}//------------设置初始时间-------------------void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据{write_ds1302(0x8e,0x00);//写控制字,允许写操作for(;n>0;n--){write_ds1302(addr,*p);p++;addr=addr+2;}write_ds1302(0x8e,0x80);//写保护,不允许写}//----------- 读取当前时间-------------------void read_nowtime(uchar addr,uchar *p,uchar n){for(;n>0;n--){*p=read_ds1302(addr);p++;addr=addr+2;}}void init_ds1302(){reset=0;sclk=0;write_ds1302(0x80,0x00);//写控制字,允许写write_ds1302(0x90,0x00);//禁止涡流充电}//-----------ds1302模块结束-------------------void main(){init_lcd(); //初始化LCDwrite_str(0x80,str1); //液晶显示提示信息init_ds1302(); //初始化ds1302set_ds1302(0x80,init,7);//设置初始时间,日期,年月//如果不设置初始化时间的话,则默认为系统时间while(1){read_nowtime(0x81,init,7); //读出当前时间,读出7个字节write_position(2,1);write_data('0'+((init[2]&0xf0)>>4));write_position(2,2);write_data('0'+(init[2]&0x0f)); //读小时write_position(2,3);write_data(':');write_position(2,4);write_data('0'+((init[1]&0xf0)>>4));write_position(2,5);write_data('0'+(init[1]&0x0f)); //读分钟write_position(2,6);write_data(':');write_position(2,7);write_data('0'+((init[0]&0xf0)>>4));write_position(2,8);write_data('0'+(init[0]&0x0f)); //读秒write_position(2,13);write_data('0'+((init[6]&0xf0)>>4));write_position(2,14);write_data('0'+(init[6]&0x0f)); //读年write_position(2,15);write_data('/');write_position(2,16);write_data('0'+((init[4]&0xf0)>>4));write_position(2,17);write_data('0'+(init[4]&0x0f)); //读月write_position(2,18);write_data('/');write_position(2,19);write_data('0'+((init[3]&0xf0)>>4));write_position(2,20);write_data('0'+(init[3]&0x0f)); //读日。

相关文档
最新文档