基于单片机的多功能万年历设计.docx
分摘要随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆 续出现在我们的生活当中。日历是人们不可或缺的日常用品。但一般日历都为纸制用品, 使用不便,寿命不长。电子万年历是一种非常广泛的日常计时工具,它采用智能电子控制 和显示技术,改善了纸制日历的缺陷。它可以对年、月、日、星期、时、分、秒进行计时, 还具有闰年补偿等多种功能。本设计采用 STC89C52 单片机为核心,构成单片机控制电路,用 DS1302 时钟芯片计时, 完成时间的自动调整和掉电保护,DS18B20 检测温度,再经过单片机处理后把时间和温度信号通过 MAX7219 和 74HC573 驱动 20 位共阴极数码管显示。日历能显示阳历和阴历年、月、日以及星期、时、分、秒、温度。该万年历设有四个按键:S1、S2、S3、S4 键,可以实现日期调整,闹钟功能,秒表功能。关键词:多功能万年历 单片机 DS1302 DS18B20 数码管-IVABSTRACTWith the rapid development of world economy and the forthcoming of information era, many kinds of mini-type intelligent domestic electric appliances appear in our life one after arenecessary daily goods in peoples life. But they are generally paper goods with inconvand short calendar is a very wide range of daily timing tool,it adopts the technology of intelligent electronic control and display, and then improves the deficiency of paper can be years, month, day, week, hour, minutes and seconds for time, but also has a leap year compensation and other functions.The design adopts the core of AT89S52 single chip microcomputer, which constitutes controlling circuit,and integrates DS1302 clock chip, which achieve self-adjusting of time and no power temperature detection, and then through the single-chip processing time and temperature signal and use 20 common cathode led that driven by MAX7219 and 74HC573 to calendar can display solar and lunar year, month, day, week, hour, minute, second. The calendar has four buttons: S1, S2, S3, S4, can achieve the date of adjustment, alarm function, stopwatch function.Keywords: Multi function calendar MCU DS1302 DS18B20 LED目录1 引言02 系统方案选择2控制模块2时钟模块2显示模块3温度检测模块3最终方案选择43 系统硬件电路的设计5系统核心部分STC89C52 主控模块5STC89C52 单片机特性5STC89C52 单片机引脚及功能6STC89C52 单片机最小系统设计7时钟模块9温度检测模块10键盘模块11显示模块11扬声器模块144 系统软件的设计15系统初始化15开机显示函数16DS18B20 温度检测函数16DS18B20 的初始化16附录181 引言随着科技的不断进步与发展,越来越多的电子类产品变得人性化与智能化,在这种大的变化趋势下,钟表类产品当然不会示弱。本次设计的多功能万年历即为生活中随处可见的产品,不管是什么时候,时间总是很重要的,一个好的时钟类产品就是可以让人们一目了然地接受到时间的信息。而随着时代的发展,时钟类产品也从最先的机械式钟表发展出了电子类钟表,让人们的生活变的更加的便捷。本次设计的多功能万年历,以STC89C52 单片机为核心,加上 DS1302 时钟芯片和DS18B20 温度传感器,可以实现对阳历年月日星期,时间以及阴历月日和温度的显示。另外,通过本设计的 4 个按键还可以实现对时间的调整,还可以实现秒表和倒计时功能,以及闹钟功能。本次设计的结构简单,计时准确,可以广泛的应用于家庭以及社会上一些需要时钟显示的场所。而且还可以被用于学校学生的兴趣设计,增强学生的动手能力,因此, 本设计具有相当重要的现实意义和实用价值。系统概述多功能万年历是一种利用数字电路计算并显示时间等数据的设备,和机械式钟表相 比,其显示更直观,计时更精确,且由于没有机械齿轮等磨损性器件,所以具有更长的使用寿命。而且万年历除了可以显示时间外还可以显示年月日星期等信息,如果加入外围器件,还可以显示温度湿度信息等等。本设计是以单片机为核心加上一些外围器件构成,其中单片机选用的是STC89C52,而时钟芯片选用了 DS1302,另外加上温度传感器 DS18B20感知温度,通过程序处理后,由MAX7219和74HC573驱动20个共阴极数码管显示阳历和阴历,时间,还有温度。在本设计中共设置了四个按键,还有一个蜂鸣器模块,可以通过这四个按键实现对日历时钟信息的调整以及闹钟功能和秒表功能。同时,由于DS1302可以设置备用电池,所以可以很好的形成掉电保护,这样等再次上电后,时间就是此刻,而不用再去校时。本次设计所用功能均通过软件控制实现,电路通过5V供电,直接用手机充电器即可实现稳定工作。本设计的系统框图如图所示,设计简单,时间准确,可以广泛的应用于各种需要时钟显示的场所。-0显示电路蜂鸣器电路电源电路单片机控制电路软件控制DS1302 时钟电路温度检测电路操控电路图 系统框图-52 系统方案选择由于现在市面上已经有很多电子万年历产品,且分有很多种类,它们的性能和价格都不尽相同,所以电子万年历应该如何设计才能具有竞争性就尤其重要。正确的方案选择可以使开发的难度大幅降低,这样就可以使开发周期缩短,并降低成本,使产品性能更好, 功能接地气,价格更亲民,因而使人们更容易选择这款产品,使它能更快的推向市场。根据本设计最终要实现的功能,可将本系统分为控制模块,时钟模块,显示模块及温度检测模块等。为了能较好的实现各个模块的功能,我分别考虑了以下几种方案,并通过比较分析,从中选择了性价比较高的方案。控制模块方案 1:采用 STC89C52 单片机作为系统控制芯片STC89C52单片机是STC公司生产的一种低功耗、高性能的CMOS 8位微控制器,其使用了经典的MSC-51内核,但由于做了很多的改进所以使得芯片具备了传统51单片机并不具备的功能。由于STC89C52单片机功耗低,体积较小,技术成熟,成本低,抗干扰性能好,且软件编程灵活,可利用软件编程实现各种算法和逻辑控制,在各个领域应用广泛。方案 2:采用 MSP430F169 单片机作为系统控制芯片MSP430系列单片机是美国德州仪器公司推出的一种 16位超低功耗、具有精简指令集(RISC)的混合信号处理器(Mixed Signal Processor)。MSP430系列单片机可以实现各种复杂的逻辑功能,它将许多功能不同的外设都集成在一块芯片上,模块多,密度高,体积小,提升了稳定性,降低了功耗,适合用于各种需要电池供电的便携式设备中。其中, MSP430F169更是具备了多种工作模式,多个串行接口,硬件乘法器,AD转换等等功能。总体而言,MSP430F169功能更强大,速度更快,与STC89C52对比来说,这些都是优势。但是,MSP430F169作为混合信号处理器,针对本次设计,许多功能未必有用,而且本次设计对处理速度的要求也不是很高,STC89C52同样可以胜任,从成本和方便调试的角度考虑, 本次设计选择方案1。时钟模块方案 1:采用 STC89C52 单片机计时利用单片机的一个 16 位定时计数器使其每 200us 发生一次中断,则当中断 250*20 次后即可产生一个秒信号,然后就可以根据时间的递进关系计算出分、时、日、星期、月、年。然而用单片机实现计时,虽然不用外接时钟芯片,且充分的利用了单片机的资源,但是计时精度却不够高,容易产生误差,而且一旦掉电就会失去所有的数据。方案 2:采用 DS1302 为时钟芯片DS1302 是串行接口的时钟芯片,综合性能较好且价格便宜。其采用三线接口(时钟, 数据,复位)与单片机进行同步通信,占用资源少,计时精确。而且它采用双电源设计, 当主电源断掉时可以启用备用电源(如果设置了备用电源),这样就实现了数据的掉电保护,当再次上电后,系统就可以调用到正确的时间数据。由于采用单片机计时会采用计数器,这样就占用了硬件资源,而且还需要设置中断与算法,也会占用单片机的资源,而采用 DS1302 计时单片机就可以避免计算时间所占用的资源,且 DS1302 计时更准确,又具有掉电保护,电路设计也较简单,综上所述,本次设计采用方案 2采用 DS1302 为时钟芯片。显示模块方案 1:采用 FYD12864-0402B 液晶显示模块作为显示器FYD12864-0402B 是一种具备多种接口方式,且自带字库的点阵图形液晶显示器。该显示器和其它同类型的显示器相比,不管是周边电路结构设计,还是显示程序设计都要简单的多,而且它的价格也略低于相同规模的显示器。利用此显示器可以很灵活很方便的构成全中文人机交互图形界面。方案 2:采用多位 LED 数码管构成显示模块采用 LED 数码管用于显示时,虽然说显示的内容有限,但是也可以显示 0 到 9 的数字以及有限的几个英文字母,而且驱动电路和程序的设计非常简单,价格也比液晶显示器要低得多。液晶显示器可以显示很丰富的内容,且硬件设计不复杂,但是本设计中并不需要显示多么复杂的内容,而且相比数码管而言,数码管显示更加清晰易见,液晶显示器显示内容过小,对于电子万年历来说不太直观,实用价值不高。故从经济和实用的角度考虑,本次设计选择方案 2.温度检测模块方案 1:采用 DS18B20 数字温度传感器作为温度检测模块DS18B20 体积小、接线少且反应灵敏,可以很方便的用于环境测温。DS18B20 是一线式数字温度传感器,只需要和单片机的一个I/O 口相连就可以实现双向通讯。它可以实现-55到+125之间的温度测量,且测温误差不超过+/。方案 2:采用 DHT11 数字温湿度传感器作为温湿度检测模块DH11 是一款可以同时测量温湿度的传感器,它采用了专用的传感和数字采集技术,具有很高的可靠性和稳定性。DH11 传感器具有响应快,抗干扰能力强,性价比高等特点,且由于其采用了单线串行接口,所以可以很方便的集成进系统,这使得它在很多苛刻的场合都得到应用。DH11 可以实现 050间的温度测量以及 20-90%RH 间的湿度测量,其温度测量误差不超过+/-2,湿度测量误差不超过+/-5%RH。由于本设计暂未考虑湿度显示设计,且DS18B20 的温度检测更为精确,所以本次设计选择了方案 1,采用 DS18B20 测温。最终方案选择经过反复考虑,最终确定了如下方案: 1)采用 STC89C52 单片机作为系统控制芯片。2) 采用 DS1302 作为时钟芯片。3) 采用多位 LED 数码管构成显示模块。4) 采用 DS18B20 数字温度传感器作为温度检测模块。3 系统硬件电路的设计根据本次设计初设想要实现的功能,初步确定本系统由主控模块、时钟模块、温度检测模块、键盘模块、显示模块、扬声器模块等 6 个模块构成,其电路方案构成框图如图所示。其中,主控芯片采用 STC89C52 单片机,时钟芯片采用 DS1302,温度检测器件采用DS18B20 数字温度传感器,显示模块分别由 MAX7219 和 74HC573 驱动的共 20 个 LED 数码管构成。数码管显示模块扬声器模块DS1302时钟模块STC89C52主控模块DS18B20温度检测键盘模块图 系统电路方案框图系统核心部分STC89C52 主控模块STC89C52 是一种以 8051 为内核的单片机,它具有 8 位 CPU,8KB 的 ROM,512 字节 RAM, 且具有多种外设。与其它传统 51 单片机相比,具有更多功能,能满足多数对运算速度要求不高的电子产品的需求,为很多产品提供了一种性价比高的解决方案。STC89C52 单片机特性 增强型 8051 单片机,指令代码完全兼容传统 8051,可以自由选择 6T 或是 12T 时钟时钟周期。 工作电压: 工作频率范围:040MHz,相当于普通 8051 的 080MHz,实际工作频率可达 48MHz 8KB 程序存储器 512 字节 RAM 32 条 I/O 口线 ISP 程序下载,可以直接通过串口升级程序。 具有 EEPROM 功能 具有看门狗功能 共 3 个 16 位定时器/计数器。即定时器 T0、T1、T2 外部中断 4 路,下降沿中断或低电平触发电路,Power Down 模式可由外部中断低电平触发中断方式唤醒 通用异步串行口(UART),还可用定时器软件实现多个 UART 工作温度范围:-40+85(工业级)/075(商业级) PDIP 封装STC89C52 单片机引脚及功能STC89C52 单片机的引脚分布如图所示。图 STC89C52 单片机-6STC89C52 单片机引脚功能说明:(1) VCC 和 GND 分别是 STC89C52 的电源输入端和接地端。(2) XTAL1 和 XTAL2 是单片机的时钟引脚,当采用外部时钟信号时,XTAL1 接晶振, XTAL2 悬空,当采用内部时钟时,两个引脚均要接上晶振,并在晶振两端与地之间接上2033pF 的小电容,使时钟起振,并使时钟更稳定。(3) RST 为复位引脚,当需要复位单片机时,给这个引脚两个机器周期以上的高电平,即可使单片机复位。EA 引脚是单片机的外部存储允许位,当单片机只需要访问内部存储时, 直接将 EA 引脚拉高即可。ALE/PROG 和 PSEN 是单片机与外部存储通讯的引脚。(4)P0、P1、P2、P3 端口均可作普通 I/O 口使用,其中一些端口还具有第二功能,由于本次设计并没有多少涉及第二功能的使用,此处就不介绍了。STC89C52 单片机最小系统设计单片机最小系统是一个控制系统的核心,主要有单片机以及晶振、复位电路和电源电路组成,单机最小系统可以通过I/O 口和各种外围电路结合,然后通过编写程序实现你想要实现的各种功能。STC89C52 单片机构成的最小系统简单且可靠,在用 STC89C52 单片机设计最小系统时, 只需要为单片机接入晶振电路、时钟电路和复位电路即可,其结构如图所示,由于 STC89C52 单片机自身的限制,此最小系统只能运用于对运算速度要求不高的设计。电源电路复位电路STC89C52单片机晶振电路图 STC89C52单片机最小系统结构(1) 电源电路STC89C52单片机采用5V供电,最初是准备利用变压器产生 18V电压,然后通过7805三端稳压器降压到5V给单片机供电,后来发现这样本设计就会很笨重,于是就利用一般手机-7充电器输出电压为5V的特性,直接给电子万年历供电,但由于 miniusb口不好固定在万用板上,最后选取了DC电源接口,这样既方便了供电口的固定,而且供电线在市面上也比较容易购买到。另外再在DC电源接口输出端接上自锁开关,这样就起到了随心控制电源的功能。电源电路设计图如图所示。图 电源电路(2) 晶振电路STC89C52单片机必须在时钟信号的作用下才能正常工作,所以就必须有晶振电路,晶振电路上电启动后会震荡产生时钟信号,而这个时钟信号就是单片机有序工作的基准信 号。STC89C52单片机晶振电路设计如图所示,在图中,由 12MHZ晶体振荡器及30pF电容连接构成电容三点式振荡器,两个30pF电容在其中起到了稳定频率和快速起振的作用,其中18、19分别对应单片机的XTAL1和XTAL2引脚。图 晶振电路(3) 复位电路-14单片机复位即使单片机和其他模块初始化为最初的状态,复位电路通常有上电复位和手动复位两种方式,上电复位即通过电容的充放电实现单片机的复位,但有些情况下,采用手动复位是很有必要的,本设计即采用的是手动按键复位。本设计中通过按键开关和RC 组合电路实现手动复位,其电路结构简单,如图所示,当按下开关时, RST引脚由低电平变为高电平,单片机即实现复位。图 复位电路(4) STC89C52 最小系统STC89C52 单片机最小系统如图所示。图 STC89C52 单片机最小系统时钟模块本设计的时钟系统采用的是 Dallas 公司生产的实时时钟芯片 DS1302,DS1302 通过串行的方式可以写入和读出当前的时间信息。DS1302 内置的时钟模块可以独立走时,可以向单片机提供秒、分、时、日、月、星期、年在内的时间信息,而且具有闰年自动补偿功能。同时 DS1302 还设计有双电源引脚,电源范围为之间,当 VCC2>VCC1 时由 VCC2 供电,当VCC2<VCC1 时由 VCC1 供电。本次设计即根据这个特性,将 VCC2 直接接入电源开关前,将VCC1 接入 3V 纽扣电池,这样只要万年历接入电源,即使没有打开开关也可以给 DS1302 供 电使其工作,而在主系统掉电后就会启用备用电源,使 DS1302 在备用电源的作用下继续运行,这样当系统再次上电后,时间仍然是准确的,不用再重新设定时间,而且还节省了 备用电源的电量。其中,X1 和 X2 引脚是振荡源,用于外接晶振,从图可看出DS1302 和单片机的连线只有三条,其中RST 是复位/片选端,I/O 是串行数据输入/输出端,SCLK 是串 行时钟输入端。时钟电路设计如图所示。图 DS1302 时钟电路温度检测模块本次设计使用的温度检测模块是通过传感器 DS18B20 实现的,DS18B20 的一线制接法使环境温度的检测变的非常简单。DS18B20 检测温度的原理是将温度通过芯片内部转化为数字信号,然后通过 DQ 引脚将数字信号传到单片机内,通过单片机的处理再读出相应的温度。本次设计的温度检测电路如图所示。图 温度检测模块键盘模块键盘模块可以设计成矩阵键盘或者是独立键盘两种形式,它们各有自己的优点,如果选用矩阵键盘模式设计可以在减少 I/O 口使用的情况下设置尽可能多的按键,这样一来也可以获得更多的按键功能。但本次设计只需要能够设置时间即可,并不需要太多的按键, 在这种情况下,并不需要占用多少 I/O 口,于是就采用了独立键盘的设计。其中 S1 为设置键,S2 为+键,S3 为-键,S4 为功能键。键盘模块如图所示。图 键盘模块显示模块本次设计显示模块使用的是 20 位 7 段共阴极 LED 数码管,显示清晰,电路设计简单。要使数码管能够稳定清晰的显示,就必须有电路驱动,初时本准备全用 74HC573 驱动数码管显示,但考虑到用 74HC573 驱动太多数码管可能会使数码管过暗,后来查到MAX7219 芯片可以一次驱动 8 个数码管,且显示效果很好,于是决定使用 2 片 MAX7219 芯片驱动 16 个数码管,2 片 74HC573 芯片驱动 4 个数码管。LED 数码管分为共阳极与共阴极两种,本设计中使用的是 20 位共阴极 7 段数码管。共阴极数码管的阴极只有接低电平时才能使数码管被点亮,而其它引脚分别对应一段发光二极管,只有给它高电平时,对应的段才能够被点亮,利用这种原理即可显示出数字或字符。当有多位数码管时,就是利用公共阴极使数码管逐一显示,从而形成位选。MAX7219 芯片是一种串行输入/输出共阴极数码管显示驱动芯片,它和单片机相连可驱动 8 位共阴极 LED 数码管。该芯片通过三线串行接口于单片机相接,而且只需要外接一个10k 电阻即可设置所有数码管的电流,单片机通过 MAX7219 的串行数据线、串行时钟线和芯片选通线即可实现控制多个数码管显示。MAX7219 芯片的引脚功能如表所示。表 MAX7219 引脚功能74HC573 是 8 进制数据锁存器,是一种CMOS 器件。其中OE 为输出使能端,当OE 使能端接低电平时,则将使 74HC573 永久使能。LE 为输出锁存端,当输出锁存端 LE 为高电平时,锁存功能对数据是不存在的,即输出同步。本次设计采用 2 个 74HC573 驱动四个数码管显示阴历月日,其中一个 74HC573 通过 7 段码使数码管显示,另一个 74HC573 则通过位选码以扫描显示数码管。显示模块如图所示。图 显示模块扬声器模块扬声器模块,主要是用于支持在设置的闹铃到时间后发出声音以及整点报时的功能。本次设计的扬声器模块在设计时考虑到此设计只是由于演示用,故而并没有设计有声音放大的功能,只是简单的用蜂鸣器设计电路来发出声音。当有需要发出声音时,由单片机给出连续或者是变化的高电平,使蜂鸣器可以鸣叫甚至放出音乐。电路很简单,由电阻、三极管 9012 以及蜂鸣器构成,其中三极管起到了放大和开关的作用,电阻主要是起到限流的作用以避免三极管被烧毁。扬声器模块电路图如图所示。图 扬声器模块4 系统软件的设计在系统硬件电路方案设计完成后,接下来就要考虑整个系统软件的设计,首先,要梳理清楚本次设计所要实现的功能具体有哪些,然后根据要实现的功能,建立系统软件框架的流程图,在设计出流程图后,需要对整个系统进行功能模块的划分,这样就可以把大的思路化为小的需求,从而逐个模块的实现所要展现的功能,最后,在各个模块实现后,就可以把各个模块通过合理的串联,构成完整的具备各种功能的系统程序。系统初始化读取温度是否有按键被按下是按键函数否设置时间更改秒表秒表模式显示日历时间及温度系统软件流程框图如图所示。图 系统软件流程框图在系统流程框图设计出来后,就要考虑各个模块的设计,具体大概有系统初始化、开机显示、DS18B20 模块、按键函数、DS1302 函数、阴历函数、显示函数、闹钟函数、秒灯函数、整点报时函数等等。系统初始化在程序设计中,系统初始化是很重要的,它将为使系统能正常运行提供初始条件,使一些模块通电初始化运转,为整个系统奠基。在初始化函数 void init()中,首先开全局中断,设置中断允许,然后以方式 1 开两个定时器的中断,并将定时器 0 赋初值为 50ms,定时器 1 赋初值为 1ms,此处定时器 0 为-17时钟计时用,而定时器 1 为秒表计时。然后还要初始化 MAX7219 和 DS1302,需要注意的是, 由于 MAX7219 的抗干扰能力稍差,所以每次调用MAX7219 时都需要初始化 MAX7219 以避免出现乱码。开机显示函数在众多有显示器件的电子产品中,大多都有在开机时设置开机画面,这样一是可以让产品有个预热的时间,让系统可以初始化,二来也可以显示品牌,提升用户好感。本次设计虽然设计简单,但也设置了开机显示函数。由于本次设计采用的显示模块是 LED 数码管, 所以开机显示很简单,即使全部数码管显示 8。DS18B20 温度检测函数单片机通过 DS18B20 检测温度时,需要向 DS18B20 发送指令,其中,DS18B20 主要的命令有以下三条:0XCCH 忽略 ROM 序列的读取操作,直接向DS18B20 发送其他命令,这命令仅仅适合只有一片 DS18B20 工作的情况;0X44H 启动 DS18B20 进行温度转换;0XBEH 读取温度寄存器 9 个字节内容。当然仅仅知道 DS18B20 工作命令是不够的,还需要了解 DS18B20 的通讯协议,与DS18B20 通讯必须有三个步骤:每次通讯时需对 DS18B20 进行初始化操作,在初始化完成后需要发送 ROM 寻址指令(只有一片工作时不需要寻址,使用 0XCC 命令即可),然后再发送 RAM 指令,这样才能使 DS18B20 进行相应的工作。DS18B20 的初始化初始化 DS18B20 时,需要先将数据线置“1”,然后稍作延时(这个时间尽可能短一点, 几十微秒就够了),然后再将数据线拉低到“0”,这时要精确延时(最好在 480 到 960 微秒间),最后再将数据线拉高,并延时一段时间后结束初始化。以下是 DS18B20 的初始化程序:/*初始化 DS18B20*/ void Init_DS18B20(void)DQ = 1;良俊.杜丽芳.王立谦.MCS-51 单片机原理及应用.北京.北京大学出版社.2013:223-236.2薛楠.Protel DXP 2004 原理图与PCB 设计实用教程.北京.机械工业出版社.2012:18-97. 3温子祺.51 单片机C 语言创新教程.北京.北京航空航天大学出版社.:82-130.4谭浩强.C 语言程序设计.第四版.北京.清华大学出版社.2010:37-290. 5STC 官网.STC89C51RC/RD+系列单片机中文指南.2005:2-20.6 王锐.基于单片机的万年历设计.信息技术.:213-216.7 郑丽丽.谢磊.李清宝.一种公历到农历日期转换算法的实现.微计算信息.(10):74-76. 8姚德法.张洪林.串行时钟芯片DS1302 的原理与使用.信息技术与信息化.:92-94. 9李伟跃.基于时钟芯片DS1302 的万年历的设计.科技创新导报.:20-21.10 段磊.基于AT89C51 单片机控制的万年历探究.海峡科学.:26-28.11 周颖.俞吉.基于AT89S52 单片机的电子万年历系统设计.现代电子技术.(13):178-182. 12苏畅.基于单片机控制的LCD 显示万年历制作.长江大学学报(自科版).(22):77-79. 13李扬.基于AT89S52 单片机的电子万年历设计与实现.无线互联科技.:172-174. 13MAX7221 :1-13.14 :1-11.15:1-12.附录1 多功能万年历电路原理图图 12 多功能万年历实物图图 2-20图 3图 4图 53 多功能万年历源程序部分代码(1) DS1302 时钟函数/*写 ds1302 函数*/void write_1302(uchar add,uchar date)uchar i;date=(date/10)*16)+(date%10);/将数据由十进制转换为 BCD 码rst_1302=0; clk_1302=0; rst_1302=1; for(i=0;i<16;i+)if(i<8)/写入地址add=add>>1;else/写入数据date=date>>1;io_1302=CY;clk_1302=0; clk_1302=1;rst_1302=0;/*读 1302 函数*/ uchar read_1302(uchar add)uchar i,temp=0; rst_1302=0; clk_1302=0; rst_1302=1;for(i=0;i<8;i+)/ 写入地址add=add>>1; io_1302=CY;clk_1302=0; clk_1302=1;for(i=0;i<8;i+)/读取数据clk_1302=1; clk_1302=0; if(io_1302)temp=temp|(0x01<<i);-27temp=temp/16*10+temp%16;/将数据由 BCD 码转换为十进制rst_1302=0;return temp;void ds1302()/读取写入 ds1302 函数if(tt=1)&&(set=0)/当退出时间设定时,首先将设定的时间写入芯片*/tt=0;write_1302(0x8e,0x00); write_1302(0x82,min); write_1302(0x84,hour); write_1302(0x8a,week); write_1302(0x86,day); write_1302(0x88,mon); write_1302(0x8c,year); write_1302(0x8e,0x80);/启动读写/禁止读写if(set=0)/没有在设置状态时读取时钟芯片数据sec=read_1302(0x81); min=read_1302(0x83); hour=read_1302(0x85); week=read_1302(0x8b); day=read_1302(0x87); mon=read_1302(0x89); year=read_1302(0x8d);if(set!=0)/设置时读取秒数据sec=read_1302(0x81);(2) MAX7219 驱动函数/*MAX7219 程序*/void MAX7219_1(uchar msb,uchar lsb)uchar i; cs_7219_1=0;for(i=0;i<16;i+)/写入 16 位数据if(i<8)/数码管位选msb=msb<<1;else/数码管段选lsb=lsb<<1;clk_7219_1=0; din_7219_1=CY;_nop_(); clk_7219_1=1;cs_7219_1=1;(3) 阴历计算函数/*函数功能:输入十进制阳历数据,输出阴历数据(只允许 2000-2099 年)调用函数示例:Conversion(year_sun,month_sun,day_sun) 如:计算 2015 年 4 月 16 日 Conversion(15,04,16); year_sun,month_sun,day_sun 均为十进制数据调用函数后,原有数据不变,读 year_moon,month_moon,day_moon 得出阴历十进制数据*/void Conversion(uchar year_sun,uchar month_sun,uchar day_sun)uchar temp1,temp2,temp3,month_p; uint temp4,table_addr;bit flag2,flag_y;/定位数据表地址table_addr=year_sun*0x3;/定位数据表地址完成/取当年春节所在的公历月份temp1=year_codetable_addr+2&0x60; temp1=_cror_(temp1,5);/取当年春节所在的公历月份完成/取当年春节所在的公历日temp2=year_codetable_addr+2&0x1f;/取当年春节所在的公历日完成/ 计算当年春年离当年元旦的天数,春节只会在公历 1 月或 2 月if(temp1=0x1)elsetemp3=temp2-1;temp3=temp2+0x1f-1;/ 计算当年春年离当年元旦的天数完成/计算公历日离当年元旦的天数,为了减少运算,用了两个表/day_code19,day_code23/如果公历月在九月或前,天数会少于 0xff,用表 day_code19,/在九月后,天数大于 0xff,用表 day_code23/如输入公历