多功能智能电子钟的设计

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

文章编号:1006-1576(2005)04-0082-03

多功能智能电子钟的设计

何宏森

(西南科技大学信息工程学院,四川绵阳 621010)

摘要:多功能智能电子钟以AT89C2051芯片为核心,采用静态与动态相结合的扫描方式显示。系统软件包括主程序和中断模块,基本时间、总天数、星期、公历、阴历等日历算法模块。其显示模块采用单片机串行输出,以分时动态扫描方式点亮21块LED数码管和4个发光二极管。

关键词:电子钟;单片机;日历算法;动态显示

中图分类号:TP216.2 文献标识码:A

Design of Intellectual Electronic-Clock of Multifunction

HE Hong-sen

(College of Information Engineering, Southwest University of Science & Technology, Mianyang 621010, China)

Abstract: The chip of AT89C2051 is based on as the core of intellectual electronic-clock, and the scanning mode is applied to display by combining dynamic scan with static scan. The system software includes: main program, interrupt program and the programmed algorithm about calendar of basic time, total days, week, the Gregorian calendar and the lunar calendar. The displaying module is designed with serial output of one chip computer, 21 pieces of LED nixie light and 4 pieces of LBDs were lighted up by the way of dynamic time-sharing scan.

Keywords: Electronic-clock; Chip computer; Calendar algorithm; Dynamic display

1 引言

万年历阴历算法以往都使用数据表。通过查询

实现,但所占空间较大。故从公农历间的关系入

手,设计电子万年历,时间长度是100年(即从

2000~2100年)。

2 硬件电路设计

图1 电子钟的硬件框图

采用AT89C2051芯片为核心,具有自动计算和显示公农历日历、星期、时间和气温。显示部分用分时动态扫描方式点亮LED数码管,单片机通过P1口发出位码并经PNP三极管驱动对需显示的LED供电,显示数据由单片机从串口发出经74LS164进行串并转换,采用静态与动态相结合的扫描方式显示。温度监测电路采用热敏电阻和555定时器及辅助电路构成多谐振荡器,根据热敏电阻阻值随温度变化的曲线,单片机可以根据

1s内555定时器输出的方波个数来计算气温值。

3 软件实现

3.1 主程序及中断模块

主程序对各单元初始化,计数器溢出后进入中断程序。调用子程序,中断返回后又继续计数,再次溢出后再进入中断程序,如此周而复始执行。进入中断程序(图2)后,先重新对T0赋初值,再调用各算法子程序,记数初值保证子程序执行完后不发生第二次中断。

3.2 日历算法

(1) 基本时间算法

设定4ms中断一次,即一秒要中断250次。通过判断预定数据缓冲单元的值,此值一到250,秒单元就加一,否则中断返回继续计数。判断秒单元,只要秒单元到60,分单元就加一,否则中断返回继续计数。再判断分单元,只要分单元到60,小时单元就加一,否则中断返回继续计数。然后再判断小时单元,小时单元一满24,那么天单元就加一,否则中断返回继续计数。如循环计算如图3。

(2) 总天数算法

为实现公历向农历的转换须进行总天数计算。公历

收稿日期:2005-02-19;修回日期:2005-03-25作者简介:何宏森,作者未提供。

·82·

计算定义2000年1月1日为起始年,总天数计为Day1。农历计算中定义农历1999年1月1日为起始年(即公历1999年2月16日,相差319天),总天数计为Day2=Day1+319天。

图3 基本时间的程序流程

如要计算今天2004.6.1距2000.1.1的总天数,只要从内存单元提出年份的十位和个位的信息,用它减去0(00年)。得X1=04。提取月份信息X2=6-1=5。可算出前5个月经过的天数X2。日信息X3=1-1=0。还需要考虑闰年的年份信息和月份信息,如果有闰年就需要把多出的天数加上。因此,总天数TOTLE=(X1×365+X11)+X2(每年基本上是一样的只有闰年和非闰年差一天)+X3。用年份信息除以4,令商为K,余数为M。M=0时为闰年,那么X11=K。如果M≠0,说明不是闰年,那么X11=K+1。这样Day1就求得。设计中预留两个内存单元(即高8位和低8位)存放总天数。

(3) 公历算法

公历算法基本上和农历一样都用逐月递减法(每减12个月存放年份信息的单元的内容就加1)。这个年份信息加上“起始年信息”就是现在的年份信息,月和日的信息在根据公农历不同而得到不同的结果。每年各月份的天数基本上是固定的如下表,除了2月可能有28天或者29天。设置两个标识,一个R1内存放即将减的月号,一个R0存放当前年信息,当R1到12时R0就加1。当R1为2时,判断当时的R0内的年份信息是否闰年了。如果是闰年就减29天,反之则减28天。其余月份则就减相应的30和31。

(4) 星期算法

星期算法有两种。一种是当小时信息满24时,存放星期信息的内存单元就加1,满7归1,如此循环获得某天为星期几。另外一种算法是:[总天数+(初始值-1)]/7的余数,就是当天的星期信息,见表1。但该算法要考虑除法的高8位借位问题,当低8位不够除的时候,就要向高8位借位。此时,高8位减1,低8位就可以加4再除7(因为256/7余4),同时要判断高8位是不是小于0。如果是则完成除法,如果不是则继续除到真正不够除为止。

表1 余数与星期信息对照表

余数0 1 2 3 4 5 6 星期信息 6 7 1 2 3 4 5

(5) 农历算法

农历算法基本上和公历一样,也是逐月递减的方法(此处是减一个的天数,比如29天或者30天)。要保存一年的信息,只要三个信息:农历每月,是否有闰月,闰几月以及闰月的大小。用相邻的两个内存单元来保存这些信息。农历算法如图4。

图4 农历算法流程

3.3 显示模块

显示部分用分时动态扫描方式点亮LED数码管,故需分时点亮21块LED数码管和4个发光二极管。用单片机串行输出,一次传送数据给三块74LS164(一组点亮三块LED),74LS164再并行输出进行动态扫描。三块74LS164首尾相接,前面164的Q7脚连接在下一个164的A,B输入脚。扫描一次就需要送三组数据到三块164中,前8个周期送最后一块164的信息,中间8个周期送中间一块164的信息,最后一个8个周期就完成排在最前面的164的信息的传送。此时再通过单片机的P1口给相应要点亮的LED的驱动电路的三极管的基极送低电平即可。在每组LED点亮后稍微的延时

·83·

相关文档
最新文档