微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求教 rs485通信问题

新手求教 rs485通信问题

时间:10-02 整理:3721RD 点击:
  以下是我的双机通信程序#include<reg51.h>
#include<delays_100ms.h>
#include<delays_500ms.h>
#include<delays_10ms.h>
#include<delays_5ms.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit RT=P3^7;
#define txd P3^1;
u8 a;
u8 du;
u8 du2;
u8 flag;
u8 jian;
u16 he;
void man2();
void main();
void send();
void anjian();
u8 code d[]={0xFF,0x01,0x01,0x00,0xaa,0x01};
//串口初始化//
void int1()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=TH1;
        SCON=0x50;
        PCON=0x00;
        TR1=1;
        delays_100ms();
        EA=1;
        ES=0;
}
void man1()
{
        int1();
        while(1)
        {
                a=1;
                RT=1;
                if(k1==0)                                   //按键判断
                {
                        delays_100ms();                   //去抖
                        if(k1==0)
                        {
                        a=0;                                   //按键标志
                        jian=0x01;                           //按键地址
                        }
                        else a=1;
                }
                if(k2==0)
                {
                        delays_100ms();
                        if(k2==0)
                        {
                        a=0;
                        jian=0x02;
                        }
                        else a=1;
                }
                if(k3==0)
                {
                        delays_100ms();
                        if(k3==0)
                        {
                        a=0;
                        jian=0x03;
                        }
                        else a=1;
                }
                if(k4==0)
                {
                        delays_100ms();
                        if(k4==0)
                        {
                        a=0;
                        jian=0x04;
                        }
                        else a=1;
                }
                //发送数据
                if(a==0 && (k1==0||k2==0||k2==0||k3==0||k4==0))
                {
                        TI=1;
                        SBUF=d[0];                                //同步字节
                        while(!TI);
                        TI=0;
                        he=0x00;
                        delays_500ms();
                        SBUF=d[1];                                //地址
                        delays_100ms();
                        he=he+d[1];
                        while(!TI);
                        TI=0;
                        delays_500ms();
                        SBUF=jian;                                //按键
                        delays_100ms();
                        he=he+jian;
                        while(!TI);
                        TI=0;
                        delays_500ms();
                        SBUF=d[3];                                //工作模式
                        delays_100ms();
                        he=he+d[3];
                        while(!TI);
                        TI=0;
                        delays_500ms();
                        SBUF=d[4];                                //读 写
                        delays_100ms();
                        he=he+d[4];
                        while(!TI);
                        TI=0;
                        delays_500ms();
                        SBUF=d[5];                                 //数据1
                        delays_100ms();
                        he=he+d[5];
                        while(!TI);
                        TI=0;
                        delays_500ms();
                        SBUF=he;                                 //校验和
                        while(!TI);
                        TI=0;
                }
                delays_100ms();
                RT=~txd;
                delays_100ms();
                if(RI)
                {
                        man2();
                }
        }
}
/*                                                main.2                                                        */


void int2()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=TH1;
        SCON=0x50;
        PCON=0x00;
        delays_100ms();
        TR1=1;
        EA=1;
        ES=1;
}
void ser() interrupt 4 using 1                  //中断接收
{
        if(RI)
        {
        flag=flag+1;
        RI=0;
        du2=SBUF;
        RT=1;
        delays_10ms();
        P2=du2;
        delays_5ms();
        RT=0;
        }
        else
                TI=0;
}

void man2()
{
        int2();
        delays_100ms();          
        RT=0;
        delays_100ms();
        while(flag<6);
        flag=1;
        if(P1==0xff)
        {
                man1();
        }
}
void main(void)
{
        if(P1!=0xff)
        {
                man2();
        }
        else
                man1();
}
两个单片机接收和发送都可以,只不过在接收和发送切换时的一帧数据会少接收一位。
弄了很久都没搞定。

中断里面没有处理一下啊

刚学,不是很懂,能讲讲该怎么处理吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top