BTLEQU2FH;波特率放在内部RAM的2FH单元
MOVTMOD,#21H;T0方式1,16位计数器,T1方式2,串口用
SETBTR0;启动T0
MOVBTL,#0F3H;波特率设定为1200
MOVSCON,#0C0H;串口方式3,9位数据,禁止接收
接收及验证程序:
NUMEQU2BH;同步符个数值存放在内部RAM的2BH单元
TEMPEQU2CH
ROM-CH:DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H
DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H;20字节同步符
MIMDB'WSC':3字节密码“WSC”
SETBP3.5;置电台收状态
SETBREN;允许串口接收
A1:MOVNUM,肆含#0;记录连续到同步符55H的个数
A2:JBRI,A2;串口有数据转A3
A3:CLRRI;清接收中断标志
MOVA,SBUF;读串口数据
CJNEA,#55H,A1;不是同步符转A1
INCNUM;收到的同步符个数加1
MOVA,NUM;取收到的同步符个数
CJNEA,#5,A2;未收够连续5个55H转A2
A4:MOVNUM,#0密码验证,记录收到密码字腔棚节数
A5:MOVDPTR,#MIM;密码字符首址
MOVA,NUM
MOVCA,@A+DPTR;查表取密码
MOVTEMP,A;保存密码
JBRI,A6;串口收完一个字节转A6
…
A6:CLRRI;清接收中断标志
MOVA,SBUF;读串口数据
CJNEA,TEMP,A4;与密码不符转A4
INCNUM;收到的密码个数加1
MOVA,NUM;取已收到的密码字节数
CJNEA,#3,A5;密码未裂圆笑收完转A5
发送程序:
CLRP3.5;置电台发状态
MOVB,#23
MOVDPTR,#ROM-CH
B1:CLRA
MOVCA,@A+DPTR;查表发送同步符和密码共24字节
INCDPTR
LCALLSEND-CH;调发送单字节子程序
DJNZB,B1
…
CLRA
MOVDPTR,#7000H;外部RAM数据首址,发送外部RAM中的数据到电台
B2:CJNER4,#0,B3
CJNER3,#0,B3;R4R3=发送字节数
B3:MOVXA,@DPTR;取数据
INCDPTR
LCALLSEND-CH
CJNER3,#0,B4
CJNER4,#0,B5
B4:DECR3
LJMPB2
DECR3
DECR4
LJMPB2
…
SEND-CH:SETBTB8
MOVSBUF,A
DB0,0,0,0,0,0,0,0
JNBTI,$;延时4μs
CLRTI
RET
结语
双机通信不需要安装虚拟端口软件,两机通过txd
<==>
rxd
直接通信。
#include
#define
uchar
unsigned
char
#define
uint
unsigneed
int
uchar
a0,a1,a2,a3,temp,i
uchar
code
tab[
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
sbit
p2_0=p2^0
sbit
p2_1=p2^1
sbit
p2_2=p2^2
sbit
p2_3=p2^3
void
delay(int
ms)
{
while(ms--)
for(i=0i<123i++)
}
void
inituart()
{
tmod=0x20
//m1=1,m0=0
定时器1工作方式2(定时常数重装,8
位或纳)
scon=0x50
//sm0=0,sm1=1,ren=1
串口工作方式1,允许接收
th1=0xfd
//晶振11.0592时,波特率衫游没9600
tl1=th1
//tl1计数,溢出后,th1值送入tl1
ea=1
//开总中断
es=1
//允许串口中断
tr1=1
//启动定时器1
}
void
disp()
{
a0=temp%2
a1=temp/2%2
a2=temp/2/2%2
a3=temp/2/2/2%2
p2_0=0
p0=tab[a0]
delay(1)
p2_0=1
p2_1=0
p0=tab[a1]
delay(1)
p2_1=1
p2_2=0
p0=tab[a2]
delay(1)
p2_2=1
p2_3=0
p0=tab[a3]
delay(1)
p2_3=1
}
void
main()
{
inituart()
/磨旁/调用串口初始化子程序
while(1)
{
disp()
sbuf=p1
while(ti==0)
ti=0
}
}
void
uartinterrupt(
)
interrupt
4
{
if(ri)
{
ri=0
temp=sbuf
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)