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

📄 walkie_talkie.asm

📁 Atmega 串口双向通信实现
💻 ASM
字号:
.include "m64def.inc"
;公共定义
.def A=R16
.def B=R17

.EQU RXD0_POINT =$203
.EQU RXD1_OVR =$204

.EQU TXD0_TRANS_BUFFER_len = $FD
.EQU TXD0_TRANS_BUFFER = $206




.CSEG
.ORG 0000
   jmp main


.org $0024
  jmp RXD0_INTERRUPT;串行口0接收中断服务程序
.org $0026
      reti

.org $0028
   jmp RS232C_TXD0;串行口0发送中断服务程序

.org $003A
   jmp TIMER3_OVF ;中断定时程序,在50ms内读通道2的最大值

.org $003C
  jmp RXD1_INTERRUPT;串行口1接收中断服务程序

.org $0040
   jmp RS232C_TXD1;串行口1发送中断服务程序




main:
    LDI R16,LOW(RAMEND)
    OUT SPL,R16
    LDI R16,HIGH(RAMEND)
    OUT SPH,R16
   
    CALL u1_init0
	call u1_init1
    ldi a,0
    sts RXD0_POINT,a
	LDI A,1
	STS RXD1_OVR,A
    
	LDI R16,$f7;初始化c口;pc0为0时M7512的XD可发;pc1为0时M7512的XD可发;pc1为1时且pc0M7512的RD可收;
   	out DDRc,R16
	LDI R16,$03
    out PORTc,R16

	ldi R16,$0;初始化TIMER3
	STS TCCR3A,R16
    ldi R16,$2;0
	STS TCCR3B,R16;设置为8分频  (1/8,000,000)*8*50000=50ms 65535-50000=3CAF
    ldi R16,$0
    STS TCCR3C,R16
    SEI


LOOP:
  
   LDS A,RXD1_OVR
   CPI A,0
   BREQ CHENG_SET
   JMP LOOP
CHENG_SET:
	LDI R16,$f7
   	out DDRc,R16
	LDI R16,$03
    out PORTc,R16
  
    
JMP LOOP
		






DELAY_10mS:PUSH A
           PUSH B
		   LDI B,100
DLY1021:LDI A,100
DLY1011:NOP
		  NOP
		  NOP
		  NOP
		  DEC A
		  CPI A,0
		  BRNE DLY1011
		  DEC B
		  CPI B,0
		  BRNE DLY1021
		   POP B
		  POP A
		  RET





		   

RXD0_INTERRUPT:PUSH A;串行口1接收中断服务程序 
               IN A,SREG
			   PUSH A
			   PUSH B
			   PUSH R18
			   PUSH R19
			   PUSH R21
			   
			   PUSH XL
			   PUSH XH

				LDI R16,$ff;只要有从上位机收到的信号就设置mod1为0m7512处于发信号状态;同时需要将ptt拉底;
	   	        out DDRc,R16
		        LDI R16,$00
	            out PORTc,R16
                LDI B,$0
			    LDI R18,$0
			    CPI R20,$FF
			    BREQ RXD1_INTERRUPT_OUT
			    CPI R20,$0
                BREQ RXD1_SET
			    MOV R21,R20


RXD1_STATE:  LDI XL,LOW(TXD0_TRANS_BUFFER)
			 LDI XH,HIGH(TXD0_TRANS_BUFFER) 
             MOV R19,R21
             DEC R19
			 CLC
             ADD XL,R19
             ADC XH,R18
			 LD  B,X+
			 ST X,B
			 DEC R21
            CPI R19,$0
			 BRNE RXD1_STATE
RXD1_SET:    LDI XL,LOW(TXD0_TRANS_BUFFER)
			 LDI XH,HIGH(TXD0_TRANS_BUFFER) 
             lds a,udr1
             ST X,A
            
			 INC R20
			 LDS A,RATE_FLAG
             INC A
			 STS RATE_FLAG,A
	
			 

			 

TIME_INI:LDI R16,$F8;FC 
	   STS TCNT3H,R16
       LDI R16,$17
       STS TCNT3L,R16   ;TCNT3H and TCNT3L
       ldi R16,$04;00000100 允许定时器3溢出中断
 	   STS ETIMSK,R16  
	   LDI A,1
	   STS RXD1_OVR,A   
	   JMP RXD1_INTERRUPT_OUT
CHENGE_SPEED:
             LDI A,0
			 STS RATE_FLAG,A
             CPI R22,0
             BREQ TIME_INI
			 ldi A,$68
             sts ubrr1l,A
             out ubrr0l,A
			 LDI R22,0
			 JMP TIME_INI
RXD1_INTERRUPT_OUT:  POP XH
			   POP XL
			  
			   POP R21
			   POP R19
			   POP R18
			   POP B
			   POP A
			   OUT SREG,A
			   POP A
               RETI
	
RS232C_TXD1:reti

RXD1_INTERRUPT:;串行口0接收中断服务程序 
           PUSH A
           IN A,SREG
	       PUSH A
		   PUSH B
          
           lds a,udr1
           out UDR0,A


RXD1_INTERRUPT_OUT:POP B
			   POP A
			   OUT SREG,A
			   POP A
               RETI

RS232C_TXD0:reti







TIMER3_OVF:PUSH A
          LDI A,0
		   STS RXD1_OVR,A
           POP A             
            RETI



u1_init0:   ;初始化串口0  
    push A                        
  
   ldi A,$22
   out ucsr0a,A;out ucsr1a,A
   ldi A,$D8;(D8允许接收中断和发送中断;98是允许接收中断,禁止发送中断,接收、发送为8位数据位;)18;(18是禁止收发中断,接收、发送为8位数据位;)(d8是允许中断,接收、发送为8位数据位;)
   out ucsr0b,A;out ucsr1b,A
   ldi A,$03;$0;01
   sts ubrr0h,A;out ubrr1h,A
   ldi A,$40;34;67;$1A=38400;$67=9600;$34;$d0;$0d0;a0;  (1a0=  416   600bps crystal:4MHz)($340=832 600bps  8MHz crystal)
   out ubrr0l,A;out ubrr1l,A   波特率9600bps
   ldi A,$06;$8e 奇偶、8位数据、1位停止 
   sts ucsr0c,A;out ucsr1c,A
   in A,ucsr0b
   ori A,$18
   out UCSR0B,A  ;发送允许标志
;   OUT UDR0,A;
   POP A
      ret

u1_init1:   ;初始化串口1  
    push A                        
  
   ldi A,$22;原来是02
   sts ucsr1a,A;out ucsr1a,A
   ldi A,$D8;(D8允许接收中断和发送中断;98是允许接收中断,禁止发送中断,接收、发送为8位数据位;)18;(18是禁止收发中断,接收、发送为8位数据位;)(d8是允许中断,接收、发送为8位数据位;)
   sts ucsr1b,A;out ucsr1b,A
   ldi A,$03;$0;01
   sts ubrr1h,A;out ubrr1h,A
   ldi A,$40;26=38400;$68=9600;$34;$d0;$0d0;a0;  (1a0=  416   600bps crystal:4MHz)($340=832 600bps  8MHz crystal)
   sts ubrr1l,A;out ubrr1l,A   波特率9600bps
   ldi A,$06;$8e 无奇偶、8位数据、1位停止
   sts ucsr1c,A;out ucsr1c,A
   LDS A,ucsr1b
   ori A,$18
   STS UCSR1B,A  ;发送允许标志
;   STS UDR1,A;
   POP A
   ret

⌨️ 快捷键说明

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