上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3 项目参考程序
1.3.1 软件编程要点
项目通过单片机定时器/计数器T0定时产生中断实现计时。将T0设置为定时工作方式1,以10ms为基本计时单元,每10ms产生一次中断,利用软件对中断计数累加。当定时器产生100次中断后(即1s后),秒单元加1。同理,对分单元、时单元亦采用相同的计数原理,分别产生秒、分、时等各位时间值,经并行口连接的6位LED显示。
以学校的作息时间为例进行作息时间控制。首先将学校的作息时间制成表格存入单片机的数据区。每秒将当前时间与数据区中时间做一次比较,若相等则通过端口输出警示信号,进行相应的打铃、播音等。
数据区的每一项时间控制字需要占用8个存储单元,其中启动控制与关闭控制各占4个单元,控制字的内容为:
时间控制字的控制码定义见表1-1。
表1-1 时间控制字的控制码定义
作息时间定义见表1-2。
表1-2 作息时间定义
时间控制字的控制码定义见表1-3。
表1-3 时间控制字的控制码定义
1.3.2 RAM单元分配
程序中用到的内部RAM数据存储单元见表1-4。
表1-4 内部RAM数据存储单元
1.3.3 项目程序流程图
1.主程序流程图
主程序流程图见图1-2。
图1-2 主程序流程图
2.控制程序流程图
控制程序流程图见图1-3。
图1-3 控制程序流程图
3. INT0、INT1中断服务程序流程图
INT0、INT1中断服务程序流程图见图1-4。
图1-4 、中断服务程序流程图
4. T0中断服务程序流程图
T0中断服务程序流程图见图1-5。
图1-5 T0中断服务程序程流程图
5.显示程序流程图
显示程序流程图见图1-6。
图1-6 显示程序流程图
1.3.4 项目参考程序
项目参考程序如下。
---------------------------------------------------- ;变量定义区 ;---------------------------------------------------- COUNT EQU26H ;0.1s计数单元 SECOND EQU27H ;秒计数单元 MINUTE EQU28H ;分计数单元 TIME EQU29H ;时计数单元 COUNT T EQU2AH ;计时单元加1暂存器 STONE S EQU2BH ;存放秒计数基制 STONE M EQU2CH ;存放分计数基制 STONE T EQU2DH ;存放时计数基制 ADDRESS EQU2EH ;保存数据区地址暂存器 STONE N EQU3AH ;控制码存储单元 NUMBER1 EQU38H ;数据暂存单元 NUMBER2 EQU3BH ;数据暂存单元 ;4A-4FH 显示缓冲区 ;---------------------------------------------------- ORG0000H LJMPMAIN ;转主程序 ORG0003H LJMPINT0 ;转INT0中断服务程序 ORG000BH LJMPCLOCK ;转定时器T0中断 ORG0013H LJMPINT1 ;转INT1中断服务程序 ;---------------------------------------------------- ;主程序 MAIN∶MOVSP,#5AH ;堆栈指针 MOVSTONE S,#60H ;秒计数基制 MOVSTONE M,#60H ;分计数机制 MOVSTONE T,#24H ;时计数机制 MOVXBR1,#14H ;INT0, INT1连到端口引脚 MOVXBR2,#0C0H ;禁止弱上拉,交叉开关允许 MOVOSCICN,#05H ;选用内部晶振4MHz MOVWDTCN,#0DEH ;禁止看门狗 MOVWDTCN,#0ADH MOVTMOD,#01H ;设定时器T0工作方式1 MOVTL0,#0CAH ;置T0初值 MOVTH0,#7DH SETBEA ;开中断 SETBET0 ;定时器T0中断允许 SETBEX0 ;外部中断0允许 SETBEX1 ;外部中断1允许 MOVTCON,#10H ;启动定时器T0 LOOP∶LCALLDSUP ;调显示 SJMPLOOP ;---------------------------------------------------- ;显示程序 DSUP∶MOVR0,#4FH ;准备向缓冲区放数 MOVA, SECOND ACALLPTDS ;存秒值 MOVA, MINUTE ACALLPTDS ;存分值 MOVA, TIME ACALLPTDS ;存时值 MOVR0,#4AH ;指向缓冲区首地址 MOVR2,#7FH ;左边第一位开始显示 DSUP1∶ORLP0,#0FCH ;关各数码管 MOVA,@R0 ;取显示缓冲区中的数 MOVP1, A ;送出字形BCD码 MOVA, R2 ;取字位码 ANLP0, A ;送字位码 MOVR3,#00H DSUP4∶DJNZR3, DSUP4 ;延时 ORLP0,#0FCH ;关各数码管 INCR0 ;右移一位,为显示下一位做准备 MOVR2, A ;存位码 JBACC.1, DSUP1 ;不到最后一位,则继续 RET ;---------------------------------------------------- ;向缓冲区放数 PTDS∶MOVR1, A ;暂存 ACALLPTDS1 ;低4位先放入缓冲区 MOVA, R1 ;取出原数 SWAPA ;高4位放入低4位中 PTDS1∶ANLA,#0FH ;放进显示缓冲区 MOV@R0, A DECR0 ;缓冲区地址指针减1 RET ;---------------------------------------------------- ;控制程序 LOOP1∶MOVDPTR,#100CH MOVADDRESS, DPL LOOP4∶MOVDPL, ADDRESS MOVR3,#04H MOVR1, COUNT T LOOP2∶INCDPTR DJNZR3, LOOP2 MOVADDRESS, DPL MOVR3,#03H ;时分秒共3次 CLRA MOVCA,@A+DPTR ;取控制码 JZLOOP3 ;若A=0,则数据区结束 MOVSTONE N, A ;保存控制码 LOOP5∶INCDPTR ;修改数据区时间单元指针 DECR1 ;修改计时单元指针 CLRA MOVCA,@A+DPTR ;读数据区时间 MOVNUMBER2, A ;暂存 MOVA,@R1 ;读计时单元时间 CJNEA, NUMBER2, LOOP4 ;比较时间 DJNZR3, LOOP5 ;3次循环 MOVA, STONE N ;恢复控制码 MOVP2, A ;由P2口输出 LOOP3∶RET ;---------------------------------------------------- ; T0中断服务程序 CLOCK∶PUSHPSW ;保护 PUSHACC SETBRS0 ;选择工作寄存器组1 MOVTL0,#0CAH ;重装初值 MOVTH0,#7DH INCCOUNT ;0.1s单元加1 MOVA, COUNT ;取0.1s单元内容 CJNEA,#0AH, DONE ;不等于10转DONE MOVCOUNT,#00H ;等于则清零 MOVR0,#SECOND ;指向秒计数单元 MOVR1,#STONE S ;指向秒计数单元基制 MOVR3,#03H ;循环3次(秒分时) LOOP0∶MOVA,@R0 ;取计时单元值 ADDA,#01H ;十进制调整 DAA MOV@R0, A ;送回计时单元 MOVNUMBER1,@R1 ;暂存 CJNEA, NUMBER1, DONE0 ;不等于计时基制则转出 MOV@R0,#00H ;等于则清零 INCR0 ;指向下一个计数单元 INCR1 ;指向下一个计数单元基制 DJNZR3, LOOP0 ;秒分时3次循环 DONE0∶CALLLOOP1 ;调控制子程序 DONE∶POPACC ;恢复 POPPSW RETI ;---------------------------------------------------- ; ITN0中断服务程序 INT0∶CLREX0 ;INT0中断关闭 PUSHACC JNBP0.0,$ ;消除键抖动 INCMINUTE ;分单元加1 MOVA, MINUTE ;十进制调整 ADDA,#00H DAA MOVMINUTE, A SUBBA,#60H ;不等于计数基制转DSUP2 JCDSUP2 MOVMINUTE,#00H ;相等则分单元清零 DSUP2∶LCALLDSUP ;调显示子程序 POPACC SETBEX0 ;开INT0中断 RETI ;中断返回 ;---------------------------------------------------- ; INT1中断服务程序 INT1∶CLREX1 ;INT1中断关闭 PUSHACC JNBP0.1,$ ;消除键抖动 INCTIME ;时单元加1 MOVA, TIME ;十进制调整 ADDA,#00H DAA MOVTIME, A SUBBA,#24H ;不等于计数基制转DSUP3 JCDSUP3 MOVTIME,#00H ;相等则时单元清零 DSUP3∶LCALLDSUP ;调显示子程序 POPACC SETBEX1 ;开INT1中断 RETI ;中断返回 ;---------------------------------------------------- ;控制码 CODE0∶ORG1010H DB01H,06H,40H,00H,11H,06H,40H,15H,10H,06H,50H,00H,11H,07H,10H,00H DB01H,08H,00H,00H,11H,08H,00H,15H,01H,08H,50H,00H,11H,08H,50H,15H DB01H,09H,00H,00H,11H,09H,00H,15H,01H,09H,50H,00H,11H,09H,50H,15H DB10H,09H,55H,00H,11H,10H,05H,00H,01H,10H,10H,00H,11H,10H,10H,15H DB01H,11H,00H,00H,11H,11H,00H,15H,01H,11H,10H,00H,11H,11H,00H,15H DB01H,12H,00H,00H,11H,12H,00H,15H,01H,13H,50H,00H,11H,13H,50H,15H DB01H,14H,00H,00H,11H,14H,00H,15H,01H,14H,50H,00H,11H,14H,50H,15H DB01H,15H,00H,00H,11H,15H,00H,15H,01H,15H,50H,00H,11H,15H,50H,15H DB10H,18H,00H,00H,11H,18H,30H,00H,01H,19H,30H,00H,11H,19H,30H,15H DB01H,21H,30H,00H,11H,21H,30H,15H,00H END