单片机数字钟Word格式.docx
- 文档编号:22151341
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:26
- 大小:678.76KB
单片机数字钟Word格式.docx
《单片机数字钟Word格式.docx》由会员分享,可在线阅读,更多相关《单片机数字钟Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
3系统软件设计
1)主流程图:
图6主流程图
流程图说明
初始化:
包括定时器赋初值,初始化各内存单元。
开定时器中断,开CPU中断,送段码表头地址给DPTR。
2)显示子程序流程图
图7显示子程序流程图
3)按键扫描子程序
图8按键扫描子程序流程图
4)模式查询子程序
图9模式查询子程序流程图
图10走时模式流程图
日期显示及调整子程序与闹钟显示及调整子程序流程图与调时模式子程序大同小异。
a)日期显示及调整子程序送给R3/R4/R5的数据为日/月/年,按功能键1日期加1,按功能键2月份加1。
至于数值的合法性在程序里有具体的判断。
b)闹钟显示及调整子程序送给R3/R4/R5的数据为闹钟开关值/闹钟分/闹钟时,按功能键1闹钟分加1,按功能键2闹钟时加1。
图11调时模式流程图
5)闹钟查询子程序
图12闹钟查询子程序流程图
6)定时器中断子程序
数值合法性在程序中处理与判断,流程图中不表现。
图13定时器中断子程序流程图
4系统调试与结果分析
Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。
编译通过只能说明程序没有语法上的错误。
进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。
许多超出预期效果的现象往往是一些微小错误引起的。
例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。
又如有些想达成某些功能而添加的语句,实际上确一点效果也没有。
举个编程中的小问题:
当有按键按下时,为了防止按键跳转,设置软件防抖程序,利用中断控制按键防抖。
仿真结果:
1、时间仿真结果(时间设置为:
1时1分)
图14时间仿真结果
2、日期仿真结果(日期设置为12年6月24日)
图15日期仿真结果
3、闹钟仿真结果(时间设置为1时2分:
注意观察蜂鸣器高低电平变化)
图16闹钟仿真结果
5结论
硬件设计部分:
首先要通过计算与参考资料等决定参数。
而后通过仿真软件Protues和Keil调试,确定参数无误后再开始用Protel画原理图,进而生成PCB板。
软件设计部分:
设计软件首先要考虑要做的功能,确定出合理的算法。
合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。
有的人为了实现某种功能用了各种各样的方法来实现,结果程序结构无法实现,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。
在设计过程中我们认识到态度要积极,不要认为很简单就不紧不慢。
很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。
在编写程序过程中我们遇到了许多问题,比如设计闹钟子程序的时候就花了很长时间,最后在我们共同的努力下才完成了对其的设计。
同时,我们也认识到了团队合作很重要,只有大家共同努力才能完成对其的设计。
也让我们明白了对于自己不能太过于自信,态度决定一切。
参考文献:
[1]杨欣,王玉凤,刘湘黔,张延强,51单片机应用实例详解,清华大学出版社
[2]洪志刚,杜维玲,井娥林,单片机应用系统设计,机械工业出版社
[3]潘永雄,新编单片机原理及应用,西安电子科技大学出版社
[4]胡启明,程钢,51单片机应用开发从入门到精通,人民邮电出版社
[5]王守中,51单片机开发入门与典型实例,人民邮电出版社
附录一:
protel原理图
附录二:
protelPCB板图
附录三:
protues电路图
附录四:
程序源代码
YEAR_LEQU31H;
年份的低位
MONTHEQU32H;
月份
DAYEQU33H;
日期
DAY_MAXEQU34H;
每月最大天数
HOUREQU35H;
时钟
MINUTEEQU36H;
分钟
SECONDEQU37H;
秒钟
BOTTONEQU38H;
键值
FLAGEQU39H;
模式标记/0走时/1调时/2日期显示及调整/3闹钟调整及闹钟开关/
BEEPHEQU40H;
闹钟时钟
BEEPMEQU41H;
闹钟分钟
ENBEEPEQU42H;
闹钟开关
ORG0000H
AJMPMAIN
ORG0003H
AJMPINTZ
ORG001BH
AJMPSERVE
MAIN:
CLRA
MOVR2,#14H
MOVTMOD,#10H;
设为模式1,定时器1
MOVMONTH,#06;
月份赋6
MOVDAY,#24H;
日期赋24
MOVYEAR_L,#12H;
年份赋12年
MOVHOUR,A;
小时清零
MOVMINUTE,A;
分钟清零
MOVSECOND,A;
秒钟清零
MOVFLAG,A;
初始化模式
CLRP3.7;
开蜂鸣器
MOVENBEEP,#01H;
闹钟默认开
MOVBEEPH,#00H;
闹钟初值00:
00:
00
MOVBEEPM,#00H
MOVTH1,#4CH;
赋定时初值
MOVTL1,#00H
SETBET1;
开中断
SETBIT0
SETBEX0
SETBEA
SETBTR1;
启动T1
MOVDPTR,#TAB;
送段码表头
DIS:
LCALLDISPLAY;
重复调用显示子程序
LCALLNEXT;
查询当前模式
LCALLBEEP;
查询闹钟开关
SJMPDIS
SERVE:
PUSHPSW;
保护现场
PUSHACC
MOVTH1,#4CH
MOVTL1,#00H;
重新赋计数初值
DJNZR2,BRIDGE;
未满20次,返回
AJMPBREAK1
BRIDGE:
LJMPRETURN
BREAK1:
MOVR2,#14H;
重置中断次数
MOVA,#01H;
秒加1
ADDA,SECOND
DAA;
转为BCD码
MOVSECOND,A
CJNEA,#60H,BRIDGE;
未满60秒,返回
MOVSECOND,#00H;
秒清零
分加1
ADDA,MINUTE
MOVMINUTE,A
CJNEA,#60H,RETURN;
未满60分,返回
MOVMINUTE,#00H;
时加1
ADDA,HOUR
MOVHOUR,A
CJNEA,#24H,RETURN;
未满24小时,返回
MOVHOUR,#00H;
小时清零
MOVA,MONTH
CJNEA,#1H,JUDGE2;
不是1月,转跳
AJMPSETDAT_MAX1
JUDGE2:
CJNEA,#3H,JUDGE3;
不是3月,转跳
JUDGE3:
CJNEA,#5H,JUDGE4;
不是5月,转跳
AJMPSETDAT_MAX1
JUDGE4:
CJNEA,#7H,JUDGE5;
不是7月,转跳
JUDGE5:
CJNEA,#8H,JUDGE6;
不是8月,转跳
JUDGE6:
CJNEA,#10H,JUDGE7;
不是10月,转跳
JUDGE7:
CJNEA,#12H,SETDAT_MAX2;
不是12月,转跳
SETDAT_MAX1:
MOVDAY_MAX,#32H;
天上限为31
AJMPCONTINUE;
返回
SETDAT_MAX2:
CJNEA,#2H,SETDAT_MAX3;
不是2月,跳转
MOVDAY_MAX,#29H;
2月,天上限28
SETDAT_MAX3:
MOVDAY_MAX,#31H;
天上限为30
CONTINUE:
天加1
ADDA,DAY
MOVDAY,A
CJNEA,DAY_MAX,RETURN;
未满天数上限,返回
MOVDAY,#01H;
天数置1
月份加1
ADDA,MONTH
MOVMONTH,A
CJNEA,#13,RETURN;
未满12月,返回
MOVMONTH,#01H;
月份置1
年低位加1
ADDA,YEAR_L
MOVYEAR_L,A
CJNEA,#99,RETURN;
未满99年,返回
MOVYEAR_L,#00H;
年低位清零
RETURN:
POPACC
POPPSW;
恢复现场
RETI;
中断返回
;
========显示子程序==========
DISPLAY:
PUSHPSW
MOVA,R3
ANLA,#0FH
MOVCA,@A+DPTR
MOVP2,#0DFH;
位选P2.5口显示秒低位
MOVP0,A;
段选显示数字
LCALLDELAY
SWAPA
MOVCA,@A+DPTR
MOVP2,#0EFH;
位选P2.4口显示秒高位
MOVP0,A
MOVA,R4
MOVP2,#0F7H;
位选P2.3口显示分低位
MOVP2,#0FBH;
位选P2.2口显示分低位
LCALLDELAY
MOVA,R5
MOVP2,#0FDH;
位选P2.1口显示时低位
MOVP2,#0FEH;
位选P2.0口显示时低位
POPPSW
RET
===========按键中断==========
INTZ:
KEY:
MOVP1,#0FFH
MOVA,P1
CPLA
ANLA,#07H;
判断是否有按键按下
JNZKEY1
RETI
KEY1:
MOVA,P1
ANLA,#07H
JNZKEY2
KEY2:
MOVBOTTON,A
JBACC.0,SETMODE
SETMODE:
MOVA,FLAG
INCA
MOVFLAG,A
CJNEA,#04H,I1
MOVFLAG,#00H
AJMPEXIT
I1:
LCALLNEXT
EXIT:
RETI
==========模式查询程序======
NEXT:
MOVA,FLAG
CJNEA,#00H,SETTIME
SETBTR1
MOVR3,SECOND
MOVR4,MINUTE
MOVR5,HOUR
MOVA,BOTTON
JBACC.1,STOP
JBACC.2,STOP
=========闹钟开关/查询===========
BEEP:
MOVA,FLAG
CJNEA,#00H,STOP
MOVA,ENBEEP
CJNEA,#01H,STOP
BEEPLAY:
MOVA,HOUR
CJNEA,BEEPH,STOP
MOVA,MINUTE
CJNEA,BEEPM,STOP
CLRP3.7;
闹钟开启
STOP:
SETBP3.7;
闹钟关闭
MOVBOTTON,#00H
=============调时程序=============
SETTIME:
CLRTR1
CJNEA,#01H,SETDATE
MOVR5,HOUR
JBACC.1,MIN
JBACC.2,HOR
MIN:
MOVA,#01H;
DAA
CJNEA,#60H,BACK
MOVMINUTE,#00H
MOVBOTTON,#00H
HOR:
DAA
CJNEA,#24H,BACK
MOVHOUR,#00H
BACK:
========日期显示及调整子程序=======
SETDATE:
CJNEA,#02H,SETBEEP
MOVR3,DAY
MOVR4,MONTH
MOVR5,YEAR_L
MOVA,BOTTON
JBACC.1,DAYS
JBACC.2,MO
DAYS:
CJNEA,#1H,JUDGEA;
AJMPSETDAT_MAXA
JUDGEA:
CJNEA,#3H,JUDGEB;
JUDGEB:
CJNEA,#5H,JUDGEC;
AJMPSETDAT_MAXA
JUDGEC:
CJNEA,#7H,JUDGED;
JUDGED:
CJNEA,#8H,JUDGEE;
JUDGEE:
CJNEA,#10H,JUDGEF;
JUDGEF:
CJNEA,#12H,SETDAT_MAXB;
SETDAT_MAXA:
MOVDAY_MAX,#32H;
AJMPCONTINUE1;
SETDAT_MAXB:
CJNEA,#2H,SETDAT_MAXC;
不是2月,转跳
MOVDAY_MAX,#29H
SETDAT_MAXC:
CONTINUE1:
MOVA,#01H;
CJNEA,DAY_MAX,BACK1
MOVDAY,#01H
MO:
MOVA,#01H
CJNEA,#13H,BACK1
MOVMONTH,#01H
BACK1:
============闹钟调整程序===========
SETBEEP:
MOVR3,ENBEEP
MOVR4,BEEPM
MOVR5,BEEPH
JBACC.1,SETM
JBACC.2,SETH
SETM:
闹钟分加1
ADDA,BEEPM
MOVBEEPM,A
CJNEA,#60H,BACK2
SETH:
MOVA,#01H;
闹钟时加1
ADDA,BEEPH
MOVBEEPH,A
CJNEA,#24H,BACK2
MOVBEEPH,#00H
BACK2:
============延时子程序=============
DELAY:
MOVR0,#06H
DELAY1:
MOVR1,#0B2H
DJNZR1,$
DJNZR0,DELAY1
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H;
段码
DB92H,82H,0F8H,80H,90H
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 数字