单片机实验 电子日历.docx
- 文档编号:4873101
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:361.88KB
单片机实验 电子日历.docx
《单片机实验 电子日历.docx》由会员分享,可在线阅读,更多相关《单片机实验 电子日历.docx(22页珍藏版)》请在冰豆网上搜索。
单片机实验电子日历
一.实验目的:
课程标志性内容的设计理解和综合运用,鼓励独立性设计和功能扩展的创新实践。
二.功能要求:
1.基本性要求
(1)显示北京时间;
(2)能够校准时间;
(3)使用汇编语言;
(4)时、分、秒之间以及年、月、日间以小数点分隔;
2发挥性要求
(1)显示公历日期
(2)能够校准日期
(3)运动秒表
(4)闹钟功能
三.方案考虑:
1.硬件方案
(1)采用6位LED数码管显示日期或者时间。
(2)显示器的驱动可采用“动态扫描驱动”的方式,用一片74LS244驱动。
(3)用两个键盘实现时间和日期的调整。
(4)用六个8550三极管驱动数码管
2.软件方案
(1)“时钟”基准时间由单片机内部的定时中断提供,定时时间是“秒”的整除数,设为50ms。
(2)用一个计数器对定时中断的次数进行计数,可实现“秒”定时,同理可以进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年”定时。
(3)动态扫描显示方式在更新显示内容时,因LED数码管余辉的存在可能会造成显示字符的模糊,新内容写入显示器之前将所有的LED数码管熄灭。
(4)关于自动识别“月大﹑月小”和“平年﹑润年”问题的考虑
a)月大和月小
2月另外计算;
4月﹑6月﹑9月﹑11月为月小30天,其余为月大31天。
b)平年和润年(年号能被4整除的就是润年)
平年的2月为28天;
润年的2月为29天。
四.程序流程图
主程序流程图
定时器T0中断子程序
显示子程序
外部中断1子程序
外部中断0子程序
五.电路原理图
电路原理图
元件清单:
AT89S521片
74LS2441个
7段共阳数码管6个
12M晶振1个
矩阵键盘按钮3个
PNP85506个
电阻10K2个
3K6个
330
8个
瓷片电容30pF2个
电解电容10uF1个
6针排针1个
系统的使用和操作说明
用K1调节调整标志位,K0调节时间日期切换和时间日期修改,K2复位
六、课程设计总结
通过这次课程设计,我们学到了很多书本上学不到的东西,也深刻的认识到自己对知识的掌握和运用还远远不足,这次课程设计也锻炼了我们独立思考问题的能力以及如何去检测解决问题,提高了我们的实际动手能力,积累了一些做课程设计的经验。
一周的课程设计,也起到了对所学知识的综合提高的作用,让我们对所学知识不仅仅是感性上的认识,对我们今后的学习起到启发作用。
附:
源代码
TICK_CNTEQU40H;T0溢出计数器
SECONDEQU41H;存储数据用真值,未用BCD码
MINUTEEQU42H
HOUREQU43H
DAYEQU44H
MONTHEQU45H
YEAREQU46H
YUSHUEQU47H;存放余数
FLASH_FLAGEQU27H;时间日期调整标志
;R7:
0-时间;1-日期
;中断向量表
ORG0000H
LJMPMAIN
ORG0003H
LJMPEX0_INT
ORG000BH
LJMPT0_INT
ORG0013H
LJMPEX1_INT
;主程序
ORG0030H
MAIN:
NOP
;初始化堆栈
MOVSP,#60H
;初始化变量
MOVSECOND,#0
MOVMINUTE,#0
MOVHOUR,#0
MOVDAY,#21
MOVMONTH,#1
MOVYEAR,#96
MOVFLASH_FLAG,#00H
MOVR7,#00H
;
MOVTL0,#0B0H;定时50ms
MOVTH0,#3CH
MOVTICK_CNT,#20;装计数初值(1s计数器)
MOVTMOD,#01H
SETBET0
SETBEX0
SETBEX1
SETBEA;开中断
SETBPX0
SETBPX1;设置中断优先级
SETBTR0;启动定时器T0
LOPP:
LCALLDISPLAY;调用显示子程序
LJMPLOPP
;-------------------------------------------------
;定时器0中断
T0_INT:
MOVTL0,#0B0H
MOVTH0,#3CH;重装载
DJNZTICK_CNT,NOT_1S;1秒到?
AJMPIS_1S
NOT_1S:
LJMPT0_RET
;1秒时间到
IS_1S:
PUSHACC
MOVA,SECOND
CJNEA,#59,IN3;59s到?
AJMPIN4
IN3:
LJMPSECOND_INC;秒加1
IN4:
MOVSECOND,#0;秒进位
MOVA,MINUTE
CJNEA,#59,IN5;59分到?
AJMPIN6
IN5:
LJMPMINUTE_INC
IN6:
MOVMINUTE,#0;分进位
MOVA,HOUR
CJNEA,#23,HOUR_INC;23h到?
MOVHOUR,#0;“时”进位
MOVA,MONTH
CJNEA,#2,NOT_FEB;是否二月?
;2月处理
;--------------------------
FEB:
NOP
ACALLDIV4
MOVA,YUSHU
CJNEA,#0,NOT_LEAP_Y;是否闰年?
LEAP_Y:
MOVA,DAY;闰年
CJNEA,#29,DAY_INC
MOVDAY,#1
MOVMONTH,#3
LJMPRESET_CNT
;非闰年
NOT_LEAP_Y:
MOVA,DAY
CJNEA,#28,DAY_INC;
MOVDAY,#1
MOVMONTH,#3
LJMPRESET_CNT
;---------------------------
;非2月处理
;30/31天?
NOT_FEB:
NOP
CJNEA,#4,Y01
AJMPMON_30D
Y01:
CJNEA,#6,Y02;是否小月?
AJMPMON_30D
Y02:
CJNEA,#9,Y03
AJMPMON_30D
Y03:
CJNEA,#11,T11
AJMPMON_30D
;31天
T11:
MOVA,DAY;大月
CJNEA,#31,DAY_INC
AJMPNEXT_MONTH
;30天
MON_30D:
MOVA,DAY;小月
CJNEA,#30,DAY_INC
;天进位
NEXT_MONTH:
MOVDAY,#1
MOVA,MONTH
CJNEA,#12,MONTH_INC
;月进位
MOVMONTH,#1
MOVA,YEAR
CJNEA,#99,YEAR_INC
MOVYEAR,#0
AJMPRESET_CNT
;年加1
YEAR_INC:
MOVA,YEAR
INCA
MOVYEAR,A
AJMPRESET_CNT
MONTH_INC:
MOVA,MONTH
INCA
MOVMONTH,A
AJMPRESET_CNT
DAY_INC:
MOVA,DAY
INCA
MOVDAY,A
AJMPRESET_CNT
HOUR_INC:
MOVA,HOUR
INCA
MOVHOUR,A
AJMPRESET_CNT
MINUTE_INC:
MOVA,MINUTE
INCA
MOVMINUTE,A
AJMPRESET_CNT
SECOND_INC:
MOVA,SECOND
INCA
MOVSECOND,A
RESET_CNT:
POPACC
MOVTICK_CNT,#20
T0_RET:
RETI
;--------------------------------------------------------------------
;-------------------------------------------------------------------
;sub:
LEDDisplay
;显示子程序
DISPLAY:
MOVDPTR,#TAB1;装段选表
MOVA,R7;
CJNEA,#00H,DISP_DATE;显示时间?
DISP_TIME:
MOVR0,#SECOND;
AJMPTSA
DISP_DATE:
MOVR0,#DAY;;显示日期
;显示时间或日期
TSA:
MOVA,@R0
MOVB,#10
DIVAB;取十位
MOVCA,@A+DPTR
MOVR2,A;存段选
MOVA,B;取个位
MOVCA,@A+DPTR
MOVR1,A;存段选
;------------
INCR0
MOVDPTR,#TAB1
MOVA,@R0
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVR4,A
MOVDPTR,#TAB2
MOVA,B
MOVCA,@A+DPTR
MOVR3,A
;-------------
INCR0
MOVDPTR,#TAB1
MOVA,@R0
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVR6,A
MOVDPTR,#TAB2
MOVA,B
MOVCA,@A+DPTR
MOVR5,A
;---------------------
;P1:
位选线
;P0:
段选线
TDP:
MOVP0,R1
MOVA,FLASH_FLAG
CJNEA,#03H,A02;是否闪烁?
AJMPA03
A02:
CJNEA,#06H,A04;
A03:
MOVA,TICK_CNT
RRCA
JNCA05
A04:
MOVP1,#0DFH;开D6
A05:
LCALLDELAY
MOVP1,#0FFH;关位选
MOVP0,R2
MOVA,FLASH_FLAG
CJNEA,#03H,B02
AJMPB03
B02:
CJNEA,#06H,B04
B03:
MOVA,TICK_CNT
RRCA
JNCB05
B04:
MOVP1,#0EFH;开D5
B05:
LCALLDELAY
MOVP1,#0FFH;关
;DisplayDS4
MOVP0,R3
MOVA,FLASH_FLAG
CJNEA,#02H,C02
AJMPC03
C02:
CJNEA,#05H,C04
C03:
MOVA,TICK_CNT
RRCA
JNCC05
C04:
MOVP1,#0F7H;开D4
C05:
LCALLDELAY
MOVP1,#0FFH;关
;DisplayDS3
MOVP0,R4
MOVA,FLASH_FLAG
CJNEA,#02H,D02
AJMPD03
D02:
CJNEA,#05H,D04
D03:
MOVA,TICK_CNT
RRCA
JNCD05
D04:
MOVP1,#0FBH;开D3
D05:
LCALLDELAY
MOVP1,#0FFH
;DisplayDS2
MOVP0,R5
MOVA,FLASH_FLAG
CJNEA,#01H,E02
AJMPE03
E02:
CJNEA,#04H,E04
E03:
MOVA,TICK_CNT
RRCA
JNCE05
E04:
MOVP1,#0FDH;开D2
E05:
LCALLDELAY
MOVP1,#0FFH
MOVP0,R6
MOVA,FLASH_FLAG
CJNEA,#01H,F02
AJMPF03
F02:
CJNEA,#04H,F04
F03:
MOVA,TICK_CNT
RRCA
JNCF05
F04:
MOVP1,#0FEH;开D1
F05:
LCALLDELAY
MOVP1,#0FFH
RET
;-------------------------------------------------------------------
D_CNT_2EQU28H
D_CNT_1EQU29H
D_CNT_4EQU30H
D_CNT_3EQU31H
;----------------------------------------
;短延时
DELAY:
MOVD_CNT_2,#2
D_LOOP2:
MOVD_CNT_1,#100;[1]
D_LOOP1:
DJNZD_CNT_1,D_LOOP1;[2]
DJNZD_CNT_2,D_LOOP2;[2]
RET
;长延时(用于键盘去抖动)
DELAY2:
MOVD_CNT_4,#60
D_LOOP4:
MOVD_CNT_3,#100;[1]
D_LOOP3:
DJNZD_CNT_3,D_LOOP3;[2]
DJNZD_CNT_2,D_LOOP4;[2]
RET
;----------------------------------------
;除法子程序,用于判断闰年
DIV4:
PUSHACC
PUSHB
MOVA,YEAR
MOVB,#4
DIVAB
MOVYUSHU,B
POPACC
POPB
RET
;---------------------------------------------------------
;外部中断0
;sub:
INT0interrupt
;处理按键K0,切换时间/日期显示或者调整时间
EX0_INT:
PUSHACC
LCALLDELAY2;长延时,去抖动
JBP3.2,OUT
MOVA,FLASH_FLAG;装标志位
CJNEA,#00H,JYY;是否为零?
MOVA,R7;R7取反
XRLA,#0FFH
MOVR7,A
OUT:
LJMPEX0_RET
;-------------------------------------------------------
JYY:
CJNEA,#01H,JMM
;调节年
MOVA,YEAR
CJNEA,#99,YY0
MOVYEAR,#0
LJMPYYF
YY0:
INCA
MOVYEAR,A
YYF:
LJMPEX0_RET
;---------------------------------------
JMM:
CJNEA,#02H,JDD
;调节月
MOVA,MONTH
CJNEA,#12,MM0
MOVMONTH,#1
LJMPMMF
MM0:
INCA
MOVMONTH,A
MMF:
LJMPEX0_RET
;***********************************************************
JDD:
CJNEA,#03H,ADH;调节天
MOVA,MONTH
CJNEA,#2,NFB
IFB:
NOP
LCALLDIV4
MOVA,YUSHU
CJNEA,#0,ANG
ARN:
MOVA,DAY
CJNEA,#29,D0A
LJMPD0B
D0A:
LJMPDDA
D0B:
LJMPDD1
ANG:
MOVA,DAY
CJNEA,#28,D0A
LJMPDD1
NFB:
NOP
CJNEA,#4,Y04
LJMPAD1
Y04:
CJNEA,#6,Y05
LJMPAD1
Y05:
CJNEA,#9,Y06
LJMPAD1
Y06:
CJNEA,#11,Y07
LJMPAD1
Y07:
NOP
MOVA,DAY
CJNEA,#31,D0A
LJMPDD1
AD1:
NOP
MOVA,DAY
CJNEA,#30,D0A
DD1:
MOVDAY,#1
LJMPDDF
DDA:
MOVA,DAY
INCA
MOVDAY,A
DDF:
LJMPEX0_RET
;---------------------------------------------------
ADH:
CJNEA,#04H,ADM;调节时
MOVA,HOUR
CJNEA,#23,JH0
MOVHOUR,#0
LJMPJHF
JH0:
MOVA,HOUR
INCA
MOVHOUR,A
JHF:
LJMPEX0_RET
;-----------------------------------------
ADM:
CJNEA,#05H,ADS;调节分
MOVA,MINUTE
CJNEA,#59,JM0
MOVMINUTE,#0
LJMPJMF
JM0:
MOVA,MINUTE
INCA
MOVMINUTE,A
JMF:
LJMPEX0_RET
ADS:
MOVA,SECOND;调节秒
CJNEA,#59,JS0
MOVSECOND,#0
LJMPEX0_RET
JS0:
MOVA,SECOND
INCA
MOVSECOND,A
EX0_RET:
NOP
JNBP3.2,EX0_RET;判断键盘是否释放
POPACC
RETI
;---------------------------------------------------------
;处理按键K1
EX1_INT:
PUSHACC
LCALLDELAY2;长延时,去抖动
JBP3.3,EX1_RET
NOP
MOVA,R7
CJNEA,#00H,DIS_DATE
;显示时间
MOVA,FLASH_FLAG
CJNEA,#00H,ED2
MOVFLASH_FLAG,#04H;标志位置04
AJMPEX1_RET
ED2:
CJNEA,#06H,ED1
;reach06H
MOVFLASH_FLAG,#00H;重置为0
AJMPEX1_RET
;显示日期
DIS_DATE:
MOVA,FLASH_FLAG
CJNEA,#03H,ED1
;==03H
MOVFLASH_FLAG,#00H;重置为0
AJMPEX1_RET
;标志加1,
ED1:
INCA
MOVFLASH_FLAG,A
EX1_RET:
NOP
JNBP3.3,EX1_RET
POPACC
RETI
;----------------------------------------------
;codetable
TAB1:
DB0c0h,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TAB2:
DB040H,79H,24H,30H,19H,12H,02H,78H,00H,10H
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机实验 电子日历 单片机 实验 电子 日历