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

📄 demo2402.asm

📁 用89S52进行DS1820温度读取程序
💻 ASM
字号:
;该程序是用于S51E实验板在线编程监控程序
;主要演示24C02的读写控制.At24c02资料见"24CXX.PDF"
;实验:使用SW1/SW2设定闹铃的周期(单位秒,10-99S),SW5/SW6设定每次闹铃的次数(3-10次),程序掉电后,参数不变
;数码管LED1,LED2:显示定时,数码管LED6显示铃声次数!
;出厂时24C02中预置为:闹铃的周期60秒,每次闹铃的次数6次.
;*********本文件包含了一套完整的IIC总线读写子程序,推荐使用!!!
;相关知识内容请参阅S51E 文档内容--I2C系统总线实验。

	    SDA	       BIT   P3.4;(V1.0)
	    CLK	       BIT   P3.2
	    KEY	       BIT   P3.3
            LED_PORT   EQU   P0
            DIG_PORT   EQU   P2
            KEY_PORT   EQU   P2
            SW1        BIT   P2.7
            SW2        BIT   P2.6
            SW3        BIT   P2.5
            SW4        BIT   P2.4
            SW5        BIT   P2.3
            SW6        BIT   P2.2
            BEEP       BIT   P2.0

            FLAG_TIM1   BIT         00H     ;定时到置标识位
	    F_BEEP      BIT         01H
            BUFF_LED1	EQU		22H
		BUFF_LED2	EQU		23H
		BUFF_LED3	EQU		24H
		BUFF_LED4	EQU		25H
		BUFF_LED5	EQU		26H
		BUFF_LED6	EQU		27H
		BUFF_LED_LP	EQU		28H
            DAT             EQU             2DH
		SLA		EQU		2EH		;24C02器件地址
		MTD		EQU		2FH		;发送给2402的MCU中数据缓冲区首地址
		MRD		EQU		30H		;接受2402中数据到中的缓冲区首地址
		NUMBYT	        EQU	 	31H		;收/发字节数
		BUFF_2402_1	EQU		32H		;2402
		BUFF_2402_2	EQU 	 	33H		;
		BUFF_2402_3	EQU	 	34H		;
		BUFF_2402_4	EQU	 	35H		;
		BUFF_TIM1	EQU		36H		;间隔(秒)
		BUFF_TIM2	EQU	 	37H		;次数
		TIM1        EQU         38H
                TIM2        EQU         39H
;---------------------------------------------------------------
            ADD_TIM1    EQU         10H         ;TIM1 数据在24C02中的存储地址
            ADD_TIM2    EQU         20H         ;TIM2 数据在24C02中的存储地址

		ORG		0000H
		LJMP		MAIN
		ORG		000BH
		LJMP		T0_INT
		ORG		0023H
		LJMP		000H
		ORG		0100H
MAIN:		MOV	      A,	#00H
		MOV	      SP,	#40H
		MOV         PSW,      #00H
		MOV	      IE,	#00H
		MOV	      P0,	#0FFH
		MOV	      P1,	#0FFH
		MOV	      P2,	#0FFH
		MOV	      P3,	#0FFH
		MOV         R0,   #7FH      ;初始化RAM区,
CLR_RAM:        MOV         A,    #00H
                MOV         @R0,A
                DJNZ        R0,   CLR_RAM
                MOV         BUFF_LED3,#10H    ;数码管LED3/4/5消隐
                MOV         BUFF_LED4,#10H
                MOV         BUFF_LED5,#10H
                LCALL       READ_24C02_TIM1   ;读取24C02中的参数
                MOV         BUFF_TIM1,TIM1
                LCALL       READ_24C02_TIM2
                MOV         BUFF_TIM2,TIM2
		    MOV         TH0,#240     ;T0=4MS
                MOV         TL0,#96
		    MOV	    TMOD,	#11H
                SETB        EA
		    SETB		TR0
		    SETB		ET0
		    LCALL		DEL
		    LCALL		DEL

WAIT_KEY:   JB          KEY,JUD_FLAG_TIM1
            JMP         PROC_KEY
JUD_FLAG_TIM1:JNB       FLAG_TIM1,WAIT_KEY
            CLR         FLAG_TIM1
            MOV         BUFF_TIM1,TIM1
            LCALL       BEEP_LP
            JMP         WAIT_KEY
PROC_KEY:   JNB   SW1,SW1_OK
            JNB   SW2,SW2_OK
            JNB   SW5,SW5_OK
            JNB   SW6,SW6_OK
            JMP   WAIT_KEY

SW1_OK:  MOV    A,TIM1
         CJNE   A,#99,SW1_OVER
         MOV    TIM1,#9
SW1_OVER:INC    TIM1        ;计时加1
         MOV    BUFF_TIM1,TIM1
         LCALL  WRITE_24C02_TIM1
         SETB   F_BEEP
         CLR    BEEP
         LCALL  DEL
         SETB   BEEP
         CLR    F_BEEP
         JMP   WAIT_KEY

SW2_OK:  MOV    A,TIM1
         CJNE   A,#10,SW2_OVER
         MOV    TIM1,#99
SW2_OVER:DEC    TIM1        ;计时减1
         MOV    BUFF_TIM1,TIM1
         LCALL  WRITE_24C02_TIM1
         SETB   F_BEEP
         CLR    BEEP
         LCALL  DEL
         SETB   BEEP
         CLR    F_BEEP
         JMP   WAIT_KEY

SW5_OK:  MOV    A,TIM2
         CJNE   A,#10,SW5_OVER
         MOV    TIM2,#02H
SW5_OVER:INC    TIM2        ;铃声加1
         MOV    BUFF_TIM2,TIM2
         LCALL  WRITE_24C02_TIM2
         SETB   F_BEEP
         CLR    BEEP
         LCALL  DEL
         SETB   BEEP
         CLR    F_BEEP
         JMP   WAIT_KEY

SW6_OK:  MOV    A,TIM2
         CJNE   A,#03,SW6_OVER
         MOV    TIM2,#11
SW6_OVER:DEC    TIM2        ;铃声减1
         MOV    BUFF_TIM2,TIM2
         LCALL  WRITE_24C02_TIM2
         SETB   F_BEEP
         CLR    BEEP
         LCALL  DEL
         SETB   BEEP
         CLR    F_BEEP
         JMP   WAIT_KEY

BEEP_LP: SETB  F_BEEP
         CLR   BEEP
         LCALL DEL
         SETB  BEEP
         CLR   F_BEEP
         LCALL DEL
         DJNZ  BUFF_TIM2,BEEP_LP
         MOV   BUFF_TIM2,TIM2
         RET

DEL:     MOV   R5,#02      ;为演示方便,人为插入的延时
DEL01:   MOV   R6,#200
DEL02:   MOV   R7,#200
         DJNZ  R7,$
         DJNZ  R6,DEL02
         DJNZ  R5,DEL01
         RET



READ_2402_RAM1: MOV BUFF_2402_1,A				;读取24C02中A地址的1字节
		MOV MTD,#BUFF_2402_1				;入口在A(存放地址),出口在 DAT(存放数据)
		MOV NUMBYT,#01H
		MOV SLA,#0AEH
		LCALL WNBYTE
		MOV SLA,#0AFH
		MOV NUMBYT,#01H
		MOV MRD,#DAT
		LCALL RNBYTE
            MOV  A, DAT
            CPL  A
            MOV  DAT,A
		SETB SDA
		SETB CLK
		RET
WRITE_2402_RAM1:MOV BUFF_2402_1,A		;将DAT中的数据写入24C02中A地址单元
                MOV   A,   DAT            ;入口,A(地址),DAT(数据)
                CPL   A
	          MOV   BUFF_2402_2,A		;1字节
	          MOV   MTD,#BUFF_2402_1
		    MOV   SLA,#0AEH
	          MOV   NUMBYT,#02H
		    LCALL	WNBYTE
		    RET

READ_24C02_TIM1:
      MOV   BUFF_2402_1,#ADD_TIM1
      MOV   MTD,#BUFF_2402_1      ;写24C02中定时周期存储地址(10H)
      MOV   NUMBYT,#01H
      MOV   SLA,#0AEH             ;
      LCALL   WNBYTE
      MOV   SLA,#0AFH             ;读24C02中定时TIM1值
      MOV   NUMBYT,#01H
      MOV   MRD,#BUFF_2402_1
      LCALL   RNBYTE
      MOV    A,BUFF_2402_1
      CPL    A
      MOV    TIM1,A
      RET

READ_24C02_TIM2:
      MOV   BUFF_2402_1,#ADD_TIM2
      MOV   MTD,#BUFF_2402_1      ;写24C02中铃声存储地址(20H)
      MOV   NUMBYT,#01H
      MOV   SLA,#0AEH             ;
      LCALL   WNBYTE
      MOV   SLA,#0AFH             ;读24C02中铃声TIM2
      MOV   NUMBYT,#01H
      MOV   MRD,#BUFF_2402_1
      LCALL   RNBYTE
      MOV    A,BUFF_2402_1
      CPL    A
      MOV    TIM2,A
      RET

WRITE_24C02_TIM1:
      MOV    BUFF_2402_1,#ADD_TIM1
      MOV    A,TIM1
      CPL    A
      MOV    BUFF_2402_2,A
      MOV    MTD,#BUFF_2402_1
      MOV    SLA,#0AEH
      MOV    NUMBYT,#02H
      LCALL  WNBYTE
      RET

WRITE_24C02_TIM2:
      MOV    BUFF_2402_1,#ADD_TIM2
      MOV    A,TIM2
      CPL    A
      MOV    BUFF_2402_2,A
      MOV    MTD,#BUFF_2402_1
      MOV    SLA,#0AEH
      MOV    NUMBYT,#02H
      LCALL  WNBYTE
      RET


BIN_BCD:  MOV  B,#10
          DIV  AB
          RET

;-------------  T0 INTRRUPT 数码管扫描定时中断---------------------------
T0_INT:  PUSH   ACC
         PUSH   PSW
         MOV   TH0,#240     ;T0=4MS
         MOV   TL0,#96
         INC    BUFF_LED_LP
         MOV    A,BUFF_LED_LP
         CJNE   A,#250,CONT_SCAN     ;250*4MS=1S
         MOV    BUFF_LED_LP,#00H
         DEC    BUFF_TIM1
         MOV    A,BUFF_TIM1
         CJNE   A,#00,CONT_SCAN
         MOV    BUFF_TIM1,TIM1
         SETB   FLAG_TIM1
CONT_SCAN:MOV   A,BUFF_TIM1
          LCALL  BIN_BCD
          MOV   BUFF_LED2,B
          MOV   BUFF_LED1,A
          MOV   A,BUFF_TIM2
          LCALL  BIN_BCD
          MOV   BUFF_LED6,B
          ;MOV   BUFF_LED5,A
          MOV   A,BUFF_LED_LP
          MOV   B,#06
          DIV   AB
          MOV   A,B
          RL    A
          MOV   DPTR,#TAB_SCAN
          JMP   @A+DPTR
TAB_SCAN: AJMP  SCAN_L1
          AJMP  SCAN_L2
          AJMP  SCAN_L3
          AJMP  SCAN_L4
          AJMP  SCAN_L5
          AJMP  SCAN_L6
SCAN_L1:  MOV   DIG_PORT,#01111111B
          MOV   A,BUFF_LED1
          JMP   END_SCAN
SCAN_L2:  MOV   DIG_PORT,#10111111B
          MOV   A,BUFF_LED2
          JMP   END_SCAN
SCAN_L3:  MOV   DIG_PORT,#11011111B
          MOV   A,BUFF_LED3
          JMP   END_SCAN
SCAN_L4:  MOV   DIG_PORT,#11101111B
          MOV   A,BUFF_LED4
          JMP   END_SCAN
SCAN_L5:  MOV   DIG_PORT,#11110111B
          MOV   A,BUFF_LED5
          JMP   END_SCAN
SCAN_L6:  MOV   DIG_PORT,#11111011B
          MOV   A,BUFF_LED6
END_SCAN: MOV   DPTR,#TAB_LED
          MOVC  A,@A+DPTR
          MOV   LED_PORT,A
          JNB   F_BEEP,END_T0
          CLR   BEEP
END_T0:   POP   PSW
          POP   ACC
          RETI

TAB_LED:	DB 0C0H,0F9H,0A4H,0B0H,99H,92H   ;数码管显示字型表
		DB 82H,0F8H,80H,90H,88H,83H,0A7H
		DB 0A1H,86H,8EH,0FFH


;-----SUB PROCESS OF  IIC  (24C02)  READ/WRITE--------------------------------------
STA: SETB  SDA                    ;启动IIC总线
     NOP
     NOP
     SETB  CLK
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR   SDA
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR   CLK
     RET

STOP:CLR   SDA               ;停止IIC总线数据传输
     NOP
     SETB  CLK
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     SETB  SDA
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR   CLK
     RET

MACK:CLR   SDA                 ;发送应答位
     NOP
     NOP
     SETB  CLK
     NOP
     NOP
     NOP
     NOP
     NOP
     CLR   CLK
     NOP
     NOP
     SETB  SDA
     NOP
     NOP
     RET

MNACK:SETB   SDA                 ;发送非应答位
      NOP
      SETB  CLK
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR   CLK
      NOP
      NOP
      CLR   SDA
      NOP
      NOP
      RET

CACK:SETB  SDA                 ;应答位检查
     NOP
     NOP
     SETB  CLK
     NOP
     CLR   F0
     JNB   SDA, CAC
     SETB  F0
     NOP
 CAC:CLR   CLK
     NOP
     NOP
     RET


WBYTE:MOV  R0,#08H             ;向SDA线上发送一个字节
 WLP: RLC   A                  ;发送字在ACC中,占用R0,C
      JC    WR1
      LJMP  WR0
WLP1: DJNZ  R0,WLP
      RET
 WR1: SETB  SDA
      NOP
      NOP
      SETB  CLK
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR   CLK
      NOP
      NOP
      CLR   SDA
      LJMP  WLP1
 WR0: CLR   SDA
      NOP
      SETB  CLK
      NOP
      NOP
      NOP
      NOP
      NOP
      CLR  CLK
      NOP
      NOP
      LJMP WLP1

RBYTE:MOV  R0,#08H              ;从SDA线上读取一个字节
      MOV  R2,#00H
 RBLP:SETB  SDA               ;读出字节存ACC中,占用R0,R2,C
      NOP
      SETB  CLK
      NOP
      JNB   SDA,RD0
      AJMP  RD1
RBLP1:DJNZ  R0,RBLP
      MOV   A,R2
      RET
 RD0: CLR  C
      MOV  A,R2
      RLC  A
      MOV  R2,A
      CLR  CLK
      AJMP RBLP1
 RD1: SETB C
      MOV  A,R2
      RLC  A
      MOV  R2,A
      CLR  CLK
      NOP
      AJMP RBLP1

WNBYTE:PUSH  PSW              ;MCU发送N个字节
      MOV  PSW,#18H           ;占用第03组REG组,R1
      LCALL  STA              ;MTD 为MCU发送缓存区首址
      MOV   A,SLA             ;SLA 为器件接收缓存区首址
      LCALL   WBYTE           ;NUMBYT 为发送数据字节数
      LCALL  CACK
      JB  F0,WNBYTE
      MOV R1,MTD              ;#MTD
WRDA: MOV A,@R1
      LCALL  WBYTE
      LCALL  CACK
      JB  F0,WNBYTE
      INC  R1
      DJNZ  NUMBYT,WRDA
      LCALL  STOP
      POP   PSW
      RET


RNBYTE:PUSH   PSW           ;MCU接收N个字节
     MOV     PSW,#18H       ;占用第"11"组REG组,R1
     LCALL  STA             ;MRD 为MCU接收数据缓存区首址
     MOV    A,SLA           ;SLA 为MCU需读取器件数据缓存区首址
     LCALL  WBYTE           ;NUMBYT 为MCU接收数据字节数
     LCALL  CACK
     JB    F0,RNBYTE
 RDN:MOV   R1,MRD            ;#MRD

RDN1:LCALL  RBYTE
     MOV    @R1,A
     DJNZ   NUMBYT,ACK24
     LCALL  MNACK
     LCALL  STOP
     POP    PSW
     RET
ACK24:LCALL  MACK
     INC  R1
     JMP  RDN1

      END


END



⌨️ 快捷键说明

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