找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5994|回复: 3
收起左侧

51单片机时钟程序流图..

[复制链接]
ID:67995 发表于 2014-10-27 21:03 | 显示全部楼层 |阅读模式
大神帮忙51单片机时钟程序流图..
回复

使用道具 举报

ID:1 发表于 2014-10-27 21:05 | 显示全部楼层
流程图和程序 下载附件即可

单片机时钟 程序 流程图 硬件电路图图 实验报告.rar

55.34 KB, 下载次数: 157

回复

使用道具 举报

ID:1 发表于 2014-10-27 21:33 | 显示全部楼层


单片机实验报告
   
       ―自动报时系统设计实验






一.        设计任务

1.        时间显示功能。用6位数码管显示时,分,秒。
2.        利用键盘可以设定当前时间(时,分,秒)
3.        2个LED指示灯L1,L2来表示输出状态
4.        作息时间表存于ROM中,时间表如下:
08:00开始工作           L1亮2s后灭,L2灭;
11:30 午休               L1亮2s后灭,L2亮一个小时后灭;
12:30下午工作开始       L1亮2s后灭,L2灭;
17:00下班               L1亮2s后灭,L2亮十分钟后灭;

二.        硬件连线图 (附录1)

三.        程序流程图 (附录2)

四.        程序 (附录3)
        
五.        操作说明
      
系统上电显示“LLLLLLLL”后,立即从初始时间7:56:30开始运行。当按下键盘last键后,进入修改模式,此时数码管对应小时的位置闪烁,时间不停,再按一下last,退出修改模式,显示正常。
在修改模式下:按下next键,转换要修改的位置,由数码管相应的位置闪烁,可知将要修改的是小时,分钟,还是秒,此时间也不停止;按下shift键,时间停止,相应的位置加一,如果指向秒的位置则清零,实现修改时间的功能。修改完毕,再按一下last,退出修改模式,显示正常。

六.        心得

        通过实验,更好得理解了MCS-51单片机的硬件系统与指令系统,有了在ADEK51实验设备上开发单片机的能力,同时对键盘扫描/显示芯片8279有了一定的了解,并能熟练应用8279。
由于本实验有一定的复杂性及应用性,所以更强调系统的设计步骤、方法,在实验中还要不断的修改,以使程序尽可能的合理与简化,此次实验增加了自己的开发经验,为以后打下坚实的基础。
回复

使用道具 举报

ID:1 发表于 2014-10-27 21:33 | 显示全部楼层
附录3:源程序
;说明:
;R0指向30,31,32的地址指针,初始值为30 全局
;R1函数toram的入口,指向20的地址指针   全局
;R2定时一秒的常数 全局
;R3接受按键 全局
;R4报警标志位   全局         r3,r4是函数toram用到的寄存器   局部
;R5计时器状态标志  全局      r5=00 计时器go  r5=11 计时器stop
;R6修改状态标志  全局        r6=00 按键无效  r6=ff 进入修改状态,
;R7函数toram的入口,全局 一个压缩BCD码
;20H开始的8个数据单元存放时间的BCD码
;30H,31H,32H依次存放小时,分,秒的压缩BCD码

Z8279   EQU  0FF82H
D8279   EQU  0FF80H                    
LEDMOD  EQU  10H                        
LEDFEQ  EQU  38H                          
LEDCLS  EQU  0D1H                       
LEDWRO  EQU  90H                     
KEY1    EQU  28H    ;修改状态改变
KEY2    EQU  29H    ;修改位置改变         
KEY3    EQU  2AH    ;数值改变   

ORG 0000H
AJMP START
ORG 000BH
AJMP T0INT
ORG  0040H
START:
       MOV SP,#60H
       MOV R1,#20H
       MOV R2,#08H
       MOV A,#00H
       MOV 30H,#07H
       MOV 31H,#56H
       MOV 32H,#30H
       MOV DPTR,#Z8279
       MOV A,#LEDCLS
       MOVX @DPTR,A
       LCALL DELAY
       MOV A,#LEDMOD
       MOVX @DPTR,A
       MOV A,#LEDFEQ
       MOVX @DPTR,A
LOOP22:
       MOV @R1,A
       INC R1
       DJNZ R2,LOOP22      
       LCALL INIT8279
;------------------------初始化     
       CLR P1.0
       CLR P1.1
      
       MOV R6,#00H                  
       MOV R0,#30H
       MOV R2,#14H
       mov R5,#00h
       MOV R4,#00H          ;清标志位   -报警      
       MOV R7,#00H
       MOV 22H,#00H
       MOV 25H,#00H
       CLR TF0
       MOV TMOD,#01H
       MOV TH0,#4BH
       MOV TL0,#0FCH
       MOV IE,#82H
       SETB TR0
;---------------------修改时间   
MODIFY:                 
      MOV DPTR,#Z8279                     
      MOVX A,@DPTR
      ANL A,#0FH
      JZ KEY_OUT                ;没有按键 跳出
      MOV A,#40H
      MOVX @DPTR,A
      MOV DPTR,#D8279
      MOVX A,@DPTR              ;A接受按键
      MOV R3,A
      CJNE R3,#KEY1,POSITION    ;判断按键是不是key1,  不是跳转   
      CJNE R6,#00H,PRESS_SEC    ;第一次按key1进入修改状态,(显示闪烁),时间不停   
      MOV R6,#0FFH              ;置标志位                       
      SJMP KEY_OUT              ;跳出
PRESS_SEC:
      MOV R6,#00H               ;第二次按key1跳出修改状态 (不闪烁)
      
      CJNE R5,#00H,MODIFY_OK    ;如果计时停止,恢复计时   
      SJMP KEY_OUT
MODIFY_OK:
      SETB TR0                  ;启动定时器
      SJMP KEY_OUT
POSITION:
      CJNE R3,#KEY2,VALUE       ;判断是否为key2,不是跳转
      CJNE R6,#0FFH,KEY_OUT     ;若未进入修改状态,跳转
      INC R0                    ;若进入修改状态,则移位
      CJNE R0,#33H,JJJ
      MOV R0,#30H
JJJ:
      SJMP KEY_OUT
VALUE:
      CJNE R3,#KEY3,KEY_OUT   ;判断是否为key3,不是跳出
      CJNE R6,#0FFH,KEY_OUT   ;判断是否进入修改状态,没有-跳出
       CLR TR0      ;若已进入,停止计时,准备修改
       MOV R5,#11H        ;标记置位,表明计时停止
       CJNE R0,#32H,WWW
       MOV @R0,#00H
       SJMP KEY_OUT
WWW:      
       MOV A,@R0       ;在相应的位置加一
       ADD A,#01H
       DA A
       MOV @R0,A
       MOV A,R0
       CJNE A,#30H,SIXTY  ;如果不是小时,加到60,
       CJNE @R0,#24H,KEY_OUT  ;是小时,加到24
       MOV @R0,#00H
       SJMP KEY_OUT
SIXTY:  
       CJNE @R0,#60H,KEY_OUT
       MOV @R0,#00H
       SJMP KEY_OUT
KEY_OUT:
           CJNE R6,#0FFH,NODIS  ;如果已进入修改状态,进入闪烁显示状态
           LCALL FLASHON
NODIS:
           LCALL SIREN           ;调用报警程序
           AJMP MODIFY          ;循环
;------------------------子程序-------------------------
FLASHON:      
           CJNE R0,#30H,JUMP31  ;如果指针指向小时,则小时位闪烁
           MOV R1,#26H                  
           MOV A,@R0
           MOV R7,A
           LCALL TORAM   ;将小时的BCD码送到26H,27H
           MOV DPTR,#Z8279     ;闪烁
           MOV A,#86H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A
           MOV DPTR,#Z8279
           MOV A,#87H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A
           LCALL DELAY

           MOV DPTR,#Z8279  ;将小时的值显示出来
           MOV A,#86H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,26H
           MOVX @DPTR,A        
           MOV DPTR,#Z8279  ;将小时的值显示出来
           MOV A,#87H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,27H
           MOVX @DPTR,A
           LCALL DELAY
           RET             ;显示完毕,跳出
JUMP31:         
           CJNE R0,#31H,JUMP32  ;如果指针指向 分,则分钟的位置闪烁
           MOV R1,#23H
           MOV A,@R0
           MOV R7,A
           LCALL TORAM
           MOV DPTR,#Z8279
           MOV A,#83H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A
           MOV DPTR,#Z8279
           MOV A,#84H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A
           LCALL DELAY
            
           MOV DPTR,#Z8279
           MOV A,#83H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,23H
           MOVX @DPTR,A
           MOV DPTR,#Z8279
           MOV A,#84H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,24H
           MOVX @DPTR,A
           LCALL DELAY
           RET
JUMP32:
           CJNE R0,#32H,QIUT  ;如果指针指向秒,则秒位闪烁
           MOV R1,#20H            
           MOV A,@R0
           MOV R7,A
           LCALL TORAM
           MOV DPTR,#Z8279
           MOV A,#80H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A
           MOV DPTR,#Z8279
           MOV A,#81H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,#00H
           MOVX @DPTR,A  
           LCALL DELAY
            
           MOV DPTR,#Z8279
           MOV A,#80H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,20H
           MOVX @DPTR,A
           MOV DPTR,#Z8279
           MOV A,#81H
           MOVX @DPTR,A
           MOV DPTR,#D8279
           MOV A,21H
           MOVX @DPTR,A
           LCALL DELAY
QIUT:      RET

SIREN:
       PUSH ACC
       MOV A,#00H    ;读取时间t1,与现在时间比较,
       MOV DPTR,#TIMETABLE      ;若相等,置报警位,输出报警信号
       MOVC A,@A+DPTR           ;不等,跳转---比较表中的下一个时间
       CJNE A,30H,NEXT1
       MOV A,#01H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,31H,NEXT1
       MOV A,#02H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,32H,NEXT1
       MOV R4,#0FFH
       SETB P1.0             ;灯1亮2s,灯2灭
       POP ACC
       RET
NEXT1:          ;读取时间t2,与现在时间比较
       MOV A,#03H ;若相等,置报警位,输出报警信号
       MOV DPTR,#TIMETABLE  ;不等,跳转---比较表中的下一个时间
       MOVC A,@A+DPTR
       CJNE A,30H,NEXT2
       MOV A,#04H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,31H,NEXT2
       MOV A,#05H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,32H,NEXT2
       MOV R4,#0FFH
       SETB P1.0         ;灯1亮2s,灯2亮
       SETB P1.1
       POP ACC
       RET
NEXT2:        ;;读取时间t3,与现在时间比较
       MOV A,#06H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,30H,NEXT3
       MOV A,#07H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,31H,NEXT3
       MOV A,#08H
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,32H,NEXT3
       MOV R4,#0FFH
       SETB P1.0     ;灯1亮2s,灯2灭
       CLR P1.1
       POP ACC
       RET
      
NEXT3:   ;读取时间t4,与现在时间比较
       MOV A,#09H ;若相等,置报警位,输出报警信号
       MOV DPTR,#TIMETABLE   ;不等,跳转---比较表中的下一个时间
       MOVC A,@A+DPTR
       CJNE A,30H,NEXT4
       MOV A,#0AH
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,31H,NEXT4
       MOV A,#0BH
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,32H,NEXT4
       MOV R4,#0FFH                     
       SETB P1.0     ;灯1亮2s,灯2亮
       SETB P1.1
       POP ACC
       RET
NEXT4:   ;;读取时间t3,与现在时间比较
       MOV A,#0CH
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,30H,NEXT5
       MOV A,#0DH
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,31H,NEXT5
       MOV A,#0EH
       MOV DPTR,#TIMETABLE
       MOVC A,@A+DPTR
       CJNE A,32H,NEXT5
       MOV R4,#0FFH                     
       SETB P1.0
       CLR P1.1     ;灯1亮2s,灯2灭
NEXT5:
       POP ACC
       RET   
            
INIT8279:
          PUSH ACC
          PUSH R2
          PUSH R1         
          MOV R1,#20H
          MOV R2,#08H
          MOV DPTR,#Z8279
          MOV A,#LEDWRO
          MOVX @DPTR,A
          MOV DPTR,#D8279
LOOP33: MOV A,@R1
        MOVX @DPTR,A
        INC R1
        DJNZ R2,LOOP33
        POP R1
        POP R2
        POP ACC        
        RET
        
DELAY: PUSH 00H
       PUSH 01H
       MOV R0,#00H
DELAY1:MOV R1,#00H
       DJNZ R1,$
       DJNZ R0,DELAY1
       POP 01H
       POP 00H
       RET
      
TORAM:   PUSH ACC
         PUSH R3
         PUSH R4
         MOV A,R7
         MOV R3,A
         MOV R4,A
         MOV A,#0FH
         ANL A,R3
         MOV DPTR,#LEDSEG
         MOVC A,@A+DPTR
         MOV @R1,A
         INC R1
         MOV A,#0F0H
         ANL A,R4
         SWAP A
         MOV DPTR,#LEDSEG
         MOVC A,@A+DPTR
         MOV @R1,A
         POP R4
         POP R3
         POP ACC
         RET
;---------------------------------中断服务程序----------
T0INT:
       MOV TH0,#4BH
       MOV TL0,#0FCH
       DJNZ R2,LOOP4
       MOV R2,#14H
       MOV A,32H        ;加一
       ADD A,#01H
       DA A
       MOV 32H,A
       CJNE A,#60H,TRANS
       MOV 32H,#00H
       MOV A,31H
       ADD A,#01H
       DA A
       MOV 31H,A
       CJNE A,#60H,TRANS
       MOV 31H,#00H
       MOV A,30H
       ADD A,#01H
       DA A
       MOV 30H,A
       CJNE A,#24H,TRANS
       MOV 30H,#00H
      
TRANS:            ;拆分送入20H开始的数据段
       MOV R1,#20H
       MOV R7,32H
       LCALL TORAM
       MOV R1,#23H
       MOV R7,31H
       LCALL TORAM      
       MOV R1,#26H
       MOV R7,30H
       LCALL TORAM
       ;CJNE R6,#00H,LOOP4
       LCALL INIT8279   ;显示
      
       CJNE R4,#00H,PPP     ;如果无报警,灯灭           
       CLR P1.0
       SJMP LOOP4
PPP:       INC R4       ;有报警,r4加一,计时
LOOP4:     RETI

LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
        DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TIMETABLE: DB  08H,00H,00H
           DB  11H,30H,00H
           DB  12H,30H,00H         
           DB  17H,00H,00H
           DB  17H,10H,00H
        END
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表