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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3045|回復: 8
打印 上一主題 下一主題
收起左側

關于51單片機利用rs485進行多機通信的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:508562 發表于 2019-11-14 13:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我現在發送端發送地址,接收端能收到,但是收到地址后就無法執行后面的操作了,麻煩給位幫我看看(程序是從網上找的例程小改了下,只改了幾個端口定義)
發送端:
#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);

/*************************************************************************/
/******************************按鍵掃描函數*******************************/
/*************************************************************************/

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;
}
                  
/*************************************************************************/
/******************************毫秒延時函數*******************************/
/*************************************************************************/

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

/*************************************************************************/
/********************定時器串口寄存器初始化函數***************************/
/*************************************************************************/

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

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

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

void display(uchar addr,uchar dat)
{
        P1 = tab[addr];                /*顯示發送的地址*/
        LED1 = 0;
        LED2 = 1;
        delayms(1000);
        P1 = 0x00;
        P1 = tab[dat];                /*顯示發送的數據*/
        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 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:640671 發表于 2019-11-14 20:47 | 只看該作者
把主機發送數據改在收到分機應答后再發送
回復

使用道具 舉報

板凳
ID:508562 發表于 2019-11-15 10:15 | 只看該作者
faiwong 發表于 2019-11-14 20:47
把主機發送數據改在收到分機應答后再發送

必須驗證地址后才能再發送數據么?那后面發送完數據后是不是也還要在驗證?
回復

使用道具 舉報

地板
ID:508562 發表于 2019-11-15 10:21 | 只看該作者
faiwong 發表于 2019-11-14 20:47
把主機發送數據改在收到分機應答后再發送

void senddat(uchar addr,uchar dat)
{
        TB8 = 1;
        SBUFSend(addr);
        rs485dir = 0;
        while(!RI);
        RI = 0;
        rs485dir = 1;
        TB8 = 0;
        SBUFSend(dat);       
}
吧這個數據發送函數改成了這樣還是不行啊
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

8#
ID:508562 發表于 2019-11-18 10:52 | 只看該作者
faiwong 發表于 2019-11-14 20:47
把主機發送數據改在收到分機應答后再發送

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

使用道具 舉報

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

你QQ多少

10#
ID:640671 發表于 2019-11-19 15:20 | 只看該作者
tomli561 發表于 2019-11-15 10:21
void senddat(uchar addr,uchar dat)
{
        TB8 = 1;


faiwong 發表于 2019-11-14 20:47
把主機發送數據改在收到分機應答后再發送

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數據發送完畢才 rs485dir = 0;不然你的數據送不到485總線上
正常情況不建議用  while(!RI);
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕 在线观看 | 久久国产一区二区三区 | 久久99精品久久久久久 | 手机av在线 | 欧美日韩国产一区二区三区 | 国产高清精品网站 | 黄色一级大片视频 | 日韩影音 | 特黄视频 | 99热视 | 日韩网站在线观看 | 久久6| www.色.com| 亚洲一二三区av | 精品欧美一区二区久久久伦 | 2019中文字幕视频 | 97精品国产97久久久久久免费 | www国产成人免费观看视频,深夜成人网 | 国产精品成人一区二区 | 电影91久久久 | 91网视频| 国产精彩视频一区 | 中文字幕视频三区 | 国产二区精品视频 | 一区二区国产精品 | 最新中文字幕久久 | 欧美精品首页 | 亚洲精品永久免费 | 日日天天| 成人午夜高清 | 欧美一区视频 | 亚洲精品自在在线观看 | 亚洲第一视频网站 | 精产国产伦理一二三区 | 欧美精品综合在线 | 亚洲精品电影在线观看 | 国产高清视频在线观看 | 99精品免费久久久久久日本 | 欧美黑人又粗大 | 久久久久亚洲精品中文字幕 | 国产区在线视频 |