|
本篇文章简单描述了对舰上16枚火箭进行遥控点火最基本的芯片通信调试过程。有关的具体控制暂未公布,如果你对这个遥控设计感兴趣或有商业需求,请联系作者,QQ:25476165。
2.使用的315芯片的资料:
http://www.ayxsj.com/f05p.htm
http://www.ayxsj.com/j04v.htm
3. 遥控端信号发射部分的电路(测试用)

4.
原理
第一块单片机p1.0口输出脉冲方波提供给无线发射模块,无线发射模块将信号以电磁波的形式传到无线接收模块。无线接收模块会根据这个电磁波还原出脉冲方波提供给第二块单片机,第二块单片机进行进一步的解算处理。
5.
通信协议
根据这个原理和315M收发模块的特性。我决定以900us高电平和2000us底电平表示1;450us高电平和
2000us低电平表示0。而8个1或0组成一个字节。为了防止误码,所以在每个字节的前面加一个2ms高电平和2ms低电平的起始码。
6. 单片机相关知识
⑴用定时器产生制定脉宽的脉冲
⑵用计数器计算接收到脉冲的宽度
GATE=1时(门控方式),
启动计数器的条件
TR=1且INT0=1。所以利用这点,可以测量外部脉冲的高电平宽度
7.
单片机调试程序
第一步的调试不停发送1(
一个位)
,观察接收到的信号是否正常。有示波器的话非常方便直观,如果没有示波器,那么可以在单片机上接16个LED灯,将TH0显示在P2口的8个灯,TL0显示在P0的8个灯。比如收到脉宽900us的信号,那么TL0=11000010B
TH0=1B
,下排P2口左边第二个和右边最后两个灯亮,上排P0口左边第一个亮。然而实验中发现实际接收到的脉宽比预计的平均少20us,但是这丝毫不会影响接收数据的正确性,因为在这个协议中只要判断TH0和TL0的高4位就足以识别是1或0了发送程序关键部分如下。
略
第二步的调试发送一字节数据( 8个位) ,并显示在P2口上ORG 0000H
AJMP
MAIN
ORG
0010H
MAIN:
MOV
TMOD,#01H
CLR C
MOV
R5,#08H
aa:
MOV
A,#10101010B
acall
send
mov
a,#01010101b
acall
send
mov
a,#11110000b
acall
send
mov
a,#1111b
acall
send
ajmp aa
send:
MOV
TH0,#00fcH
MOV
TL0,#0018H
SETB
P1.0
SETB
TR0
JNB
TF0,$
CLR P1.0
CLR TF0
MOV
TH0,#00FCH
MOV
TL0,#0025H
SETB TR0
JNB
TF0,$
CLR TF0
SS:
RLC A
JC S1
AJMP S0
S1:
MOV
TH0,#00feH
MOV
TL0,#003fH
SETB
P1.0
SETB
TR0
JNB
TF0,$
CLR P1.0
CLR TF0
MOV
TH0,#00FCH
MOV
TL0,#0025H
SETB TR0
JNB
TF0,$
CLR TF0
AJMP OUT
s0:
MOV
TH0,#00ffH
MOV
TL0,#001fH
SETB
P1.0
SETB
TR0
JNB
TF0,$
CLR P1.0
CLR TF0
MOV
TH0,#00FCH
MOV
TL0,#0025H
SETB TR0
JNB
TF0,$
CLR TF0
ajmp out
OUT:
DJNZ
R5,SS
clr c
mov
a,#10101010b
mov
r5,#08h
ret
DELAY:
mov
R0,#05Fh
w_1:
mov
R1,#0fFh
w_2:
djnz
R1,w_2
djnz
R0,w_1
RET
接收端的电路(测试)
如果顺利,那么在接收芯片的数据输出端也会产生900us脉宽的脉冲波。如果没有示波器,那么怎么知道接受到信号的脉宽呢?我在P2口接了8个LED。读取TH0
TL0
里的数值,取反,然后依次在P2上显示。比如900us脉宽对应TH0=11B
TL0=10000100B,对应位为1折亮,所以当显示TH0的时候最左边的两个LED会被点亮,而显示TL0的时候从左往右:第三个和最后一个亮。但事实上脉冲信号存在20us的误差。然而这丝毫不影响遥控的准确性,因为我是取900us表示1,450us表示0,然后根据8个1或0组成一个字节的控制码。具体的通信协议就不在这啰嗦了

接收部分测试用的代码
ORG
0000H
AJMP
MAIN
org
0003h
ajmp TF
ORG
0050H
MAIN:
SETB
IT0
CLR IE0
MOV
TMOD,#00001001B
MOV
TH0,#00H
MOV
TL0,#00H
MOV
IE,#10000001B
ajmp $
TF:
acall
det
MOV
A,TH0
CJNE
A,#07H,diuqi
AJMP
DETECT
detect:
acall
det
MOV
A,TH0
CJNE
A,#03H,S_C
AJMP
SETB1
S_C:MOV
A,TH0
CJNE
A,#01h,ERROR
AJMP
SETB0
SETB1:
MOV A,R7
SETB C
RLC A
MOV R7,A
DJNZ
R3,DETECT
AJMP OUT
SETB0:
MOV A,R7
CLR C
RLC A
MOV R7,A
DJNZ
R3,DETECT
AJMP OUT
det:
mov
th0,#00h
mov
tl0,#00h
JB
P3.2,detect
SETB TR0
S_2:
JNB
P3.2,S_2
s_3:
JB
P3.2,s_3
clr tr0
ret
diuqi:
acall
fuwei
reti
ERROR:
clr p0.7
acall
delay
setb
p0.7
acall
delay
acall
fuwei
RETI
OUT:
clr p0.6
CPL A
mov p2,A
mov
r4,#20h
del:acall
delay
djnz
r4,del
setb
p0.6
mov
p2,#0ffh
acall
delay
acall
fuwei
reti
fuwei:
mov
TH0,#00h
mov
TL0,#00h
MOV
R3,#08H
MOV
R6,#02H
clr ie0
ret
DELAY:
mov
R0,#061h
w_1:
mov
R1,#0ffh
w_2:
djnz
R1,w_2
djnz
R0,w_1
RET
|