单片机RS-485通信源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附录一、主机源程序

#include

unsigned char xdata table[5];

unsigned char code tab[]={0x03,0x9f,0x25,0x0d,

0x99,0x49,0x41,0x1f,

0x01,0x09,0x05,0xc1,

0x63,0x85,0x61,0x71,0xff}; sbit ctrl=P1^2;

sbit DATA=P1^0;

sbit CLK=P1^1;

void show(unsigned char m)//LED显示子程序

{

unsigned char i,d;

d=tab[m];

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

{

DATA=d&0x01;

CLK=0;

CLK=1;

d=d>>1;

}

}

void interrupt0(void) interrupt 0 using 0//串行中断程序{

unsigned char cm0,cm1,sum0,sum1,i;

lab:

sum0=0;

ctrl=1;//将MAX485设置为发送方式

SBUF=0xFF;//发送数据申请

while(TI!=1);

ctrl=0; //将MAX485设置为接收方式

TI=0;

while(RI!=1);

cm0=SBUF;//接收申请确认信号

RI=0;

if(cm0==0xff)

{

i=0;

ctrl=0;

while(RI!=1);

cm1=SBUF; //接收第一个数据

RI=0;

while(cm1!=0xf0)

{

table[i]=cm1;

while(RI!=1);

cm1=SBUF;//接收后续的数据

RI=0;

i++;

}

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

sum0=sum0+table[i];//计算校验和

sum1=table[4];//获取收到的校验和

if(sum0==sum1)

{

ctrl=1;

SBUF=0xf0; //发送数据确认信号

while(TI!=1);

TI=0;

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

show(table[i]);

}

else goto lab;

}

else goto lab;

ctrl=1;//将MAX485设置为发送方式return ;

}

void main(void)

{

SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1;

TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA;

TR1 = 1; //启动定时器

EX0=1; //开外部中断0

IT0=0;

EA=1; //开总中断

ctrl=1;//将MAX485设置为发送方式while(1); //等待中断

}

附录二、从机源程序

#include

unsigned char xdata table[]={0,0,0,0};

sbit replay=P1^0;

sbit warn0=P1^1;

sbit CTRL=P1^2;

sbit DATA=P1^3;

sbit CLK=P1^4;

unsigned char code tab[]={0x03,0x9f,0x25,0x0d, //显示用的码表

0x99,0x49,0x41,0x1f,

0x01,0x09,0x05,0xc1,

0x63,0x85,0x61,0x71,0xff};

void delay(void) //键盘扫描延时10ms程序

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void show(unsigned char m)//LED显示子程序

{

unsigned char i,d;

d=tab[m];

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

{

DATA=d&0x01;

CLK=0;

CLK=1;

d=d>>1;

}

}

void ser(void) interrupt 4 using 0//串行中断程序

{

unsigned char cm,sum,i;

sum=0;

replay=1;

warn0=1;

cm=SBUF;

RI=0;

if(cm==0xf0)//判断是否为主机返回的确认信号

{

replay=0; //表示已正确发送完一组数据

goto end;

}

else

if(cm!=0xff)//判断是否为主机的数据申请

{

warn0=0; //通信命令错误提示

goto end;

}

else

{

CTRL=1; //置MAX485为发送方式

SBUF=0xff;//发送申请确认信号

相关文档
最新文档