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

📄 新建 文本文档.txt

📁 是我在电子竞赛期间写的一些单片机汇编程序
💻 TXT
字号:
双机通讯(8032与8032)
第一题:
发送程序
          ORG      0000H
          AJMP     MAIN
          ORG      0030H
MAIN:     MOV	    TMOD,#20H
		   MOV   	TH1,#0F3H
		   MOV 	TL1,#0F3H
		   MOV	    SCON,#0C0H
		   MOV 	PCON,#80H
	  	   SETB	TR1
		   MOV 	R0,#50H
LOOP1:     MOV    A,@R0
		   MOV 	SBUF,A
WAIT:	   JBC 	TI,LOOP2
		   SJMP	WAIT
LOOP2:	   INC	R0
		   CJNE	R0,#60H,LOOP1
		   SJMP	$
		   END		    
接收程序
ORG     0000H
AJMP    MAIN
ORG     0040H
MAIN:	MOV    TMOD,#20H
		MOV    TH1,#0E6H
		MOV    TL1,#0E6H
		MOV    SCON,#0D0H
		MOV    PCON,#80H
		SETB   TR1
		MOV    R0,#50H
WAIT:	JBC	   RI,LOOP
		SJMP 	WAIT
LOOP:	MOV  	A,SBUF
		MOV 	@R0,A
		INC 	R0
		CJNE	R0,#60H,WAIT
		SJMP	$
		END

第二题: 甲机发送程序
ORG    0000H
LJMP   MAINT              ;跳至主程序入口
 
           ORG      0023H
           LJMP     INTSE1               ;转至串行中断服务程序
MAINT:     MOV      SCON,#01000000B      ;置串行口工作方式1
       MOV      TMOD,#20H            ;定时器1为工作方式2
       MOV      TH1,#0D9H            ;产生400波特率的时间常数
       MOV      TL1,#0D9H
       SETB     TCON.6               ;启动定时器1
       SETB     EA                   ;开中断
       SETB     ES                   ;串口开中断
       MOV      DPTR,#ADDRT          ;首址送DPTR
       MOV      R0,#00H              ;传送字节数初值
       MOVX     A,@DPTR              ;取第一个发送字节
       MOV      SBUF,A               ;启动串行口发送
       SJMP     $                    ;等待中断
;中断服务子程序
  INTSE1:  CLR      SCON.1               ;清中断标志
           CJNE     R0,#7FH,LOOP         ;判别128个字节都发送完否,若没有完,则转LOOP继续取下一个发送数据
           CLR      ES                   ;全部发送完毕,禁止串行口中断
           SJMP     ENDT                 ;转中断返回
   LOOP:   INC      R0                   ;修改字节数指针
           INC      DPTR                 ;修改地址指针
           MOVX     A,@DPTR              ;取发送数据
           MOV      SBUF,A               ;启动串行口
  ENDT:    RETI                          ;中断返回
乙机接收程序:
 ORG     0000H
LJMP    MAINR                ;跳至主程序入口
 ORG      0023H
           LJMP     INTSE2               ;转至串行中断服务程序
MAINR: MOV      SCON,#01010000B      ;置串行为接收口,工作方式1
       MOV      TMOD,#20H            ;定时器1为工作方式2
       MOV      TH1,#0D9H            ;产生400波特率的时间常数
       MOV      TL1,#0D9H
       SETB     TCON.6               ;启动定时器1
       SETB     EA                   ;开中断
       SETB     ES                   ;串口开中断
       MOV      DPTR,#ADDRR          ;首址送DPTR
       MOV      R0,#00H              ;传送字节数初值
       SJMP     $                    ;等待中断
;中断服务子程序
  INTSE2:  CPL      SCON.0               ;清中断标志
           MOV      A,SBUF              ;取接收的断据
           MOVX      @DPTR,A            ;接书的数据送缓冲区
           CJNE      R0,#7FH,LOOP       ;判128个字节接收完否。若没有,转LOOP继续
           CLR       ET1                ;接收下面的数据。全部接收完毕则关定时器1及关串口中断
           CLR       ES                 
           SJMP      SEND
  LOOP:    INC       R0                  ;修改计数指针
           INC       DPTR                ;修改地址指针
  SEND:    RETI                          ;中断返回

第三题: 
;甲机发送程序
;主程序:
ORG    0000H
LJMP   MAINT
ORG    0023H
LJMP  INTSE1
MAINT:    MOV   PCON,#80H
          MOV   SCON,#10010000B
          MOV   DPTR,#0200H
          MOV   R0,#00H
          SETB  EA
          SETB  ES
          MOVX  A,@DPTR
          ADD   A,#00H
          MOV   C,P
          MOV   TB8,C
          MOV   SBUF,A
          SJMP  $
;中断服务子程序
INTSE1:  JB     SCON.0,LOOP
         CLR    SCON.1
         SJMP   ENDT
LOOP:    CLR    SCON.0
         MOV    A,SBUF
         SUBB   A,#01H
         JC     LOOP3
         MOVX   A,@DPTR
         ADD    A,#00H
MOV     C,P
MOV     TR8,C
MOV     SBUF,A
SJMP    ENDT
LOOP3:       INC     DPTR
             INC     R0
             MOVX    A,@DPTR
             ADD     A,#00H
             MOV     C,P
             MOV     TR8,C
             MOV     SBUF,A
             CJNE    R0,#80H,ENDT
             CLR     ES
 ENDT:       RETI
;乙机接收程序
;主程序
        ORG   0000H
        LJMP  MAINR              
        ORG   0023H
        LJMP  INTSE2                                  
       
        ORG   0100H
 MAINR: MOV   PCON,#80H            ;波特率加倍
        MOV   SCON,#10010000B      ;工作方式2,允许接收
        MOV   DPTR,#0100H          ;数据指针首址
        MOV   R0,#00H              ;接收数据字节数初值
        SETB  EA                   ;CPU开中断
        SETB  ES                   ;串口开中断
        SJMP  $                    ;等待中断
                
 ;串行口中断服务程序      
 INTSE2:JB    SCON.0,LOOP        ;检测是否是本机的接收口中断,若SCON.0=1,转入接收程序
        CLR   SCON.1               ;若SCON.0=0,必若SCON.1=1是本机的发送中断,故应清零
        SJMP  ENDT                 ;跳至中断返回程序
 LOOP:  CLR   SCON.0               ;清本机的接收中断标志
        MOV   A,SBUF               ;取接收的数据
        ADD   A,#00H               ;奇偶校验
        MOV   C,P                  
        JC    LOOP1             ;若8位数为奇,则转LOOP1再检测RB8位        ORL   C,RB8                ;8位数为偶,再检测RB8位,RB8=1则
        JC    LOOP2                  9位数为奇,补偶错转LOOP2

        SJMP  LOOP3                ;补偶正确,转LOOP3
 LOOP1: ANL   C,RB8                ;8位数为奇,再检测RB8位,RB8=1,补偶正确,转LOOP3
        JC    LOOP3
 LOOP2: MOV   A,#0FFH              ;本机发应答信息(FFH)给甲机,表明数据传送不正确
        MOV   SBUF,A
        SJMP  ENDT                 ;跳至中断返回程序
 LOOP3: MOVX  @DPTR,A              ;将接收的正确数据送数据缓冲区
        MOV   A,#00H               ;本机发应答信息(00H)给甲机,表明数据传送正确,甲机发下一个数据
        MOV   SBUF,A
        INC   R0                   ;修改指针
        INC   DPTR
        CJNE  R0,#80H,ENDT         ;判128个字节接收完否
        CLR   ES                   ;接收完毕,关串行口中断
  ENDT: RETI                       ;中断返回
        END
                            

⌨️ 快捷键说明

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