关键词不能为空

当前您在: 主页 > 高中公式大全 >

电子日历时钟

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-12-09 17:32
tags:电子日历

化学选修三知识点总结-爱国主义的诗歌

2020年12月9日发(作者:吕飞)
课程设计任务书
学 院 信息科学与项目学院 专 业 计算机科学与技术
学生姓名 班级学号
课程设计题目 电子日历时钟设计
实践教案要求与任务:
1.学习Proteus仿真系统下的原理图设计方法和系统仿真调试方法;
2.掌握简单的51单片机应用系统的软硬件设计方法;
3.学习Keil C51集成开发环境的使用和程序调试方法。
具体任务如下:
<1)通过检索、查资料和研究学习,设计单片机应用系统原理图;
<2)在Keil 51集成开发环境下编写 电子日历时钟设计 应用
系统程序;
<3)在Proteus仿真环境下进行软硬件系统调试,实现应用系统设计目标;
<4)写出课程设计报告。
工作计划与进度安排:
第16—19周:布置课程设计任务;
查阅资料;
分组设计原理图;
编写程序代码。
第20周:系统仿真调试,验收,答辩,编写课程设计报告。

指导教师:
20年月日
专业负责人:
20年月日
学院教案副院长:
20年月日
成绩评定表
学生姓名
专 业

计算机科学
与技术
班级学号
课程设计题目

电子日历时钟



成绩
组长签字:

日期
20 年 月 日

目录
1设计目的及 要
求····························
············ ··5

1.1课程设计目
的························ ····
···········5
1.2设计内容、技术条件和要
求····························5
1.2.1设计内
容····························
··········5
1.2.2设计要
求·················· ··········
··········5
2系统的组成及工作
理······ ······················
········5
2.1 系统
成····························
···············5< br>
2.2 工作原理
述····························< br>···········6
2.3 Protues
介·············· ··············
···········6

2.4 Keil C5 1
介····························
··········6< br>
3器件的功能和
用········································7






3.1 AT89C51简
介····························
· ··········7

3.2 DS1302简
介·············· ··············
············9

3.3 LCD16 02
介····························
··········· 9

4系统硬
计····························
···············11

4.1控制
块············ ················
··············12

4.2显示
块····························
············· ·12

4.3按键
块····························
··············13

5系统软







计······················ ······
··············13

5.1程序流程
图··· ·························
············13
5.2 程序清单及程序功能注
释····························1
4
6 系统仿真调
试····························
·· ············28

6.1程序调试过
程·············· ··············
·········28
6.2仿真调试过
程··· ·························
·········31
7 结果分
析····························
············· ·····32

8体会与感
想························ ····
················32

9参考文
献······ ······················
··················33

1、设计目的及要求
1.1课程设计目的
1. 培养学生文献检索的能力,如何利用Internet检索需要的文献资料。
2. 培养学生综合分析问题、发现问题和解决问题的能力。
3. 培养学生综合运用知识的能力和项目设计的能力。
4. 培养学生理论联系实际的能力。
5. 提高学生课程设计报告撰写水平。
1.2设计内容、技术条件和要求
1.2.1设计内容
电子日历时钟系统主要功能为实时时间的显示,以AT89S51单片机 为核心芯片,通过
DS1302时钟芯片的功能扩展;在共阴极LED数码管上或LM1602液晶显示 屏上显示出来。

<1)时钟芯片选用DS1302;
<2)数码管选用4位共阴极动态显示的数码管;
<3)能实时显示年、月、日和时、分、秒 ,用数码管显示时,要求年、月、日与时、分、
秒交替显示,间隔1秒;

<4)可通过按键调节、设置当前时间。
1.2.2 设计要求
设计单片机最小系统<包括复位按钮、晶振电路等)
DS1302时钟芯片的控制设计。
时间调节按键的电路设计。
绘制实现本设计内容的硬件电路<原理图),系统的组成框图。
相应的控制状态表;
编写本课程设计内容的软件设计<包含程序流程图和对程序注释)。
硬件实验部分可选用实验箱测试或Proteus仿真软件实现。
2.系统的组成及工作原理
2.1系统组成

图2.1系统组成原理图
2.2 工作原理
设计的题目是电子时钟。根据设计要求显示正常的年、月、日、时、分、秒。要想实
现上述功能 ,就必须将硬件系统和软件系统有机的结合在一起,方可实现我们设计任务中
的各项要求。

硬件系统主要有单片机AT89C51、DS1302、74LS154 等。
AT89C51 主要功能是存储程序、根据程序的内容对各个端口进行判断并做出相应的处
理 。DS1302主要的功能是控制年、月、日、时、分、秒的显示效果。

根据设计要求,电子 日历要显示年、月、日、时、分、秒就需要16个显示数码管,因
为数码管的数量较多,必须采用动态显 示扫描的方法。例如07-12-01,首先日分为个位和
十位,个位显示到09时,应向日的十位自动 进位,即个位清0,十位置1,显示为10,继
续累计;当显示为31时,日的十位就应自动向月的个位 进位,显示为01,当月显示到09
时,月的个位自动向月的十位进位,个位清0,十位置1,即为10 ,当月至12时,月向年
的个位进位,即显示08,同时月、日开始从01月01日继续显示,依次周而 复始的循环运
行。

根据按键电路可实现年、月、日、时、分、秒的调整,当K1键按 下时,可以调整时
间,K2、K3键分别对时间进行加或减,K4键可以切换正常模式与省电模式。
利用单片机将RC复位电路、动态显示电路、电源电路、去抖电路等正确的连接在一
起, 并通过单片机的编程来实现本次设计任务中的要求。

2.3Protues简介
Protues软件是英国Labcenter electronics公司出版的EDA工具软件。 它不仅具有
其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机< br>及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教案
的教师、 致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具
(仿真软件>, 从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设
计,真正实现了从概念到产 品的完整设计。迄今为止是世界上唯一将电路仿真软件、PCB
设计软件和虚拟模型仿真软件三合一的设 计平台,其处理器模型支持8051、HC11、
PIC1DsPIC33、AVR、ARM、8086 和MSP430等,2018年即将增加Cortex
和DSP系列处理器,并持续增加其他系列处理器 模型。在编译方面,它也支持IAR、Keil
和MATLAB等多种编译

2.4Keil C51简介
Keil C51是美国Keil Software公司出品 的51系列兼容单片机C语言软件开发系
统,与汇编相比,C语言在功能上、结构性、可读性、可维护性 上有明显的优势,因而易
学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强 大的仿真调试
器等在内的完整开发方案,通过一个集成开发环境行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C 语言编程,那么
Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的 集成
环境、强大的软件仿真调试工具也会令你事半功倍。

3.器件的功能和作用
3.1 AT89C51简介

图3.1AT89C51引脚图
VCC:电源电压
GND:接地
P0口:P0口是一组 8位漏极开路双向IO口,即地址数据总线复用口。作为输出口
时,每一个管脚都能够驱动8个TTL电 路。当“1”被写入P0口时,每个管脚都能够作为
高阻抗输入端。P0口还能够在访问外部数据存储器 或程序存储器时,转换地址和数据总线
复用,并在这时激活内部的上拉电阻。P0口在闪烁编程时,P0 口接收指令,在程序校验
时,输出指令,需要接电阻。

P1口:P1口一个 带内部上拉电阻的8位双向IO口,P1的输出缓冲级可驱动4个TTL
电路。对端口写“1”,通过内 部的电阻把端口拉到高电平,此时可作为输入口。因为内部
有电阻,某个引脚被外部信号拉低时输出一个 电流。闪烁编程时和程序校验时,P1口接收
低8位地址。

P2口:P2口 是一个内部带有上拉电阻的8位双向IO口,P2的输出缓冲级可驱动4
个TTL电路。对端口写“1” ,通过内部的电阻把端口拉到高电平,此时,可作为输入口。
因为内部有电阻,某个引脚被外部信号拉低 时会输出一个电流。在访问外部程序存储器或
16位地址的外部数据存储器时,P2口送出高8位地址数 据。在访问8位地址的外部数据存
储器时,P2口线上的内容在整个运行期间不变。闪烁编程或校验时, P2口接收高位地址和
其它控制信号。

P3口:P3口是一组带有内部电阻 的8位双向IO口,P3口输出缓冲故可驱动4个TTL
电路。对P3口写如“1”时,它们被内部电阻 拉到高电平并可作为输入端时,被外部拉低
的P3口将用电阻输出电流。P3口除了作为一般的IO口外 ,更重要的用途是它的第二功
能,具体如下:P3.0--RXD,P3.1--TXD,P3.2-- INT0,P3.3--INT1,P3.4--T0,P3.5--T1,
P3.6-- WR,P3.7--RD。P3口还接收一些用于闪烁存储器编程和程序校验的控制信号。

RST:复位输入。当震荡器工作时,RET引脚出现两个机器周期以上的高电平将使单片
机复位。
ALE :当访问外部程序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE以时钟震荡频率的116输出固定的正脉冲信号,因此
它可对 输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个
ALE脉冲时,闪烁存储 器编程时,这个引脚还用于输入编程脉冲。如果必要,可对特殊寄
存器区中的8EH单元的D0位置禁止 ALE操作。这个位置后只有一条MOVX和MOVC指令ALE
才会被应用。此外,这个引脚会微弱拉 高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许输出是外 部程序存储器的读选通信号,当AT89C51由外部程序存
储器读取指令时,每个机器周期两次PSE N 有效,即输出两个脉冲。在此期间,当访问外
部数据存储器时,这两次有效的PSEN 信号不出现。

EAVPP:外部访问允许。欲使中央处理器仅访问外部程序存储器, EA端必须保持低电
平。需要注意的是:如果加密位LBI被编程,复位时内部会锁存EA端状态。如E A端为高
电平,CPU则执行内部程序存储器中的指令。闪烁存储器编程时,该引脚加上+12V的编程
允许电压VPP,当然这必须是该器件是使用12V编程电压VPP。

XT AL1:片内振荡器反相放大器和时钟发生线路的输入端。使用片内振荡器时,连接外
部石英晶体和微调 电容。

XTAL2:片内振荡器反相放大器的输出端。当使用片内振荡器时,外接石英晶体和 微调
电容。
3.2DS1302简介

图3.2 DS1302引脚图
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以
对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~
5.5 V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信
号或RAM数据 。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是
DS120 2的升级产品,与DS1202兼容,但增加了主电源后备电源双电源引脚,同时提供了
对后备电源进行 涓细电流充电的能力。

DS1302 的管脚排列及描述如下图及表所示
X1、X2:32.768KHZ晶振接入引脚。
GND:地。
RST:复位引脚,低电平有效。
I/O:数据输入/输出引脚,具有三态功能。
SCLK:串行时钟输入引脚。
V
CC1
:工作电源引脚。
V
CC2
:备用电源引脚。
3.3 LM016L简介

图3.3LM016L
1602采用标准的16脚接口,其中:
VSS:为电源地
VDD:接5V电源正极
VEE:为液晶显示器对比度调整端,接正电源时对比度最弱,接地 电源时对比度最高<对比
度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

RS:为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
RW:为读写信号线,高电平(1>时进行读操作,低电平(0>时进行写操作。
E(或EN>:为使能(enable>端,高电平<1)时读取信息,负跳变时执行指令。
D0~D7:为8位双向数据端。


RS
0
清除显示
RW
0
D7
0
D6
0
D5
0
指令码
D4
0
D3
0
D2
0
D1
0
D0
1
功 能

将DDRAM填满并且设定
DDRAM的地址计数器(AC>到
H
0
地址归位
位置。这个指令不改变DDRAM
的内容
显示状态
开关
0 0 0 0 0 0 0 1 ID S
0 0 0 0 0 0 1 D C B
[D=1: 整体显示 ON][C=1: 游标O
N]
[B=1:游标位置反白允许]
进入点设


游标或显
示移位控
0 0 0 0 0 1 SC RL X X
设定游标的移动与显示的移位控
制位。这个指令不改变DDRAM
指定在数据的读取与写入时,设定
游标的移动方向及指定显示的移
0 0 0 0 0 0 0 1 X
设定DDRAM的地址计数器(AC>
到并且将游标移到开头原点

0
功能设定
0 0 0 1 DL X RE X X
的内容
[DL=01:48位数据]
[RE=01: 基本指令操作 扩充指
令操作]
设定CGR
AM地址
设定DDR
AM地址
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0
设定CGRAM 地址
设定DDRAM 地址<显示位址)
[第一行:80H-A7H]
[第二行:C0H-E7H]
0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0
读取忙标
志和地址
0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
读取忙标志(B F>可以确认内部动
作是否完成,同时可以读出地址计
数器(AC>的值
写数据到
RAM
读出RAM
的值
1 0
数据 将数据D7——D0写入到内部的
RAM (DDRAMCGRAMIRAMG
RAM>
1 1
数据 从内部RAM读取数据D7——D0
(DDRAMCGRAMIRAMGRAM>
表:3.1指令集表
4系统硬件设计
电子日历时钟系统主要功能为实时时间的显示 ,以AT89C51单片机为核心芯片,通过
DS1302时钟芯片的功能扩展;在共阴极LED数码管 上或LM1602液晶显示屏上显示出来。

图4.1 系统原理图
4.1控制模块

图4.2 控制模块原理图
控制模块原理图如图4.2 所示。主控制器采用AT89C51。AT89C51是一个低电压,高性
能CMOS8位单片机带有4 K字节的可反复擦写的程序存储器存储器,128字节随机存取 数据存储器,32个IO口,2个16位定时计数器,1个5向量
两级中断结构,1个串行通信口,片内 震荡器和时钟电路。

4.2显示模块

图4.3 显示模块电路图
显示模块采用LM016L显示器,将单片机输出的时钟信号以字符方式将其显示出来。
4.3按键模块

图4.4 按键模块电路图
在图中共三个按键,第一个 为设置按键,当按下次数不同时会对时间的不同位设置,第二
个位加按键,当按下时时间的数字增加,第 三个为减按键,当按下时,时间的数字减少。

5、系统软件设计
5.1程序流程图
软件设计分为:动态扫描、主程序、系统资源分配和软件模块几部分,在此设计中采
用定时器来 完成动态扫描显示。用定时器T0定20ms的时间间隔,每次定时时间到时就输
出一个LED信号,即 显示一位。主程序初始化后,就开始进行对DS1302的读时间;读完后
送显示缓冲区,同时并对定时 时间进行判断比较。DS1302的地址由114字节的用户RAM存
放。10字节的存放实时时钟时间 日历和定闹RAM及用于控制和状态的4字节特殊寄存器
组成,几乎所有的128个字节直接读写。
设计程序有:主程序、读取时间的子程序和显示刷新程序。

图5.1程序流程图
5.2 程序清单及程序功能注释
#include
#define uint unsigned int
#define uchar unsigned char
uchar a,se c,hour,min,day,moon,year,week,flag,key1n,ZJL。ZJL为中 间量

#define yh 0x80 LCD第一行的初始位置,因为LCD1602字符 地址首位D7恒定为
1<100000000=80)

#define er 0x80+0x40 LCD第二行初始位置<因为第二行第一个字符位置地址是0x40)

液晶屏的与C51之间的引脚连接定义<显示数据线接C51的P0口)
sbit rs=P3^5。
sbit en=P3^7。
sbit rw=P3^6。 如果硬件上rw接地,就不用写这句和后面的rw=0了
DS1302时钟芯片与C51之间的引脚连接定义
sbit IO=P2^2。
sbit SCLK=P2^1。
sbit RST=P2^0。
sbit ACC0=ACC^0。
sbit ACC7=ACC^7。
************* ***********************************************

ACC累加器=A
ACC.0=E0H
ACC.0就是ACC的第0位。Acc可以位寻址。
**************************
校时按键与C51的引脚连接定义
sbit key1=P2^5。 设置键
sbit key2=P2^6。 加键
sbit key3=P2^7。 减键
********************** ****************************************

uchar code tab1[]={。 年显示的固定字符
uchar code tab2[]={。时间显示的固定字符
延时函数,后面经常调用
void delay(uint xms>延时函数,有参函数
{
uint x,y。
for(x=xms。x>0。x-->
for(y=110。y>0。y-->。
}
********液晶写入指令函数与写入数据函数,以后可调用************** *在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面
*
write_1602com(uchar com>****液晶写入指令函数****
{
rs=0。数据指令选择置为指令
rw=0。 读写选择置为写
P1=com。送入数据
delay(1>。
en=1。拉高使能端,为制造有效的下降沿做准备
delay(1>。
en=0。en由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchar dat>***液晶写入数据函数****
{
rs=1。数据指令选择置为数据
rw=0。 读写选择置为写
P1=dat。送入数据
delay(1>。
en=1。 en置高电平,为制造下降沿做准备
delay(1>。
en=0。 en由高变低,产生下降沿,液晶执行命令
}
lcd_init(>***液晶初始化函数****
{
write_1602 com(0x38>。设置液晶工作模式,意思:16*2行显示,5*7点阵,8
位数据

write_1602com(0x0c>。开显示不显示光标
write_1602com(0x06>。整屏不移动,光标自动右移
write_1602com(0x01>。清显示
write_1602com(yh+1>。日历显示固定符号从第一行第1个位置之后开始显示
for(a=0。a<14。a++>
{
write_1602dat(tab1[a]>。向液晶屏写日历显示的固定符号部分
delay(3>。
}
write_1602com(er+2>。时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0。a<8。a++>
{
write_1602dat(tab2[a]>。写显示时间固定符号,两个冒号
delay(3>。
}
}
*********************ov er***********************
***************DS1302有关子函数********************
void write_byte(uchar dat>写一个字节
{
ACC=dat。
RST=1。
for(a=8。a>0。a-->
{
IO=ACC0。
SCLK=0。
SCLK=1。
ACC=ACC>>1。
}
}
uchar read_byte(>读一个字节
{
RST=1。
for(a=8。a>0。a-->
{
ACC7=IO。
SCLK=1。
SCLK=0。
ACC=ACC>>1。
}
return (ACC>。
}
----------------------------------------
void write_1302(uchar add,uchar dat>向1302芯片写函数,指定写入地址,数据

{
RST=0。
SCLK=0。
RST=1。
write_byte(add>。
write_byte(dat>。
SCLK=1。
RST=0。
}
uchar read_1302(uchar add>从1302读数据函数,指定读取数据来源地址
{
uchar ZJL。
RST=0。
SCLK=0。
RST=1。
write_byte(add>。
ZJL=read_byte(>。
SCLK=1。
RST=0。
return(ZJL>。
}
uchar BCD_Decimal(uchar bcd>BCD码转十进制函数,输入BCD,返回十进制

{
uchar Decimal。
Decimal=bcd>>4。
return(Decimal=Decimal*10+(bcd&=0x0F>>。
}
--------------------------------------
void ds1302_init(> 1302芯片初始化子函数(2018-06-17,00:00:00,week7>

{
RST=0。
SCLK=0。
write_1302(0x8e,0x00>。 允许写,禁止写保护
write_1302(0x80,0x12>。 向DS1302内写秒寄存器80H写入初始秒数据00

write_1302(0x82, 0x12>。向DS1302内写分寄存器82H写入初始分数据00

write_1302 (0x84,0x12>。向DS1302内写小时寄存器84H写入初始小时数据00

write_1302(0x8a,0x04>。向DS1302内写周寄存器8aH写入初始周数据7
write_1302(0x86,0x08>。向DS1302内写日期寄存器86H写入初始日期数 据17

write_1302(0x88,0x08>。向DS1302内写月份寄存器88 H写入初始月份数据06

write_1302(0x8c,0x12>。向DS1302内 写年份寄存器8cH写入初始年份数据12

write_1302(0x8e,0x80>。 打开写保护
}
------------------------------------
时分秒显示子函数
void write_sfm(uchar add,uchar dat>向LCD写时分秒,有显示位置加、现示数据,两
个参数

{
uchar gw,sw。
gw=dat%10。取得个位数字
sw=dat10。取得十位数字
write_1602com(er+add>。er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw>。数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw>。数字+30得到该数字的LCD1602显示码
}
-------------------------------------
年月日显示子函数
void write_nyr(uchar add,uchar dat>向LCD写年月日,有显示位置加数、显示数据,
两个参数

{
uchar gw,sw。
gw=dat%10。取得个位数字
sw=dat10。取得十位数字
write_1602com(yh+add>。设定显示位置为第一个位置+add
write_1602dat(0x30+sw>。数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw>。数字+30得到该数字的LCD1602显示码
}
-------------------------------------------
void write_week(uchar week>写星期函数
{
write_1602com(yh+0x0c>。星期字符的显示位置
switch(week>
{
case 1:write_1602dat('M'>。星期数为1时,显示
write_1602dat('O'>。
write_1602dat('N'>。
break。
case 2:write_1602dat('T'>。星期数据为2时显示
write_1602dat('U'>。
write_1602dat('E'>。
break。
case 3:write_1602dat('W'>。星期数据为3时显示
write_1602dat('E'>。
write_1602dat('D'>。
break。
case 4:write_1602dat('T'>。星期数据为4是显示
write_1602dat('H'>。
write_1602dat('U'>。
break。
case 5:write_1602dat('F'>。星期数据为5时显示
write_1602dat('R'>。
write_1602dat('I'>。
break。
case 6:write_1602dat('S'>。星期数据为6时显示
write_1602dat('T'>。
write_1602dat('A'>。
break。
case 7:write_1602dat('S'>。星期数据为7时显示
write_1602dat('U'>。
write_1602dat('N'>。
break。
}
}
****************键盘扫描有关函数**********************
void keyscan(>
{
if(key1==0>--------- ------key1为功能键<设置键)--------------------

{
delay(9>。延时,用于消抖动
if(key1==0>延时后再次确认按键按下
{
delay(20>。
while(!key1>。
key1n++。
if(key1n==9>
key1n=1。设置按键共有秒、分、时、星期、日、月、年、返回,8个功
能循环
switch(key1n>
{
case 1: TR0=0。关闭定时器
TR1=0。
write_1602com(er+0x09>。设置按键按动一次,秒位置显示光标
write_1602com(0x0f>。设置光标为闪烁
ZJL=(sec>10*16+(sec>%10。秒数据写入DS1302
write_1302(0x8e,0x00>。
write_1302(0x80,0x80|ZJL>。sec
write_1302(0x8e,0x80>。
break。
case 2: write_1602com(er+6>。按2次min位置显示光标
write_1602com(0x0f>。
break。
case 3: write_1602com(er+3>。按动3次,hour
write_1602com(0x0f>。
break。
case 4: write_1602com(yh+0x0e>。按动4次,week
write_1602com(0x0f>。
break。
case 5: write_1602com(yh+0x0a>。按动5次,day
write_1602com(0x0f>。
break。
case 6: write_1602com(yh+0x07>。按动6次,moon
write_1602com(0x0f>。
break。
case 7: write_1602com(yh+0x04>。按动7次,year
write_1602com(0x0f>。
break。
case 8:
write_1602com(0x0c>。按动到第8次,设置光标不闪烁
TR0=1。打开定时器
ZJL=(sec>10*16+(sec>%10。
write_1302(0x8e,0x00>。
write_1302(0x80,0x00|ZJL>。sec数据写入DS1302
write_1302(0x8e,0x80>。
break。
}
}
}
--------------------- --------加键key2----------------------------

if(key1n!=0>当key1按下以下。再按以下键才有效<按键次数不等于零)
{
if(key2==0> 上调键
{
delay(10>。
if(key2==0>
{
delay(20>。
while(!key2>。
switch(key1n>
{
case 1:sec++。设置键按动1次,调秒
if(sec==60>
sec=0。秒超过59,再加1,就归零
write_sfm(0x08,sec>。令LCD在正确位置显示加设定好的秒

ZJL=(sec>10*16+(sec>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。 允许写,禁止写保护
write_1302(0x80,ZJL>。 向DS1302内写秒寄存器80H写入调整
后的秒数据BCD码

write_1302(0x8e,0x80>。 打开写保护
write_1602com( er+0x09>。因为设置液晶的模式是写入数据后,
光标自动右移,所以要指定返回

write_1602com(0x0b>。
break。
case 2:min++。
if(min==60>
min=0。
write_sfm(0x05,min>。令LCD在正确位置显示加设定好的分
数据
ZJL=(min>10*16+(min>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x82,ZJL>。向DS1302内写分寄存器82H写入调整
后的分数据 BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(er+6>。因为设置液晶的模式是写入数据后,指
针自 动加一,在这里是写回原来的位置

break。
case 3:hour++。
if(hour==24>
hour=0。
write_sfm(2,hour>。令LCD在正确的位置显示加设定好的小
时数据
ZJL=(hour>10*16+(hour>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x84,ZJL>。向DS1302内写小时寄存器84H写入调
整后的小时 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(er+3>。因为设置液晶的模式是写入数据后,指
针自 动加一,所以需要光标回位

break。
case 4:week++。
if(week==8>
week=1。
write_1602com(yh+0x0C>。指定'加'后的周数据显示位置
write_week(week>。指定周数据显示内容
ZJL=(week>10*16+(week>%10。十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00>。允许写,禁止写保护
write_1 302(0x8a,ZJL>。向DS1302内写周寄存器8aH写入调整
后的周数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+0x0e>。因为设置液晶的模式是写入数据
后,指针自动加一, 所以需要光标回位

break。
case 5:day++。if(moon==1>
{if(day==32>
day=1。}
if(moon==2>
{if((year4==0&&year100!=0>||(year400==0>>判断是否闰年

{if(day==29>
day=1。}
else if(day==28>
day=1。}
if(moon==3>
{if(day==32>
day=1。}
if(moon==4>
{if(day==31>
day=1。}
if(moon==5>
{if(day==32>
day=1。}
if(moon==6>
{if(day==31>
day=1。}
if(moon==7>
{if(day==32>
day=1。}
if(moon==8>
{if(day==32>
day=1。}
if(moon==9>
{if(day==31>
day=1。}
if(moon==10>
{if(day==32>
day=1。}
if(moon==11>
{if(day==31>
day=1。}
if(moon==12>
{if(day==32>
day=1。}设定,1、3、5、7、8、10、12月有31天,4、
6、9、11月有30天,二 月闰年有29天,平年有28天

write_nyr(9,day>。令LCD在正确的位置显示加设定好的日期
数据
ZJL=(day>10*16+(day>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x86,ZJL>。向DS1302内写日期寄存器86H写入调
整后的日期 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+10>。因为设置液晶的模式是写入数据后,指
针 自动加一,所以需要光标回位

break。
case 6:moon++。
if(moon==13>
moon=1。
write_nyr(6,moon>。令LCD在正确的位置显示加设定好的月
份数据
ZJL=(moon>10*16+(moon>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x88,ZJL>。向DS1302内写月份寄存器88H写入调
整后的月份 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+7>。因为设置液晶的模式是写入数据后,指
针自 动加一,所以需要光标回位

break。
case 7:year++。
if(year==100>
year=0。
write_nyr(3,year>。令LCD在正确的位置显示加设定好的年
份数据
ZJL=(year>10*16+(year>%10。十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00>。允许写,禁止写保护
write_13 02(0x8c,ZJL>。向DS1302内写年份寄存器8cH写入调
整后的年份数据BCD码
write_1302(0x8e,0x80>。打开写保护
wr ite_1602com(yh+4>。因为设置液晶的模式是写入数据后,指
针自动加一,所以需要光 标回位

break。
}
}
}
-- ----------------减键key3,各句功能参照'加键'注释---------------

if(key3==0>
{
delay(10>。调延时,消抖动
if(key3==0>
{
delay(20>。
while(!key3>。
switch(key1n>
{
case 1:sec--。
if(sec==-1>
sec=59。秒数据减到-1时自动变成59
write_sfm(0x08,sec>。在LCD的正确位置显示改变后新的秒数
ZJL=(sec>10*16+(sec>%10。十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00>。 允许写,禁止写保护
write_1302(0x80,ZJL>。 向DS1302内写秒寄存器80H写入调整
后的秒数据BCD码

write_1302(0x8e,0x80>。 打开写保护
write_1602com( er+0x09>。因为设置液晶的模式是写入数据后,
指针自动加一,在这里是写回原来的位置

write_1602com(0x0b>。
break。
case 2:min--。
if(min==-1>
min=59。
write_sfm(5,min>。
ZJL=(min>10*16+(min>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x82,ZJL>。向DS1302内写分寄存器82H写入调整
后的分数据 BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(er+6>。因为设置液晶的模式是写入数据后,指
针自 动加一,在这里是写回原来的位置

break。
case 3:hour--。
if(hour==-1>
hour=23。
write_sfm(2,hour>。
ZJL=(hour>10*16+(hour>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x84,ZJL>。向DS1302内写小时寄存器84H写入调
整后的小时 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(er+3>。因为设置液晶的模式是写入数据后,指
针自 动加一,所以需要光标回位

break。
case 4:week--。
if(week==0>
week=7。
write_1602com(yh+0x0C>。指定'加'后的周数据显示位置
write_week(week>。指定周数据显示内容
ZJL=(week>10*16+(week>%10。十进制转换成DS1302要求的
DCB码
write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x8a,ZJL>。向DS1302内写周寄存器8aH写入调整
后的周数据 BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+0x0e>。因为设置液晶的模式是写入数据
后,指针自动加一,所以需要光标回位

break。
case 5:day--。
if(moon==1>
{if(day==0>
day=31。}
if(moon==2>
{if((year4==0&&year100!=0>||(year400==0>>
{if(day==0>
day=29。}
else if(day==0>
day=28。}
if(moon==3>
{if(day==0>
day=31。}
if(moon==4>
{if(day==0>
day=30。}
if(moon==5>
{if(day==0>
day=31。}
if(moon==6>
{if(day==0>
day=30。}
if(moon==7>
{if(day==0>
day=31。}
if(moon==8>
{if(day==0>
day=31。}
if(moon==9>
{if(day==0>
day=30。}
if(moon==10>
{if(day==0>
day=31。}
if(moon==11>
{if(day==0>
day=30。}
if(moon==12>
{if(day==0>
day=31。}同上加键
write_nyr(9,day>。
ZJL=(day>10*16+(day>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x86,ZJL>。向DS1302内写日期寄存器86H写入调
整后的日期 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+10>。因为设置液晶的模式是写入数据后,指
针 自动加一,所以需要光标回位

break。
case 6:moon--。
if(moon==0>
moon=12。
write_nyr(6,moon>。
ZJL=(moon>10*16+(moon>%10。十进制转换成DS1302要求的DCB

write_1302(0x8e,0x00>。允许写,禁止写保护
write_1302(0x88,ZJL>。向DS1302内写月份寄存器88H写入调
整后的月份 数据BCD码

write_1302(0x8e,0x80>。打开写保护
write_1602com(yh+7>。因为设置液晶的模式是写入数据后,指
针自 动加一,所以需要光标回位

break。
case 7:year--。
if(year==-1>
year=99。
write_nyr(3,year>。
ZJL=(year>10*16+(year>%10。十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00>。允许写,禁止写保护
write_13 02(0x8c,ZJL>。向DS1302内写年份寄存器8cH写入调
整后的年份数据BCD码
write_1302(0x8e,0x80>。打开写保护
wr ite_1602com(yh+4>。因为设置液晶的模式是写入数据后,指
针自动加一,所以需要光 标回位

break。
}}}}}
-------------------------------
void init(> 定时器、计数器设置函数
{
TMOD=0x11。 指定定时计数器的工作方式为3
TH0=0。 定时器T0的高四位=0
TL0=0。 定时器T0的低四位=0
EA=1。 系统允许有开放的中断
ET0=1。 允许T0中断
TR0=1。 开启中断,启动定时器
}
*** ****************主函数**************************
************************************************** *

void main(>
{
lcd_init(>。 调用液晶屏初始化子函数
ds1302_init(>。 调用DS1302时钟的初始化子函数
init(>。 调用定时计数器的设置子函数
delay(80>。
while(1> 无限循环下面的语句:
{
keyscan(>。 调用键盘扫描子函数
}}
void timer0(> interrupt 1 取得并显示日历和时间
{
读取秒时分周日月年七个数据 sec = BCD_Decimal(read_1302(0x81>>
min = BCD_Decimal(read_1302(0x83>>。
hour = BCD_Decimal(read_1302(0x85>>。
day = BCD_Decimal(read_1302(0x87>>。
moon=BCD_Decimal(read_1302(0x89>>。
year=BCD_Decimal(read_1302(0x8d>>。
week=BCD_Decimal(read_1302(0x8b>>。显示秒、时、分数据:
write_sfm(8,sec>。秒,从第二行第8个字后开始显示<调用时分秒显示子函数)
write_sfm(5,min>。分,从第二行第5个字符后开始显示
write_sfm(2,hour>。小时,从第二行第2个字符后开始显示
显示日、月、年数据:
write_nyr(9,day>。日期,从第二行第9个字符后开始显示
write_nyr(6,moon>。月份,从第二行第6个字符后开始显示
write_nyr(3,year>。年,从第二行第3个字符后开始显示
write_week(week>。
}
6、系统仿真调试
6.1程序调试过程
<1)在keilC51中建立project,在keilc51界面上点击菜单栏的“Projec t”,选择“New
Project”,在界面会显示出如图6.1所示的窗口,保存路径自己定义, 在文件名上输入自
己给项目起的名字,然后点击保存


图6.1
(2)如图6.3所示点击“AT89C51”,之后点“确定”

图6.2 (3)
在建好的项目中插入文件。具体步骤如下:在菜单栏中“File”下拉菜单中选择
新建文件,将文件另存在与项目一样的存取路径下,文件格式存为“**.c”的形式,结果
如图6.3 所示,之后点击“保存”。


图6.3
(4)
在左侧右键Target1 ,单击Options for target‘target1’出现图6.4 单击
output,将create HEX File 选项勾卷。


图6.4
<5)、编辑、链接结果。


图6.5
6.2仿真调试过程
<1)打开proteus软件,单机双 击单片机出现图6.6,将刚才生成的电子日历时钟.hex文
件导入。

图6.6
<2)点击运行,结果如图6.7

图6.6运行结果图
7、结果分析
通过对仿真系统的运行,可以看到,电子日历时钟系统成功运行,与预期设计结果想符
合,仿 真实验成功。
8、体会与感想
本设计了实现单片机控制下电梯智能控制系统的设计方案,通 过PROTEUS仿真模拟电
路实现了电子日历时钟功能。本次课程设计主要是结合keilc51和p roteus两种软件,通
过软件的设计实现软硬件的结合。在keilc51中编写程序,使LCD显 示屏显示实验想要达
到的效果,将文件导入proteus中实现仿真电路的实现。本次实验不仅让我对 c51编程有
了更深一步的理解,提高了自己的编程能力,而且还对硬件的功能有了进一步的了解,只< br>有把软硬件结合才能实现更加符合实际的问题。单片机正是使软硬件结合的一门课程,对
于我们以 后的动手能力有很深的影响。

同时,本次课程设计也反应出了自己平时的欠缺之处。比如在显 示屏实现上下滚动这
一功能时,上网查阅很多资料才弄懂这一功能如何实现,看似简单的代码自己实现起 来却
不是那么简单。主要欠缺之处还是在于平时自己编程少,积攒的知识少,才会到用的时候
没 有思路。在今后的学习中,我会更加注重动手能力的培养和学习,争取取得更大的进
步。

9、参考文献
[1] 谢维成.《单片机原理与应用及C51程序设计<第2版)》.清华大学出版社 2009
[2] 高歌.《Altium Designer电子设计应用教程》. 高等教育出版社.2018
[3] 徐向名.《Altium Designer快速入门》.北京. 北京航空航天大学出版社.2008
[4] 李春葆.《C语言程序设计题典》.北京.清华大学出版社.2002

孩子叛逆期-出生的英文


最低级公务员-减肥计划表


寒假班补习-欧美qq头像


市场营销专业前景-留守儿童心理健康


西湖的诗句-湖南文科分数线


长春大学怎么样-电脑网站


圣诞节送礼物-德邦货运


对数公式-广东商学院分数线



本文更新与2020-12-09 17:32,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/479331.html

电子日历时钟的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文