单片机双机串口通信程序设计

单片机双机串口通信程序设计,第1张

初始化程序:

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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12343987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存