资源描述
南华大学 摘要 随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领 域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能 进一步提高。 时间就是金钱、时间就是生命、时间就是胜利,准确的掌握时间和分配时间对人们 来说至关重要,时钟是我们生活中必不可少的工具。电子钟的设计方法有很多种,但是基于 单片机并通过 LCD 显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。 利用 STC89C52 单片机对 DS1302 时钟芯片进行读写操作并通过 1602 字符液晶显示实时 时钟信息,这样便构成了一个单片机电子时钟。 关键词:单片机,电子时钟,STC89C52,蜂鸣器 ABSTRACT With the rapid development of microcomputer technology in its promotion, modern electronics into almost all areas of society, a strong impetus to the development of social productive forces and social improvement in the level of information, but also to further improve the performance of modern electronic products. Time is a money, time is life, time is victory Accurate grasp of time and allocation of time is crucial to people, The clock is necessary in our life tools . Clock Design There are many ways, however, produced by single chip electronic clock is more flexible programming, and easy expansion of electronic capabilities, high accuracy, easy to carry, display visual and so on. In this paper, through the use of STC89C52 microcontroller by DS1302 clock chips for reading and writing operation and through 1602 character liquid crystal display real-time clock information so that forming a single chip electronic clock. Key Words: Microcontroller,STC89C52 ,Electronic clock,buzzer 南华大学 目录 绪论-1 概述-1 研究目的-1 第 1 章 设计要求与方案论证-2 1.1 设计要求-2 1.2 系统基本方案选择和论证-2 1.2.1 单片机芯片的选择方案和论证-2 1.2.2 显示模块选择方案和论证 -2 1.2.3 时钟芯片的选择方案和论证-2 1.3 电路设计最终方案决定-3 第 2 章 主要元件介绍-3 2.1 STC89C52 以及最小系统介绍-3 2.1.1 STC89C52 主要功能及 PDIP 封装-4 2.1.2 STC89C52 引脚介绍-4 2.1.3 STC89C52 最小系统-4 2.2 DS1302 时钟芯片以及集成时钟模块介绍-5 南华大学 2.2.1 DS1302 概述-6 2.2.2 DS1302 引脚介绍-6 2.2.3 DS1302 使用方法-6 2.2.4 时钟集成模块内部原理图以及实物图-8 2.3 1602 字符液晶以及显示模块介绍-9 2.3.1 1602 液晶概述- 9 2.3.2 1602 引脚介绍-10 2.3.3 1602 字符液晶使用方法-11 2.3.4 LCD 显示模块原理图- 13 第 3 章 系统硬件设计14 3.1 电路设计框图-14 3.2 系统硬件概述-14 第 4 章 系统的软件设计- 15 4.1 程序流程框图-15 第 5 章 系统测试与总结- 南华大学 17 5.1 系统测试-17 5.2 总结-17 致谢-18 参考文献-18 源程序清单-18 附录-35 南华大学 - 0 - 绪论 概述 时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。因 此自从时钟发明的那刻起,就成为人类的好朋友。随着时间的流逝,科学技术的不断发展和 提高,人们对时间计量的精度要求越来越高,应用越来越广。怎样让时钟更好、更方便、更 精确的显示时间,这就要求人们不断设计研发出新型的时钟。 高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采 用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。数字式电子钟用 集成电路计时时,译码代替机械式传动,用 LED 显示器代替指针进而显示时间,减小了计时 误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在单片机 的应用系统中,时钟有两个方面的含义:一是指为保障系统正常工作的基准振荡定时信号, 主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的 标准定时时钟,即定时时间,它通常有两种实现方法:一是用软件实现,即用单片机内部的 可编程定时器/计数器来实现;二是用专门的时钟芯片实现。 研究目的 通过利用 STC89C52 单片机和 DS1302 芯片以及外围的按键和 LCD 显示器等部件,设计一 个基于单片机的电子时钟。设计的电子时钟通过液晶显示器显示,并能通过按键对时间以及 闹钟进行设置。 第 1 章 设计要求与方案论证 1.1 设计要求: 具有年、月、日、星期、时、分、秒显示功能() 具备年、月、日、星期、时、分、秒校准功能 具有闹钟显示、调节设定、鸣叫功能 南华大学 - 1 - 1.2 系统基本方案选择和论证 1.2.1 单片机芯片的选择方案和论证: 方案一: 采用 STC89C52 芯片作为硬件核心。STC89C52 内部具有 8KB ROM 存储空间,512 字节数据 存储空间,带有 2K 字节的 EEPROM 存储空间,与 MCS-51 系列单片机完全兼容,STC89C52 可以 通过串口下载。 方案二: 采用 AT89S52。AT89S52 片内具有 8K 字节程序存储空间,256 字节的数据存储空间没有 EEPROM 存储空间,也与 MCS-51 系列单片机完全兼容,具有在线编程可擦除技术。 两种单片机都完全能够满足设计需要,STC89C52 相对 ATS89C52 价格便宜,且抗干扰能 力强。考虑到成本因素,因此选用 STC89C52。 1.2.2 显示模块选择方案和论证: 方案一: 采用点阵式数码管显示。点阵式数码管是由八行八列的发光二极管组成,对于显示文 字比较适合,如采用在显示数字显得太浪费,且也相对较高,所以不用此种作为显示。 方案二: 采用 LED 数码管动态扫描。LED 数码管价格便宜,对于显示数字最合适,但功耗较大,且 显示容量不够,所以也不用此种方案。 方案三: 采用 LCD 液晶显示屏。液晶显示屏的显示功能强大,可显示大量文字,显示多样,清晰可 见,且价格适中,所以采用了 LCD 数码管作为显示。 1.2.3 时钟芯片的选择方案和论证: 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒 计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不 采用此方案。 方案二: 南华大学 - 2 - 采用 DS1302 时钟芯片实现时钟,DS1302 芯片是一种高性能的时钟芯片,可自动对秒、分、 时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,工作电压 2.5V5.5V 范围内, 2.5V 时耗电小于 300nA. 1.3 电路设计最终方案决定 综上各方案所述,对此次作品的方案选定: 采用 STC89C52 单片机作为主控制系统;采用 DS1302 作为时钟芯片;采用 1602 LCD 液晶作为显示器件。 第 2 章 主要元件介绍 2.1 STC89C52 以及最小系统介绍 2.1.1 STC89C52 主要功能及 PDIP 封装 STC89C52 是由深圳宏晶科技公司生产的与工业标准 MCS-51 指令集和输出管脚相兼容的 单片机。STC89C52 主要功能如表 1 所示,其 PDIP 封装如图 2 所示 表 1:STC89C52 主要功能 主要功能特性 兼容 MCS51 指令系统 8K 可反复擦写 Flash ROM 32 个双向 I/O 口 256x8bit 内部 RAM 3 个 16 位可编程定时 /计数器中断 时钟频率 0-24MHz 2 个串行中断 可编程 UART 串行通道 2 个外部中断源 共 6 个中断源 2 个读写中断口线 3 级加密位 低功耗空闲和掉电模式 软件设置睡眠和唤醒功能 2.1.2 STC89C52 引脚介绍 主电源引脚(2 根) VCC(Pin40):电源输入,接5V 电源 南华大学 - 3 - GND(Pin20):接地线 外接晶振引脚(2 根) XTAL1(Pin19):片内振荡电路的输入端 XTAL2(Pin20):片内振荡电路的输出端 控制引脚(4 根) RST/VPP(Pin9):复位引脚,引脚上出现 2 个机器周期的高电平将使单片机复位。 ALE/PROG(Pin30):地址锁存允许信号 PSEN(Pin29):外部存储器读选通信号 EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接 高电平则从内部程序存储器读指令。 可编程输入/输出引脚(32 根) STC89C52 单片机有 4 组 8 位的可编程 I/O 口,分别位 P0、P1、P2、P3 口,每个口有 8 位 (8 根引脚),共 32 根。 P0 口(Pin39Pin32):8 位双向 I/O 口线,名称为 P0.0P0.7 P1 口(Pin1Pin8):8 位准双向 I/O 口线,名称为 P1.0P1.7 P2 口(Pin21Pin28):8 位准双向 I/O 口线,名称为 P2.0P2.7 P3 口(Pin10Pin17):8 位准双向 I/O 口线,名称为 P3.0P3.7 S T C 8 9 C 5 2 4 0 3 9 3 8 3 4 3 5 3 6 3 7 2 7 2 8 2 9 3 0 3 1 3 2 3 3 2 3 2 4 2 5 2 6 2 2 2 1 P 1 . 0 1 2 3 2 0 1 9 1 8 1 7 1 6 1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 T 0 / P 3 . 4 I N T O / P 3 . 2 R X D / P 3 . 0 R S T V c c S C K / P 1 . 7 M I S O / P 1 . 6 M O S I / P 1 . 5 P 1 . 4 P 1 . 3 P 1 . 2 P 1 . 1 T X D / P 3 . 1 I N T I / P 3 . 3 T 1 / P 3 . 5 W R / P 3 . 6 R D / P 3 . 7 X T A L 2 X T A L 1 G N D P 0 . 0 ( A D 0 ) P S E N A L E / P R O G E A / V p p P 0 . 1 ( A D 1 ) P 0 . 7 ( A D 7 ) P 0 . 6 ( A D 6 ) P 0 . 5 ( A D 5 ) P 0 . 4 ( A D 4 ) P 0 . 3 ( A D 3 ) P 0 . 2 ( A D 2 ) P 2 . 7 ( A D 1 5 ) P 2 . 6 ( A D 1 4 ) P 2 . 1 ( A D 9 ) P 2 . 2 ( A D 1 0 ) P 2 . 3 ( A D 1 1 ) P 2 . 4 ( A D 1 2 ) P 2 . 5 ( A D 1 3 ) P 2 . 0 ( A D 8 ) 图 2:STC89C52 PDIP 封装图 南华大学 - 4 - 2.1.3 STC89C52 最小系统 最小系统是指能进行正常工作的最简单电路。STC89C52 最小应用系统电路如图 3 所示。 它包含五个电路部分:电源电路、时钟电路、复位电路、片内外程序存储器选择电路、输入 /输出接口电路。其中电源电路、时钟电路、复位电路是 保证单片机系统能够正常工作的最 基本的三部分电路,缺一不可。 电源电路 芯片引脚 VCC 一般接上直流稳压电源+5V,引脚 GND 接电源+5V 的负极,电源 电压范围在 45.5 之间,可保证单片机系统能正常工作。 时钟电路 单片机引脚 18 和引脚 19 外接晶振及电容, STC89C52 芯片的工作频率可在 233MHz 范围之间选,单片机工作频率取决于晶振 XT 的频率,通常选用 11.0592MHz 晶振。 两个小电容通常取值 3pF,以保证振荡器电路的稳定性及快速性。 复位电路 一般若在引脚 RST 上保持 24 个工作主频周期的高电平,单片机就可以完成 复位,但为了保证系统可靠地复位,复位电路应使引脚 RST 保持 10ms 以上的高电平。如图 复位电路带有上电自动复位功能,当电路上电时,由于 C1 电容两端电压值不能突变,电源 +5V 会通过电容向 RST 提供充电电流,因此在 RST 引脚上产生一高电平,使单片机进入复位 状态。随着电容 C1 充电,它两端电压上升使得 RST 电位下降,最终使单片机退出复位状态。 正常运行时,可按复位按钮对单片机复位 图 3:STC89C52 最小系统 2.2 DS1302 时钟芯片以及时钟集成模块介绍 南华大学 - 5 - 2.2.1 DS1302 概述 DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟芯片,它可 以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V5.5V。采用双电源供电(主电源和备用电源),同时提供了对后背电源进行涓细电流 充电的能力。采用三线接口与 CPU 进行同步通信 D S 1 3 0 2 V c c 1 S C L K V c c 2 X 1 X 2 G N D C E I / O 1 2 7 6 5 4 3 8 图 4:DS1302 封装图 2.2.2 DS1302 引脚介绍 各引脚功能为: Vcc: 主电源;Vcc2:备用电源。当 Vcc2Vcc1+0.2V 时,由 Vcc2 向 DS1302 供电; 当 Vcc2Vcc1 时,由 Vcc1 向 DS1302 供电。 SCLK:串行时钟输入端,控制数据的输入与输出 I/O: 三线接口时的双向数据线 CE: 输入信号,在读、写数据期间必须为高 2.2.3 DS1302 使用方法 (1) 时钟芯片 DS1302 的工作原理: DS1302 在每次进行读、写程序前都必须初始化,先把 SCLK 端置 “0”,接着把 RST 端 置“1”,最后才给予 SCLK 脉冲;读/写时序如图 5 所示。表 2 为 DS1302 的控制字,此控制 字的位 7 必须置 1,若为 0 则不能把对 DS1302 进行读写数据。对于位 6,若对程序进行读/ 写时 RAM=1,对时间进行读/写时,CK=0。位 1 至位 5 指操作单元的地址。位 0 是读/写操作 位,进行读操作时,该位为 1;该位为 0 则表示进行的是写操作。控制字节总是从最低位开 始输入/输出的。表 6 为 DS1302 的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该 位为 1 时,时钟振荡器停止,DS1302 处于低功耗状态;当该位为 0 时,时钟开始运行。 南华大学 - 6 - “WP” 是写保护位,在任何的对时钟和 RAM 的写操作之前,WP 必须为 0。当“WP”为 1 时,写保护 位防止对任一寄存器的写操作。 (2) DS1302 的控制字节 DS1302 的控制字如表所示。控制字节最高有效位(位 7)必须是逻辑 1,如果它为 0, 则不能把数据写入 DS1302 中,位 6 如果 0,则表示存取日历时钟数据,为 1 表示存取 RAM 数 据;位 5 至位 1 指示操作单元的地址;最低有效位(位 0)如为 0 表示要进行写操作,为 1 表示进行读操作,控制字节总是从最低位开始传输 RAM RD 1 CK A4 A3 A2 A1 A0 WR 表 2:DS1302 控制字 (3) 数据输入输出(I/O) 在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入 从低位即位 0 开始。同样,在紧跟 8 位的控制指令字后的下一个 SCLK 脉冲的下降沿读出 DS1302 的数据,读出数据时从低位 0 位到高位 7。其读写时序如图示 图 5:DS1302 读写时序 (4)DS1302 寄存器 DS1302 中与时间、日期有关的寄存器共有 12 个,其中 7 个存放数据的格式为 BCD 码 格式,其读写地址如下表所示 读寄 存器 写寄 存器 Bit7 Bit7 Bit7 Bit7 Bit7 Bit7 Bit7 Bit7 范围 南华大学 - 7 - 81H 80H CH 10 秒 秒 00-59 83H 82H 10 分 分 00-59 12 10 0-23 85H 84H 24 0 AM/PM 时 时 1-12 87H 86H 10 日 日 1-31 89H 88H 10 月 月 1-12 8BH 8AH 0 0 0 0 0 周 1-7 8DH 8CH 10 年 年 00-99 8FH 8EH WP 0 0 0 0 0 0 0 表 3:DS1302 时钟寄存器 第一行秒寄存器,CH 为时钟暂停标志位,该位为 1 时时钟停止,该位为 0 时时钟运行 第二行分寄存器,bit0bit6 表示分钟数,因采用 BCD 编码,所以低四位最大能表示的 数字为 9,计数满向高三位进 1。 第三行时寄存器,12/24 用来定义 DS1302 小时的运行模式,12 小时模式下 bit5 为 1 表 示 PM 下午,bit5 为 0 表示 AM 上午 第八行控制寄存器,bit7 是写保护位 WP,当 WP 为 1 时,写保护位可防止对任一寄存器 的写操作,在任何的对时钟和 RAM 的写操作之前,WP 位必须为 0 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302 与 RAM 相关的寄存器分为两类:一类是单个 RAM 单元,共 31 个,每个单元组态为一 个 8 位的字节,其命令控制字为 C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突 发方式下的 RAM 寄存器,此方式下可一次性读写所有的 RAM 的 31 个字节,命令控制字为 FEH(写)、FFH(读)。 2.2.4 时钟集成模块内部原理图以及实物图 南华大学 - 8 - 图 6:DS1302 内部原理图 南华大学 - 9 - 图 7:DS1302 实物图 2. 3 1602 字符液晶以及显示模块介绍 2.3.1 1602 液晶概述 工业字符型液晶,1602 是指显示的内容为 16*2,即能够同时显示两行,每行 16 个字符。 常见的 1602 字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色 字体,目前市面上字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的。 本课题所用 1602 液晶模块,显示屏是蓝色背光白色字体。如图 6 所示 南华大学 - 10 - 1 2 3 10987654 11 12 13 14 15 16 G N D V C C V O D 1 D 0 ER / W R S D 2 D 3 D 4 D 5 D 6 D 7 B L A B L K L C D 1 6 0 2 图 8:1602 字符液晶 2.3.2 1602 引脚介绍 编号 符号 引脚说明 编号 符号 引脚说明 1 GND 电源地 2 VCC 电源正极 3 VO 液晶显示对 比度调节端 4 RS 数据/ 命令选 择端 5 R/W 读写选择 6 E 使能信号 7 D0 数据口 8 D1 数据口 9 D2 数据口 10 D3 数据口 11 D4 数据口 12 D5 数据口 13 D6 数据口 14 D7 数据口 15 BLA 背光电源正 16 BLK 背光电源负 表 4:1602 字符液晶引脚说明 各个引脚具体功能说明: 第 1 脚:GND 为地电源。 第 2 脚:VCC 接 5V 正电源。 第 3 脚:VO 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高, 对比度过高时会产生重影,使用一个 1K 的电位器调整对比度。 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 714 脚:DB0DB7 为 8 位双向数据线。 南华大学 - 11 - 第 1516 脚:背光灯电源。 2.3.3 1602 字符液晶使用方法 (1)基本操作时序 操作 输入 输出 读状态 RSL,RW H,EH D0D7状态字 写指令 RSL ,RWL,D0D7指令码,E高脉冲 无 读数据 RSH,RW H,EH D0D7数据 写数据 RSH,RWL,D0D7数据,E高脉冲 无 图 9:1602 液晶读时序图 图 10:1602 液晶写时序图 南华大学 - 12 - (2)RAM 1602 液晶控制器芯片内部带有 80 个 8 位的 RAM 缓冲区,其地址和屏幕的对应关系如 图 7 示 图 11 (3)1602 字符液晶字库 1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字符图 形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名 等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B(41H ), 显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“A” 。 高位 低位 000 0 001 0 001 1 010 0 010 1 011 0 011 1 101 0 101 1 110 0 110 1 111 0 111 1 XXXX0000 0 P p - P XXXX0001 ! 1 A Q a q q XXXX0010 “ 2 B R b r XXXX0011 # 3 C S c s XXXX0100 $ 4 D T d t XXXX0101 % 5 E U e u o XXXX0110 /定义下面通过 lcden 来操作 P27 口,1602 液晶使能控制端 南华大学 - 19 - sbit lcdwr=P25;/定义下面通过 lcdrw 来操作 P25 口,1602 读写选择端 sbit lcdrs=P26;/定义选数据寄存器选指令寄存器控制端 sbit sda=P34;/定义 DS1302 数据总线 sbit rst=P35;/DS1320 复位 sbit sck=P36;/定义时钟总线 sbit s1=P10;/定义设置按钮 sbit s2=P11;/定义调时按钮 sbit s3=P12;/定义确定按钮 sbit s4=P13; sbit ACC0=ACC0; sbit ACC7=ACC7; sbit BELL=P15; char fen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen; uchar code table= 2012- - ;/要写入 1602 液晶的数据 uchar code table1= : : : ;/字库中的字可直接以外加号的形式直接写入 uchar code table2= Welcome To Lcd!;/欢迎界面 uchar code table3=Happy Every Day!; /欢迎界面 /* 时函数,z 的取值为这个函数的延时 ms 数,delay(200); 大约延时 200ms. delay(500);大约延时 500ms */ void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); /*蜂鸣器函数 */ void didi() uchar i; for(i=0;i60;i+) BELL = 0; delay(1); 南华大学 - 20 - BELL = 1; delay(1); /*向 1602 液晶中写一个指令 */ void write_com(uchar com) lcdwr=0; /lcdwr 为读写控制端,lcdwr=0, 这里可不写 lcdrs=0; /液晶 rs 接口为 0 时,写指令,rs 为 1 时写数据 P0=com; /将要写的指令赋给 P0 口, delay(5); /由 1602 读写操作时序图,先将指令赋给 P0 口,延时后将使能 lcden=1; / 端 lcden 置高,再延时一段时间,然后将 lcden 置低,这样指令 delay(5); / 就写入到 LCD 了 lcden=0; /*向液晶写数据*/ void write_data(uchar date)/与写指令类似,这里 lcdrs 设为 1 lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; /*初使化 1602 液晶 */ void init_1602() lcdwr=0; lcden=0; write_com(0 x38);/设置 LCD 为 16*2 显示、5*7 点阵、8 位数据接口模式 南华大学 - 21 - write_com(0 x0c);/开显示、不显示光标 write_com(0 x06);/写一个字符后,地址指针加 1 write_com(0 x01);/显示清 0 /*/ void gudingtime_1602() uchar num; write_com(0 x80);/将指针指向初始位置 for(num=0;num16;num+)/循环函数,用于将 2012- - 写入液晶 write_data(tablenum); write_com(0 x80+0 x40);/将指针指向 1602 液晶的第二行 for(num=0;num16;num+)/功能与上同,用于将 : : : 写入 write_data(table1num); /*显示欢迎界面函数*/ void displaystar(void) uchar i; write_com(0 x80); for(i=0;i16;i+) write_data(table2i); write_com(0 x80+0 x40); for(i=0;i0;i-) sda=ACC0; sck=1; sck=0; ACC=ACC1; /*读数据字节子函数*/ uchar Output_1byte(void)/读一字节数据 uchar i; for(i=8;i0;i-) ACC=ACC1; ACC7=sda; sck=1; 南华大学 - 23 - sck=0; return(ACC); /*写 DS1302 数据函数*/ void write_1302(uchar DS_ADD,uchar DS_DAT)/写操作 rst=0; sck=0; rst=1; Input_1byte(DS_ADD); Input_1byte(DS_DAT); sck=1; rst=0; /*读 DS1302 数据函数*/ uchar read_1302(uchar DS_ADD)/读操作 uchar DS_INF; rst=0; sck=0; rst=1; Input_1byte(DS_ADD); DS_INF=Output_1byte(); sck=1; rst=0; return(DS_INF); /*初始化 DS1302 子函数*/ void inital_1302() 南华大学 - 24 - write_1302(0 x8e,0 x00);/禁止写保护 write_1302(0 x90,0 xaa);/定义充电 write_1302(0 x80,0 x53);/秒 write_1302(0 x84,0 x13);/时 write_1302(0 x82,0 x43);/分 write_1302(0 x8c,0 x12);/年 write_1302(0 x88,0 x06);/月 write_1302(0 x86,0 x03);/日 write_1302(0 x8a,0 x06);/星期 write_1302(0 xc0,0 x08);/闹钟小时初始化 write_1302(0 xfc,0 x00);/闹钟分钟初始化 write_1302(0 x8e,0 x80);/开保护 /* 扫描函数 */ void keyscan() if(s1=0 if(s1=0 s1num+; while(!s1);didi(); if(s1num=1) write_com(0 x80+0 x40+8);/光标移动到*位置 write_com(0 x0f);/显示光标 if(s1num=2) 南华大学 - 25 - write_1302(0 x8e,0 x00);/禁止写保护 write_1302(0 x80,miao);/写入秒信息 write_1302(0 x8e,0 x80);/开写保护 write_com(0 x80+0 x40+5); if(s1num=3) write_1302(0 x8e,0 x00); write_1302(0 x82,fen); write_1302(0 x8e,0 x80); write_com(0 x80+0 x40+2); if(s1num=4) write_1302(0 x8e,0 x00); write_1302(0 x88,yue); write_1302(0 x8e,0 x80); write_com(0 x80+13); if(s1num=5) write_1302(0 x8e,0 x00); write_1302(0 x84,shi); write_1302(0 x8e,0 x80); write_com(0 x80+10); if(s1num=6) write_1302(0 x8e,0 x00); write_1302(0 x86,ri); write_1302(0 x8e,0 x80); write_com(0 x80+7); if(s1num=7) 南华大学 - 26 - write_1302(0 x8e,0 x00); write_1302(0 x8c,nian); write_1302(0 x8e,0 x80); write_com(0 x80+4); if(s1num=8) flag1=0; s1num=0; write_1302(0 x8e,0 x00); write_1302(0 x8a,zhou); write_1302(0 x8e,0 x80); write_com(0 x0c);/不显示光标 /*/ if(s1num!=0 if(s2=0) while(!s2);didi(); if(s1num=1) int x1,x2; x1=miao%16; x2=miao/16; x1+; if(x1=10) x1=0; 南华大学 - 27 - x2+; if(x2=6) x2=0; miao=x1+x2*16; write_sfm(7+0 x40,miao);/将修改的数送到 1602 显示 write_com(0 x80+0 x40+8);/挪回光标 if(s1num=2) int x3,x4; x3=fen%16; x4=fen/16; x3+; if(x3=10) x3=0; x4+; if(x4=6) x4=0; fen=x3+x4*16; write_sfm(4+0 x40,fen); write_com(0 x80+0 x40+5); if(s1num=3) int x5,x6; x5=shi%16; x6=shi/16; x5+; if(x6=2 x6=0; 南华大学 - 28 - if(x5=10) x5=0; x6+; shi=x5+x6*16; write_sfm(1+0 x40,shi); write_com(0 x80+0 x40+2); if(s1num=4) zhou+; if(zhou=8) zhou=1; write_zhou(zhou); write_com(0 x80+13); if(s1num=5) int x5,x6; x5=ri%16; x6=ri/16; x5+; if(x6=3 x6=0; if(x5=10) x5=0; x6+; 南华大学 - 29 - ri=x5+x6*16; write_sfm(9,ri); write_com(0 x80+10); if(s1num=6) int x5,x6; x5=yue%16; x6=yue/16; x5+; if(x6=1 x6=0; if(x5=10) x5=0; x6+; yue=x5+x6*16; write_sfm(6,yue); write_com(0 x80+7); if(s1num=7) int x5,x6; x5=nian%16; x6=nian/16; x5+; if(x6=2 x6=0; 南华大学 - 30 - if(x5=10) x5=0; x6+; nian=x5+x6*16; write_sfm(3,nian); write_com(0 x80+4); /*/ if(s1num!=0|s4num!=0)/ 在调整模式下 if(s3=0)/如果确定键按下 delay(5); if(s3=0) /延时并重新检测 S3 是否按下,用于差小误差 if(s1num!=0) while(!s3);didi();/在松手时将调整后的时间、日期及周信息写入 DS1302,退出调整模式并隐藏光标,按键次数清 0 write_1302(0 x8e,0 x00); write_1302(0 x80,miao); write_1302(0 x84,shi); write_1302(0 x82,fen); write_1302(0 x8a,zhou); write_1302(0 x8c,nian);/年 write_1302(0 x88,yue);/月 write_1302(0 x86,ri); write_1302(0 x8e,0 x80); flag1=0; 南华大学 - 31 - write_com(0 x0c); s1num=0; if(s4num!=0) while(!s3);didi();/在松手时将调整后的时间、日期及周信息写入 DS1302,退出调整模式并隐藏光标,按键次数清 0 write_1302(0 x8e,0 x00); write_1302(0 xc0,lshi); write_1302(0 xfc,lfen); write_1302(0 x8e,0 x80); flag2=0; s4num=0; write_com(0 x0c); if(s4=0 if(s4=0 flag2=1; while(!s4);didi(); if(s4num=1) write_com(0 x80+0 x40+14); write_com(0 x0f); 南华大学 - 32 - if(s4num=2) write_1302(0 x8e,0 x00);/禁止写保护 write_1302(0 xfc,lfen);/闹钟初始化 write_1302(0 x8e,0 x80);/开写保护 write_com(0 x80+0 x40+11); if(s4num=3) s4num=0; flag2=0; write_1302(0 x8e,0 x00);/禁止写保护 write_1302(0 xc0,lshi);/闹钟初始化 write_1302(0 x8e,0 x80);/开写保护 write_com(0 x0c);/不显示光标 if(s4num!=0 if(s2=0) while(!s2);didi(); if(s4num=1) int x1,x2; x1=lfen%16; x2=lfen/16; x1+; if(x1=10) 南华大学 - 33 - x1=0; x2+; if(x2=6) x2=0; lfen=x1+x2*16; write_sfm(13+0 x40,lfen); write_com(0 x80+0 x40+14); if(s4num=2) int x5,x6; x5=lshi%16; x6=lshi/16; x5+; if(x6=2 x6=0; if(x5=10) x5=0; x6+; lshi=x5+x6*16; write_sfm(10+0 x40,lshi); write_com(0 x80+0 x40+11); void laba() 南华大学 - 34 - if(shi=lshi) void main() init_1602(); delay(5); displaystar();/初始化 1602 后马上显示欢迎语句 delay(5000);/让欢迎界面停留一段时间 gudingtime_1602();/显示液晶固定不变部分 inital_1302(); lshi=read_1302(0 xc1);/从 ds1302 里面的 RAM 读取闹钟时,此处不放在 while(1)大循环里 面是因为 ds1302 里面的 RAM 里的数据是不变的只需读取一次 lfen=read_1302(0 xfd);/从 ds1302 里面的 RAM 读取闹钟分 write_sfm(0 x40+10,lshi);/将闹钟时送到 1602 显示 write_sfm(0 x40+13,lfen);/将闹钟分送到 1602 显示 while(1) keyscan(); laba(); if(flag1=0/先读出,再送到 1602 显示,不断循环操作, 使 1602 动态显示时间的走动 fen=read_1302(0 x83); shi=read_1302(0 x85); ri=read_1302(0 x87); yue=read_1302(0 x89); zhou=read_1302(0 x8b); nian=read_1302(0 x8d); 南华大学 - 35 - write_sfm(7+0 x40,miao); write_sfm(4+0 x40,fen); write_sfm(1+0 x40,shi); write_sfm(9,ri); write_sfm(6,yue); write_sfm(3,nian); write_zhou(zhou); 附录一: 南华大学 - 36 - 系统原理图 附录二: PCB 南华大学 - 37 - 附录三: 首先上电进入欢迎界面,如上图所示,显示 5S 钟。 南华大学 - 38 - 上电后的整体外观图,各按键的功能都有标注 南华大学 - 39 - 按 K1 进入调时状态按得次数不同光标显示的位置不同,从而进行年、月、日、时、分、秒、 的调整,按 8 次时退出,按 K2 调时,K3 确定键,确认所调时间。 按 K4 进入闹铃调整状态,按一次光标显示在闹铃秒位置,从而进行秒的调整,当按二次光 标显示在闹铃时位置,从而进行时的调整,按第三次退出调整状态。
展开阅读全文