1、3 系统软件设计1)主流程图:图6 主流程图流程图说明初始化:包括定时器赋初值,初始化各内存单元。开定时器中断,开CPU中断,送段码表头地址给DPTR。2)显示子程序流程图图7 显示子程序流程图3)按键扫描子程序图8按键扫描子程序流程图4)模式查询子程序图9模式查询子程序流程图图10 走时模式流程图日期显示及调整子程序与闹钟显示及调整子程序流程图与调时模式子程序大同小异。a)日期显示及调整子程序送给R3/R4/R5的数据为日/月/年,按功能键1日期加1,按功能键2月份加1。至于数值的合法性在程序里有具体的判断。b)闹钟显示及调整子程序送给R3/R4/R5的数据为闹钟开关值/闹钟分/闹钟时,按功
2、能键1闹钟分加1,按功能键2闹钟时加1。图11 调时模式流程图5)闹钟查询子程序图12 闹钟查询子程序流程图6)定时器中断子程序数值合法性在程序中处理与判断,流程图中不表现。图13定时器中断子程序流程图4 系统调试与结果分析Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。编译通过只能说明程序没有语法上的错误。进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。许多超出预期效果的现象往往是一些微小错误引起的。例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。又如有些想达成某些功能而添加的语句,实际上确一点效果也没有。举个编程中的小问题:当有按键按下时,为
3、了防止按键跳转,设置软件防抖程序,利用中断控制按键防抖。仿真结果:1、时间仿真结果(时间设置为:1时1分)图14时间仿真结果2、日期仿真结果(日期设置为12年6月24日)图15日期仿真结果3、闹钟仿真结果(时间设置为1时2分:注意观察蜂鸣器高低电平变化)图16闹钟仿真结果5 结论硬件设计部分:首先要通过计算与参考资料等决定参数。而后通过仿真软件Protues和Keil调试,确定参数无误后再开始用Protel画原理图,进而生成PCB板。软件设计部分:设计软件首先要考虑要做的功能,确定出合理的算法。合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。有的人为了实现某种功能用了各种各样的方
4、法来实现,结果程序结构无法实现,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。在设计过程中我们认识到态度要积极,不要认为很简单就不紧不慢。很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。在编写程序过程中我们遇到了许多问题,比如设计闹钟子程序的时候就花了很长时间,最后在我们共同的努力下才完成了对其的设计。同时,我们也认识到了团队合作很重要,只有大家共同努力才能完成对其的设计。也让我们明白了对于自己不能太过于自信,态度决定一切。参考文献:1杨欣,王玉凤,刘湘黔,张延强,51单片机应用实例详解,清华大学出版社2洪志刚,杜维玲
5、,井娥林,单片机应用系统设计,机械工业出版社3潘永雄,新编单片机原理及应用,西安电子科技大学出版社4胡启明,程钢,51单片机应用开发从入门到精通,人民邮电出版社5王守中,51单片机开发入门与典型实例,人民邮电出版社附录一:protel原理图附录二:protel PCB板图附录三:protues电路图附录四:程序源代码 YEAR_L EQU 31H ;年份的低位 MONTH EQU 32H ;月份 DAY EQU 33H ;日期 DAY_MAX EQU 34H ;每月最大天数 HOUR EQU 35H ;时钟 MINUTE EQU 36H ;分钟 SECOND EQU 37H ;秒钟 BOTTO
6、N EQU 38H ;键值 FLAG EQU 39H ;模式标记/0走时/1调时/2日期显示及调整/3闹钟调整及闹钟开关/ BEEPH EQU 40H ;闹钟时钟 BEEPM EQU 41H ;闹钟分钟 ENBEEP EQU 42H ;闹钟开关 ORG 0000H AJMP MAIN ORG 0003H AJMP INTZ ORG 001BH AJMP SERVEMAIN:CLR A MOV R2,#14H MOV TMOD,#10H ;设为模式1,定时器1 MOV MONTH,#06 ;月份赋6 MOV DAY,#24H ;日期赋24 MOV YEAR_L,#12H ;年份赋12年 MOV
7、HOUR,A ;小时清零 MOV MINUTE,A ;分钟清零 MOV SECOND,A ;秒钟清零 MOV FLAG,A ;初始化模式 CLR P3.7 ;开蜂鸣器 MOV ENBEEP,#01H ;闹钟默认开 MOV BEEPH,#00H ;闹钟初值00:00:00 MOV BEEPM,#00H MOV TH1,#4CH ;赋定时初值 MOV TL1,#00H SETB ET1 ;开中断 SETB IT0 SETB EX0 SETB EA SETB TR1 ;启动T1 MOV DPTR,#TAB ;送段码表头DIS:LCALL DISPLAY ;重复调用显示子程序 LCALL NEXT ;
8、查询当前模式 LCALL BEEP ;查询闹钟开关 SJMP DISSERVE:PUSH PSW ;保护现场 PUSH ACC MOV TH1,#4CH MOV TL1,#00H ;重新赋计数初值 DJNZ R2,BRIDGE ;未满20次,返回 AJMP BREAK1BRIDGE: LJMP RETURNBREAK1: MOV R2,#14H ;重置中断次数 MOV A,#01H ;秒加1 ADD A,SECOND DA A ;转为BCD码 MOV SECOND,A CJNE A,#60H,BRIDGE ;未满60秒,返回 MOV SECOND,#00H ;秒清零分加1 ADD A,MINU
9、TE MOV MINUTE,A CJNE A,#60H,RETURN ;未满60分,返回 MOV MINUTE,#00H ;时加1 ADD A,HOUR MOV HOUR,A CJNE A,#24H,RETURN ;未满24小时,返回 MOV HOUR,#00H ;小时清零 MOV A,MONTH CJNE A,#1H,JUDGE2 ;不是1月,转跳 AJMP SETDAT_MAX1 JUDGE2: CJNE A,#3H,JUDGE3 ;不是3月,转跳JUDGE3: CJNE A,#5H,JUDGE4 ;不是5月,转跳 AJMP SETDAT_MAX1JUDGE4: CJNE A,#7H,JU
10、DGE5 ;不是7月,转跳JUDGE5 :CJNE A,#8H,JUDGE6 ;不是8月,转跳JUDGE6: CJNE A,#10H,JUDGE7 ;不是10月,转跳JUDGE7: CJNE A,#12H,SETDAT_MAX2;不是12月,转跳SETDAT_MAX1: MOV DAY_MAX,#32H ;天上限为31 AJMP CONTINUE ;返回SETDAT_MAX2: CJNE A,#2H,SETDAT_MAX3 ;不是2月,跳转 MOV DAY_MAX,#29H ;2月,天上限28SETDAT_MAX3: MOV DAY_MAX,#31H ;天上限为30CONTINUE:天加1 A
11、DD A,DAY MOV DAY,A CJNE A,DAY_MAX,RETURN ;未满天数上限,返回 MOV DAY,#01H ;天数置1月份加1 ADD A,MONTH MOV MONTH,A CJNE A,#13,RETURN ;未满12月,返回 MOV MONTH,#01H ;月份置1年低位加1 ADD A,YEAR_L MOV YEAR_L,A CJNE A,#99,RETURN ;未满99年,返回 MOV YEAR_L,#00H ;年低位清零RETURN: POP ACC POP PSW ;恢复现场 RETI ;中断返回 ;=显示子程序=DISPLAY:PUSH PSW MOV A
12、,R3 ANL A,#0FH MOVC A,A+DPTR MOV P2,#0DFH ;位选P2.5口 显示秒低位 MOV P0,A ;段选 显示数字 LCALL DELAY SWAP A MOVC A,A+DPTR MOV P2,#0EFH ;位选P2.4口 显示秒高位 MOV P0,A MOV A,R4 MOV P2,#0F7H ;位选P2.3口 显示分低位 MOV P2,#0FBH ;位选P2.2口 显示分低位 LCALL DELAY MOV A,R5 MOV P2,#0FDH ;位选P2.1口 显示时低位 MOV P2,#0FEH ;位选P2.0口 显示时低位 POP PSW RET=按
13、键中断=INTZ:KEY:MOV P1,#0FFH MOV A,P1 CPL A ANL A,#07H ;判断是否有按键按下 JNZ KEY1 RETIKEY1:MOV A,P1 ANL A,#07H JNZ KEY2KEY2:MOV BOTTON,A JB ACC.0,SETMODESETMODE:MOV A,FLAG INC A MOV FLAG,A CJNE A,#04H,I1 MOV FLAG,#00H AJMP EXIT I1:LCALL NEXT EXIT:RETI=模式查询程序=NEXT: MOV A,FLAG CJNE A,#00H,SETTIME SETB TR1 MOV R
14、3,SECOND MOV R4,MINUTE MOV R5,HOUR MOV A,BOTTON JB ACC.1,STOP JB ACC.2,STOP=闹钟开关/查询=BEEP: MOV A,FLAG CJNE A,#00H,STOP MOV A,ENBEEP CJNE A,#01H,STOPBEEPLAY:MOV A,HOUR CJNE A,BEEPH,STOP MOV A,MINUTE CJNE A,BEEPM,STOP CLR P3.7 ;闹钟开启STOP: SETB P3.7 ;闹钟关闭 MOV BOTTON,#00H =调时程序=SETTIME:CLR TR1 CJNE A,#01H
15、,SETDATE MOV R5,HOUR JB ACC.1,MIN JB ACC.2,HORMIN:MOV A,#01H ; DA A CJNE A,#60H,BACK MOV MINUTE,#00H MOV BOTTON,#00HHOR: DA A CJNE A,#24H,BACK MOV HOUR,#00HBACK:=日期显示及调整子程序=SETDATE:CJNE A,#02H,SETBEEP MOV R3,DAY MOV R4,MONTH MOV R5,YEAR_L MOV A,BOTTON JB ACC.1,DAYS JB ACC.2,MODAYS: CJNE A,#1H,JUDGEA
16、 ; AJMP SETDAT_MAXA JUDGEA:CJNE A,#3H,JUDGEB ;JUDGEB: CJNE A,#5H,JUDGEC ; AJMP SETDAT_MAXAJUDGEC: CJNE A,#7H,JUDGED ;JUDGED :CJNE A,#8H,JUDGEE ;JUDGEE: CJNE A,#10H,JUDGEF ;JUDGEF: CJNE A,#12H,SETDAT_MAXB ;SETDAT_MAXA: MOV DAY_MAX,#32H ; AJMP CONTINUE1 ;SETDAT_MAXB: CJNE A,#2H,SETDAT_MAXC ;不是2月,转跳 MO
17、V DAY_MAX,#29HSETDAT_MAXC:CONTINUE1: MOV A,#01H ; CJNE A,DAY_MAX,BACK1 MOV DAY,#01HMO: MOV A,#01H CJNE A,#13H,BACK1 MOV MONTH,#01HBACK1:=闹钟调整程序=SETBEEP:MOV R3,ENBEEP MOV R4,BEEPM MOV R5,BEEPH JB ACC.1,SETM JB ACC.2,SETHSETM:闹钟分加1 ADD A,BEEPM MOV BEEPM,A CJNE A,#60H,BACK2SETH: MOV A,#01H ;闹钟时加1 ADD A,BEEPH MOV BEEPH,A CJNE A,#24H,BACK2 MOV BEEPH,#00HBACK2:=延时子程序=DELAY: MOV R0,#06H DELAY1: MOV R1,#0B2H DJNZ R1,$ DJNZ R0,DELAY1TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;段码 DB 92H,82H,0F8H,80H,90H END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1