单片机项目设计教程
上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