欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 關(guān)于51單片機利用rs485進(jìn)行多機通信的問題 [打印本頁]

作者: tomli561    時間: 2019-11-14 13:31
標(biāo)題: 關(guān)于51單片機利用rs485進(jìn)行多機通信的問題
我現(xiàn)在發(fā)送端發(fā)送地址,接收端能收到,但是收到地址后就無法執(zhí)行后面的操作了,麻煩給位幫我看看(程序是從網(wǎng)上找的例程小改了下,只改了幾個端口定義)
發(fā)送端:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit LED1 = P3^4;
sbit LED2 = P3^5;
sbit MCU1 = P2^2;
sbit MCU2 = P2^3;
sbit rs485dir = P3^2;

uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x77,0x7c};

uchar keyscan(void);
void delayms(uint t);
void init_serial(void);
void SBUFSend(uchar key);
void senddat(uchar addr,uchar dat);
void display(uchar addr,uchar dat);

/*************************************************************************/
/******************************按鍵掃描函數(shù)*******************************/
/*************************************************************************/

uchar keyscan(void)
{
        uchar temp,key;
        P0 = 0xfe;
        temp = P0;
        temp = temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);
                if(temp!=0xf0)
                {
                        temp = P0;
                        switch(temp)
                        {
                                case 0xee:        key = 0;        break;
                                case 0xde:        key = 1;        break;
                                case 0xbe:        key = 3;        break;
                                case 0x7e:        key = 4;        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp = P0;
                                temp = temp&0xf0;
                        }
                }
        }
        P0 = 0xfd;
        temp = P0;
        temp = temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);
                if(temp!=0xf0)
                {
                         temp = P0;
                         switch(temp)
                         {
                                 case 0xed:        key = 4;        break;
                                case 0xdd:        key = 5;        break;
                                case 0xbd:        key = 6;        break;
                                case 0x7d:        key = 7;        break;
                         }
                         while(temp!=0xf0)
                         {
                                 temp = P0;
                                temp = temp&0xf0;
                         }
                }
        }
        P0 = 0xfb;
        temp = P0;
        temp = temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);
                if(temp!=0xf0)
                {
                        temp = P0;
                        switch(temp)
                        {
                                case 0xeb:        key = 8;        break;
                                case 0xdb:        key = 9;        break;
                                case 0xbb:        key = 10;        break;
                                case 0x7b:        key = 11;        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp = P0;
                                temp = temp&0xf0;
                        }
                }  
        }
        P0 = 0xf7;
        temp = P0;
        temp = temp&0xf0;
        if(temp!=0xf0)
        {
                delayms(10);
                if(temp!=0xf0)
                {
                        temp = P0;
                        switch(temp)
                        {
                                case 0xe7:        key = 12;        break;
                                case 0xd7:        key = 13;        break;
                                case 0xb7:        key = 13;        break;
                                case 0x77:        key = 15;        break;
                        }
                        while(temp!=0xf0)
                        {
                                temp = P0;
                                temp = temp&0xf0;
                        }
                }
        }
        return key;
}
                  
/*************************************************************************/
/******************************毫秒延時函數(shù)*******************************/
/*************************************************************************/

void delayms(uint t)
{
        uchar i,j;
        for(i=0;i<t;i++)
                for(j=0;j<110;j++);
}

/*************************************************************************/
/********************定時器串口寄存器初始化函數(shù)***************************/
/*************************************************************************/

void init_serial(void)
{
        TMOD = 0x20;
        TH1 = 0xfa;
        TL1 = 0xfa;
        PCON = 0x80;
        SCON = 0x50;
        TR1 = 1;
        ES = 1;
        EA = 1;
        rs485dir = 1;
}
                                                                                                         
/*************************************************************************/
/******************************信息發(fā)送函數(shù)*******************************/
/*************************************************************************/

void SBUFSend(uchar key)
{
        SBUF = key;
        while(TI ==0);
        TI = 0;
}
                          
/*************************************************************************/
/****************************發(fā)送地址數(shù)據(jù)函數(shù)*****************************/
/*************************************************************************/

void senddat(uchar addr,uchar dat)
{
        TB8 = 1;
        SBUFSend(addr);
        delayms(1);
        TB8 = 0;
        SBUFSend(dat);
        delayms(1);        
}
                                                                  
/*************************************************************************/
/*****************************數(shù)碼管顯示函數(shù)******************************/
/*************************************************************************/

void display(uchar addr,uchar dat)
{
        P1 = tab[addr];                /*顯示發(fā)送的地址*/
        LED1 = 0;
        LED2 = 1;
        delayms(1000);
        P1 = 0x00;
        P1 = tab[dat];                /*顯示發(fā)送的數(shù)據(jù)*/
        LED1 = 1;
        LED2 = 0;
        delayms(1000);
        P1 = 0x00;
}

void main()
{                           
        char addr,dat;        
        init_serial();
        dat = keyscan();
        while(1)
        {
                if(MCU1==0)
                {
                        addr = 1;
                        dat = keyscan();
                        senddat(1,dat);
                        display(1,dat);
                }
                if(MCU2==0)
                {
                        addr = 2;
                        dat = keyscan();
                        senddat(2,dat);
                        senddat(2,dat);
                }
        }
}

void serial_init()        interrupt 4
{
        if(RI==1)
                RI = 0;
        if(TI==1)
                TI = 0;
}

接收端:
#include <reg52.h>

#define uchar unsigned char

sbit LED1 = P1^0;
sbit LED2 = P1^1;

uchar DispCode[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void SerialInit()
{
        SCON = 0xf0;
        PCON = 0x00;
        TMOD = 0x20;
        TH1 = 0xfd;
        TH1 = 0xfd;
        TR1 = 1;
        ES = 1;
        EA = 1;
}

void SBUFSend(uchar Ch)
{
        SBUF = Ch;
        while(TI==0);
        TI = 0;
}

void main()
{
        P2 = 0xff;
        SerialInit();
        while(1);
}

void SerialServer()        interrupt 4
{
        uchar Ch;
        if(RI == 1)
        {
                uchar i;
                RI = 0;
                Ch = SBUF;
                if(RB8 == 1)
                {
                        if(Ch==1)
                        {
                                SM2 = 0;
                                SBUFSend(1);
                                LED1 = 0;
                                LED2 = 1;
                                for(i=500;i>0;i--)
                                        P2 = DispCode[Ch];
                        }
                        else
                        {
                                SM2 = 1;
                        }
                }
                if(RB8 == 0)
                {
                        P2 = 0xff;
                        LED1 = 1;
                        LED2 = 0;
                        for(i=500;i>0;i--)
                                P2 = DispCode[Ch];
                        SM2 = 1;
                }
        }
}


作者: faiwong    時間: 2019-11-14 20:47
把主機發(fā)送數(shù)據(jù)改在收到分機應(yīng)答后再發(fā)送
作者: tomli561    時間: 2019-11-15 10:15
faiwong 發(fā)表于 2019-11-14 20:47
把主機發(fā)送數(shù)據(jù)改在收到分機應(yīng)答后再發(fā)送

必須驗證地址后才能再發(fā)送數(shù)據(jù)么?那后面發(fā)送完數(shù)據(jù)后是不是也還要在驗證?
作者: tomli561    時間: 2019-11-15 10:21
faiwong 發(fā)表于 2019-11-14 20:47
把主機發(fā)送數(shù)據(jù)改在收到分機應(yīng)答后再發(fā)送

void senddat(uchar addr,uchar dat)
{
        TB8 = 1;
        SBUFSend(addr);
        rs485dir = 0;
        while(!RI);
        RI = 0;
        rs485dir = 1;
        TB8 = 0;
        SBUFSend(dat);       
}
吧這個數(shù)據(jù)發(fā)送函數(shù)改成了這樣還是不行啊
作者: lele5211314    時間: 2019-11-15 18:48
RS485通訊這一部分我比較擅長,可以加我QQ詳細(xì)教你下
作者: yzwzfyz    時間: 2019-11-16 09:10
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫程序才靠譜。
作者: tomli561    時間: 2019-11-18 10:51
yzwzfyz 發(fā)表于 2019-11-16 09:10
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫程序才靠譜。

通信原理知道哈, 第一次些 細(xì)節(jié)肯定沒法都注意到,所以才會找例程這樣學(xué)習(xí)才是最快的,啥都自己摸索有些東西沒有那個思維很難解決,我在這提問肯定是遇到了自己無法解決的問題,別老是覺得什么都很輕松一樣靠自學(xué)都行,要是這樣了師傅下崗得了,學(xué)生只要發(fā)本教材自己學(xué)就可以了
作者: tomli561    時間: 2019-11-18 10:52
faiwong 發(fā)表于 2019-11-14 20:47
把主機發(fā)送數(shù)據(jù)改在收到分機應(yīng)答后再發(fā)送

親,有沒有完整能用的例程給小弟一下,萬分 感謝
作者: faiwong    時間: 2019-11-19 15:20
tomli561 發(fā)表于 2019-11-15 10:21
void senddat(uchar addr,uchar dat)
{
        TB8 = 1;


faiwong 發(fā)表于 2019-11-14 20:47
把主機發(fā)送數(shù)據(jù)改在收到分機應(yīng)答后再發(fā)送

void senddat(uchar addr,uchar dat)
{
        TB8 = 1;
        SBUFSend(addr);
        while(!TI);
        TI=0;
        rs485dir = 0;
        while(!RI);
        RI = 0;
        rs485dir = 1;
        TB8 = 0;
        SBUFSend(dat);        
}
這樣試試,要讓CPU數(shù)據(jù)發(fā)送完畢才 rs485dir = 0;不然你的數(shù)據(jù)送不到485總線上
正常情況不建議用  while(!RI);





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1