单片机RS-485通信源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;//发送申请确认信号