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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3004|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:508562 發(fā)表于 2019-11-14 13:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我現(xiàn)在發(fā)送端發(fā)送地址,接收端能收到,但是收到地址后就無(wú)法執(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;
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
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)

5#
ID:93224 發(fā)表于 2019-11-15 18:48 | 只看該作者
RS485通訊這一部分我比較擅長(zhǎng),可以加我QQ詳細(xì)教你下
回復(fù)

使用道具 舉報(bào)

6#
ID:123289 發(fā)表于 2019-11-16 09:10 | 只看該作者
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫(xiě)程序才靠譜。
回復(fù)

使用道具 舉報(bào)

7#
ID:508562 發(fā)表于 2019-11-18 10:51 | 只看該作者
yzwzfyz 發(fā)表于 2019-11-16 09:10
先弄清楚通訊原理,再構(gòu)思出通訊的協(xié)議,而后再寫(xiě)程序才靠譜。

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

使用道具 舉報(bào)

8#
ID:508562 發(fā)表于 2019-11-18 10:52 | 只看該作者
faiwong 發(fā)表于 2019-11-14 20:47
把主機(jī)發(fā)送數(shù)據(jù)改在收到分機(jī)應(yīng)答后再發(fā)送

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

使用道具 舉報(bào)

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

你QQ多少

10#
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ī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产92 | 亚洲va中文字幕 | 99精品国产一区二区青青牛奶 | 国产精品一区在线观看 | 青青草视频免费观看 | 欧美一区二区三区 | 国产91精品久久久久久久网曝门 | 亚洲午夜av久久乱码 | 欧美一级片在线观看 | 91精品国产91 | 欧美精品久久久久久久久久 | 日韩精品三区 | 草久久久| 99久久亚洲 | 亚洲视频手机在线 | 99在线免费视频 | 综合成人在线 | 欧美美女爱爱 | 欧美在线国产精品 | 成人日韩 | 国产成人精品网站 | 亚洲天堂影院 | 日韩免费视频一区二区 | 97色在线视频 | 久久综合九九 | 国产98色在线 | 日韩 | 国产最新精品视频 | 黄色网址在线播放 | 欧美精品久久久久 | 成人三级视频 | 日本天堂视频在线观看 | 在线观看黄色大片 | 九九免费视频 | 中文字幕日韩欧美一区二区三区 | 搞av.com | av黄色在线播放 | 免费毛片网站在线观看 | 亚洲精品一区二区三区中文字幕 | 国产精品成人久久久久 | 成人深夜福利 | 久久99精品国产自在现线小黄鸭 |