//从机1串行通信程序
#include <reg52.h>
sbit led=P2^0; //定义P2.0连接的黄色LED
bit rrdy=0; //接收准备标志位rrdy=0,表示未做好接收准备
bit trdy=0; //发送准备标志位trdy=0,表示未做好发送准备
bit err=0;
void delay_ms(unsigned int i) //延时函数
{
unsigned char j;
for(;i>0;i--)
for(j=0;j<125;j++)
;
}
void main() //从机1主函数 廖轶超项目3
{
EA=1; //总中断打开
TMOD=0x20; //T1方式2自动装载,用于设置波特率
TL1=0xfd;TH1=0xfd; PCON=0x00; //波特率设为9600
SCON=0xd0; //SM2设为0,TB8设为0
TR1=1; //启动定时器T1
P1=0xff; //向P1写入全1,8个绿色LED全灭
ES=1; //允许串口中断
while(RI==0); //接收控制指令0xff
if(SBUF==0xff) err=0; //如果接收到的数据为0xff,err=0,表示通信正常
else err=1; //err=1,表示接收出错
RI=0; //接收中断标志清0
SM2=1; // SM2置1,为多机通讯做好准备。
while(1);
}
void int1() interrupt 4 //串行口中断函数
{
if(RI)
{
if(RB8) //如果RB8=1,表示接收的为地址帧
{
RB8=0;
if(SBUF==0x02) //如接收的数据为地址帧0x01,是本从机的地址
//2#机本句改为:if(SBUF==0x02)
{
SM2=0; //则SM2清0,准备接收数据帧
led=0; //点亮本从机黄色发光二极管
}
}
else //如果接收的不是本从机的地址
{
rrdy=1; //准备好接收标志置1
P1=SBUF; //串口接收的数据送P1,LED显示
SM2=1; // SM2仍为1
led=1; // 熄灭本从机黄色发光二极管
}
RI=0;
}
delay_ms(500);
P1=0xff; //熄灭本从机8个绿色发光二极管
}