视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机RS-485通信源程序
2025-09-24 06:34:41 责编:小OO
文档
附录一、主机源程序

#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;//发送申请确认信号

     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;

  }

}

附录三、电路原理图

显示部分电路

主要部分电路下载本文

显示全文
专题