单片机 多机通讯c语言,【C语言】89c52单片机的多机串口通讯,救助

这篇博客详细介绍了如何使用C语言编写一个简单的从机程序(slave.c),通过串口进行通信。它涵盖了中断处理、地址识别、数据发送与接收、错误检测等核心功能。通过SSIO中断服务函数,程序能够处理来自主机的命令并作出相应反应,包括数据传输和状态指示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

//从机程序slave.c如下

#include

#define uchar unsigned char

#define SLAVE 0x02 //从机地址

#define BN 16

bit tready;

bit rready;

void main(void)

{

TMOD=0x20;

TL1=0xfd;

TH1=0xfd;

PCON=0x00;

TR1=1;

SCON=0xf0;

ES=1;

EA=1;

while(1){tready=1;rready=1;} //假定准备好发送和接收

}

void ssio(void)interrupt 4 using 1

{ void str(void);

void sre(void):

uchar a,i;

RI=0;

ES=0; //关串行口中断·

if(SBUF!=SLAVE){ES=1;goto reti;} //非本机地址、继续监听

SM2=0; //取消监听状态

SBUF=SLAVE; //从机地址发回

while(TI!=1);TI=0;

while(RI!=1);RI=0;

if(RB8==1){SM2=1;ES=1;goto reti;} //是复位信号,恢复监听

a=SBUF; //接收命令

if(a=0x01){ //从机接收主机的数据

if(rready==1)SBUf=0x01; //接受准备好发送状态

else SBUF=0x00;

while(TI!=1);TI=0;

while(RI!=1);RI=0;

fi(RB8==1){SM2=1;ES=1;goto reti;}

sre();

} //接收数据块

else{

if(a=0x02){ //从机向主机发数据

if(tready==1)SBUF=0x02; //发送准备好发送状态

else SBUF=0x00;

while(TI!=1);TI=0;

while(RI!=1);RI=0;

if(RB8==1){SM2=1;ES=1;goto reti;}

str(); } //发送数据块

else{

SBUF=0x80; //命令非法,发状态

while(TI!=1);TI=0;

SM2=1;

ES=1; //发送状态

}

}reti;

}

void str(void)// 发送数据块

{ uchar p.i;

tready=0;

do{p=0;// 清校验和

for(i=0;i

{SBUF=trbuf[i];// 发送一数据

p+=trbuf[i];

while(TI!=1);

TI=0;

}

SBUF=p;// 发送校验和

while(TI!=1);TI=0;

while(RI!=1);RI=0;

}while(SBUF!=0); //主机接受不正确,重新发送

SM2=1;

ES=1;

}

void ste(void) //接收数据块

{ uchar p,i;

rready=0;

while(1)

{ p=0; // 清校验和

for(i=0;i

{while(RI!=1);RI=0;

rebuf{i}=SBUF;

p+=rebuf[i]; // 接收一数据

}

while(RI!=1);RI=0;

if(SBUF==p){SBUF=0x00;break;} // 校验和相同发“00”

else{

SUBF=0xff;//校验和不同发“ff”重新接收

while(TI==0);TI=0;

}

}

SM2=1;

ES=1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值