单片机/MCU论坛
直播中

经历过听说过

7年用户 97经验值
私信 关注

新手求教 rs485通信问题

  以下是我的双机通信程序#include
#include
#include
#include
#include

typedef unsigned char u8;
typedef unsigned int u16;
***it k1=P1^1;
***it k2=P1^2;
***it k3=P1^3;
***it k4=P1^4;
***it 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();

}
两个单片机接收和发送都可以,只不过在接收和发送切换时的一帧数据会少接收一位。
弄了很久都没搞定。

回帖(2)

chenwei6991627

2017-7-22 11:26:48
中断里面没有处理一下啊
举报

经历过听说过

2017-7-22 13:57:20
引用: chenwei6991627 发表于 2017-7-22 11:26
中断里面没有处理一下啊

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

更多回帖

发帖
×
20
完善资料,
赚取积分