📄 2400m16.asm
字号:
.include "m16def.inc" ;ATmega16头文件
.equ RX_LED =0 ;
.equ TX_LED =1 ;
;rxd pd0
;txd pd1
.equ DR1 =2 ;无线信号标志
;clk1 PB5 (spi clk)
;miso PB4 (spi so) data
;misi PB3 (spi si) data
.equ CE =2 ;PC2 使能
.equ PWR_UP =1 ;PC1 无线模块工作电源
.equ CS =0 ;PC0 片选
.equ MODE =3 ;PC3 模式
;;;;;
.def com_buffer =r16 ; 数据缓存
.def LED_S =r20 ; 指示灯状态
;
.org $000
rjmp reset
.org $050
reset:
cli
ldi r16,high(RAMEND) ; 堆栈处理
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
;I/O 方向定义 ,1 输出 0 输入
ldi r17,$2f
out DDRB,r17
ldi r17,$07
out DDRC,r17
ldi r17,$02
out DDRD,r17
sbi portb,4 ;上拉
;
USART_Init: ;串口初始化
ldi r16, $18 ;接收发送使能
out UCSRB,r16
ldi r16,$86 ;8n1
out UCSRC,r16
ldi r16,$00
out UBRRH,r16
ldi r16,$0C ;波特率
out UBRRL,r16
;
SPI_Init: ;SPI初始化
ldi r16,$51
out SPCR,r16
ldi r16,$01
out SPSR,r16
;
start: ;配置无线模块
cbi PORTC,PWR_UP
cbi PORTC,CS
cbi PORTC,CE
;
sbi PORTC,PWR_UP
rcall delay_5mS
sbi PORTC,CS ;config
rcall delay_5uS
start1: ldi r16,$00
out SPDR,r16
config1: sbis SPSR,SPIF
rjmp config1
;
ldi r16,$08
out SPDR,r16
config2: sbis SPSR,SPIF
rjmp config2
;
ldi r16,$00
out SPDR,r16
config3: sbis SPSR,SPIF
rjmp config3
;
ldi r16,$00
out SPDR,r16
config4: sbis SPSR,SPIF
rjmp config4
;
ldi r16,$00
out SPDR,r16
config5: sbis SPSR,SPIF
rjmp config5
;
ldi r16,$00
out SPDR,r16
config6: sbis SPSR,SPIF
rjmp config6
;
ldi r16,$00
out SPDR,r16
config7: sbis SPSR,SPIF
rjmp config7
;
ldi r16,$00
out SPDR,r16
config8: sbis SPSR,SPIF
rjmp config8
;
ldi r16,$00
out SPDR,r16
config9: sbis SPSR,SPIF
rjmp config9
;
ldi r16,$00
out SPDR,r16
config10: sbis SPSR,SPIF
rjmp config10
;
ldi r16,$00
out SPDR,r16
config11: sbis SPSR,SPIF
rjmp config11
;
ldi r16,$cc
out SPDR,r16
config12: sbis SPSR,SPIF
rjmp config12
ldi r16,$23
out SPDR,r16
config13: sbis SPSR,SPIF
rjmp config13
ldi r16,$6f
out SPDR,r16
config14: sbis SPSR,SPIF
rjmp config14
;无线模块的工作模式, 1 接收模式,0 发射模式
sbis PINC,MODE
rjmp config15_1
;recieve mode
ldi r16,$05
out SPDR,r16
config15: sbis SPSR,SPIF
rjmp config15
rjmp config15_3
config15_1:
ldi r16,$04
out SPDR,r16
config15_2: sbis SPSR,SPIF
rjmp config15_2
config15_3:
nop
cbi PORTC,CS
NOP
rcall delay_5mS
;配置完成
;
cbi PORTB,RX_led
cbi PORTB,TX_led
ldi LED_S,$12 ;
;
sbis PINC,MODE
rjmp SEND_MODE
RECIEVE_MODE: ;接收模式
loop:
in r16,SPSR ;
cbi PORTC,CS
rcall delay_5uS
sbi PORTC,CE
sbis PIND,DR1 ;判断是否接收到有效的无线数据
rjmp loop
;recieved RF data
ldi r16,$ff
out SPDR,r16
read_spi: ;获取无线数据
sbis SPSR,SPIF
rjmp read_spi
in r16,SPDR ;转发给串口
out UDR,r16 ;usart
send_uart: sbis UCSRA,UDRE ;等待串口发送
rjmp send_uart
;
cpi LED_S,$12 ;状态灯指示
brne loop_1
cbi PORTB,RX_led
ldi LED_S,$21
rjmp loop
loop_1: sbi PORTB,RX_led
ldi LED_S,$12
rjmp loop ;循环
;
SEND_MODE: ;发送模式
sbis UCSRA,RXC ;判断串口是否接收到数据
rjmp SEND_MODE
in r16,UDR ;获取串口数据
;
;
cbi PORTC,CS ;无线模块发送数据准备
cbi PORTC,CE
rcall delay_5uS
sbi PORTC,CE
rcall delay_5uS
;addr
ldi r17,$cc
out SPDR,r17
SEND_MODE_1: sbis SPSR,SPIF
rjmp SEND_MODE_1
;data
out SPDR,r16 ;将串口数据转发给无线模块
SEND_MODE_2: sbis SPSR,SPIF ;等待发送数据载入
rjmp SEND_MODE_2
;
nop
cbi PORTC,CE ;启动无线发送数据
rcall delay_200uS
;
cpi LED_S,$12 ;状态灯处理
brne SEND_MODE_3
cbi PORTB,TX_led
ldi LED_S,$21
rjmp SEND_MODE
SEND_MODE_3: sbi PORTB,TX_led
ldi LED_S,$12
rjmp SEND_MODE ;循环
;;;;
;软件延时子程序,实现非精确延时。
DELAY_5uS:
ldi r18,$06 ;
L1:dec r18
brne L1
ret
delay_200uS: ;
ldi r19,30
L2: rcall delay_5us
dec r19
brne L2
ret
delay_5mS:
ldi r20,25 ;
L3: rcall delay_200us
dec r20
brne L3
ret
dec r18
brne L2
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -