久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3175|回復(fù): 8
收起左側(cè)

關(guān)于51單片機(jī)利用rs485進(jìn)行多機(jī)通信的問題

[復(fù)制鏈接]
ID:508562 發(fā)表于 2019-11-14 13:31 | 顯示全部樓層 |閱讀模式
我現(xiàn)在發(fā)送端發(fā)送地址,接收端能收到,但是收到地址后就無法執(zhí)行后面的操作了,麻煩給位幫我看看(程序是從網(wǎng)上找的例程小改了下,只改了幾個(gè)端口定義)
發(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í)函數(shù)*******************************/
/*************************************************************************/

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

/*************************************************************************/
/********************定時(shí)器串口寄存器初始化函數(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;
                }
        }
}

回復(fù)

使用道具 舉報(bào)

ID:640671 發(fā)表于 2019-11-14 20:47 | 顯示全部樓層
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(jī)應(yīng)答后再發(fā)送
回復(fù)

使用道具 舉報(bào)

ID:508562 發(fā)表于 2019-11-15 10:15 | 顯示全部樓層
faiwong 發(fā)表于 2019-11-14 20:47
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(jī)應(yīng)答后再發(fā)送

必須驗(yàn)證地址后才能再發(fā)送數(shù)據(jù)么?那后面發(fā)送完數(shù)據(jù)后是不是也還要在驗(yàn)證?
回復(fù)

使用道具 舉報(bào)

ID:508562 發(fā)表于 2019-11-15 10:21 | 顯示全部樓層
faiwong 發(fā)表于 2019-11-14 20:47
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(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);       
}
吧這個(gè)數(shù)據(jù)發(fā)送函數(shù)改成了這樣還是不行啊
回復(fù)

使用道具 舉報(bào)

ID:93224 發(fā)表于 2019-11-15 18:48 | 顯示全部樓層
RS485通訊這一部分我比較擅長,可以加我QQ詳細(xì)教你下
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2019-11-16 09:10 | 顯示全部樓層
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫程序才靠譜。
回復(fù)

使用道具 舉報(bào)

ID:508562 發(fā)表于 2019-11-18 10:51 | 顯示全部樓層
yzwzfyz 發(fā)表于 2019-11-16 09:10
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫程序才靠譜。

通信原理知道哈, 第一次些 細(xì)節(jié)肯定沒法都注意到,所以才會(huì)找例程這樣學(xué)習(xí)才是最快的,啥都自己摸索有些東西沒有那個(gè)思維很難解決,我在這提問肯定是遇到了自己無法解決的問題,別老是覺得什么都很輕松一樣靠自學(xué)都行,要是這樣了師傅下崗得了,學(xué)生只要發(fā)本教材自己學(xué)就可以了
回復(fù)

使用道具 舉報(bào)

ID:508562 發(fā)表于 2019-11-18 10:52 | 顯示全部樓層
faiwong 發(fā)表于 2019-11-14 20:47
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(jī)應(yīng)答后再發(fā)送

親,有沒有完整能用的例程給小弟一下,萬分 感謝
回復(fù)

使用道具 舉報(bào)

ID:508562 發(fā)表于 2019-11-18 11:59
lele5211314 發(fā)表于 2019-11-15 18:48
RS485通訊這一部分我比較擅長,可以加我QQ詳細(xì)教你下

你QQ多少

ID:640671 發(fā)表于 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
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(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);
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级a性色生活片久久毛片 一级特黄a大片 | 精品国产第一区二区三区 | 国产在线精品一区二区 | 狠狠操婷婷 | 欧美a在线看 | 天天操天天射天天舔 | 婷婷丁香综合网 | 国产成人免费视频网站高清观看视频 | 黄片毛片在线观看 | 日韩中文字幕久久 | 新91视频网| 成年人网站在线观看视频 | 午夜一级黄色片 | 欧美精品一区二区免费视频 | 超碰成人在线观看 | 国产精品1区 | 美日韩精品 | 精品国模一区二区三区欧美 | 天天欧美 | 日本粉嫩一区二区三区视频 | 精品久久久久久 | 亚洲高清久久 | 久草电影网| 国产一区二区免费 | 成人欧美一区二区三区在线播放 | 精品在线99| 国产精品精品视频一区二区三区 | 激情五月激情综合网 | 成人精品视频免费 | 精久久久 | 国产专区在线 | 国产91在线播放 | 国产在线资源 | 99久久婷婷国产亚洲终合精品 | 久久精品成人热国产成 | 一级特黄a大片 | 国产精品视频网 | 午夜免费福利电影 | 伊人艹 | 国产成人免费观看 | 精品美女在线观看视频在线观看 |