⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sjj.asm

📁 基于AT89S51单片机和步进电机的国旗升降系统
💻 ASM
字号:
/*液晶控制引脚*/
RS       BIT    P3.7
RW       BIT    P3.6
E        BIT    P3.5
/*语音芯片ISD2560控制引脚*/
ISD_CE   BIT    P3.2
ISD_PD   BIT    P3.3
ISD_PR   BIT    P2.0
/*系统按键*/
FLAG_UP    BIT    P2.3
FLAG_DOWN  BIT    P2.4
FLAG_STOP  BIT    P2.5
FLAG_HALF  BIT    P2.7
/*24C02控制引脚*/
I2C_SDA    BIT    P2.2
I2C_SCL    BIT    P2.1

FLAGUP     BIT    00H
FLAGDOWN   BIT    01H
FLAGHALF   BIT    02H
GETTOP     BIT    03H
GETBOTTOM  BIT    04H


SEC       DATA   35H   ;    秒存放单元(BCD码)
SECD      DATA   36H   ;    0.05秒存放单元(BCD码)

ORG     0000H 
AJMP    MAIN
;ORG     000BH
;LJMP    TIMER0      ;定时器T0中断,负脉冲时计圈数
ORG     001BH
LJMP    TIMER1      ;定时器T1中断,定时1ms

ORG   0050H
MAIN:MOV  SP, #70H
     LCALL INITIAL
     LCALL CLS
     
     CLR  FLAGUP
     CLR  FLAGDOWN
     CLR  FLAGHALF
     CLR  GETTOP
     CLR  GETBOTTOM
     MOV  SEC,#0                ;0秒
     MOV  SECD,#0               ;0.00秒
     MOV  TMOD,#15H
     MOV  TH1,#0H
     MOV  TL1,#0H
     MOV  TH0,#0H
     MOV  TL0,#0H
     MOV  TH1,#3CH              ;定时初值(50ms,12MHz晶体)
     MOV  TL1,#0B0H
     MOV  TH0,#0FFH
     MOV  TL0,#23H
     CLR TF0
     

     MOV  DPTR,#LINE0
     MOV  A,#80H
     LCALL  WRITE_COM
     LCALL DISLINE
     MOV  DPTR,#LINE1
     MOV  A,#0C0H
     LCALL  WRITE_COM
     LCALL DISLINE
     
     SETB ISD_CE
     SETB ISD_PD
     SETB ISD_PR

     
/*判断按键*/
key:     jnb FLAG_UP,up
         jnb FLAG_DOWN,down
         jnb FLAG_STOP,GOSTOP
         jnb FLAG_HALF,HALF
         SJMP KEY
GOSTOP:  LJMP STOP
/*国旗上升按键*/
up:      lcall keycheck
         jb FLAG_UP,key

         JB  GETTOP,KEY
	 ;SETB  TR0
	 ;SETB  TR1                 ;启动定时器T1
         ;SETB  ET1                 ;允许定时器T1中断
	 ;SETB  EA                  ;开放中断

         CLR  GETBOTTOM
	 CLR  FLAGHALF
	 
	 LCALL CLS
         MOV  DPTR,#LINE2
         MOV  A,#10000000B
         LCALL  WRITE_COM
         LCALL DISLINE
         
         
         SETB ISD_PR
	 CLR  ISD_PD
         CLR  ISD_CE

         lcall djuping
	 lcall key

/*国旗下降按键*/
down:    lcall keycheck
         jb FLAG_DOWN,key

         JB  GETBOTTOM,KEY
	 JB  FLAGHALF,HALFDOWN
	 
	 CLR  GETTOP
	 CLR  FLAGHALF

         LCALL CLS
         MOV  DPTR,#LINE3
         MOV  A,#10000000B
         LCALL  WRITE_COM
         LCALL DISLINE

         lcall djdowning
         lcall key

/*半旗状态*/
HALF:    LCALL KEYCHECK
         JB FLAG_HALF,KEY
         
	 SETB FLAGHALF
	 CLR  GETTOP
	 CLR  GETBOTTOM
         
	 SETB  ISD_CE
	 SETB  ISD_PD

	 LCALL CLS
         MOV  DPTR,#LINE5
         MOV  A,#10000000B
         LCALL  WRITE_COM
         LCALL DISLINE
         
	 SETB ISD_PR
	 CLR  ISD_PD
         CLR  ISD_CE

	 LCALL DJUPING
	 MOV R4,#10
	 LCALL KEEPDOWN2

 	 CLR GETTOP
	 CLR GETBOTTOM
	 
	 LJMP KEY

HALFDOWN:mov r4,#10        
HALFUP2:mov r3,#50
HALFUP: MOV P1,#01H
        LCALL DEL

        MOV P1,#08H
        LCALL DEL

        MOV P1,#02H
        LCALL DEL

        MOV P1,#04H
        LCALL DEL

        MOV R0,#0C0H
        MOV  A,R0
        LCALL  WRITE_COM
        MOV R1,SEC
        LCALL WRITESEC

        djnz r3,HALFUP
	djnz r4,HALFUP2
	setb gettop
	LCALL DJDOWNING	
	LJMP KEY

/*国旗停止按键*/
stop:    lcall keycheck
         jb FLAG_STOP,KEYBACK

         CLR  TR0
	 CLR  TR1
	 CLR  TF1
	 MOV  SEC,#0                ;0秒
         MOV  SECD,#0               ;0.00秒
       
         LCALL CLS
         MOV  DPTR,#LINE4
         MOV  A,#10000000B
         LCALL  WRITE_COM
         LCALL DISLINE

         lcall djstop
KEYBACK: lcall key
/*
RECORD:  lcall keycheck
         jb P2.7,key
         CLR  ISD_PR
         CLR  ISD_PD
         CLR  ISD_CE
;	 JMP $
	 RET
*/
/*按键消抖*/ 
    
keycheck:   MOV  R7,#10             
D2:         MOV  R6,#248
            DJNZ  R6,$
            DJNZ  R7,D2
	    ret

/*国旗上升处理子程序*/	    
djuping:jnb FLAG_DOWN,GODOWN
        jnb FLAG_STOP,stop
	SETB  TR1                 ;启动定时器T1
        SETB  ET1                 ;允许定时器T1中断
	SETB  EA                  ;开放中断

        mov r4,#30        
keepup2:mov r3,#50
KEEPUP: MOV P1,#01H
        LCALL DEL

        MOV P1,#08H
        LCALL DEL

        MOV P1,#02H
        LCALL DEL

        MOV P1,#04H
        LCALL DEL

        MOV R0,#0C0H
        MOV  A,R0
        LCALL  WRITE_COM
        MOV R1,SEC
        LCALL WRITESEC

	;JMP djuping  
        djnz r3,keepup
	djnz r4,keepup2
	setb gettop
        ret	    
	
/*国旗下降处理子程序*/    
DJDOWNING:jnb FLAG_UP,back_up
          jnb FLAG_STOP,BACK_STOP
          
          mov r4,#30
keepdown2:mov r3,#50
KEEPDOWN: MOV P1,#01H
          LCALL DEL

          MOV P1,#04H
          LCALL DEL

          MOV P1,#02H
          LCALL DEL

          MOV P1,#08H
          LCALL DEL

	  djnz r3,keepdown
	  djnz r4,keepdown2
	  setb getbottom
          ret
BACK_UP:  lcall up
          ret

BACK_STOP:LCALL STOP
          RET
GODOWN:   LCALL DOWN
          RET
/*国旗停止处理子程序*/
DJSTOP:   mov p1,#00h
          
          CLR TR1
	  CLR EA
	  CLR TR0
	  MOV TH1,#3CH
	  MOV TL1,#0B0H
	  MOV TH0,#0FFH
	  MOV TL0,#23H
          ret

;          ljmp key

WRITESEC:     INC  R0
  	      MOV  A,R0
	      LCALL  WRITE_COM
	      MOV  A,R1
	      ANL  A,#0F0H
	      SWAP  A
	      ADD  A,#30H
	      LCALL  WRITE_DATA
	      INC  R0
	      MOV  A,R0
	      LCALL  WRITE_COM
	      MOV  A,R1
	      ANL  A,#0FH
	      ADD  A,#30H
	      LCALL  WRITE_DATA
	      RET

TIMER1:  ORL  TL1,#0B0H       ;重置定时器时常数
         MOV  TH1,#3CH
         PUSH  ACC            ;保护现场
         PUSH  PSW
         MOV  A,SECD
         ADD  A,#1            ;加0.05秒
         DA  A
         MOV  SECD,A
         CJNE  A,#20H,CLKEE
         MOV SECD,#0
         MOV  A,SEC           ;调整秒
         ADD  A,#1
         DA  A
         MOV  SEC,A
CLKEE:	 POP  PSW
	 POP  ACC
	 RETI

/*液晶显示字符、数字*/	    
DIS:       LCALL  WRITE_COM  ;液晶显示
           PUSH ACC
           MOV  A,@R1
           LCALL  WRITE_DATA
           POP  ACC
           INC  A
           INC  R1
           DJNZ  R2,DIS
           RET

/*液晶显示字符串*/
DISLINE:   PUSH ACC
DISL_LOOP: CLR A
           MOVC  A,@A+DPTR
           JZ  END_DISL
           LCALL  WRITE_DATA
           INC  DPTR
           SJMP  DISL_LOOP
END_DISL:  POP  ACC
           RET

LINE0:   DB "SYSTEM IS READY,",00H
LINE1:   DB "MAKE A CHOICE:"  ,00H
LINE2:   DB "FLAG IS RISEING!",00H
LINE3:   DB "FLAG IS DOWNING!",00H
LINE4:   DB "FLAG IS STOPPED!",00H
LINE5:   DB "HALF POSITION!" ,00H    
/*液晶显示初始化*/     
INITIAL: MOV  A,#00111000B            
         LCALL  WRITE_COM
         MOV  A,#00001110B
         LCALL  WRITE_COM
         MOV  A,#00000110B
         LCALL  WRITE_COM
         RET

/*液晶显示忙检查*/ 
CHECK_BUSY:PUSH  ACC             
           PUSH  PSW
BUSY_LOOP: CLR  E
         SETB  RW
         CLR  RS
         SETB  E
         MOV  A,P0
         CLR  E
         JB  ACC.7,BUSY_LOOP
	 POP  PSW
         POP  ACC
         LCALL  DISDEL
         RET

/*液晶显示写控制字*/ 
WRITE_COM: LCALL CHECK_BUSY      
         CLR  E
         CLR  RS
         CLR  RW
         SETB  E
         MOV  P0,A
         CLR  E
         RET

/*液晶显示写数据*/ 
WRITE_DATA: LCALL CHECK_BUSY      
         CLR  E
         SETB  RS
         CLR  RW
         SETB  E
         MOV  P0,A
         CLR  E
         RET

/*液晶显示清屏*/ 
CLS:     MOV  A,#00000001B          
         LCALL  WRITE_COM
         RET

/*液晶显示延时*/
DISDEL:  MOV  R6,#5                 
LL1:     MOV  R7,#255
         DJNZ  R7,$
         DJNZ  R6,LL1
         RET

/*步进电机转动延时*/
DEL:     MOV  R6,#8                 
LL2:     MOV  R7,#255
         DJNZ  R7,$
         DJNZ  R6,LL1
         RET
	 END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -