当前位置:文档之家› 单片机RS-485通信源程序

单片机RS-485通信源程序

附录一、主机源程序
#include <reg52.H>
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 <reg52.H>
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;//发送申请确认信号
while(TI!=1);
TI=0;
for(i=0;i<4;i++)
{
SBUF=table[i]; //发送数据
while(TI!=1);
TI=0;
sum=sum+table[i];//计算校验和
}
SBUF=sum; //发送校验和
while(TI!=1);
TI=0;
SBUF=0xf0;//发送结束标志
while(TI!=1);
TI=0;
}
end: CTRL=0; //置MAX485为接收方式return;
}
void main(void)
{
unsigned char key,X,Y,temp;
SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1;
TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA;
TR1 = 1; //启动定时器
ES=1; //开串行中断
EA=1; //开总中断
CTRL=0; //置MAX485为接收方式replay=1;
warn0=1;
while(1) //键盘扫描
{
P2=0xff; //键盘初始化
P2=0xf0;
if (P2!=0xf0)
{
delay(); //延时去抖
if (P2!=0xf0)
{
X=P2; //读键盘
P2=0x0f;
Y=P2;
P2=X|Y;
temp=P2;
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
for(X=0;X<4;X++) //存储最近读的按键码
table[X]=table[X+1];
table[3]=key;
P2=0xf0;
temp=P2;
for(X=0;X<4;X++)
show(table[X]);
while(temp!=0xf0)
{P2=0xf0;temp=P2;}
}
}
else key=16;
}
}
附录三、电路原理图
显示部分电路
主要部分电路。

相关主题