×
单片机 > 单片机程序设计 > 详情

基于51单片机的带时间显示和紧急控制的交通灯的设计

发布时间:2020-08-21 发布时间:
|

;特别说明,本程序仅供单片机爱好者自己学习使用,


;不得做为其它商业用途


;此程序在硬件上调试通
;晶振频率为11.0592MHZ
;用定时器1延时,外部中断0接紧急控制
;R0为100MS延时常数,R2为状态延时常数
;8279控制数码管显示时间
;用P1口控制双色灯
;此程序写于2007-7-6,作者:徐学军
Z8279                 EQU                 0FF82H                     ;8279 状态/命令口地址
D8279                 EQU                 0FF80H                     ;8279 数据口地址
LEDMOD                EQU                 00H                        ;左边输入 八位字符显示
                                         ;外部译码键扫描方式,双键互锁
LEDFEQ                EQU                 33H                        ;扫描速率
LEDCLS                EQU                 0C1H                       ;清除显示 RAM
LEDWR0                EQU                 80H                        ;设定的将要写入的显示RAM地址
       
                      ORG                0000H
                      LJMP START
                      ORG                0003H                  ;INT 0 中断入口地址
                      LJMP INT_0
                      ORG                001BH                    ;T1中断入口地址
                      LJMP INT_T1
                      ORG                0040H
START:
                      MOV SP,#60H
                      MOV                TMOD,#10H                ;置T1为方式1                        
                      SETB EX0                    ;INT 0 中断有效
                      SETB IT0
                      SETB EA      
                      MOV                TL1,#00H                 ;延时50mS常数
                      MOV                TH1,#4cH
                      MOV                R0,#2                   ;延时100mS常数
                      SETB TR1                      ;启动T1
                      SETB ET1
                      setb                pt1                   ;必须设置定时器1的中断优先级高于外部中断0
                       LCALL INIT8279                   ;初始化8279



                      LCALL STATUS0 ;初始状态(都是红灯)
CIRCLE:
                      LCALL STATUS1 ;南北绿灯,东西红灯
                      LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯
                      LCALL STATUS3 ;南北红灯,东西绿灯
                      LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯
                      LJMP CIRCLE
INT_0:
                      PUSH PSW                    ;保护现场
                      PUSH 2
                      PUSH 90H  
                      clr                ex0      
                      MOV P1,#0FH                  ;南北,东西都亮红灯       
                      MOV R2,#100                 ;延时10秒
                      LCALL DELAY_DISPLAY
                      setb                ex0
                      POP 90H                     ;恢复现场       
                      POP 2
                      POP PSW
                      RETI
                INT_T1:
                      PUSH ACC
                      PUSH PSW
                      CLR                TR1
                      MOV                TL1,#00H                 ;延时 50mS 常数
                      MOV                TH1,#4CH        
                      SETB TR1
                      DJNZ R0,EXIT
                      MOV                R0,#2                   ;延时 100ms常数
                        DEC R2
                 EXIT:
                      POP                PSW
                      POP                ACC
                      RETI
      
STATUS0:                            ;南北红灯,东西红灯       
                      MOV P1,#0FH       
                      MOV R2,#10                  ;延时1秒
                      LCALL DELAY_DISPLAY
                      RET
STATUS1:                            ;南北绿灯,东西红灯        
                      MOV P1,#96H                  ;南北绿灯,东西红灯      
                      MOV R2,#200                 ;延时20秒
                      LCALL DELAY_DISPLAY
                      RET
STATUS2:                            ;南北绿灯闪转黄灯,东西红灯        
                      MOV R3,#03H                 ;绿灯闪3次
FLASH:
                      MOV P1,#9FH       
                      MOV R2,#03H
                      LCALL DELAY_DISPLAY
                      MOV P1,#96H       
                      MOV R2,#03H
                      LCALL DELAY_DISPLAY
                      DJNZ R3,FLASH
                      MOV P1,#06H                  ;南北黄灯,东西红灯       
                      MOV R2,#10                  ;延时1秒
                      LCALL DELAY_DISPLAY
                      RET
STATUS3:                            ;南北红灯,东西绿灯       
                      MOV P1,#69H       
                      MOV R2,#200                 ;延时20秒
                      LCALL DELAY_DISPLAY
                      RET
STATUS4:                            ;南北红灯,东西绿灯闪转黄灯       
                      MOV R3,#03H                 ;绿灯闪3次
FLASH1:
                      MOV P1,#6FH        
                      MOV R2,#03H
                      LCALL DELAY_DISPLAY
                      MOV P1,#69H       
                      MOV R2,#03H
                      LCALL DELAY_DISPLAY
                      DJNZ R3,FLASH1
                      MOV P1,#09H                 ;南北红灯,东西黄灯       
                      MOV R2,#10                 ;延时1秒
                      LCALL DELAY_DISPLAY
                      NOP
                      RET
                   INIT8279:                                ;8279初始化子程序
                      PUSH                DPH                        ;保存现场
                      PUSH                DPL
                      PUSH                ACC
                      LCALL DELAY                      ;延时
                      MOV                 DPTR ,#Z8279
                      MOV                 A,#LEDMOD                  ;置8279工作方式
                      MOVX                @DPTR,A
                      MOV                 A,#LEDFEQ                  ;置键盘扫描速率
                      MOVX                @DPTR,A
                      MOV                 A,#LEDCLS                  ;清除 LED 显示
                      MOVX                @DPTR,A
                      LCALL DELAY                      ;延时
                      POP                 ACC                        ;恢复现场
                      POP                 DPL
                      POP                 DPH
                      RET
                                         ;显示字符子程序
                                         ;输入: R4,位置 R5,值
DISLED:
                      PUSH                DPH                        ;保存现场
                      PUSH                DPL
                      PUSH                ACC
                      MOV                 A,#LEDWR0                  ;置显示起始地址
                      ADD                 A,R4                       ;加位置偏移量
                      MOV                 DPTR,#Z8279
                      MOVX                @DPTR,A                    ;设定显示位置
                      MOV                 DPTR,#LEDSEG ;置显示常数表起始位置
                      MOV                 A,R5
                      MOVC                A,@A+DPTR                  ;查表
                      MOV                 DPTR,#D8279
                      MOVX                @DPTR,A                    ;显示数据
                      POP                 ACC                        ;恢复现场
                      POP                 DPL
                      POP                 DPH
                      RET
DELAY:                                  ;延时子程序
                      PUSH                0                          ;保存现场
                      PUSH                1
                      MOV                 0,#0H
DELAY1:
                      MOV                 1,#0H
                      DJNZ                1,$
                      DJNZ                0,DELAY1
                      POP                 1                          ;恢复现场
                      POP                 0
                      RET
   
DELAY_DISPLAY:                              ;延时和显示时间子程序       
                      PUSH 1
                      PUSH 0
                      push acc
loopwait: mov b,#10
                      mov a,2
                      div ab
                      mov b,#10
                      div ab
                      mov                r4,#1
                      mov                r5,a
                      LCALL DISLED                     ;显示秒高位
                      mov                r4,#0
                      mov                r5,b
                      LCALL DISLED                     ;显示秒低位
                     mov a,2
                     jnz                loopwait                     ;延时等待
                      pop                acc  
                      POP 0
                      POP 1       
                      RET
                LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
                        DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
                    END




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单