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

📄 tongxin.txt

📁 单片机实现双机通信的汇编语言程序! 汇编语言实现
💻 TXT
字号:
DISP1  EQU  38H       ;串行显示寄存器1 DISP2  EQU  39H       ;串行显示寄存器2 SRDAT  EQU  3AH       ;收发数寄存器 TCER   EQU  40H       ;定时中断0定时次数 DIRLOP EQU  5BH       ;显示字节数寄存器 CLK    EQU  P1.1      ;串行显示时钟 DAT    EQU  P1.0      ;串行显示数据位          ORG   0000H          AJMP  START                    ORG   0023H                ;串口中断程序          AJMP  RECIVE                    ORG   0030H START:   MOV   R0,#38H              ;初始化程序          MOV   A,#0 MAIN0:   MOV   @R0,A          INC   R0          CJNE  R0,#40H,MAIN0          MOV   IE,#10010000B        ;开启串口的中断请求          MOV   TMOD,#20H            ;设定定时器1为方式2(波特率发生器)          MOV   TH1,#0FAH            ;波特率为2.4kbps(6MHz时钟)          MOV   TL1,#0FAH          SETB  TR1          MOV   SCON,#0D0H           ;设置串口          MOV   PCON,#00H           MAIN:    ACALL  KEY                 ;键扫描          ACALL  TRANS               ;显示拆字          ACALL  DISP                ;串行显示          ACALL  DL10MS              ;延时          ACALL  DL10MS          MOV   SCON,#0D0H           ;重新设置串口,准备下次通信          SETB  ES          NOP          NOP          SJMP  MAIN                                     ;串行接收程序 RECIVE:  CLR   ES                   ;关闭串行中断          PUSH  ACC
         PUSH PSW FMT_RAM: MOV R1,#SRDAT               //载入接受数据单元 RX_ACK:  JBC RI,IF_06H               //检查“06H“信号 SJMP RX_ACK IF_06H: MOV A,SBUF         CJNE A,#06H,TX_15H TX_00H: MOV A,#00H                   //发送”00H“应答信号准备接受         MOV SBUF,A  WAIT1:  JBC TI,RX_BYTES         SJMP WAIT1 RX_15H: MOV A,#15H                   //发送”15H“信号,要求重发信号             MOV SBUF,A WAIT2:  JBC TI,HAVE1         SJMP WAIT2 HAVE1:  LJMP RX_ACK RX_BYTES:                           //接受发送字节数         JBC RI,HAVE2         SJMP RX_BYTES HAVE2:  MOV A,SBUF         JNB PSW.0,LOOP2             //校验         JNB RB8,LOOP3 	SJMP LOOP4 LOOP2: JB RB8,LOOP3 LOOP4: MOV R6,A        CLR PSW.5 TX_BACK: MOV A,#0FH                   //接受成功,发回”0FH“信号          MOV SBUF,A TX_YES: JBC TI,RX_NEWS         SJMP TX_YES  
RX_NEWS: JBC RI,HAVE3          SJMP RX_NEWS HAVE3:  MOV A,SBUF                    //接受数据         JNB PSW.0,LOOPA 	JNB RB8,LOOP3 	SJMP LOOPB LOOPA:  JB RB8,LOOP3 LOOPB:  MOV @R1,A         CLR,PSW.5 TX_BACK1:                                //接受成功,发回"0FH”信号         MOV A,#0FH 	    MOV SBUF,A TX_YES1:         JBC TI,RX_N 	    SJMP TX_YES1 RX_N: INC R1                          //判断接受完了没有        DJNZ R6,RX_NEWS TX_RIGHT:                             //接受成功,发回“0FH"信号,接受完成        MOV A,#0FH        MOV SBUF,A
WAIT3: JBC TI,GOOD
       SJMP WAIT3
GOOD:  POP PSW            ;中断返回
       POP ACC
       RETI
LOOP3: SETB PSW.5          ;接收出错,发"F0"信号,要求重发
       MOV A,#0F0H
       MOV SBUF,A
WAIT4: JBC TI,AGAIN
       SJMP WAIT4
AGAIN: LJMP FMT_RAM
KEY: MOV P2,#0FFH           ;检查有否键按下
     NOP
     NOP
     JNB P2.0,K1
     JNB P2.1,K2
     JNB P2.2,K3
KBACK: RET
K1: ACALL DL10MS             ;K1键功能
    JB P2.0,KBACK
J1: JNB P2.0,J1
    MOV A,SRDAT              ;收发数寄存器加1
    ANL A,#0FH
    CJNE A,#0FH,J11
    ANL SRDAT,,#0F0H
    RET
J11: MOV A,SRDAT 
     ADD A,#1
     MOV SRDAT,A
     RET
K2: ACALL DL10MS                ;K2键功能
    JB P2.1,KBACK
J2: JNB P2.1,J2
    MOV A,SRDAT                  ;收发数寄存器加1
    ANL A,#0F0H
    CJNE A,0F0H,J21
    ANL SRDAT,#0FH
    RET
    J21: MOV A,SRDAT ADD A,#10H
    MOV SRDAT,A
    RET
K3: ACALL DL10MS                  ;串口发送数据
            JB P2.2,KBACK
        J3: JNB P2.2,J3
            ACALL SEND
            RET
     DELAY: MOV 70H,#0FFH             ;键盘防抖动延时程序
    DELAY1: DJNE 70H,DELAY1
            RET
    DL10MS: MOV 71H,#0AH              ;10ms定时程序
   DL10MS1: ACALL DELAY
            DJNZ 71H,DL10MS1
            RET
  
 SEND: CLR ES                    ;串口发送程序
  FMT_RAM1: MOV R0,#SRDAT             ;载入发送数据单元
            MOV R5,#1                 ;发送字节数
   TX_ACK1: MOV A,#06H                ;发出“06H”初始信号
            MOV SBUF,A
    WAIT11: JBC TI,RX_YES1
            SJMP WAIT11
   RX_YES1: JBC RI,NEXT11
            SJMP RX_YES1
    NEXT11: MOV A,SBUF                ;接收判断是否“00H”
            CJNE A,#00H,TX_ACK1
 TX_BYTES1: MOV A,R5                  ;发送发送字节数
            MOV C,P
            MOV TB8,C                 ;发送校验位
            MOV SBUF,A
    WAIT21: JBC TI,TX_NEWS1
            SJMP WAIT21
  RX_RCE11: JBC RI,RX_YES21
            SJMP RX_RCE11
  RX_YES21: MOV A,SBUF                ;接收判断是否“0FH”接收成功信号,否则重发
            CJNE A,#0FH,TX_BYTES1
  TX_NEWS1: MOV A,@R0                 ;发送数据
            MOV C,P
            MOV TB8,C
            MOV SBUF,A
    WAIT31: JBC TI,NEXT21
            SJMP WAIT31
  RX_RCE21: JBC RI,RX_YES31
            SJMP RX_RCE21
  RX_YES31: MOV A,SBUF                ;判断是否“0FH”接收成功信号,否则重发
            CJNE A,#0FH,TX_NEWS1
    NEXT21: INC R0
            DJNZ R5,TX_NEWS1          ;判断发送完毕没有   
RX_OFH1:JBC RI,IF_0FH1
        SJMP RX_0FH1
IF_0FH1:MOV A,SBUF
        CJNE A,#0FH,FMT_RAM1   //接收完成信号退出发送程序
        RET
TRANS:MOV DISP2,SRDAT
TRAN2:MOV A,DISP1              //显示拆字程序
      ANL A,#0F0H
      SWAP A
      MOV 3CH,A
      MOV A,DISP1
      ANL A,#0FH
      MOV 3DH,A
      MOV A,DISP2
      ANL A,#0F0H
      SWAP A
      MOV 3EH,A
      MOV A,DISP2
      ANL A,#0FH
      MOV 3FH,A
      RET
DISP:MOV DIRLOP,#4           //以P1.0代RXD,P1.1代TXD的串行显示程序
     MOV R0,#3CH             //3CH到3FH是显示缓冲区 
DL0:MOV A,@R0
    MOV DPTR,#TAB
    MOVC A,@A+DPTR           //查得相应的七段代码
    ACALL DIRS                //调用单字节串行发送程序
    INC R0
    DJNZ DIRLOP,DL0
    RET
TAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H          //共阴七段数码管代码表
     DB 0BEH,0E0H,0FEH,0EEH,03EH,9CH
     DB 7AH,9EH,8EH
DIRS:SETB CLK                         //模拟串口发送数据
     MOV R7,#8                        //8位(一个字节)
DIRS1:CPL CLK                        //形成脉冲上升沿                   
      RRC A                            
      MOV DAT,C                      //发送一位数据                   
      CPL CLK           
      DJNZ R7,DIRS1
      RET
      END    

⌨️ 快捷键说明

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