基于单片机的电子日历时钟系统

合集下载

基于单片机的万年历设计

基于单片机的万年历设计

基于单片机的万年历设计一、系统总体设计基于单片机的万年历系统主要由单片机控制模块、时钟模块、显示模块、按键模块和电源模块等组成。

单片机控制模块是整个系统的核心,负责处理和协调各个模块之间的数据传输和控制信号。

通常选用具有较高性能和稳定性的单片机,如 STC89C52 等。

时钟模块用于提供准确的时间信息,常见的有 DS1302 等芯片,能够实现年、月、日、时、分、秒的精确计时。

显示模块用于将时间等信息直观地展示给用户,可采用液晶显示屏(LCD)或数码管。

LCD 显示效果清晰、美观,但成本相对较高;数码管则价格低廉,显示简单明了。

按键模块用于用户对万年历进行设置和操作,如调整时间、设置闹钟等。

电源模块为整个系统提供稳定的电源供应,保证系统的正常运行。

二、硬件设计1、单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,保证其正常工作;复位电路则用于在系统出现异常时将单片机恢复到初始状态。

2、时钟模块电路DS1302 时钟芯片通过串行方式与单片机进行通信,其引脚连接到单片机的相应 I/O 口。

通过对 DS1302 进行读写操作,可以获取和设置时间信息。

3、显示模块电路若采用 LCD1602 液晶显示屏,其数据线和控制线与单片机的 I/O 口相连。

通过编程控制单片机向 LCD 发送指令和数据,实现时间等信息的显示。

4、按键模块电路通常使用独立按键,将按键的一端接地,另一端连接到单片机的I/O 口,并通过上拉电阻保证在按键未按下时引脚处于高电平。

当按键按下时,引脚电平被拉低,单片机通过检测引脚电平的变化来判断按键的操作。

三、软件设计软件设计主要包括主程序、时钟模块驱动程序、显示模块驱动程序和按键处理程序等。

主程序负责初始化各个模块,并进行循环检测和处理。

在循环中,不断读取时钟模块的时间数据,然后通过显示模块进行显示,并检测按键是否有操作。

时钟模块驱动程序根据 DS1302 的通信协议,实现对时钟芯片的读写操作,从而获取和设置时间。

基于单片机的电子万年历

基于单片机的电子万年历

论文题目基于单片机的电子万年历(英文)Design of Electronic Calendar basedon single Chip Microcomputer摘要现今信息技术飞速发展,时间和每一个人都有非常密切的相互联系,时间对任何人都有着非常重要的影响。

随着科技的快速发展,流逝的时间,我们从根据太阳来判断时间,发展到了用钟摆看时间,到现在又有了各种电子表等。

当各类电子表在我们生活中广泛应用的时候,电子万年历的的出现又把我们引入到一个全新的时代。

电子万年历是一种使用非常广泛的日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,还具有时间校准等功能。

本设计是基于51系列的单片机进行的电子万年历设计,主要由时钟芯片DS1302采集数据到单片机进行处理再通过LCD1602显示出来。

电子万年历的软件部分是使用c语言编写,主要用到的硬件电路有时钟芯片DS1302、液晶显示LCD1602,主控制芯片AT89C51,还有按键。

关键词:单片机, LCD602, AT89C51 ,DS302AbstractNowadays information technology develops rapidly, and time and everyone have very close interconnections, and time has a very important influence on anyone. With the rapid development of science and technology, the time elapsed, we judge the time according to the sun, develop to use the pendulum to watch the time, and now have all kinds of electronic watches and so on. When all kinds of electronic watches are widely used in our lives, the advent of electronic calendar brings us to a whole new era. Electronic calendar is a kind of widely used daily timing tool, which is becoming more and more popular in modern society. It can time the year, month, day, Sunday, hour, minute, second, also have leap year compensation and so on many functions, still have time calibration and so on function.This design is based on the electronic calendar design of 51 series of single-chip microcomputer, mainly by the clock chip DS1302 collecting data to the single chip microcomputer for processing and then through LCD1602. The software part of the electronic calendar is written in c language. The main hardware circuits used are clock chip DS1302, liquid crystal display LCD1602, master control chip AT89C51, and buttons.Key words:Microcontroller;LCD1602;AT89C51;DS1302目录目录 (3)第1章绪论 (4)1.1背景及目的 (4)1.1.1课题研究背景 (4)1.1.2选题的意义及目的 (4)1.2 国内外发展现状及水平 (4)第2章系统的方案选择及论证 (6)2.1 单片机芯片选择 (6)2.2 时钟芯片的选择与论证 (6)2.3 显示模块的选择与论证 (6)2.4 电路设计最终方案 (7)第3章系统的硬件设计与实现 (8)3.1 电路设计框图 (8)3.2系统硬件概述 (8)3.3 系统的电路设计 (8)3.3.1 系统总体电路设计图 (9)3.3.2单片机主控制模块 (9)3.3.3 时钟电路模块 (12)3.3.4 显示模块 (16)第4章系统的软件设计 (19)4.1 程序流程框图: (19)第5章Proteus软件仿真与测试 (22)5.1 仿真软件介绍 (22)5.2 Proteus 仿真效果 (22)第6章总结与体会 (24)参考文献 (25)附录1:程序 ..................................................... 错误!未定义书签。

基于单片机的电子万年历设计

基于单片机的电子万年历设计

基于单片机的电子万年历设计一、概述随着科技的快速发展和人们对生活品质的追求,电子设备在日常生活中扮演着越来越重要的角色。

电子万年历作为一种集日期、时间显示于一体的实用电子产品,已经深入到人们的日常生活和工作中。

传统的机械式日历已经无法满足现代人对时间精确性和功能多样性的需求,基于单片机的电子万年历设计应运而生,成为了当前研究的热点之一。

基于单片机的电子万年历设计,旨在利用单片机(如STC89CAT89C51等)的强大计算和控制能力,结合液晶显示屏(LCD)、按键输入等外设,实现时间的准确显示、日期的自动更新、闹钟提醒、温度显示等多样化功能。

该设计不仅具有高度的集成性和可靠性,而且能够通过编程实现各种定制化的功能,满足不同用户的需求。

本文将对基于单片机的电子万年历设计进行详细的介绍和分析,包括设计思路、硬件组成、软件编程等方面。

通过本文的阅读,读者可以了解电子万年历的基本原理和设计方法,掌握单片机在电子万年历设计中的应用技巧,为实际的开发工作提供有益的参考和借鉴。

1.1 研究背景与意义随着科技的不断进步,人们日常生活和工作中对于时间的精度和便捷性的要求日益提高。

传统的机械式日历和简单的电子时钟已经无法满足现代生活的需求。

电子万年历作为一种集时间显示、日历查询、定时提醒等多功能于一体的电子装置,在日常生活、工作乃至科研领域都具有广泛的应用价值。

基于单片机的电子万年历设计,不仅可以提供准确的时间显示,还能实现复杂的日期计算、农历显示、节假日提示等功能,极大地提高了时间管理的效率和便捷性。

单片机作为一种集成度高、功耗低、价格适中的微型计算机,非常适合用于小型化、智能化的电子产品设计,如电子万年历。

本研究的意义在于,通过对基于单片机的电子万年历的设计研究,可以推动微型计算机技术和电子时钟技术的融合发展,提升电子产品的智能化水平,满足人们日益增长的生活和工作需求。

同时,该研究还可以为相关领域的技术人员提供参考和借鉴,推动电子万年历产品的不断创新和优化。

基于单片机的万年历设计

基于单片机的万年历设计

一、引言万年历是一种显示当前日期和时间的器件或软件。

随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。

本文将介绍一种基于单片机的万年历设计。

二、设计原理1.显示模块:采用液晶显示屏作为显示模块,可以显示日期、时间等信息。

2.时钟模块:基于RTC(实时时钟)模块,用于获取当前日期和时间。

3.按键模块:采用按键模块作为输入模块,用于设置日期和时间、切换显示模式等。

4.控制模块:基于单片机,用于控制各个模块的工作,并进行相关的计算和显示。

三、硬件设计1.单片机选择在本设计中,选择了一款常用的单片机,STM32F103C8T6、它具有低功耗、高性能的特点,并且具备丰富的外设接口,非常适合用来设计万年历。

2.RTC模块选择在本设计中,选择了一款常用的RTC模块,DS1302、它具有低功耗、稳定性好的特点,并且具备SPI接口,非常适合用来获取当前日期和时间。

3.液晶显示屏选择在本设计中,选择了一款常用的液晶显示屏,1602液晶显示屏。

它具有较大的屏幕尺寸、低功耗的特点,并且可以显示多行字符,非常适合用来显示日期、时间等信息。

4.按键模块选择在本设计中,选择了一款常用的按键模块,4x4按键模块。

它具备4行4列的按键布局,可以满足设置日期和时间、切换显示模式等功能的需求。

五、软件设计1.初始化设置在软件设计中,首先需要对各个硬件模块进行初始化设置。

2.获取当前日期和时间使用RTC模块获取当前日期和时间,并将其存储在相应的变量中。

3.显示日期和时间使用液晶显示屏将当前日期和时间显示出来。

4.设置日期和时间通过按键模块获取用户的输入,并将对应的日期和时间设置到RTC模块中。

5.切换显示模式通过按键模块获取用户的输入,并根据用户的选择切换不同的显示模式,例如切换到年模式、月模式、日模式等等。

六、总结通过以上的设计,基于单片机的万年历完成了日期和时间的获取、显示和设置等功能。

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

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

引言随着生活节奏的日益加快,人们的时间观也越来越重,同时对电子钟表、日历的需求也随之提高。

因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。

本系统程序由主程序、中断服务函数和多个子函数构成。

主函数主要完成各子函数和中断函数的初始化。

定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。

时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改具体值写入时钟芯片内部。

系统的硬件设计与电路原理电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能、低功耗、能在3V的超低压工作。

时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

可产生年、月、日、周日、时、分、秒,具有使用寿命长、精度高和低功耗等特点,同时具有掉电自动保存功能。

主控制模块单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

时钟电路模块时钟电路模块的设计DS1302的引脚排列如图3所示,其中Vcc1为后备电源,Vcc2为主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。

X1和X2是振荡源,外接32.768KHz晶振。

RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

基于单片机的多功能电子万年历系统

基于单片机的多功能电子万年历系统

一、研究现状
一、研究现状
在国内外学者的研究中,单片机多功能电子万年历系统得到了广泛的。近年 来,国内外研究者纷纷致力于开发具有高精度、多功能、智能化等特点的电子万 年历系统。特别是在国内,单片机技术的快速发展为电子万年历系统的研究提供 了强有力的支持。同时,国外的发达国家如美国、日本等也在不断推进相关技术 的研发,电子万年历市场呈现出蓬勃的发展态势。
基于单片机的多功能电子万年 历系统
01 一、研究现状
目录
02 二、技术方案
03 三、系统实现
04 四、系统测试
05 五、创新点和成果
06 六、展望未来
内容摘要
随着科技的不断发展,单片机技术在电子产品中的应用越来越广泛。其中, 基于单片机的多功能电子万年历系统成为了国内外研究的热点。本次演示将详细 介绍基于单片机的多功能电子万年历系统的研究现状、技术方案、系统实现、系 统测试、创新点和成果以及展望未来。
六、展望未来
3、安全性更高:随着物联网技术的发展,未来的电子万年历可能会涉及更多 的隐私和安全问题,因此需要加强系统安全性的设计和保护。
谢谢观看
随着科技的不断发展,基于单片机的多功能电子万年历系统将会有着更加广 阔的发展前景和趋势。未来可能的发展方向和不足包括:
六、展望未来
1、功能更加强大:未来电子万年历可能会融入更多的智能家居技术,实现与 其他智能设备的互联互通,成为智能家居的一个重要组成部分。
六、展望未来
2、更加节能环保:未来的电子万年历将会更加注重节能和环保,采用更加先 进的节能技术,减少对环境的污染。
五、创新点和成果
2、多功能:除了显示时间、日期外,还具有闹钟、计步器等多种功能,满足 用户多样化的需求。
五、创新点和成果

基于单片机的电子时钟万年历设计

基于单片机的电子时钟万年历设计

(2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容Vcc=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。

所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。

图2 DS1302管脚图1.2显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。

目前单片机数码管普通采用动态显示。

编程简单,但只能显示数字,不能显示中文。

方案二:LCD1602能够显示英文和数字。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

所以最终选择LCD1602。

2.项目功能模块2.1 89C51模块Mcs-51单片机管脚图图如图3所示:单片机管脚图2.2 1602液晶显示模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

基于单片机控制的电子万年历.

基于单片机控制的电子万年历.

基于单片机控制的电子万年历摘要本设计是一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整功能,并且还包含显示温度功能。

其中显示部分采用LCD1602显示,时钟部分采用DS1302时钟芯片,温度部分采用DS18B20单线温度传感器。

软件方面我们采用C语言编程,利用Keil uVision3软件编写C语言程序并且生成HEX文件。

先将程序在Proteus 仿真,通过之后再烧录到单片机中。

该设计的优点是充分利用了LCD1602的显示功能完成了万年历应该具有的功能并且还扩展了温度;不足之处是收到LCD1602显示功能的限制没能显示农历日期。

电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采用AT89S51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

关键词:万年历;AT89C51;液晶显示(LCD1602);温度传感器(DS18B20);时钟芯片(DS1302);proteus仿真;目录摘要 (1)目录 (1)1引言: (2)2设计方案 (3)2.2模块选择 (4)2.3方案框图 (4)3 软件实现 (5)3.1流程图 (5)3.2程序编写 (6)3.3运行程序生成hex文件 (12)4 proteus仿真 (13)4.1软件简介 (13)4.2 Proteus电路仿真与调试 (14)5 PCB制版 (21)5.1 绘制电路原理图并仿真调试 (21)5.2加载网络表及元件封装 (21)5.3规划电路板并设置相关参数 (23)5.4元件布局及调整 (24)5.5布线并调整 (25)5.6输出及制作PCB (26)总结 (27)参考文献 (28)致谢 (29)1引言:随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。

基于51单片机ds1302和ds18b20芯片设计的电子日历

基于51单片机ds1302和ds18b20芯片设计的电子日历

液晶 1602设计的电子日历, proteus 仿真及 C 程序.#include<reg51.h> // 包含单片机寄存器的头文件#include<intrins.h> //包含 _nop_()函数定义的头文件 #define uchar unsigned char #define uint unsigned intsbit DQ=P3^7;//ds18b20 和单片机连接口uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志unsigned char code digit[10]={"0123456789"}; //定义字符数组显示用 DS1302 时钟芯片、 AT89C51 单片机、 温度传感器 DS18B20、LCD数字sbit DATA=P3^6; //位定义1302 芯片的接口,数据输出端定义在P1.1引脚sbit RST=P3^4;//位定义1302 芯片的接口,复位端口定义在P1.1引脚sbit SCLK=P3^5; //位定义1302 芯片的接口,时钟输出端口定义在P1.1引脚//液晶引脚定义sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0 引脚sbit RW=P2^1; //读写选择位,将RW 位定义为P2.1 引脚sbit E=P2^2; //使能信号位,将E 位定义为P2.2 引脚sbit BF=P0^7;/*****************************************************函数功能:延时若干微秒入口参数:n void delaynus(unsigned char n) {unsigned char i;for(i=0;i<n;i++);}void Write1302(unsigned char dat)unsigned char i;SCLK=0; //拉低SCLK ,为脉冲上升沿写入数据做好准备delaynus(2); // 稍微等待,使硬件做好准备for(i=0;i<8;i++){DATA=dat&0x01; //取出dat的第0 位数据写入1302 delaynus(2); // 稍微等待,使硬件做好准备SCLK=1;delaynus(2); // 稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK ,形成脉冲dat>>=1;}}/***************************************************** 函数功能:根据命令字,向1302 写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据***************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat)RST=0; //禁止数据传递SCLK=0; // 确保写数居前SCLK 被拉低RST=1; //启动数据传输delaynus(2); //稍微等待,使硬件做好准备Write1302(Cmd); // 写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}unsigned char Read1302(void){unsigned char i,dat;delaynus(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续读8 个二进制位数据{dat>>=1;// 将dat 的各数据位右移1 位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1 取出,写在dat的最高位SCLK=1; //将SCLK 置于高电平,为下降沿读出delaynus(2); //稍微等待SCLK=0; //拉低SCLK ,形成脉冲下降沿delaynus(2); //稍微等待}return dat; //将读出的数据返回//dat 已经是一位一位的存在单}// 片集中unsigned char ReadSet1302(unsigned char Cmd){unsigned char dat;RST=0; //拉低RSTSCLK=0;//确保写数居前SCLK 被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302();SCLK=1;RST=0;return dat;}void Init_DS1302(void)//读出数据{WriteSet1302(0x8E,0x00);WriteSet1302(0x80,((0/10)<<4|(0%10))); WriteSet1302(0x82,((0/10)<<4|(0%10))); WriteSet1302(0x84,((12/10)<<4|(12%10)));WriteSet1302(0x86,((16/10)<<4|(16%10)));WriteSet1302(0x88,((11/10)<<4|(11%10)));WriteSet1302(0x8c,((8/10)<<4|(8%10)));}/*****************************************************函数功能:延时1ms(3j+2)*i=(3 × 33+2)×10=1010(微秒),可以认为是1 毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++)}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delaynms(unsigned char n)unsigned char i;{for(i=0;i<n;i++)delay1ms();}bit BusyTest(void){bit result;RS=0;RW=1;E=1;_nop_();_nop_();_nop_();_nop_();result=BF;E=0;return result;}void WriteInstruction (unsigned char dictate) {while(BusyTest()==1);RS=0;RW=0;E=0;_nop_();_nop_();P0=dictate;_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;}/void WriteAddress(unsigned char x) {WriteInstruction(x|0x80);}void WriteData(unsigned char y) {while(BusyTest()==1);RS=1;RW=0;E=0;P0=y;_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;}void LcdInitiate(void){delaynms(15);WriteInstruction(0x38); delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38); delaynms(5); WriteInstruction(0x0c); delaynms(5); WriteInstruction(0x06); delaynms(5); WriteInstruction(0x01); delaynms(5);}void DisplaySecond(unsigned char x){unsigned char i,j;i=x/10;// 取十位j=x%10;// 取个位WriteAddress(0x49);WriteData(digit[i]);WriteData(digit[j]);delaynms(50);}void DisplayMinute(unsigned char x) unsigned char i,j; i=x/10;// 取十位j=x%10;// 取个位WriteAddress(0x46);WriteData(digit[i]);WriteData(digit[j]);delaynms(50); //延时1ms 给硬件一点反应时间{}void DisplayHour(unsigned char x){unsigned char i,j; //j,k,l 分别储存温度的百位、十位和个位i=x/10;j=x%10;WriteAddress(0x43);WriteData(digit[i]);WriteData(digit[j]); delaynms(50);}void delay_18B20(unsigned int i)//延时1 微秒{while(i--);}voidds1820rsδ=ds1820M^*/宀UnSignedChar X H P DQHI-=DQM tξp deωyl18B20(4x1Mt卑O O H O -deωyl18B20(10sDQMdeωyl18B20(4sUChardsl820rd()Λ⅛^≡*/ 宀UnSignedChar -H o -UnSignedChard s-HO -for("8v0 〒—)宀O O H o - ⅛⅛φdat>VMDQHIS龄奚⅛≡F Φif(DQ)dafll0x80八return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1; wdata>>=1;}}read_temp(){ uchar a,b;ds1820rst(); ds1820wr(0xcc);ds1820wr(0x44); ds1820rst();ds1820wr(0xcc); ds1820wr(0xbe);a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{ tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);return(tvalue);}void ds1820disp(){ uchar flagdat;disdata[0]=tvalue/1000+0x30;disdata[1]=tvalue%1000/100+0x30;disdata[2]=tvalue%100/10+0x30;disdata[3]=tvalue%10+0x30;if(tflag==0)flagdat=0x20;elseflagdat=0x2d;if(disdata[0]==0x30){disdata[0]=0x20;if(disdata[1]==0x30){disdata[1]=0x20;}}WriteAddress (0x80); WriteData (flagdat);WriteAddress (0x81);WriteData (disdata[0]);WriteAddress (0x82);WriteData (disdata[1]);WriteAddress (0x83);WriteData (disdata[2]);WriteAddress (0x84);WriteData (0x2e);WriteAddress (0x85);WriteData (disdata[3]);}/*结束*/ void main(void){unsigned char second,minute,hour; // 分别储存苗、分、小时,unsigned char ReadValue; //储存从1302 读取的数据LcdInitiate(); //将液晶初始化WriteAddress(0x45); //写小时和分钟分隔符的显示地址,显示在第2 行第6 列WriteData(':'); //将字符常量写入LCDWriteAddress(0x48); //写分钟和秒分隔符的显示地址,显示在第2 行第9 列WriteData(':'); //将字符常量写入LCDInit_DS1302(); //将1302 初始化while(1){read_temp();//读取温度ds1820disp();//显示ReadValue = ReadSet1302(0x81); //从秒寄存器读数据second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);DisplaySecond(second); // 显示秒ReadValue = ReadSet1302(0x83); //从分寄存器读minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); // 将读出数据转化DisplayMinute(minute); // 显示分ReadValue = ReadSet1302(0x85); //从分寄存器读hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); // 将读出数据转化DisplayHour(hour); // 显示小时} }。

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

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

基于单片机的多功能电子万年历设计引言在现代社会中,计算机及其应用已经成为我们生活中不可或缺的一部分。

计算机科技的发展不仅使我们的生活更加便捷,还为我们提供了更多的娱乐和功能选择。

在这样一个科技高度发达的时代,电子万年历作为一种基于单片机技术的应用产品,正逐渐走进人们的生活。

而本文将着重对基于单片机的多功能电子万年历进行设计与实现。

一、设计目标本次设计主要是基于单片机的多功能电子万年历。

设计目标包括:1.显示日期、时间和星期几的功能。

2.具备日历计算功能,能够计算今天是该年的第几天,该周的第几天等信息。

3.具备闹钟和定时器功能。

二、设计思路基于单片机的多功能电子万年历的设计理念是通过单片机与LCD显示屏、温度传感器、按键等外设组合实现多种功能。

具体实现步骤如下:1. 使用单片机和RTC(Real-Time Clock)芯片实现时间的获取和处理。

RTC芯片可以提供准确的时钟信息,单片机可以通过与RTC芯片的通信来读取时钟信息,并进行相应的处理。

2.使用单片机与LCD显示屏进行通信,将获取的时间、日期和星期信息显示在LCD显示屏上。

3.设计按键接口,通过按键的触发实现切换功能或进行相应操作。

例如,通过按键的触发可以实现日期、时间的调整,以及闹钟和定时器的设置等。

4.使用单片机和温度传感器实现温度测量功能。

通过温度传感器读取当前温度信息,并将其显示在LCD屏幕上。

5.使用定时器功能实现闹钟和定时器的功能。

单片机可以通过定时器来控制闹钟和定时器的开启与关闭,并通过LCD屏幕上的显示提醒用户。

三、电路设计本次设计中需要使用的元器件主要包括单片机、RTC芯片、LCD显示屏、温度传感器和按键。

其中,单片机为本次设计的核心控制器,RTC芯片用于提供准确的时钟信息,LCD显示屏用于显示时间、日期和其他信息,温度传感器用于测量当前温度信息,按键用于触发相应的操作。

四、软件设计本次设计中需要编写相应的软件程序,用于读取RTC芯片提供的时钟信息,并将其显示在LCD屏幕上。

基于单片机的电子日历时钟

基于单片机的电子日历时钟

保护 psw、A 寄存器
带显示延时
N
Key0 按下?
Y
秒表模式?
N
设置闹钟?
N
闪烁切换模式
Y
暂停/继续计时
Y 打开/关闭闹钟
滴一声提示
闪烁循环切换
恢复 psw、A 寄存器
退出中断
八、性能测试与故障排查
1、硬件部分
问题:断路。 现象:程序下载完之后可以工作但是 6 个 LED 显示器有 2 个没亮。 分析:因为其他几个显示器完全正常,这两个则完全没亮,所以推断是位选
修改二:程序默认设置的外部中断延时过短,导致操作过于“灵敏”,也即 按键 K0、K1 按下时,跳变过快。这里所说的延时是中断子程序 EX0_INT 和 EX1_INT 中的语句 LCALL DIS_DELAY。解决这个情况只需修改 DELAY 次数,则 DIS_DELAY: MOV D_CNT_DIS,#10H。
; 学生姓名:陈晓伟、冯劲增 ; 学生学号:200830240144,200830240229 ; 分组编号:004
;变量定义
TICK_CNT EQU 20H
;------------------
SECOND_BCD EQU 21H
MINUTE_BCD EQU 22H
HOUR_BCD EQU 23H
ALAM_OFF1 EQU 39H
ALAM_OFF2 EQU 3AH
ALAM_OFF3 EQU 3BH
;------------------
;中断向量表
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EX0_INT
; port INT0
ORG 000BH

基于51单片机的电子日历的应用设计与实现

基于51单片机的电子日历的应用设计与实现

摘要摘要随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒信息,还具有时间校准等功能。

本设计以数字集成电路技术为基础,单片机技术为核心。

软件设计采用模块化结构,C语言编程。

系统通过LCD显示数据,可以显示公历日期(年、月、日、时、分、秒)以及星期。

在内容安排上首先描述系统硬件工作原理,着重介绍了各硬件接口技术和各个接口模块;其次,详细的阐述了程序的各个模块和实现过程。

具体实现功能:(1)显示年月日时分秒及星期信息(2)具有可调整日期和时间功能关键词:万年历单片机DS1302目录目录摘要 (I)第一章方案论证 (1)1.1单片机芯片的选择方案和论证 (1)1.2显示模块选择方案和论证 (1)1.3时钟芯片的选择方案和论证 (1)1.4电路设计最终方案决定 (2)第二章系统的硬件设计与实现 (3)2.1 总体电路 (3)2.2单片机主控制模块的设计 (3)2.2.1 AT89S52的介绍 (3)2.2.2 单片机主控制模块介绍 (5)2.3 时钟模块设计 (5)2.3.1 DS1302的性能特性 (5)2.3.2 DS1302数据操作原理 (6)2.3.3 DS1302与AT89S52接口电路设计 (7)2.4显示模块的设计 (8)2.4.1 LCM1602介绍 (8)2.4.2 LCM1602与单片机的接口 (9)第三章系统的软件设计 (11)3.1程序总体描述 (11)3.2模块程序描述 (11)第四章PROTEUS仿真 (13)4.1 PROTEUS工作界面 (13)4.2 PROTEUS功能仿真 (13)第五章测试与结果分析 (15)5.1测试仪器 (15)5.2硬件测试 (15)5.3软件测试 (16)5.4 测试结果分析与结论 (16)5.4.1 测试结果分析 (16)5.4.2 测试结论 (16)第六章总结与展望 (17)致谢 (19)参考文献 (21)附录1 系统电路图 (23)附录2 系统程序 (24)第一章方案论证第一章方案论证1.1单片机芯片的选择方案和论证方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

单片机课程设计实验报告(时钟、日历)..

单片机课程设计实验报告(时钟、日历)..

基于单片机的电子钟设计目录第一章电子时钟设计--—--—----————-—-—-—----—-—-——-——21.1 设计原理简介--————-—----—---——---———-----——-—-—-—21.2 设计功能-——--—-—————-———-—----————---——--——-——---—3第二章主要电路元器件介绍-—-———-———-—------———---32。

1 STC89C52 单片机简介—--—--—-—-—-—-—-—---—-——-———32。

1.1 单片机简介--——--——--——---—-—--————----—————--——-—-32。

1.2 主要特性---——-------—---—-—---————-—--—--———-—-—-—32.1.3 管脚功能说明—---———-———-———-——---—-————-—-—-—-————42.1。

4 LCD1602-—------——---—--—-——--———--——------——-—-—5第三章单元电路的硬件设计—-----————————————————--63.1 硬件原理框图—-———--—--——---—--—-—---------—--———-—-63。

2 单片机 STC89C52 系统的设计-—-—-—-—-————-—————-—----63。

3 时钟电路—————-----———-—---—-——---—--—-—-—-—--————--73.4 复位电路-----——-——--———-————-———-—----———---—--—-—-------—-—--—-——---—-—————-—---——--73。

5 键盘接口电路--—---—-———--—--——--——--——----———---——-83.6 LCD1602显示——---——————--—-—-——--——----—----———-————8第四章设计总原理图—-—-—---——-----—-———-9 第五章心得体会---—-------—————--——-—-——9第六章源程序---—-—-——-—-------———---—-——————-——----10前言:摘要数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便.由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现电子时钟是一种使用微处理器或单片机作为主控制器的数字时钟。

它不仅能够显示当前时间,还可以具备其他附加功能,如闹钟、日历、温度显示等。

一、设计目标设计一个基于单片机的电子时钟,实现以下功能:1.显示时间:小时、分钟和秒钟的显示,采用7段LED数码管来显示。

2.闹钟功能:设置闹钟时间,到达设定的时间时会发出提示音。

3.日历功能:显示日期、星期和月份。

4.温度显示:通过温度传感器获取当前环境温度,并显示在LED数码管上。

5.键盘输入和控制:通过外部键盘进行时间、日期、闹钟、温度等参数的设置和调整。

二、硬件设计1.单片机选择:选择一款适合的单片机作为主控制器,应具备足够的输入/输出引脚、中断和定时器等功能,如STC89C522.时钟电路:使用晶振为单片机提供稳定的时钟源。

3.7段LED数码管:选择合适的尺寸和颜色的数码管,用于显示小时、分钟和秒钟。

4.温度传感器:选择一款适合的温度传感器,如DS18B20,用于获取环境温度。

5.喇叭:用于发出闹钟提示音。

6.外部键盘:选择一款适合的键盘,用于设置和调整时间、日期、闹钟等参数。

三、软件设计1.初始化:设置单片机定时器、外部中断和其他必要的配置。

2.时间显示:通过定时器中断,更新时间,并将小时、分钟和秒钟分别显示在相应的LED数码管上。

3.闹钟功能:设置闹钟时间,定时器中断检测当前时间是否与闹钟时间一致,若一致则触发警报。

4.日历功能:使用定时器中断,更新日期、星期和月份,并将其显示在LED数码管上。

5.温度显示:通过定时器中断,读取温度传感器的数据,并将温度显示在LED数码管上。

6.键盘输入和控制:通过外部中断,读取键盘输入,并根据输入进行相应的操作,如设置时间、闹钟、日期等。

7.警报控制:根据设置的闹钟时间,触发警报功能,同时根据用户的设置进行控制。

四、测试与调试完成软件设计后,进行系统测试与调试,包括验证显示时间、日期、温度等功能的准确性,以及闹钟和警报功能的触发与控制。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计报告万年历的设计基于51单片机的万年历摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。

在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。

软件方面主要包括日历程序、时间调整程序,显示程序等。

程序采用C语言编写。

所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

一、设计要求基本要求:1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”;2,具有日历功能;③时间可以通过按键调整。

发挥部分:④具有闹钟功能(可以设定多个)。

二:总体设计电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用时不需要额外的外围电路。

基于单片机的电子日历时钟系统

基于单片机的电子日历时钟系统

目录一、设计任务二、设计方案三、硬件及电路设计四、程序设计及流程图五、设计体会一、设计任务利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个电子日历时钟系统。

使用液晶显示器将日期,时间实时显示出来,并且能够通过按钮修改日期,完成实时操作并具有闹铃功能。

二、设计方案硬件选择:单片机AT89C51,DS1302时钟芯片,SED1520液晶控制器接口芯片:74LS138,74LS373,片选CS0三、硬件及电路设计(一)实验所用芯片简要介绍1、主控芯片采用单片机AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机,与AT80C51引脚和指令系统完全兼容,可擦除只读存储器可以反复擦除1000次。

AT89C51共有128×8位内部RAM ,32可编程I/O线,两个16位定时器/计数器,5个中断源,采用全静态工作,三级程序存储器锁定和可编程串行通道,工作频率为0Hz-24MHz。

另外片内内置振荡器和时钟电路,低功耗的闲置和掉电模式。

2、实时时钟部分采用DS1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。

采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

3、SED1520液晶控制器SED1520液晶显示驱动器是一种点阵图形式液晶显示驱动器,它可直接与8位微处理器相连,集行、列驱动器于一体,因此使用起来十分方便,作为内藏式控制器被广泛应用于点阵数较少的液晶显示模块,内置显示RAM区RAM容量为2560位,RAM中的1位数据控制液晶屏上一个点的亮灭状态:“1”表示亮,“0”表示暗,具有16个行驱动口和16个列驱动口,可直接与80系列微处理器相连,亦可直接与68系列微处理器相连。

单片机课程设计报告--基于STC89C52单片机的电子时钟(日历)

单片机课程设计报告--基于STC89C52单片机的电子时钟(日历)

目录目录------------------------------------------------------------------------------1 摘要------------------------------------------------------------------------------2一、实验要求----------------------------------------------------------------2二、实验主要元器件介绍-------------------------------------------------32.1 STC89C52单片机简介---------------------------------------------3 2.2 LCD1602简介-------------------------------------------------------62.3 软件平台--------------------------------------------------------------7三、实验原理与设计内容-------------------------------------------------73.1 实验原理--------------------------------------------------------------7 3.2 三个组成部分--------------------------------------------------------73.3 键盘控制模块--------------------------------------------------------8四、调试过程----------------------------------------------------------------84.1 硬件调试--------------------------------------------------------------8 4.2 软件调试--------------------------------------------------------------94.3 测试数据与数据分析-----------------------------------------------9五、程序流程图-------------------------------------------------------------10六、任务分工与成果展示-------------------------------------------------116.1前期准备--------------------------------------------------------------11 6.2课程设计过程--------------------------------------------------------11 6.3个人主要工作及遇到问题-----------------------------------------116.4成果展示--------------------------------------------------------------12七、课程设计总结思考与致谢-------------------------------------------13八、参考文献----------------------------------------------------------------14 附录一:(程序)-------------------------------------------------------------15 附录二:(原理图)----------------------------------------------------------25 附录三:(实物图)----------------------------------------------------------25 附录四:(元件清单)-------------------------------------------------------26摘要:数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED 作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。

基于单片机的电子万年历的设计

基于单片机的电子万年历的设计

基于单片机的电子万年历的设计摘要本文以AT89C2051单片机为主控芯片,采用美国DALLAS公司的涓细充电时钟芯片DS1302为时钟控制芯片,设计了一个电子万年历,能够显示年、月、日、时、分、秒、星期信息。

关键词实时显示 AT89C2051 单片机目录0、引言 (3)1、电子万年历的硬件电路设计 (3)2、主控制器AT89C2051 (3)3、DSl302时钟芯片的工作原理 (4)3.1 引脚功能 (4)3.2 DSl302的控制字节 (4)3.3 DSl302的复位特征和时钟控制要求 (4)3.4 数据输入输出I/O (5)3.5 DSl302的寄存器 (5)4、DS1302与微控制器的连接及软件控制 (5)4.1 DSl302与AT89C2051的连接 (5)4.2 软件控制 (6)4.3 根据在调试中出现的问题,作如下说明: (9)5、总结 (9)0、引言日常生活生产中有许多地方需要电子时钟和日历,比如家庭,办公室,以及一些智能化仪表。

目前的电子时钟日历系统多采用时钟芯片以简化系统的设计。

DSl302是众多时钟芯片中一款性价比较高的产品。

以AT89C2051单片机为主控芯片,采用美国DALLAS 公司的实时时钟芯片DSl302为时钟控制芯片,设计并实现的各种时钟控制电路,应用于各种家电、实验设备等。

其能够显示年、月、日、时、分、秒、星期。

并且可根据需要对各个位进行调节。

1、电子万年历的硬件电路设计硬件电路设计是电子时钟日历系统设计的第一步。

系统由主控模块,时钟芯片。

显示电路、键盘扫描电路共四个部分组成,电路构成,框图如图l所示。

图l 电子万年历系统的框架图主控芯片使用MCU-51系列的AT89C2051单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DSl302。

采用DSl302作为主要计时芯片,可以作到计时准确。

更重要的是,DSl302可以在很小的后备电源(2.5-5.5V电源,在2.5V 时耗电小于300Na)下继续计时,并可编程选择多种充电电源来对后备电源进行慢速充电,可以保证后备电源基本不耗电。

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

目录一、设计任务二、设计方案三、硬件及电路设计四、程序设计及流程图五、设计体会一、设计任务利用单片机及外围接口电路(键盘接口和显示接口电路)设计制作一个电子日历时钟系统。

使用液晶显示器将日期,时间实时显示出来,并且能够通过按钮修改日期,完成实时操作并具有闹铃功能。

二、设计方案硬件选择:单片机AT89C51,DS1302时钟芯片,SED1520液晶控制器接口芯片:74LS138,74LS373,片选CS0三、硬件及电路设计(一)实验所用芯片简要介绍1、主控芯片采用单片机AT89C51AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机,与AT80C51引脚和指令系统完全兼容,可擦除只读存储器可以反复擦除1000次。

AT89C51共有128×8位内部RAM ,32可编程I/O线,两个16位定时器/计数器,5个中断源,采用全静态工作,三级程序存储器锁定和可编程串行通道,工作频率为0Hz-24MHz。

另外片内内置振荡器和时钟电路,低功耗的闲置和掉电模式。

2、实时时钟部分采用DS1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。

采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

3、SED1520液晶控制器SED1520液晶显示驱动器是一种点阵图形式液晶显示驱动器,它可直接与8位微处理器相连,集行、列驱动器于一体,因此使用起来十分方便,作为内藏式控制器被广泛应用于点阵数较少的液晶显示模块,内置显示RAM区RAM容量为2560位,RAM中的1位数据控制液晶屏上一个点的亮灭状态:“1”表示亮,“0”表示暗,具有16个行驱动口和16个列驱动口,可直接与80系列微处理器相连,亦可直接与68系列微处理器相连。

驱动占空比为1/16或1/32。

可以与SED1520配合使用,以便扩展列驱动口数目。

(二)硬件设计(三)电路图四、程序设计实验执行程序如下:#include <reg51.h>#define uchar unsigned charY 132.76...#define uint unsigned int#define PD1 61unsigned char aa,bb,cc,s1num;unsigned char curtime[];void WriteSHU16x16(unsigned char,unsigned char,unsigned char);void WriteZHI16x16(unsigned char,unsigned char,unsigned char);void Delay(unsigned char);sbit t_clk=P1^0;sbit t_io=P1^1;sbit t_rst=P1^2;sbit s1=P1^5;sbit s2=P1^6;sbit s3=P1^7;sbit sv=reset;unsigned int i;unsigned char Column;unsigned char Page_ ;unsigned char Code_ ;unsigned char Column1;unsigned char Page;unsigned char Code1 ;unsigned char Command;unsigned char LCDData;xdata unsigned char CWADD1 _at_ 0x8000; xdata unsigned char DWADD1 _at_ 0x8001; xdata unsigned char CRADD1 _at_ 0x8002; xdata unsigned char DRADD1 _at_ 0x8003; xdata unsigned char CWADD2 _at_ 0x8004; xdata unsigned char DWADD2 _at_ 0x8005; xdata unsigned char CRADD2 _at_ 0x8006; xdata unsigned char DRADD2 _at_ 0x8007; code unsigned char SHUTAB[][16]={{0x3E,0x51,0x49,0x45,0x3E}, // -0- {0x00,0x42,0x7F,0x40,0x00}, // -1-{0x62,0x51,0x49,0x49,0x46}, // -2-{0x21,0x41,0x49,0x4D,0x33}, // -3-{0x18,0x14,0x12,0x7F,0x10}, // -4-{0x27,0x45,0x45,0x45,0x39}, // -5-{0x3C,0x4A,0x49,0x49,0x31}, // -6-{0x01,0x71,0x09,0x05,0x03}, // -7-{0x36,0x49,0x49,0x49,0x36}, // -8-{0x46,0x49,0x49,0x29,0x1E}, // -9-{0x00,0x08,0x08,0x08,0x00},// --- };code unsigned char CCTAB[][32] ={{0x00,0x20,0x10,0xCC,0x47,0x44,0x44,0xFC,0x44,0x44,0x44,0x64,0x46,0x04,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00},{0x00,0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFF,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,0x00} };void wr_1302(unsigned char add,unsigned char date) { uchar i;t_rst=0;t_clk=0;t_rst=1;for(i=0;i<8;i++) { if(add&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;add>>=1;}for(i=0;i<8;i++) { if(date&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;date>>=1;}t_rst=0;}unsigned char re_1302(unsigned char add) { uchar date,i;t_rst=0;t_clk=0;t_rst=1;for(i=0;i<8;i++){ if(add&0x01)t_io=1;elset_io=0;t_clk=1;t_clk=0;add>>=1;}for(i=0;i<8;i++){ date>>=1;if(t_io)date=date|0x80;t_clk=1;t_clk=0;}t_rst=0;return(date);}void set_1302(){ wr_1302(0x8e,0x00);wr_1302(0x8c,curtime[6]);wr_1302(0x8a,curtime[5]);wr_1302(0x88,curtime[4]);wr_1302(0x86,curtime[3]);wr_1302(0x84,curtime[2]);wr_1302(0x82,curtime[1]);wr_1302(0x80,curtime[0]);wr_1302(0x8e,0x80);}void get_1302(){ cc=re_1302(0x81);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x30,aa);Delay(5);WriteSHU16x16(0x04,0x38,bb);curtime[0]=aa*10+bb;cc=re_1302(0x83);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x18,aa);Delay(5);WriteSHU16x16(0x04,0x20,bb);curtime[1]=aa*10+bb;cc=re_1302(0x85);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x04,0x00,aa);Delay(5);WriteSHU16x16(0x04,0x08,bb); curtime[2]=aa*10+bb;cc=re_1302(0x87);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x40,aa); Delay(5);WriteSHU16x16(0x02,0x48,bb); curtime[3]=aa*10+bb;cc=re_1302(0x89);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x20,aa); Delay(5);WriteSHU16x16(0x02,0x28,bb); curtime[4]=aa*10+bb;cc=re_1302(0x8d);aa=cc>>4;bb=cc&0x0f;WriteSHU16x16(0x02,0x00,aa);Delay(5);WriteSHU16x16(0x02,0x08,bb);curtime[6]=aa*10+bb;WriteSHU16x16(0x04,0x10,10);WriteSHU16x16(0x04,0x28,10);WriteZHI16x16(0x02,0x10,0);WriteZHI16x16(0x02,0x30,1);WriteZHI16x16(0x02,0x50,2);}void WriteCommandE1(unsigned char Command) {while(CRADD1 & 0x80);CWADD1 = Command;}void WriteDataE1(unsigned char LCDData){ while(CRADD1 & 0x80);DWADD1 = LCDData;}void ReadDataE1(unsigned char DRADD1){ while(CRADD1 & 0x80);LCDData = DRADD1;}void WriteCommandE2(unsigned char Command) { while(CRADD2 & 0x80);CWADD2 = Command;}void WriteDataE2(unsigned char LCDData){ while(CRADD2 & 0x80);DWADD2 = LCDData;}void ReadDataE2(unsigned char DRADD2){ while(CRADD2 & 0x80);LCDData = DRADD2;}void Init(){ WriteCommandE1(0xe2); WriteCommandE2(0xe2); WriteCommandE1(0xa4);WriteCommandE2(0xa4); WriteCommandE1(0xa9); WriteCommandE2(0xa9); WriteCommandE1(0xa0); WriteCommandE2(0xa0); WriteCommandE1(0xc0); WriteCommandE2(0xc0); WriteCommandE1(0xaf); WriteCommandE2(0xaf);}void Clear(){ unsigned char i,j;for(i=0;i<4;i++){ WriteCommandE1(i+0xb8);WriteCommandE2(i+0xb8);WriteCommandE1(0x00);WriteCommandE2(0x00);for(j=0;j<61;j++){ WriteDataE1(0x00);WriteDataE2(0x00);}}}void Delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void WriteSHU16x16(unsigned char Page_,unsigned char Column,unsigned char Code_){ unsigned int i,j,k;i = 0;j = 0;while(j<2){ WriteCommandE1(((Page_ + j) & 0x03) | 0xb8);WriteCommandE2(((Page_ + j) & 0x03) | 0xb8);k = Column;while(k<Column + 8){ if (k < PD1){ WriteCommandE1(k);LCDData = SHUTAB[Code_][i];WriteDataE1(LCDData);}else{ Command = k-PD1;WriteCommandE2(Command);LCDData = SHUTAB[Code_][i];WriteDataE2(LCDData);};i++;if( ++k >= PD1 * 2) break;} ;j++;};}void WriteZHI16x16(unsigned char Page,unsigned char Column1,unsigned char Code1){ unsigned int i,j,k;i = 0;j = 0;while(j<2){ WriteCommandE1(((Page + j) & 0x03) | 0xb8);WriteCommandE2(((Page + j) & 0x03) | 0xb8);k = Column1;while(k<Column1 + 16){ if (k < PD1){ WriteCommandE1(k);LCDData = CCTAB[Code1][i];WriteDataE1(LCDData);}else{ Command = k-PD1;WriteCommandE2(Command);LCDData = CCTAB[Code1][i];WriteDataE2(LCDData);};i++;if( ++k >= PD1 * 2) break;} ;j++;};}void keyscan(){s1num = 0;sv=0;if(s1==0){ Delay(5);if(s1==0){ s1num++;while(!s1);}}if(s1num!=0){ if(s1num==1){if(s2==0){Delay(5);if(s2==0){ if(curtime[0]==59){curtime[0]=0;}else curtime[0]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[0]==0){curtime[0]=59;}else curtime[0]--;}}}if(s1num==2){ if(s2==0){Delay(5);if(s2==0){ if(curtime[1]==59){curtime[1]=0;}else curtime[1]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[1]==0){curtime[1]=59;}else curtime[1]--;}}}if(s1num==3){ if(s2==0){Delay(5);if(s2==0){ if(curtime[2]==23){curtime[2]=0;}else curtime[2]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[2]==0){curtime[2]=23;}else curtime[2]--;}}}if(s1num==4){ if(s2==0){Delay(5);if(s2==0){ if(curtime[3]==31){curtime[3]=1;}else curtime[3]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[3]==1){curtime[3]=31;}else curtime[3]--;}}}if(s1num==5){ if(s2==0){Delay(5);if(s2==0){ if(curtime[4]==12){curtime[4]=1;}else curtime[4]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[4]==1){curtime[4]=12;}else curtime[4]--;}}}if(s1num==6){ if(s2==0){Delay(5);if(s2==0){ if(curtime[6]==99){curtime[6]=0;}else curtime[6]++;}}if(s3==0){Delay(5);if(s3==0){ if(curtime[6]==0){curtime[6]=99;}else curtime[6]--;}}}if(s1num==7){s1num=0;}set_1302();get_1302();}}void main(){ Init();Clear();set_1302();while(1){keyscan();get_1302();}}.。

相关文档
最新文档