最新毕业设计基于单片机的电子日历时钟.docx
- 文档编号:27496392
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:41
- 大小:640.56KB
最新毕业设计基于单片机的电子日历时钟.docx
《最新毕业设计基于单片机的电子日历时钟.docx》由会员分享,可在线阅读,更多相关《最新毕业设计基于单片机的电子日历时钟.docx(41页珍藏版)》请在冰豆网上搜索。
最新毕业设计基于单片机的电子日历时钟
一课程设计题目:
电子日历时钟
二实现的功能:
基本功能:
(1)显示北京时间,并且能够校准时间;
(2)程序使用汇编语言;
(3)显示的时、分、秒之间以及年、月、日间以小数点分隔;
(4)显示公历日期,并且能够校准日期;
发挥功能:
(5)运动秒表;
(6)闹钟功能;
(7)自动整点报时。
三课程设计的目的:
课程标志性内容的设计理解和综合运用,对所学内容进行一次实操,学以致用。
四、设计方案说明
1、硬件部分
(1)采用6位LED数码管显示日期或者时间。
(2)显示器的驱动采用“动态扫描驱动”,且采用“一键多用”的设计方案,系统电路大为简化。
使用小数点表示闹钟设置状态;
(3)电路连接使用PCB,使电路连接简洁美观
2、软件部分
(1)“时钟”基准时间由单片机内部的定时中断提供,考虑因素:
定时时间是“秒”的整除数,且长短适宜。
最长不能超过16位定时器的最长定时时间;最短不能少于中断服务程序的执行时间。
基准时间越短,越有利于提高时钟的运行精确度。
基准时间定为0.05秒。
(2)用一个计数器对定时中断的次数进行计数,由基准时间为0.05秒知计数值为20即可实现实现“秒”定时,同理进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年”定时。
(3)LED数码管显示器采用“动态扫描驱动”考虑问题:
驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。
(4)动态扫描显示方式在更新显示内容时,考虑到因LED数码管余辉的存在可能会造成显示字符的模糊,所以新内容写入显示器之前将所有的LED数码管熄灭。
(5)关于自动识别“月大﹑月小”和“平年﹑润年”问题的考虑
a)月大和月小
2月另外计算;
4月﹑6月﹑9月﹑11月为月小30天,其余为月大31天。
b)平年和润年(年号能被4整除的就是润年)
平年的2月为28天;
润年的2月为29天。
五、使用说明
实物图请参照后面附带图片,从左至右为按键K2,K1,K0,以两个LED显示器为一组,左中右显示时分秒或者年月日,还有闹钟和秒表
K2:
复位K1:
设置闪烁K0:
切换时间/日期或者调整时间/日期
初始状态:
接上电源之后,日期默认为10年6月21日,时间为0时0分
秒,闹钟2点整但默认关闭,秒表为0状态
(1)显示状态切换:
不断按K0键就会依次循环显示下面的状态
初始状态时间
日期
闹钟时间
闹钟状态
秒表状态
(2)调节时间,日期:
按K0键切换到想要调节的显示状态,再按K1键选择要修改的位,不断按K1键会按左闪烁.中闪烁.右闪烁.确定.四个状态切换,闪烁的位可以修改,按K0键可以实现增加,不能递减,例如要调慢时间要按到循环到较慢时间。
(3)闹钟使用:
闹钟默认响的时间为一分钟,闹钟的时间设置同时间日期的调节,只需把状态切换到闹钟时间的状态,闹钟的开关先按K0键切换到屏幕显示为OFF的状态,如下:
再按K1可切换到开状态,如下图,再按K1可关闭,不断循环
(4)秒表:
K0键按4下就可切换到秒表状态,出示为0,此时按下K1键就可开始计时,再按一下K1键可停止,此时K1为秒表开关,按K0键可再切换显示其他。
六、硬件连接图
1、原理图
2、pcb图
3、实物图
七、程序流程图:
1.主程序
2.定时器0中断子程序
3.外部中断0子程序
4.外部中断1子程序
八、性能测试与故障排查
1、硬件部分
问题:
断路。
现象:
程序下载完之后可以工作但是6个LED显示器有2个没亮。
分析:
因为其他几个显示器完全正常,这两个则完全没亮,所以推断是位选的线路出故障。
检测:
用万用表测试各点电压,着重测试两条位选线路的断路与短路情况,最终发现两处断路。
解决:
焊锡接上,最终全亮
2、软件部分
偶数组实现基础功能的程序老师已经提供,该程序基本没有多大的问题,就是里面的几个参数需要修改,同时还有一个小bug。
修改一:
由于提供的程序所默认采取的晶振计数频率是6MHz,但是所提供的现实原件则是12MHz,所以根据晶振的不同,定时器的定时时间变为0.05s。
按照该程序直接跑的话,计数时间为0.5s。
这就需要设置计数次数TICK_CNT为#14H,即0.05s*20=1s。
代码段:
MOVTICK_CNT,#14H
修改二:
程序默认设置的外部中断延时过短,导致操作过于“灵敏”,也即按键K0、K1按下时,跳变过快。
这里所说的延时是中断子程序EX0_INT和EX1_INT中的语句
LCALLDIS_DELAY。
解决这个情况只需修改DELAY次数,则DIS_DELAY:
MOVD_CNT_DIS,#10H。
修改三:
观察实物电路工作发现每一位:
LED数码管的小数点都是亮的,没有起到用小数点区分时间/日期中的时分秒/年月日。
要解决这个问题,在显示子程序中TSA代码段的MOVRxA前插入语句ADDA,#80H(x=1、2、4、6)。
以及加上发挥部分的拓展功能:
秒表和闹钟。
九、原件清单
品名
型号
数量
LED七段数码管
共阳BS
6
三极管
S8550
7
电阻
3k
8
电阻
200Ω
9
电阻
4.7k
1
微型按钮
4脚
3
瓷片电容
30p
2
电解电容
10uf
1
晶体振荡器
12MHz
1
小型蜂鸣器
自发声
1
排针
无
6
IC
AT89S52
1
IC
74LS244
1
IC座
40脚
1
IC座
20脚
1
十、心得体会与总结
这个学期做了两个与汇编有关的课程设计(不过这次是大作业),一次是开学初的微机原理课程设计,还有就是这次单片机原理大作业。
上次基本上只与程序打交道,硬件部分实操不多。
而这次大作业则是硬件、软件两方面都有兼顾,且两者所花的时间也都不少。
虽然从老师那已经获取了原理图和程序,但这是我们第一次比较系统的从熟悉软件操作到软硬件设计了解整个流程。
硬件部分,由于先前我们都没有操作过protel之类的软件,所以一切从零开始,针对这次大作业需要,学习了protel软件的基本操作、原理图的绘制修改、原件的封装以及原件集成库的创建,当然还有PCB板的排线。
之后就是PCB图打印,电路板热压制、腐蚀、钻孔,元器件的焊接。
流程很简洁,过程很纠结。
我们一步一个脚印地制作着,生怕哪个步骤出错而导致前功尽废。
不过在我们不懈努力下终于走完。
但是焊接的不仔细——两个电阻虚焊,使后来电路出现问题,也排查了好久,需要记住教训。
软件部分,虽然老师已经给了具备基本功能的程序,但是仍需看懂弄懂,后期才能更好地发现问题以及修改添加功能。
我发现这个过程也并非一件易事,清楚认识每一句的作用也需要经常查阅书籍。
另外在硬件焊接已经实现后我们把两者结合在一起,通过下载器把程序烧进52单片机中实现既定功能,发现上面故障排查中出现的问题,继而针对每个问题分别从软硬件寻找解决方法,这个过程我认为收获更大,能让我们更清楚熟悉软硬件两者的运作方法。
而且我俩分工是按硬件、软件而分的,自个儿认为分工尚算明确,各司其职。
十一、程序附录
;wahaha.asm
;(ElectronicCalendarandClock)
;ReferenceforGrade2008,s.c.u.t.
;Key0(forshift/adjust)connectedtoINT1
;Key1(forun-flash/flash)connectedtoINT0
;学生姓名:
陈晓伟、冯劲增
;学生学号:
200830240144,200830240229
;分组编号:
004
;变量定义
TICK_CNTEQU20H;T0倍乘
;------------------
SECOND_BCDEQU21H;时间记录
MINUTE_BCDEQU22H
HOUR_BCDEQU23H
DAY_BCDEQU24H;日期记录
MONTH_BCDEQU25H
YEAR_BCDEQU26H
;------------------
FLASH_FLAGEQU27H;是否闪烁
DIS_FLAGEQUR7;当前显示内容标志;DIS_FLAG:
0-时间;1-日期;2-闹钟;3-闹钟开关;4-秒表
;------------------
NSECOND_BCDEQU2BH;闹钟时间
NMINUTE_BCDEQU2CH
NHOUR_BCDEQU2DH
;------------------
TCC_BCDEQU2EH;秒表计时器
TBB_BCDEQU2FH
TAA_BCDEQU30H
;------------------
TIMER_FLAGEQU31H;秒表模式
TIMER_START_FLAGEQU32H;秒表开始
;------------------
ALAM_STATEEQU33H;闹钟开启标志
;------------------
DI_40HEQU34H;提示音延时变量
DI_41HEQU35H;延时
;------------------
ALAM_ON1EQU36H;闹钟状态显示
ALAM_ON2EQU37H
ALAM_ON3EQU38H
ALAM_OFF1EQU39H
ALAM_OFF2EQU3AH
ALAM_OFF3EQU3BH
;------------------
;中断向量表
ORG0000H
LJMPMAIN
ORG0003H
LJMPEX0_INT;portINT0
ORG000BH
LJMPT0_INT;portT0
ORG0013H
LJMPEX1_INT;portINT1
;主程序
ORG0030H
MAIN:
NOP;mainprogram
;初始化堆栈
MOVSP,#60H
;初始化变量
MOVSECOND_BCD,#00H;BCDof"second"
MOVMINUTE_BCD,#00H;BCDof"minute"
MOVHOUR_BCD,#00H;BCDof"hour"
MOVNSECOND_BCD,#00H;闹钟BCDof"second"
MOVNMINUTE_BCD,#00H;闹钟BCDof"minute"
MOVNHOUR_BCD,#06H;闹钟BCDof"hour"
MOVTCC_BCD,#00H;秒表BCDof"second"
MOVTBB_BCD,#00H;秒表BCDof"minute"
MOVTAA_BCD,#00H;秒表BCDof"hour"
MOVTIMER_START_FLAG,#00H;秒表工作标志
MOVTIMER_FLAG,#00H;秒表模式标志
MOVDAY_BCD,#21H;BCDof"day"
MOVMONTH_BCD,#06H;BCDof"month"
MOVYEAR_BCD,#010H;BCDof"year"
MOVFLASH_FLAG,#00H;flagforun-flash/flash
MOVDIS_FLAG,#00H;flagforshift(time/date)
MOVALAM_ON1,#55H;BCDOFF闹钟状态显示
MOVALAM_ON2,#01H
MOVALAM_ON3,#55H
MOVALAM_OFF1,#63H
MOVALAM_OFF2,#42H
MOVALAM_OFF3,#33H
MOVALAM_STATE,#00H;初始化闹钟状态为OFF
;------------------
MOVTL0,#0B0H;constantfor0.05s
MOVTH0,#3CH;65536-15536=50,000for12MHz
MOVTICK_CNT,#14H;timesofoverflow0.05*20=1s
MOVTMOD,#01H;Mode1forT0,TimerMode
SETBET0;openT0
SETBEX0;openINT0,Key1
SETBEX1;openINT1,Key0
SETBEA;totalopen
SETBPT0;priorityforT0,高优先级
SETBTR0;startT0,Run
SCAN_HOUR:
;闹钟扫描
MOVA,SECOND_BCD
CJNEA,#00H,SCANALARM
MOVA,MINUTE_BCD
CJNEA,#00H,SCANALARM
HOUR:
CLRP2.0
NOP;整点,滴
SETBP2.0
SCANALARM:
;闹钟扫描
MOVA,ALAM_STATE
JZSCAN_HOUR;闹钟开关已打开?
MOVA,NHOUR_BCD
CJNEA,HOUR_BCD,WAIT
MOVA,NMINUTE_BCD
CJNEA,MINUTE_BCD,WAIT
ALARM:
CLRP2.0;闹铃:
滴滴滴滴``````
SETBP2.0
CLRP2.0
SETBP2.0
CLRP2.0
SETBP2.0
CLRP2.0
SETBP2.0
NOP
NOP
NOP
WAIT:
SETBP2.0
SJMPSCAN_HOUR;waitforinterrupt
;-------------------------------------------------
;sub:
T0interrupt
;定时器0中断
T0_INT:
PUSHACC
MOVTL0,#0B0H;constantfor0.05s
MOVTH0,#3CH;Timer0重装载
MOVA,TIMER_START_FLAG
CJNEA,#01H,TIMER_NEXT;秒表模式?
LJMPTIMER_INC;秒表计时
TIMER_NEXT:
DJNZTICK_CNT,NOT_1S;isupto1second?
SJMPIS_1S
NOT_1S:
LJMPT0_RET
;1秒时间到
IS_1S:
MOVA,SECOND_BCD;takeBCDof"second"
CJNEA,#59H,IN3;isupto59seconds?
SJMPIN4
IN3:
LJMPSECOND_INC;秒加1
IN4:
MOVSECOND_BCD,#00H;秒进位
MOVA,MINUTE_BCD;takeBCDof"minute"
CJNEA,#59H,IN5;isupto59minutes?
SJMPIN6
IN5:
LJMPMINUTE_INC
IN6:
MOVMINUTE_BCD,#00H;分进位
MOVA,HOUR_BCD;takeBCDof"hour"
CJNEA,#23H,HOUR_INC;isupto23hours?
MOVHOUR_BCD,#00H;"时"进位
MOVA,MONTH_BCD;takeBCDof"month"
CJNEA,#02H,NOT_FEB;isFebruary?
;2月处理
;--------------------------
FEB:
NOP
ACALLBCD_DIV4;BCDof"yearin26H"dividedby4
MOVA,R3;remainderinR3
CJNEA,#00H,NOT_LEAP_Y;"00"meansleapyear
;闰年,29天
LEAP_Y:
MOVA,DAY_BCD;takeBCDof"day"inFeb.
CJNEA,#29H,DAY_INC;isupto29days(leapyear)?
MOVDAY_BCD,#01H;keepthefirstday
MOVMONTH_BCD,#03H;increase"month"
SJMPRESET_CNT
;非闰年
NOT_LEAP_Y:
MOVA,DAY_BCD;takeBCDof"day"inFeb.
CJNEA,#28H,DAY_INC;isupto28days(commonyear)?
MOVDAY_BCD,#01H;keepthefirstday
MOVMONTH_BCD,#03H;increase"month"
SJMPRESET_CNT
;---------------------------
;非2月处理
;30/31天?
NOT_FEB:
NOP;other"month"exceptFeb.
CJNEA,#04H,Y01;isApril?
AJMPMON_30D
Y01:
CJNEA,#06H,Y02;isJune?
AJMPMON_30D
Y02:
CJNEA,#09H,Y03;isSeptember?
AJMPMON_30D
Y03:
CJNEA,#11H,T11;isNovember?
AJMPMON_30D
;31天
T11:
MOVA,DAY_BCD;takeBCDof"day"
CJNEA,#31H,DAY_INC;isupto31days?
AJMPNEXT_MONTH
;30天
MON_30D:
MOVA,DAY_BCD;takeBCDof"day"
CJNEA,#30H,DAY_INC;isupto30days?
;天进位
NEXT_MONTH:
MOVDAY_BCD,#01H;keepthefirstday
MOVA,MONTH_BCD;takeBCDof"month"
CJNEA,#12H,MONTH_INC;isDecember?
;月进位
MOVMONTH_BCD,#01H;keepthefirstmonth
MOVA,YEAR_BCD;takeBCDof"year"
CJNEA,#99H,YEAR_INC;isupto99years?
MOVYEAR_BCD,#00H;keepthefirstyear
SJMPRESET_CNT
;年加1
YEAR_INC:
MOVA,YEAR_BCD;takeBCDof"year"
ADDA,#01H;increase"year"
DAA;adjustBCD
MOVYEAR_BCD,A;keep"year"
SJMPRESET_CNT
MONTH_INC:
MOVA,MONTH_BCD;takeBCDof"month"
ADDA,#01H;increase"month"
DAA;BCD码调整
MOVMONTH_BCD,A;keep"month"
SJMPRESET_CNT
DAY_INC:
MOVA,DAY_BCD;takeBCDof"day"
ADDA,#01H;increase"day"
DAA;BCD码调整
MOVDAY_BCD,A;keep"day"
SJMPRESET_CNT
HOUR_INC:
MOVA,HOUR_BCD;takeBCDof"hour"
ADDA,#01H;increase"hour"
DAA;BCD码调整
MOVHOUR_BCD,A;keep"hour"
SJMPRESET_CNT
MINUTE_INC:
MOVA,MINUTE_BCD;takeBCDof"minute"
ADDA,#01H;increase"minute"
DAA;BCD码调整
MOVMINUTE_BCD,A;keep"minute"
SJMPRESET_CNT
SECOND_INC:
MOVA,SECOND_BCD;takeBCDof"second"
ADDA,#01H;increase"second"
DAA;BCD码调整
MOVSECOND_BCD,A;saveback"second"
RESET_CNT:
MOVTICK_CNT,#14H;retrievetimesofoverflow
T0_RET:
POPACC
RETI
;--------------------------------------------------------------------
;秒表增
TIMER_INC:
TCC_INC:
MOVA,TCC_BCD;takeBCDof"0.05S"
CLRC
SUBBA,#95H
JZTBB_INC
MOVA,TCC_BCD
ADDA,#05H;increase"0.05S"
DAA;BCD码调整
MOVTCC_BCD,A;keep"0.05S"
AJMPTIMER_OUT
TBB_INC:
MOVTCC_BCD,#00H
MOVA,TBB_BCD;takeBCDof
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 毕业设计 基于 单片机 电子 日历 时钟