望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6723|回复: 21

[电气与信息工程学院] [课程设计]电子日历...

[复制链接]
发表于 2006-11-2 09:38:36 | 显示全部楼层 |阅读模式
本文介绍了一种由单片机作为中心处理器的电子日历,详细的说明了它的硬件结构框图和主要的编程思想。

关键词:万年历、单片机、动态显示

引言:
  挂历是我们生活中不可缺少的东西,它可以给我们指示当前的年份、日期、节气等的信息。但它也有它的不足之处:那就是它的更新要靠人,还有它的指示的内容不明确等等。基于这些,我们设计了一个电子日历,它的更新是自动的,减轻了人的工作量;它不但可以显示年、月、日等的信息,而且还可以显示当时的北京时间:小时、分钟、秒;另外,它还有闹钟的功能,它和普通的闹钟有所不同,一天内可以设定三路的定时时间。

一、硬件的组成
1.1 硬件框图如右图所示:
从框图中可以看出该电路由四大部分组成:1中心处理器、2显示模块、3键盘模块、4闹钟模块;
1.2中心处理器
中心处理器取用的是AT89C51单片机,Atmel公司生产的AT89C51单片机,是一种低功耗、高性能、片内含有4KB Flash ROM的8位CMOS单片机,工作电压范围为2.7V~6V(实际使用+5V供电),8位数据总路线,32线并行I/O接口,128字节片内RAM。
1.3显示模块
该电路是取用动态显示方式,数码管选用的是双联共阴数码管。译码方式是硬件译码,取用两块CD4511进行译码,选通位由74LS138译码得到。硬件示意图如下








1.4键盘模块
该电路和键盘有4个按键:S1、S2、S3、S4其功能如下:
1、S1、为调北京时间入口,进入后,S1的功能变为加1;S2为减1;S3为右移(移尽表示确定退出);S4为取消操作。
2、S2为调定时时间入口,进入后S2的功能变为减1;S1为加1;S3为左移;S4为确定。
3、S4的功能是:当闹钟起作用后,长按S4则可以关闹钟(注:下次时间到,闹钟照样响)。
4、S5的功能是:长按S5可以起动或关闹钟功能(有LED指示,LED亮表示闹钟有效,反之闹钟功能无效)。如果闹钟功能没有起动的话,即使定时时间到,但闹钟也不会工作,只有在闹钟功能起动后,闹钟才会起作用。
1.5闹钟模块
该模块取用的是一般机械闹钟上的闹钟模块,只要对它稍作修改便可以。

二、软件编程
2.1闰年处理
公历是比较有规律的,1、3、5、7、8、10、12月为大月,每月31天;4、6、9、11月为小月,每月只有30天;而2月份,则要根据当前的年份来决定,平年,2月份有28天,闰年,2月份有29天。所以处理2月份天数前要先判断是平年还是闰年。由于本系统显示的年份只是显示它的后两位,如:2003年,则只显示03,所以判断是不是闰年只要把当前的年份除以4,如果能被4整除则为闰年,否则为平年。以这种方法处理的电子日历,在本世纪中运行是不会出现问题的,按正确的判断方法应该是这样的:闰年的条件是,能被4整除、但不能被100整除,或者能被400整除。
2.2显示处理
由于取用了双联共阴的数码管显示,而且译码取用了两个CD4511译码,所以显示是方面是有点特别,现在以秒这位的显示作以说明,用30H这个单元存放秒的信息,最大的数值可以是59,由于它存放的形式是16进制,如:当前是15秒,那么30H里面的内容为0FH,不能直接显示,在显示前要进行BCD码转换。把它变成压缩的BCD码15H。转换的方法是:把30H里的内容除以10,商左移四位后再与余数相或,这样便得到了压缩的BCD码。具体的显示子程序见右边子程序:




三、总结
该电子日历经过长时间的运行,结果证明它工作稳定、定时可靠、显示不闪烁、时间准确等。10天内的时间误差为1秒左右。所以它是一个高性能、实用的电子日历



 楼主| 发表于 2006-11-2 09:47:32 | 显示全部楼层
ACALL START
MOV R7,#0A2H
ACALL SEND
MOV R7,#02H
ACALL SEND
MOV R7,#00H
ACALL SEND
ACALL D5U
MOV R7,#22H
ACALL SEND
MOV R7,#15H
ACALL SEND
ACALL D5U
ACALL STOP
ACALL DELAY3 ;写11:16到分与时中
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOOP:
  LCALL START        ;启动
      MOV  R7,#0A2H
      LCALL  SEND         ;发送写24C02的寻址字节
      MOV  R7,#03H
      LCALL SEND         ;发接受缓冲区首址
     
           
      LCALL START        ;再次启动
      MOV  R7,#0A3H
      LCALL  SEND         ;发送读24C02的寻址字节

LCALL READ
MOV MIN,R7
ACALL D5U
 楼主| 发表于 2006-11-2 09:47:44 | 显示全部楼层
LCALL READ
MOV HOUR,R7
ACALL D5U
ACALL STOP
ACALL DELAY3


MOV A,MIN
     ANL A,#7FH
     MOV MIN,A
     MOV A,MIN
     ANL A,#0FH
     MOV DPTR,#SETTAB
MOVC A,@A+DPTR
     MOV SBUF,A
D1:   JNB TI,D1
CLR TI
ACALL DELAY3


MOV A,MIN
ANL A,#0F0H
SWAP A
MOV DPTR,#SETTAB
     MOVC A,@A+DPTR   
MOV SBUF,A
D2:   JNB TI,D2
CLR TI
ACALL DELAY3



    MOV A,HOUR
   ANL A,#3FH
    MOV HOUR,A
    MOV A,HOUR
     ANL A,#0FH
     MOV DPTR,#SETTAB
MOVC A,@A+DPTR
     MOV SBUF,A
D3:   JNB TI,D3
CLR TI
ACALL DELAY3

MOV A,HOUR
ANL A,#0F0H
SWAP A
MOV DPTR,#SETTAB
     MOVC A,@A+DPTR   
MOV SBUF,A
D4:   JNB TI,D4
CLR TI
ACALL DELAY3
ACALL D1S
ACALL D1S

AJMP LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:  
SETB SDA         ;启动信号子程序,大家可以参考开始信号的时序图
   SETB  SCL
      LCALL D5U
      CLR SDA
      CLR SCL
      RET
 楼主| 发表于 2006-11-2 09:47:56 | 显示全部楼层
STOP:  
CLR SDA            ;停止信号子程序
      SETB SCL
      LCALL D5U
      SETB SDA
      LCALL D5U
      NOP
     ; CLR SDA
      CLR SCL
      RET      

;send是发送一个字节子程序
SEND:   
MOV R6,#08H         
      MOV A,R7          ;要发送的数在r7中
SENDLOP1:
RLC A            ;左环移,把A的最高位移入cy
      MOV SDA,C         ;把cy的值通过sda发送出去
      SETB SCL          ;在scl上产生一个时钟
      LCALL D5U
 楼主| 发表于 2006-11-2 09:48:20 | 显示全部楼层
CLR SCL
      DJNZ  R6,SENDLOP1      ;重复8次,发送一个字节
      ;cack是检查应答信号的子程序
CACK:  SETB  SDA           ;主机首先拉高sda
      SETB  SCL            ;发出一个时钟
      LCALL  D5U
SENDLOP2:
MOV  C,SDA          ;读入sda的状态,如果是0表示接受到了应答
    JC SENDLOP2      
      CLR SCL            ;接受到应答位,结束时钟
      RET     
;send是发送一个字节子程序


SEND1:   
MOV 78H,#08H         
      MOV A,R7          ;要发送的数在r7中
SENDLOP11:
RLC A            ;左环移,把A的最高位移入cy
      MOV SDA,C         ;把cy的值通过sda发送出去
      SETB SCL          ;在scl上产生一个时钟
      LCALL D5U
      CLR SCL
      DJNZ  78H,SENDLOP11      ;重复8次,发送一个字节
      
  ;cack是检查应答信号的子程序
CACK1:  SETB  SDA           ;主机首先拉高sda
      LCALL D5U
      SETB  SCL            ;发出一个时钟
      LCALL  D5U

SENDLOP22:
MOV  C,SDA          ;读入sda的状态,如果是0表示接受到了应答
    JC SENDLOP22      
    CLR SCL            ;接受到应答位,结束时钟
     
     
      RET
 楼主| 发表于 2006-11-2 09:48:31 | 显示全部楼层
READ:   
MOV  R6,#08H          ;读取一个字节子程序
READLOP1:  
SETB  SDA            ;置sda为输入方式
      SETB SCL             ;发出一个时钟  
      LCALL D5U
      ;LCALL D5U
      ;LCALL D5U
      MOV C,SDA          ;读入sda状态
      RLC A              ;把该位的状态移入A中  
      CLR SCL            ;结束时钟
NOP
NOP
NOP      
      DJNZ R6,READLOP1       ;重复8次,读入一个字节
      MOV R7,A            ;读进来的数放在r7中
   
;sack是发送应答位子程序
SACK:   
CLR  SDA            ;拉低sda线
      LCALL D5U
      SETB SCL            ;发出时钟信号
      LCALL D5U
      CLR SCL
      LCALL D5U
      SETB SDA
      LCALL D5U
      RET
 楼主| 发表于 2006-11-2 09:48:43 | 显示全部楼层
READ1:   
MOV  R6,#08H          ;读取一个字节子程序
READLOP11:  
SETB  SDA            ;置sda为输入方式
      SETB SCL             ;发出一个时钟  
      LCALL D5U
      ;LCALL D5U
      ;LCALL D5U
      MOV C,SDA          ;读入sda状态
      RLC A              ;把该位的状态移入A中  
      CLR SCL            ;结束时钟
NOP
NOP
NOP      
      DJNZ R6,READLOP11       ;重复8次,读入一个字节
      MOV R7,A            ;读进来的数放在r7中
 楼主| 发表于 2006-11-2 09:48:55 | 显示全部楼层
;sack是发送应答位子程序
SACK1:   
SETB  SDA            ;拉低sda线
      LCALL D5U
      SETB SCL            ;发出时钟信号
      LCALL D5U
      CLR SCL
      LCALL D5U
      ;SETB SDA
      LCALL D5U
      RET   

D5U:   
NOP            ;延时5us子程序
      NOP
      NOP
      NOP
      NOP
      NOP
      RET



;INT1:

DELAY3:
MOV    R1,#0FFH
D21: MOV R2,#0FFH
  DJNZ   R2,$
DJNZ R1,D21
    RET

D1S:   MOV R1,#100      ;延时1s子程序
DEL11:  MOV  R4,#20
DEL22:  MOV R3,#0FFH  
DEL33:  DJNZ  R3,DEL33
      DJNZ R4,DEL22
      DJNZ  R1,DEL11
      RET
SETTAB:
DB  0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
DB  0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
发表于 2006-11-2 10:48:21 | 显示全部楼层
就是一个数字钟嘛  [s:23]  以前dsp玩过
发表于 2006-11-2 17:26:29 | 显示全部楼层
楼主这是自己写的程序么?
发表于 2006-11-2 17:37:39 | 显示全部楼层
呵呵
我们那会就做这个课程设计,很锻炼自己的所学知识和动手能力
不过有些情况下一部分人搞的差不多了,然后。。。
啥时候才多变几个题目, [s:35]
发表于 2006-11-2 20:05:10 | 显示全部楼层
这个,用一个芯片就搞定了 [s:19]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2024-11-24 01:26 , Processed in 0.151984 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表