实验24 DS1302实时时钟实验

合集下载

DS1302数字钟实验

DS1302数字钟实验

实验十四、DS1302数字钟实验(一)、实验目的:DS1302 是美国DALLAS 公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

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

将DS1302与单片机连接可以方便的取得时间信息,与全软件的数字时钟相比,编程简单、易于调整、使用方便。

该实验的目的就是使使用者通过实验例程的学习,掌握单片机控制系统的实时时钟/日历电路的使用方法,由于DS1302与单片机连接时采用SPI接口,故该实验可以使使用者了解和学习SPI的通讯协议和编程方法。

(二)、实验接线和步骤:1、在DS1302芯片附近,将“P33”、I/O”跳线短接,将“P23”、“SCK”跳线短接,即完成DS1302和单片机的接口连接。

2、将液晶屏12864接到串行接口,将U13(上面的8位拨码开关)的“6”、“7”、“8”三位拨到“ON”位置。

这三位是控制和串行数据接口。

3、短路块短接实验板左侧7289模块的四路跳线“CS1、CLK1、DIO1、INT1”(“KEY”插座附近),然后将7289模块和实验板“KEY”插座相连接。

4、上电下载程序。

5、7289键盘数码管模块对应调时间的按键如下:“1”键调“年”;“2”键调“月”;“3”键调“日”;“A”键调“周”;“7”键调“时”;“8”键调“分”;“9”键调“秒”;所有按键的调节都是单方向增加模式,关于双方向增减模式的调节可以自行修改程序完成。

7289模块数码管上显示的是7289模块按键的键值(不是时间的设置值,时间的设置变化值显示在12864液晶屏上)。

说明一:如果程序下载后运行液晶出现乱码现象,可以按单片机重启按钮重启单片机,还是不行则需要重新启动实验板电源。

说明二:因程序例程篇幅过长,不方便以书面形式列出,为方便使用者,例程的原代码及工程文件所有文档均已附在电子文档“简单端口实验”文件夹中。

DS1302实现时钟

DS1302实现时钟

DS1302实现时钟一、实验目的:1、了解DS1302的结构及工作原理;2、理解DS1302的寄存器;3、掌握DS1302的读/写时序;4、利用DS1032实现时钟功能。

二、实验原理:DS1302的工作电压为2.5~5.5V,采用的是三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据,DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。

其内部结构如下:DS1302串行时钟由电源、输入移位寄存器、命令控制逻辑、振荡器、实时时钟以及RAM组成。

DS1302的控制字的最高有效位(D7)必须是逻辑1;如果它为0,则不能把数据写入DS1302中。

D6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。

D5~D1指示操作单元的地址。

最低有效位(D0)如果为0表示进行写操作,为1表示进行读操作,控制字总是从最低位开始输出。

值得注意的是:在单片机从DS1302中读取数据时,从DS1302输出的第一个数据位发生在紧接着单片机输出的命令字节最后一位的第一个下降沿处;而且在读操作过程中,要保持RST时钟为高电平状态。

当有额外的SCLK时钟周期时,DS1302将重新发送数据字节,这一输出特性使得DS1302具有多字节连续输出的能力。

在控制指令字输入之后下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即D0开始。

同样,在紧跟8位控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位D0至高位D7。

下面为DS1302的单字节读/写时序图:DS1302有12个寄存器,其中七个寄存器与日历、时钟相关,存放的数据位为BCD码形式。

其日历、时间寄存器及其控制字如下表:日历、时钟寄存器与控制字的对照表可一次性顺序读/写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302是一种实时时钟(RTC)电路芯片,由Dallas Semiconductor (现被Maxim Integrated收购)设计和制造。

它提供了一个准确的时间和日期计时功能,适用于许多应用,例如电子设备、仪器仪表、通讯设备和计算机系统等。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部集成了一个时钟发生器电路,它使用外部XTAL晶体和一个频率分频器来产生准确的时钟信号。

晶体的频率通常为32.768kHz,这是由于此频率具有较好的稳定性。

2.电源管理:DS1302芯片可以使用3V到5.5V的电源供电。

它内部具有电源管理电路,可以自动切换到低功耗模式以延长电池寿命。

3.时间计数器:DS1302芯片内部包含一个时间计数器,用于计算并保存当前时间、日期和星期。

它采用24小时制,并提供了BCD编码的小时、分钟、秒、日、月和年信息。

4.控制和数据接口:DS1302芯片使用串行接口与外部器件进行通信,如微控制器或外部检测电路。

控制和数据信息通过三根线SCLK(串行时钟)、I/O(串行数据输入/输出)和CE(片选)进行传输。

5.电源备份:为了确保即使在电源中断的情况下仍能保持时间数据,DS1302芯片通过附带的外部电池来提供电源备份功能。

当主电源中断时,芯片会自动切换到电池供电模式,并将时间数据存储在内部RAM中。

DS1302芯片的应用包括但不限于以下几个方面:1.时钟和日历显示:DS1302芯片可以直接连接到LCD显示屏、LED显示器或数码管等设备,用于显示当前时间和日期。

2.定时控制:DS1302芯片可以用作定时器或闹钟,在特定的时间触发一些事件。

例如,可以使用它作为控制家庭设备的定时开关。

3.数据记录:由于DS1302芯片具有时间计数功能,它可以用于记录事件的时间戳,如数据采集、操作记录或系统状态记录。

4.电源失效保护:DS1302芯片的电源备份功能可确保即使在电源中断的情况下,时间数据也能被保存,以避免系统重新启动后时间重置的问题。

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302芯片是一种低功耗的实时时钟(RTC)电路。

它包含了一个真正的时钟/日历芯片和31个静态RAM存储单元,用于存储时钟和日期信息。

DS1302芯片的工作电压范围为2.0V至5.5V,并且具有极低的功耗,非常适合于移动电子设备和电池供电的应用。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部具有一个实时时钟发生器,它通过晶振和电容电路生成稳定的振荡信号,用于计时。

2.时钟/计时电路:DS1302芯片内部的时钟/计时电路可以精确地计算并保持当前的时间和日期。

它具有秒、分钟、小时、日期、月份、星期和年份等不同的计时单元。

3.RAM存储单元:DS1302芯片包含31个静态RAM存储单元,用于存储时钟和日期信息。

这些存储单元可以通过SPI接口进行读写操作,并且在断电情况下也能够保持数据。

4.控制接口:DS1302芯片通过3线接口与微控制器通信,包括一个时钟线、一个数据线和一个使能线。

这种接口使得与微控制器的通信非常简单,并且能够高效地读写时钟和日期信息以及控制芯片的其他功能。

DS1302芯片的应用如下:1.实时时钟:DS1302芯片可以用作电子设备中的实时时钟。

例如,它可以用于计算机、嵌入式系统、电子游戏等设备中,以提供准确的时间和日期信息。

2.定时器:DS1302芯片的计时功能可以用于设计各种定时器应用。

例如,它可以用于计时器、倒计时器、定时开关等应用中,以实现定时功能。

3.时钟显示:DS1302芯片可以与显示模块结合使用,用于显示当前的时间和日期。

例如,它可以用于数字钟、计时器、时钟频率计等应用中。

4.能量管理:由于DS1302芯片具有低功耗特性,因此它可以用于电池供电的设备中,以实现节能的能量管理策略。

例如,它可以用于手持设备、无线传感器网络等应用中,以延长电池寿命。

综上所述,DS1302芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

电子系统设计实验报告实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。

扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Options for Target 1”的Output选项中,将Create HEX Fil选项勾起来。

2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档6、按下运行键,对Proteus 进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析: 1、DS1302时钟采集模块:1.1电路原理图:1.2 DS1302分析:首先DS1302是DALLAS 公司推出的涓流充电时钟芯片。

内含有一个实时时钟/日历和31字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。

DS1302芯片广脚介绍:X1、X2为32.768KHz 晶振管脚。

DS1302实时时钟原理与应用

DS1302实时时钟原理与应用

DS1302实时时钟原理与应用
1.原理:
DS1302实时时钟通过一个简单的三线接口与微控制器相连,这三根
线分别是:数据线、时钟线和复位线。

通过这三根线,微控制器可以向
DS1302写入和读取时钟和日期信息。

具体的通信协议可以通过发送特定
的命令字节来实现。

当写入数据时,数据线的电平可以提供有效数据,而
时钟线的上升沿控制数据的传输。

当读取数据时,数据线的电平会反映
DS1302存储器中的信息。

2.应用:
a.数字时钟和日期显示器:DS1302实时时钟可以用来驱动数字时钟
和日期显示器,供人们查看当前时间和日期。

b.考勤系统:DS1302实时时钟可以用来记录员工的考勤信息,如签
到和签退时间。

c.定时器:DS1302实时时钟可以用来控制各种定时器,如定时开关、定时器插座等。

d.定时报警器:使用DS1302实时时钟可以实现定时报警功能,如定
时提醒服药、定时关机等。

e.温度和湿度监测:结合温湿度传感器,DS1302实时时钟可以用来
记录环境的温度和湿度信息,并提供时间戳。

f.数据日志记录器:DS1302实时时钟可以用来记录各种传感器的数据,并提供时间戳,以便后续分析和处理。

总之,DS1302实时时钟是一种非常实用的集成电路,具有精确和可靠的时间计量功能。

它可以广泛应用于各种需要时间记录和计量的电子设备和系统中。

通过合理的设计和应用,我们可以充分发挥DS1302实时时钟的功能,提高系统的可靠性和稳定性。

ds1302显示时间课程设计

ds1302显示时间课程设计

ds1302显示时间课程设计一、课程目标知识目标:1. 学生能理解DS1302时钟芯片的基本原理,掌握其引脚功能及电路连接方式。

2. 学生能够掌握DS1302芯片的寄存器配置方法,并运用此知识读取和显示时间。

3. 学生能够解释时间格式,并掌握如何在LCD显示屏上正确显示时间。

技能目标:1. 学生能够独立完成DS1302模块与微控制器的连接,进行基本的电路搭建。

2. 学生能够编写程序,通过I2C或SPI接口与DS1302通信,读取实时时间数据。

3. 学生能够通过调试程序,解决显示时间中的常见问题,确保显示时间的准确性。

情感态度价值观目标:1. 学生能够培养对电子技术的兴趣,激发学习嵌入式系统的热情。

2. 学生能够在项目合作中发展团队协作精神,提高沟通与解决问题的能力。

3. 学生能够认识到时间管理的重要性,通过技术手段加强对时间的认识和尊重。

课程性质分析:本课程为中学信息技术或电子技术相关课程内容,结合实践操作,旨在让学生通过具体的项目实践,掌握DS1302芯片的应用,增强理论与实践相结合的能力。

学生特点分析:考虑到学生所在年级,课程设计需结合学生的认知水平,注重知识技能的逐步引导与提升,同时注重激发学生的学习兴趣,提高自主学习和探究的能力。

教学要求:1. 教学过程中应注重理论与实践相结合,强调动手能力。

2. 通过任务驱动的教学方法,引导学生主动探索,合作学习。

3. 教学评估应基于学生在电路搭建、程序编写、问题解决等方面的具体表现,确保学习目标的达成。

二、教学内容1. 引入DS1302时钟芯片的基础知识,包括芯片特性、引脚功能及其在电路中的作用。

- 课本章节:第三章,第二节“实时时钟芯片DS1302”2. 介绍DS1302的内部寄存器结构,解释各寄存器功能及配置方法。

- 课本章节:第三章,第三节“DS1302的寄存器及其设置”3. 指导学生完成DS1302与微控制器(如Arduino)的电路连接。

- 教学大纲:实践活动一“DS1302电路连接与测试”4. 讲解I2C或SPI通信协议,并运用此协议实现微控制器与DS1302的数据交换。

基于DS1302的实时数字钟设计

基于DS1302的实时数字钟设计

基于DS1302的多功能实时数字钟控制摘要:本系统采用STC89C52 单片机和DS1302 配合,实现实时时间日期和星期的保存和显示。

系统中还有一块1602显示屏,用以显示系统中所需的符号和时间日期。

另外系统中还装有4个独立式键盘,用于系统操作与控制。

并接一个直流蜂呜器和一个交流蜂呜器,用以进行音响提示。

DS1302可以实现对系统是的时、分、秒,日期和星期等信息的保存,使系统在掉电的情况下仍然能够准确的保存并运行时间信息。

利用单片机的定时器,实现了倒计时和秒表功能的设计。

关键字:单片机;DS1302;数字钟Based on DS1302 control of multi-purpose real-time digitalclockAbstract:The system uses the microcontroller and the DS1302 with STC89C52, real-time time date and week of preservation and display. There is also a 1602 display system to display the system date and time required for the symbol. Another system is also equipped with 4 separate keyboard for the system operation and control. And then a DC and an AC buzzer buzzer, used for audio prompts. DS1302 can be achieved on the system is the hours, minutes, seconds, date, and save information such as a week, the system in case of power-down will still be able to save and run-time and accurate information. Use of microcomputer timer, countdown and stopwatch functions to achieve the design.Key words:Single Chip Microcomputer; DS1302; digital clock目录1 绪论 (1)2 系统方案选择和论证 (1)2.1 设计要求 (1)2.2 各模块方案选择和论证 (2)2.2.1 主控模块的选择说明 (2)2.2.2 时钟芯片的选择和说明 (3)2.2.3 显示模块的选择和说明 (5)2.3 最终选择方案 (7)3 系统硬件设计及实现 (7)3.1 单片机外围电路设计 (7)3.2 DS1302与单片机的接口设计 (8)3.3 LCD1602与单片机的接口设计 (8)3.4 按键电路设计 (9)3.5 闹铃电路设计 (9)3.6 电源设计 (10)4 软件设计 (11)4.1 主程序设计 (11)4.2 DS1302子程序的设计 (11)4.4 键盘扫描子程序的设计 (14)4.5 闹钟子程序的设计 (14)5 系统调试 (14)5.1 软件调试 (15)5.2 硬件调试 (15)5.2.1 显示电路调试 (16)5.2.2 DS1302电路调试 (16)5.2.3 按键电路的调试 (16)6 总结 (16)致谢 (18)参考文献 (19)附录 (20)附录一:电路板实物图 (20)附录二:设计总电路图 (22)附录三:仿真图 (23)基于DS1302的多功能实时数字钟控制***班 ***指导教师 ***1 绪论在实时监控系统的设计中,要对各个控制信号进行实时监控,更重要的是在发生事故的情况下准确记录下故障数据,以便准确分析排除错误。

利用单片机及DS1302制作电子时钟_实习报告

利用单片机及DS1302制作电子时钟_实习报告

单片机原理及应用基于Proteus 和Keil C实习报告课程名:利用单片机及DS1302 制作电子时钟摘要为了进一步熟悉51单片机地编程以及学习电子时钟地相关设计方法,在老师地指导下我们进行了本次电子时钟地设计.我们在实习期间基于51单片机一一AT89C51和时钟芯片DS1302设计并实现了电子时钟显示•在PCB 板制作完成并且调试成功之际,为了进一步提高自己地动手能力和编程能力,对这次电子时钟地设计和制作地过程中遇到地问题及设计思路做一次总结•本电子时钟是一种利用时钟芯片DS1302及51单片机来显示时、分、秒和年、月地装置•默认显示为时间,由四个按键分别控制定时设置、时间调整、分钟调整、日期显示;设计电路工作电源为5V ;由4位LED数码管显示时间,格式为时时分分,中间点每隔1S亮暗;有备用电池,掉电后再上电能正常显示时间•电子时钟大体可以分为三大模块,数码管地显示模块、DS1302 时钟芯片与单片机地时钟模块和按键与单片机地模块•单片机在5V 电压下,各个模块正常工作•单片机从DS1302 芯片中读出一组时间日期数据,同时单片机通过按键设置当前要求显示地信息给单片机•单片机接收到各个数据时,把各个数据显示出来•目录一、总体设计•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••31.1设计目地 (3)1.2硬件功能描述 (3)1.3设计方案选择 (3)1.4 设计任务及要求 (3)二、电子时钟软件和硬件设计 (3)2.1硬件电路设计 (3)2.1.1工作原理 (3)2.1.2单元模块电路 (4)2.1.3元器件清单 (5)2.2软件设计 (5)2.2.1 程序设计流程 (5)三、电路调试 (6)四、心得体会 (6)五、参考文献 (6)附录I: (7)附录川: 13附录H:程序清单 (8)一、总体设计此电子时钟利用AT89C51 单片机和时钟芯片DS1302 设计完成.1.1 设计目地1、通过对电子时钟地设计,进一步熟练掌握单片机编程方法及思想.2、通过对电子时钟地设计,掌握实时时钟芯片DS1302 地使用方法.3、通过对电子时钟地设计,进一步掌握独立式键盘地编程控制并认识独立式键盘在实际中地运用.4、通过对电子时钟地设计,增强对单片机地兴趣及动手能力.并在此过程中学会对程序地逐步调试.1.2 硬件功能描述数字钟能够完成24 小时制计时,计时初始化值为00:00:00,用户可以通过按键调整时钟地初值实现校时功能,并且可以通过按键设定一个24 小时以内任意时刻地闹铃,用户可以手动选择闹铃地开或者关两种状态.1.3 设计方案选择计时方案:方案1:采用实时时钟芯片现在市场上有许多实时时钟集成电路,如:DS1287、DS2887、ds1302 等.这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据地更新每秒自动进行一次,不需要程序干预.因此,在工业实时测控系统中多采用这这一类专用芯片来实现实时时钟功能.方案2:是用单片机内地可编程定时器. 利用单片机内部地定时计数器进行中断定时,配合软件延时实现时分秒地计时.该方案节省硬件成本,但程序设计较复杂.I—r 〉,显示方案: 一个良好地显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来.同时显示模块提供了良好地人机交互平台.常用地显示模式有LED 7段数码管显示、点阵显示和液晶显示.液晶显示屏(LCD )具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点.但由于液晶其成本偏高.在使用时,不能有静电干扰,否则易烧坏液晶地显示芯片.鉴于LED 7段数码管成本低,也比较容易实现地特点,最终确定使用共阳极数码管来显示.1.4 设计任务及要求任务:设计一个可调时及日期显示地电子时钟要求: 1、用DS1302 来实现对时间地计算2、用7 段LED 来显示时间3、加独立式键盘来进行调时二、电子时钟软件和硬件设计2.1 硬件电路设计2.1.1 工作原理此电子时钟可显示地时间范围为: 2000年1月1日0点至2100年12月31日23时59分.此时钟在正常计时模式下具有自动调整每月地天数地变化,并用内接电池对时间保持.时间为24 小时至.接通电源对时间进行调整,按定时设置键确定被修改位地值.用时钟芯片记忆当前时间并保持,待下次接通电源无须调整能正确显示当前时间.附录川: 13定时设置:菜单按键,松开按键时有效此按键实现闹铃功能,设定一个时间,此时四位数码管第四位地小数点亮起,表示有闹铃设 置;当闹铃是可按此键结束闹铃 • 时、分调整:加一键,松开按键有效当定时设置键选中要修改地位时,如分(分闪烁时),按此键可以使分地值从当前值开始加一,加至60时变为00 (59过后即显示00,不显示60);而时则在加至 24时变为00 (23过后即 显示0,不显示24);日在加至32时变为00 (即31过后即显示0,不显示32)。

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

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

目 录
课程分析
方案论证
方案实现
电路与程序设计
测试方案与测试结果
致谢
课程分析
此次课程设计,要求利用51单片机和DS1302设计一个实时电子 时钟。 基本要求: 1.在8位数码管上显示准确的北京时间(09-21-06),采用24 小时制; 2.设置按键可以进行时间校准,按键利用51学习板上的矩阵按键 ,结合实际矩阵键盘的分布,为了方便对键值的处理,初步设计 矩阵键盘的各个功能键的分布如下:
方案论证-比较与选择
• 现有的资源是MC51单片机,要实现的是实 时时间的显示,可以采用两种方案, • 一种是软件的方法,利用中断或者软件延 时来实现时间的产生。由于是采用的纯软 件的方法,时间的误差比较大。 • 另一种方案是采用专用的时钟芯片,来精 确的产生时间。然后用单片机控制数码管 来显示产生的时间。 下一页
实时电子时钟
0110907 左学 李婷 周媛
摘 要
这次所做的实时电子时钟的主体部件包括 MCS-51单片机,数码管,按键,蜂鸣器,DS1302芯片。 其中DS1302是美国DALLAS公司推出的一种高性能、低功耗 的实时时钟芯片,工作电压宽2.5~5.5V,简单的三线接口为 单片机节省大量资源; AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS 8 位单片机. 整体思路是 通过对AT89C51单片机写入程序实现对DS1302读写,读写 出正确的时分秒信息,然后数据用LED显示出来。通过键盘扫 描得到的键值进行键值处理可以进行定时、校时功能以及闹钟 功能。 关键字:MCS-51 数码管 按键 DS1302 蜂鸣器
B)软件部分的测试方案主要测试: 语法格式错误、 全局变量及局部变量的混乱使用、 逻辑上的错误 下一页

哈理工荣 单片机课设 基于DS1302的实时时钟显示

哈理工荣 单片机课设  基于DS1302的实时时钟显示

哈尔滨理工大学荣成学院单片机原理课程设计题目:基于DS1302的实时时钟显示班级:姓名:学号:年月号目录一、题目简介二、实现方案三、电路SCH图四、软件流程图五、软件设计源程序六、心得体会七、参考文献一、题目简介本文采用单片机控制系统的基础上综合应用时钟芯片DSI302和Proteus软件。

单片机是一个基本微型计算机,由AT89C52单片机一个芯片通过简单的电路连接,便可组成最小的应用系统,利用集成在单片机内部的接口,实现并行,串行数据传输,定时计数控制,中断等功能,从而完成一定检测控制功能。

希望通过研究与设计了解DS1302芯片的内部结构,工作方式,各引脚功能及I/O接口的使用,用LCD显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表有时、分、秒显示时间的功能,还可以进行时和分的校时,片选的灵活性好。

二、实现方案基于DS1302的电子万年历设计一、系统硬件电路图的设计按照系统设计功能的要求,初步确定设计系统由主控模块,时钟模块,存储模块,键盘接口模块,显示模块和闹铃模块共6个模块组成。

主控芯片使用52系列STC89S52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能,地功耗,带RAM的时钟芯片DS1302作为主要计时芯片,可以做到计时准确。

更重要的是,DS1302可以在很小电流的后备下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。

二、系统核心部分---闪电存储器件STC89C511、STC89C51具有下列主要性能:8KB可编程序Flash存储器全静态工作:0HZ—24MHZ三级程序存储器保密128 X 8 字节内部RAM32条可编程序I/O线2个16位定时器/计数器6个中断源可编程序串行口片内时钟振荡器2、AT89C51的引脚及其功能AT89C51的管脚(1)主要电源引脚(a)VCC电源端(b)GND接地线(2)外接晶体引脚XTAL1和XTAL2(a)XTAL1:在单片机内部,它是构成片内振荡器的反相放大器的输入端。

将DS1302时钟走时更准确的方法

将DS1302时钟走时更准确的方法

将DS1302时钟走时更准确的方法将DS1302时钟走时更准确的方法用DS1302制作电子时钟,由于32678K的晶振误差原因造成时钟走时不准确,大家使用的晶振精度都不高,每天误差都差6到10秒,如果购买高精度的晶振价格又非常高,不如用单片机的计时器编程走时更准确,可以进行误差调整,本人作了几个用DS1302时钟,由于32678K晶振的原因,每天都快6-9秒之间,原来用的方法是每天自动校一次,由于每天的误差不是整数,比如每天快7.6秒,这样每天就得自动校8秒,又造成每天慢0.4秒,每月误差又是12秒,走时还是不准确,本人改成了每差1秒校正一次的方法,原理是:比如每天快7.6秒,24*60/7.6=189,也就是189分钟快1秒,每189分钟就自动校一次时钟,这样校时理论上每年的误差最大不到6秒,本人的时钟4个月误差不到1秒,属于相当准确喽,现在提供给大家分享。

设计原理是:由于程序的大小和原理不同,每分钟读取DS1302的次数也不同,这样先设置二个变量,一个是分钟比较变量,用于判断分钟不等相等时计数器变量加1,另一个是校时计数变量,用于校时时间计数,当计数器变量等于189时,DS1302自动修正一次,程序如下:变量设置BJBL DATA 20H ;分钟比较变量,用于判断分钟不等相等时计数器加1JSBL DATA 21H ;校时计数变量,用于校时时间计数MOV BJBL,#00HMOV JSBL,#00H自动校时子程序AUTOXS:MOV A,MINCJNE A,BJBL,AS1JMP AS2AS1: MOV BJBL,AMOV A,JSBLINC AMOV JSBL,AAS2: MOV A,JSBLCJNE A,#0D3H,AS5MOV A,SECCJNE A,#01H,AS5 ;秒等于1时校回到0秒MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITE ;调用写DS1302程序MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作 LCALL WRITE ;调用写DS1302程序MOV R1,#8EH ;写保护寄存器 MOV R0,#80H ;禁止写入LCALL WRITE ;调用写DS1302程序MOV JSBL,#00HAS5: RET将此子程序在每次读取DS1302时调用。

实验24 DS1302实时时钟实验

实验24 DS1302实时时钟实验

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

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

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

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

2.1 引脚功能及结构DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。

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

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

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

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

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

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

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

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST 必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向),后面有详细说明。

SCLK始终是输入端。

相关原理:程序运行照片:接线方法:1、按键接到P1口下半部分。

用一条4PIN数据排线,把按键部份的JP37,接到CPU部份的P1口JP44的p1.4—p1.7.2、接8位数码管的数据线。

用ds1302制作一个精密的电子时钟

用ds1302制作一个精密的电子时钟

用ds1302制作一个精密的电子时钟感想:我看视频的时候讲的是DS12CR887这块芯片,两块毕竟是不一样的,所以,我只是看了他讲怎样看时序,之后的就没再看了。

我就拿着自己下载打印的DS1302数据手册,研习,研习,再研习。

还查了书上的,网上的,源程序。

但是,你别指望着谁会把所有的东西都给你写上去。

只能作为参考。

后来,我终于写出了一个程序,可是一编译,就漏洞百出。

最主要的有两点:for循环和BCD码。

不过还好,都得到了很好的解决。

解决方案:#include#include#define uchar unsigned char#define uint unsigned intuchar data table[]="2009-01-01 Mon.";uchar data table1[]=" 00:00:00";uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";uchar num;uchar hour,min,sec,week,day,month,year;sbit ds1302_sclk=P1^4;sbit ds1302_io=P1^5;sbit ds1302_ce=P2^2;sbit acc0=ACC^0;sbit acc7=ACC^7;sbit lcdrs=P1^7; //端口定义sbit lcdrw=P1^6;sbit lcde=P2^4;sbit le=P3^ 6;sbit led en=P2^5;sbit dkle=P3^7;void delay(uint a);void write_byte(uchar dat) //写入一个字节{uchar i;ACC=dat;for(i=8;i>0;i--){ds1302_io=acc0;ds1302_sclk=1;ds1302_sclk=0;ACC=ACC>>1;}}uchar read_byte() //读出一个字节{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;acc7=ds1302_io;ds1302_sclk=1;ds1302_sclk=0;}return(ACC);}void s_write(uchar add,uchar dat)//单字节写入子函数{ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);write_byte(dat);ds1302_sclk=1;ds1302_ce=0;}uchar s_read(uchar add) //单字节读出子函数{uchar temp;ds1302_ce=0;ds1302_sclk=0;ds1302_ce=1;write_byte(add);temp=read_byte();ds1302_sclk=1;ds1302_ce=0;temp=(temp/0x0a)*10+temp%0x0a;return(temp);}void set_ds1302(uchar *pClock) //设置ds1302的时间{uchar i;uchar add=0x80;EA=0;s_write(0x8e,0x00);for(i=7;i>0;i--){s_write(add,*pClock);pClock++;add+=2;}s_write(0x8e,0x80);EA=1;}void read_ds1302(uchar Curtime[]) //读取ds1302的时间{uchar i;uchar add=0x81;EA=0;for(i=7;i>0;i--){Curtime[i]=s_read(add);add+=2;}EA=1;}void write_com(uchar com) //写命令子函数{lcde=0;lcdrw=0;lcdrs=0;delay(1);lcde=1;delay(1);P0=com;delay(1);lcde=0;}void write_data(uchar dat) //写数据子函数{lcde=0;lcdrw=0;lcdrs=1;delay(1);lcde=1;delay(1);P0=dat;delay(1);lcde=0;}void init(){month=1;day=1;year=9;lcde=0; //LCD1602初始化le=0;leden=0;write_com(0x38);delay(100);write_com(0x38);delay(50);write_com(0x38);delay(10);write_com(0x08);write_com(0x01);write_com(0x0c);write_com(0x80);for(num=0;num<15;num++) //在第一行显示“ 2000-00-00 Mon.”{write_data(table[num]);}write_com(0x80+0x40);for(num=0;num<10;num++) //在第二行末尾显示“00:00:00”{write_data(table1[num]);}}void write_time(uchar add,uchar dat) //写入时间子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_riqi(uchar add,uchar dat) //写入日期子函数{uchar shi,ge;shi=dat/16;ge=dat%16;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void write_xingqi(uchar dat) //写入星期子函数{write_com(0x80+0x0b);switch(dat){case 1: for(num=0;num<4;num++){write_data(xingqi[num]);};break;case 2: for(num=5;num<9;num++){write_data(xingqi[num]);};break;case 3: for(num=10;num<14;num++){write_data(xingqi[num]);};break;case 4: for(num=15;num<19;num++){write_data(xingqi[num]);};break;case 5: for(num=20;num<24;num++){write_data(xingqi[num]);};break;case 6: for(num=25;num<29;num++){write_data(xingqi[num]);};break;case 7: for(num=30;num<34;num++){write_data(xingqi[num]);};break;}}void main(){init();delay(5);s_write(0x8e,0x00); //控制写入WP=0 s_write(0x90,0xa5);s_write(0x80,0x00); //秒s_write(0x82,0x20); //分s_write(0x84,0x09); //时24时制s_write(0x86,0x27); //日s_write(0x88,0x08); //月s_write(0x8a,0x04); //星期s_write(0x8c,0x09); //年 */s_write(0x8e,0x80);//控制写入WP=1;P0=0xff;while(1){sec=s_read(0x81);write_time(8,sec);write_com(0x80+0x40+9);min=s_read(0x83);write_time(5,min);write_com(0x80+0x40+6);hour=s_read(0x85);write_time(2,hour);write_com(0x80+0x40+3); week=s_read(0x8b);write_xingqi(week);write_com(0x80+0x0d);day=s_read(0x87);write_riqi(8,day);write_com(0x80+9);month=s_read(0x89);write_riqi(5,month);write_com(0x80+6);year=s_read(0x8d);write_riqi(2,year);write_com(0x80+3);}}void delay(uint a) { //延时子函数uint i,j;for(j=a;j>0;j--)for(i=250;i>0;i--) ;}。

1302 时钟芯片实验

1302 时钟芯片实验

实验九 DS1302+LM1602日历/时钟显示实验20122593 李九生实验目的:掌握单片机控制系统的实时时钟/日历电路的使用方法,由于DS1302与单片机连接时采用SPI接口,故该实验可以使我们了解和学习SPI的通讯协议和编程方法。

实验原理:DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。

数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。

时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。

实验内容:将DS1302和LM1602芯片,分别和单片机的并口连接。

在DS1302上设置初始时间为2014年5月29号星期4 /10点10分10秒,并能正确的在LM1602上显示出来。

#include<reg52.h>#include<intrins.h>#include<string.h>#define uint unsigned int#define uchar unsigned char//*******LCD*******sbit LCDRS=P2^0; //LCD数据/命令选择端sbit LCDRW=P2^1;sbit LCDEN=P2^2; //LCD使能新号端//******DS1302******sbit IO=P1^0; //1302数据线sbit SCLK=P1^1; //1302时钟线sbit RST=P1^2; //复位uint num=0;uchar table[]="2014-05-29 wen ";uchar table1[]="10:10:10";uchar Date[]={"Date: 2000-00-00 "};uchar Time[]={"Time: *00:00-00* "};uchar date_time[7]; //从ds1302读取的当前日期时间//=======延时=======void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********向1302写数据*********void write_ds1302(uchar dat){uchar i;for(i=0;i<8;i++){IO=dat & 0x01; //保持最后一位为1,读状态SCLK=1;delay(1);SCLK=0;dat >>= 1;}}//*********从1302读数据*********uchar read_ds1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);SCLK=1;delay(1);SCLK=0;}return b/16*10+b%16; //与BCD码转换}//*********从指定位置读数据********uchar read_data(uchar addr){uchar dat;RST=0;SCLK=0;RST=1;write_ds1302(addr);dat=read_ds1302();SCLK=1;RST=0;return dat;}//*********读取当前日期时间*********void read_date_time(){uchar i,addr=0x81;for(i=0;i<7;i++){date_time[i]=read_data(addr);addr+=2;}}//----------LCD写指令----------void lcd_write_com(uchar com){LCDRS=0; //RS为0时,写指令,RS为1时,写数据P0=com;delay(5);LCDEN=1;delay(5);LCDEN=0;}//----------LCD写数据----------void lcd_write_data(uchar dat){LCDRS=1;P0=dat;delay(5);LCDEN=1;delay(5);LCDEN=0;}//-------LCD初始化-------void lcd_init(){LCDEN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1 lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------void set_lcd_pos(uchar p){lcd_write_com(p | 0x80);}//---------液晶显示程序----------void lcd_print(uchar p,uchar *s){set_lcd_pos(p);for(num=0;num<16;num++){lcd_write_data(s[num]);delay(10);}}//----------日期时间转换-----------void format_datetime(uchar d,uchar *p){p[0]=d/10+'0';p[1]=d%10+'0';}//---------主程序----------void main(){uint k;LCDRW=0;lcd_init();lcd_init();lcd_write_com(0x80);for(k=0;k<16;k++)lcd_write_data(table[k]);lcd_write_com(0xc0);for(k=0;k<16;k++)lcd_write_data(table1[k]);delay(500);while(1){read_date_time();format_datetime(date_time[6],Date+8); //年月日format_datetime(date_time[4],Date+11);format_datetime(date_time[3],Date+14);// strcpy(Date+13,week[date_time[5]]);format_datetime(date_time[2],Time+7); //时间转换format_datetime(date_time[1],Time+10);format_datetime(date_time[0],Time+13);lcd_print(0x00,Date);lcd_print(0x40,Time);}}。

电气自动化技术专业《实验13-- DS1302时钟-实验指导书》

电气自动化技术专业《实验13-- DS1302时钟-实验指导书》

实验十三 DS1302时钟实验
一、实验概述
使用DS1302计算时间,并用LCD1602显示出来。

二、实验目的
掌熟悉单片机小系统综合设计方法;握单片机扩展实时时钟芯片DS1302的工作原理。

三、实验预习要求
本实验主要用到的知识点是:DS1302的工作原理、字符型LCD的显示原理。

四、实验原理
图:DS1302
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为~。

采用三线接口与C
视频
ainvoid
{
LCD_initial;
set1302cloc;
while1
{
get1302time;
display;
}
}
五、作业
请简述电路中的晶振的作用。

答:DS1302 电路的一个重点就是晶振电路,它所使用的晶振是一个的晶振,晶振外部也不需要额外添加其它的电容或
者电阻了。

时钟的精度,首先取决于晶振的精度以及晶振的引脚负载电容。

如果晶振不准或者负载电容过大或过小,都会导致时钟误差过大。

六、实验思考题
比拟外部时钟芯片和定时器产生时钟的优劣。

微机实验 实时时钟

微机实验 实时时钟

实验三串行口实时时钟实验实验目的1、了解实时时钟电路工作原理2、了解串行时钟芯片的控制方法3、掌握DS1302串行时钟芯片的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、DS1302串行时钟芯片工作原理DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。

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

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

DS1302增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

引脚图如图4-77所示。

图4-77 DS1302引脚图DS1302的控制字最高位必须为1;D6位:1:读写内部通用存储器,0:读写时钟存储器;随后是地址位。

最低位是读写控制:1代表读,0:代表写。

DS1302内部日历数据存储器位定义如图4-78所示。

图4-78 DS1302内部日历数据存储器结构图CH:时钟停止位(CH=0振荡器工作允许,CH=1振荡器停止)寄存器2的第7位:12/24小时标志(bit7=1,12小时模式,bit7=0,24小时模式)寄存器2的第5位:AM/PM定义(AP=1下午模式,AP=0上午模式)WP:写保护位(WP=0 寄存器数据能够写入,WP=1寄存器数据不能写入)TCS:涓流充电选择(TCS=1010使能涓流充电,TCS=其它禁止涓流充电)DS:二极管选择位(DS=01一个二极管,DS=10两个,DS=00或11,充电功能也被禁止)图4-79 DS1302内部充电电路结构图从图中可以看出,第1脚电源经过开关、二极管、电阻对接在第8脚的备用电源进行充电。

调整涓流充电控制寄存器的值可以控制涓流充电方式。

2、DS1302芯片读写时序DS1302采用三线串行口通迅,占用IO口少。

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

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

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

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

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

2.1 引脚功能及结构DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。

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

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

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

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

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

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

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

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc≥2.5V之前,RST 必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向),后面有详细说明。

SCLK始终是输入端。

相关原理:接线方法:1、按键接到P1口下半部分。

用一条4PIN数据排线,把按键部份的JP37,接到CPU部份的P1口JP44的p1.4—p1.7.2、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.3、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.4、用1条1PIN线把喇叭部分的JP16接单片机P3.35、用1条1PIN线把继电器部分的JP18接单片机P3.56、用一条4PIN数据排线,把DS1302部份的JP83,接到CPU部份的P1口JP44的p1.0—p1.3汇编语言参考程序:;8位数码管显示;P0 为段码口、P2 为位码口;时钟芯片:DS1302;接线方法:;八位数码管用两条8pin排线分别连p0,p2口;24c02 用一条2pin线连接P3.6, P3.7;喇叭用一条1pin线连接P3.3;端口按键JP37用一条4PIN线连接P1.4,1.5,1.6,1.7 ;DS1302的JP83用一条4PIN线连接P1.0,1.1,1.2,1.3;************** DS1302 端口位定义 ************** IO_DATA BIT P1.1 ; 数据传送总线SCLK BIT P1.0 ; 时钟控制总线RST BIT P1.2 ; 复位总线K1 EQU P1.4 ;独立键K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.3 ;蜂鸣器RELAY EQU P3.5 ;继电器T_CONU EQU 22H ;中断计数TIME_L EQU 23H ;定时初值TIME_H EQU 24HTIME_DATA EQU 50H ;显示时间单元首地址DATE_DATA EQU 60H ;显示日期单元首地址DS_DATA EQU 58H ;显示定时时间单元首地址;------------------------------------------------ ORG 0000HAJMP MAINORG 000BHAJMP INT_T0ORG 0080H;------------------------------------------------ MAIN:MOV TMOD,#01H ;T0,方式1MOV TIME_L,#00H ;50MS定时值MOV TIME_H,#4CHMOV T_CONU,#00H ;中断次数MOV IE,#82H ;EA=1,ET0=1MOV A,#00HMOV R0,#40H ;从40H单元开始MOV R1,#40H ;清64个单元M_CLEAR: MOV @R0,AINC R0DJNZ R1,M_CLEARMOV 7FH,#0AH ;送熄灭符SETB BEEPLCALL TIME_DELAY ;调显示延时LCALL PROSET ;DS1302初始化MAIN1:LCALL GET_TIME ;从DS1302读数据程序LCALL CHULI ;实时时间数据处理MOV R0,#TIME_DATA ;显示时、分、秒LCALL DISPMOV R0,#TIME_DATALCALL TIME_DISPLAYLCALL SET_KEY ;键功能程序LCALL COMP ;实时时间与定时时间比较JB K1,MAIN1CALL BEEP_BLMAIN2:LCALL CHULI ;日期数据处理MOV R0,#DATE_DATALCALL DISP ;显示年、月、日MOV R0,#DATE_DATALCALL TIME_DISPLAYJB K1,MAIN2CALL BEEP_BLMAIN3:LCALL DS_CHULI ;定时时间数据处理MOV R0,#DS_DATALCALL DS_SP ;显示定时时间MOV R0,#DS_DATALCALL DS_DISPLAYJB K1,MAIN3CALL BEEP_BLAJMP MAIN1;--------------------------------------------;中断服务子程序;300MS对闪动标记取反一次;-------------------------------------------- INT_T0:PUSH ACCPUSH PSWMOV TL0,TIME_LMOV TH0,TIME_HINC T_CONUMOV A,T_CONUCJNE A,#06H,INT_ENDMOV T_CONU,#00HCPL 0AHINT_END:POP PSWPOP ACCRETI;-------------------------------------------- ;DS1302 初始化子程序; (R0)=数据 (R1)=地址;-------------------------------------------- PROSET:CLR RST ;DS1302复位CLR SCLKNOPNOPSETB RST;MOV R1,#80H ;写秒寄存器;MOV R0,#00H ;启动振荡器;LCALL WRITE;MOV R1,#82H ;写分寄存器;MOV R0,#58H;LCALL WRITE;MOV R1,#84H ;写时寄存器;MOV R0,#80H;LCALL WRITEMOV R1,#90H ;写充电寄存器MOV R0,#0ABHLCALL WRITERET;=============================================== ;读时间、日期数据子程序;存放单元 40H - 46H;=============================================== GET_TIME:MOV R1,#81H ;读秒LCALL READMOV 40H,R0MOV R1,#83H ;读分LCALL READMOV 41H,R0MOV R1,#85H ;读时LCALL READMOV 42H,R0MOV R1,#87H ;读出日期LCALL READMOV 43H,R0MOV R1,#89H ;读出月份LCALL READMOV 44H,R0MOV R1,#8BH ;读出星期LCALL READMOV 46H,R0MOV R1,#8DH ;读出年LCALL READMOV 45H,R0RET;================================================ ;写 DS1302 子程序;================================================ WRITE:CLR SCLKNOPNOPSETB RSTNOPMOV A,R1MOV R2,#08HWRI_01:RRC A ;传输地址到DS1302 NOPNOPCLR SCLKNOPNOPMOV IO_DATA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_01CLR SCLKNOPNOPMOV A,R0MOV R2,#08HWRI_02:RRC A ;传输数据到DS1302 NOPCLR SCLKNOPNOPMOV IO_DATA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_02CLR SCLKNOPNOPCLR RSTNOPNOPRET;================================================= ;读 DS1302 子程序;================================================= READ:CLR SCLKNOPNOPSETB RSTNOPNOPMOV A,R1MOV R2,#08HREAD_01:RRC ANOP ;先传输地址到DS1302MOV IO_DATA,CNOPNOPSETB SCLKNOPNOPCLR SCLKNOPNOPDJNZ R2,READ_01NOPNOPSETB IO_DATACLR ACLR CMOV R2,#08HREAD_02:CLR SCLKNOPNOPMOV C,IO_DATANOPNOPRRC A ;再从DS1302接收数据NOPNOPSETB SCLKNOPNOPDJNZ R2,READ_02MOV R0,ARET;============================================== ;实时时间、日期数据处理子程序;============================================== CHULI:MOV A,40H ;处理秒数据ANL A,#0FHMOV 50H,AMOV 70H,AMOV A,40HANL A,#11110000BSWAP AMOV 51H,AMOV 71H,A;--------------------------------------------- MOV A,41H ;处理分数据ANL A,#0FHMOV 52H,AMOV 72H,AMOV A,41HANL A,#11110000BSWAP AMOV 53H,AMOV 73H,A;--------------------------------------------- MOV A,42H ;处理时数据ANL A,#0FHMOV 54H,AMOV A,42HANL A,#11110000BSWAP AMOV 55H,AMOV 75H,A;---------------------------------------------- MOV A,43H ;处理日数据ANL A,#0FHMOV 60H,AMOV 76H,AMOV A,43HANL A,#11110000BSWAP AMOV 61H,AMOV 77H,A;--------------------------------------------- MOV A,44H ;处理月数据ANL A,#0FHMOV 62H,AMOV 78H,AMOV A,44HANL A,#11110000BSWAP AMOV 63H,AMOV 79H,A;--------------------------------------------- MOV A,45H ;处理年数据ANL A,#0FHMOV 7AH,AMOV A,45HANL A,#11110000BSWAP AMOV 65H,AMOV 7BH,A;----------------------------------------------MOV A,46H ;处理周数据MOV 66H,AMOV 7CH,ARET;=============================================;实时时间、日期查表取数子程序;============================================= DISP: ;MOV R0,#TIME_DATAMOV R3,#06HDISP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DISP1RET;==================================================== ;时间、日期显示子程序;==================================================== TIME_DISPLAY:;MOV R0,#TIME_DATA ;取得显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#08H ;共8个数码管DISLP: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DISLP1 ;第三位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP1: JB ACC.2,DISLP2 ;第六位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP2: INC R0DISLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAY ;为了保证数码管亮度,延时DJNZ R2,DISLP ;重复显示,直到全部数据刷新过RET ;返回DELAY:MOV R4,#0AHL15: MOV R5,#64HL16: DJNZ R5,L16DJNZ R4,L15RET;****************************************************** SET_KEY:SETB K1 ;增加键SETB K2 ;减少键SETB K3 ;选择键SETB K4 ;定时设定功能键NOPJB K4,KEY01LCALL BEEP_BLJMP DS_KEY ;进入定时值设定子程序KEY01: JB K2,KEY02LCALL BEEP_BLJMP SET_TIME ;进入时间设定子程序KEY02: JB K3,KEY03LCALL BEEP_BLCPL 20H.0 ;止闹标记取反KEY03: RET;----------------------------------------------------- DS_KEY:CALL DS_DELAYJNB K4,$LCALL DSSETCALL DS_DELAYRET;==============================================;实时时间设定子程序;K1为加键、K2为减键、K3为选择键;==============================================SET_TIME:MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITEMOV R1,#80H ;写秒寄存器MOV R0,#80H ;停止振荡器工作LCALL WRITESETB TR0K001: CALL TIME_DELAY ;校时JNB K3,K001 ;K3为位移键K010:CALL CHULIJNB 0AH,KH01MOV 54H,7FH ;送入熄灭符MOV 55H,7FHJMP KH02KH01: MOV 54H,74H ;送实时值MOV 55H,75H ;送实时值KH02: MOV R0,#TIME_DATA CALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K011AJNB K2,K011BJNB K3,K002JMP K010K011A:MOV A,42HADD A,#01HDA AMOV 42H,AXRL A,#24HJNZ K012AMOV 42H,#00HK012A: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010K011B:MOV A,42HXRL A,#00HJZ K012BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,42H ;加被减数DA A ;十进制调整MOV 42H,A ;XRL A,#00HJNZ K012CK012B: MOV 42H,#23HK012C: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAY;------------------------------------------------- K002: CALL TIME_DELAY ;校分JNB K3,K002 ;K3为位移键K020: CALL CHULIJNB 0AH,KM01MOV 52H,7FH ;送入熄灭符MOV 53H,7FHJMP KM02KM01: MOV 52H,72H ;送实时值MOV 53H,73H ;送实时值KM02: MOV R0,#TIME_DATACALL DISPMOV R0,#TIME_DATACALL TIME_DISPLAYJNB K1,K021AJNB K2,K021BJNB K3,K003JMP K020K021A:MOV A,41HADD A,#01HDA AMOV 41H,AJNZ K022AMOV 41H,#00HK022A: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;--------------------------------------------------- K021B:MOV A,41HXRL A,#00HJZ K022BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,41H ;加被减数DA A ;十进制调整MOV 41H,A ;XRL A,#00HJNZ K022CK022B: MOV 41H,#59HK022C: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K003: CALL DATE_DELAY ;校日JNB K3,K003 ;K3为位移键K030: CALL CHULIJNB 0AH,KR01MOV 60H,7FH ;送入熄灭符MOV 61H,7FHJMP KR02KR01: MOV 60H,76H ;送实时值MOV 61H,77H ;送实时值KR02: MOV R0,#DATE_DATACALL DISPMOV R0,#DATE_DATACALL TIME_DISPLAYJNB K1,K031AJNB K2,K031BJNB K3,K004JMP K030K031A:MOV A,43HADD A,#01HDA AMOV 43H,AXRL A,#32HJNZ K032AMOV 43H,#00HK032A: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DATE_DELAYJMP K030K031B:MOV A,43HXRL A,#00HJZ K032BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,43H ;加被减数DA A ;十进制调整MOV 43H,AXRL A,#00HJNZ K032CK032B: MOV 43H,#31HK032C: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DATE_DELAYJMP K030;------------------------------------------------ K004: CALL DATE_DELAY ;校月JNB K3,K004 ;K3为位移键K040: CALL CHULIJNB 0AH,KC01MOV 62H,7FH ;送入熄灭符MOV 63H,7FHJMP KC02KC01: MOV 62H,78H ;送实时值MOV 63H,79H ;送实时值KC02: MOV R0,#DATE_DATACALL DISPMOV R0,#DATE_DATACALL TIME_DISPLAYJNB K1,K041AJNB K2,K041BJNB K3,K005JMP K040K041A:MOV A,44HADD A,#01HDA AMOV 44H,AXRL A,#13HJNZ K042AMOV 44H,#00HK042A: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DATE_DELAYJMP K040K041B:MOV A,44HXRL A,#00HJZ K042BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,44H ;加被减数DA A ;十进制调整MOV 44H,A ;XRL A,#00HJNZ K042CK042B: MOV 44H,#12HK042C: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DATE_DELAYJMP K040;----------------------------------------------- K005: CALL DATE_DELAY ;校年JNB K3,K005 ;K3为位移键K050: CALL CHULIJNB 0AH,KY01MOV 64H,7FH ;送入熄灭符MOV 65H,7FHKY01: MOV 64H,7AH ;送实时值MOV 65H,7BH ;送实时值KY02: MOV R0,#DATE_DATACALL DISPMOV R0,#DATE_DATACALL TIME_DISPLAYJNB K1,K051AJNB K2,K051BJNB K3,K008JMP K050K051A:MOV A,45HADD A,#01HDA AMOV 45H,AXRL A,#9AHJNZ K052AMOV 45H,#00HK052A: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DATE_DELAYJMP K050K051B:MOV A,45HXRL A,#00HSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,45H ;加被减数DA A ;十进制调整MOV 45H,A ;XRL A,#00HJNZ K052CK052B: MOV 45H,#99HK052C: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DATE_DELAYJMP K050;------------------------------------------------- K008: JNB K3,K008MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作LCALL WRITEMOV R1,#8EH ;写保护寄存器MOV R0,#80H ;禁止写入LCALL WRITECALL DATE_DELAYCLR 0AHCLR TR0CALL BEEP_BLRET;=================================================== ;定时时间设定子程序;K1为加键、K2为减键、K3为选择键;=================================================== DSSET:SETB TR0DS01: LCALL DS_DELAY ;定时分设定JNB K4,$DS010: CALL DS_CHULIJNB 0AH,DS01_1MOV 58H,7FH ;送入熄灭符MOV 59H,7FHJMP DS01_2DS01_1: MOV 58H,70H ;送实时值MOV 59H,71H ;送实时值DS01_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS01A ;加键JNB K2,DS01B ;减键JNB K3,DS02JMP DS010DS01A: ;加MOV A,48HADD A,#01HDA AMOV 48H,AXRL A,#60HJNZ DS011MOV 48H,#00HDS011: LCALL DS_DELAYJMP DS010DS01B: MOV A,48H ;判48H是否为0XRL A,#00HJZ DS012SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,48H ;加被减数DA A ;十进制调整MOV 48H,A ;XRL A,#00HJNZ DS013DS012: MOV 48H,#59HDS013: CALL DS_DELAYJMP DS010;---------------------------------------------- DS02: LCALL DS_DELAY ;定时时设定JNB K3,$DS020:CALL DS_CHULIJNB 0AH,DS02_1MOV 5AH,7FH ;送入熄灭符MOV 5BH,7FHJMP DS02_2DS02_1: MOV 5AH,72H ;送实时值MOV 5BH,73H ;送实时值DS02_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS02AJNB K2,DS02BJNB K3,DS03JMP DS020DS02A: MOV A,49H ;加ADD A,#01HDA AMOV 49H,AXRL A,#24HJNZ DS021MOV 49H,#00HDS021: LCALL DS_DELAYJMP DS020DS02B: MOV A,49H ;判49H是否为0XRL A,#00HJZ DS022SETB C ;减CLR A ;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,49H ;加被减数DA A ;十进制调整MOV 49H,A ;XRL A,#00HJNZ DS023DS022: MOV 49H,#23HDS023: CALL DS_DELAYJMP DS020;------------------------------------------- DS03: CALL DS_DELAYJNB K3,$DS030: CALL DS_CHULIJNB 0AH,DS03_1MOV 5CH,7FH ;送入熄灭符JMP DS03_2DS03_1: MOV 5CH,74H ;送实时值DS03_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K3,DS04JNB K1,DS03AJMP DS030DS03A: CPL 20H.1 ;报警标记取反JNB 20H.1,DS031MOV 4AH,#01H ;报警标记=1,允许报警AJMP DS032DS031: MOV 4AH,#00H ;报警标记=0,禁止报警DS032: LCALL DS_DELAYJMP DS030;-------------------------------------------- DS04: CLR TR0CLR 0AHCALL BEEP_BLLCALL DS_DELAYRET;============================================= ;定时时间数据处理子程序;============================================= DS_CHULI:MOV A,48H ;处理分数据ANL A,#0FHMOV 58H,AMOV 70H,AMOV A,48HANL A,#0F0HSWAP AMOV 59H,AMOV 71H,AMOV A,49H ;处理时数据ANL A,#0FHMOV 5AH,AMOV 72H,AMOV A,49HANL A,#0F0HSWAP AMOV 5BH,AMOV 73H,AMOV A,4AH ;处理定时标记ANL A,#01HMOV 5CH,AMOV 74H,ARET;================================================== ;定时时间查表取数子程序;================================================== DS_SP: ;MOV R0,#58HMOV R3,#05HDS_SP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DS_SP1RET;==================================================;定时时间显示子程序;================================================== DS_DISPLAY:;MOV R0,#58H ;取得设定显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#07H ;共7个数码管DSPLAY: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A ;数码显示JB ACC.5,DSLP1 ;第三位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP1: JB ACC.2,DSLP2 ;第六位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP2: INC R0DSLP3: MOV A,R1 ;为下一个数准备RR A ;下一个单元MOV R1,A ;保存LCALL DELAYDJNZ R2,DSPLAY ;重复显示,直到全部数据刷新过RET ;返回;==================================================== ;实时时间与设定时间比较子程序;20H.0 止闹标记,=0,允许,=1,禁止。

相关文档
最新文档