protues怎么模拟485_51单片机与485全双工通信Proteus仿真程序

本文介绍了如何使用protues模拟485通信,通过51单片机实现全双工通信的Proteus仿真程序。文章详细讲解了通信初始化、数据发送和接收的步骤,并提供了相应的代码实现,帮助读者理解485通信协议。
摘要由CSDN通过智能技术生成

#include

#include

#define TR 1

#define uchar unsigned char

#define uint  unsigned int

uchar idata buf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};  //从机1发送的数据

uchar idata buf1[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09}; //从机2发送的数据

uchar idata buf2[3];                                                      //接受从机的数据

uchar data1,data2,data3;

uchar pf,addr,TRR,count,count1;

uchar flag,flag1,flag2=3;

uchar i;

sbit key1=P2^0;

/************延时程序************/

void delay(uchar k)

{

uchar j;

while((k--)!=0)

{

for(j=0;j<125;j++)

{;}

}

}

void init(void)

{

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

PCON=0x00;

TR1=1;

SCON=0xd0;

}

void send(uchar addr,uchar TRR)

{

TB8=1;

key1=1;                     //TB8置1

SBUF=addr;                   //发送从机的地址

while(TI==0)

{

;

}

TI=0;

key1=0;

while(RI==0)

{

;

}

data1=SBUF;                //接受从机地址并检验

RI=0;

if(data1!=addr)             //从机地址有错误

{

flag2=0;

}

else{                        //从机地址正确--------是发送数据标志0X01

if(TRR==0x01)

{

TB8=0;            //TB8置0

key1=1;

SBUF=TRR;

while(TI==0)

{

;

}

TI=0;

key1=0;

while(RI==0)       //接受从机状态

{

;

}

data3=SBUF;

RI=0;

if(data3!=TRR)     //从机没有就绪

{

flag2=0;

}

else{              //从机就绪

pf=0;        //清效验位

key1=1;

for(i=0;i<=9;i++)         //发送数据

{

TB8=0;

SBUF=buf[i];

pf+=buf[i];

while(TI==0)

{

;

}

TI=0;

}

TB8=0;

SBUF=pf;                //发送效验和

while(TI==0)

{

;

}

TI=0;

key1=0;

while(RI==0)            //主机接受从机是否正确接受数据

{

;

}

data2=SBUF;

RI=0;

if(data2==0xcc)         //如果正确结束数据通信

{

flag2=3;            //通信结束标志

}

else{

flag2=0;            //如果不正确重新通信------即重新通信标志

}

}

}

if(TRR==0x02)

{               //是接受从机数据标志------即TRR=0X0

TB8=0;

key1=1;

SBUF=TRR;                    //发送接受标志0X02

while(TI==0)

{

;

}

TI=0;

key1=0;

while(RI==0)                 //接受从机的状态

{

;

}

data3=SBUF;

RI=0;

if(data3!=TRR)              //从机没有就绪

{

flag2=0;

}

else{ key1=0;                     //从机就绪---主机接受数据

pf=0;

for(i=0;i<=2;i++)

{

while(RI==0)

{

;

}

buf2[i]=SBUF;        //接受从机发送的数据

pf+=buf2[i];

RI=0;

}

key1=0;

while(RI==0)            //接受从机的效验和

{

;

}

data2=SBUF;

RI=0;

if(pf==data2)         //比较效验和

{

flag2=3;          //效验和正确标志

}

else{

flag2=0;        //效验和错误标志

}

}

}

}

}

void  display(void)

{

if(flag2==3)                  //如果接受正确开始显示

{

for(i=0;i<=2;i++)

{

P0=buf2[i];

delay(50);

}

}

}

void main(void)

{

delay(500);

init();

count=2;

count1=2;

while(1)

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值