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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

利用keil+Proteus實現 51單片機的modbus通訊 附源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:86450 發表于 2020-6-4 13:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用keil proteus 實現 51單片機的modbus通訊https://www.bilibili.com/video/BV1Et4y1y7Sx  錄了一個小視頻
https://www.bilibili.com/video/BV1Et4y1y7Sx/




//FIRMWARE FOR SLAVE
#include <reg52.h>
#include <intrins.h>

#define Uint16 unsigned int
#define Uint32 unsigned long
#define uchar  unsigned char


//函數定義//
void InitUART(void);
void SendOneByte(unsigned);
void Send(uchar * a,uchar b);
void mdproc(uchar);
Uint16 Crc16(Uint16 *puchMsg, Uint16 usDataLen);
void modbus_read_back();
void modbus_write_back(uchar add , uchar val);
//變量定義
Uint16  temp16;
uchar rx_buff[20];
//燈和開關定義
sbit led1=P3^2;
sbit led2=P3^3;
sbit led3=P3^4;
sbit led4=P3^5;

sbit k0 = P1^0;
sbit k1 = P1^1;
sbit k2 = P1^2;
sbit k3 = P1^3;



/* CRC 高位字節值表 */
const Uint16 code auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;

/* CRC低位字節值表*/
const Uint16 code auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
//主函數
void main(void)
{
        InitUART();
        while(1)
        {        
        }
}


Uint16 Crc16(uchar *puchMsg, Uint16 usDataLen)
{
        Uint16 uchCRCHi = 0xFF ;              /* 高CRC字節初始化  */
        Uint16 uchCRCLo = 0xFF ;              /* 低CRC 字節初始化 */
        Uint16 temp16;
        Uint32 uIndex ;                      /* CRC循環中的索引  */
        while (usDataLen--)                  /* 傳輸消息緩沖區   */
        {
                temp16=*puchMsg++;
                uIndex = uchCRCHi ^ temp16 ; /* 計算CRC          */
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                uchCRCLo = auchCRCLo[uIndex] ;
        }
        return (uchCRCHi << 8 | uchCRCLo) ;
}


void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x3C;
    TL0 = 0x0B0;
}
//串口中斷函數
void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
                RI = 0;
               
                mdproc(SBUF);//處理數據
    }
    else
      TI = 0;
}

void mdproc(uchar b)  
{        
        rx_buff[0] = rx_buff[1];
        rx_buff[1] = rx_buff[2];
        rx_buff[2] = rx_buff[3];
        rx_buff[3] = rx_buff[4];
        rx_buff[4] = rx_buff[5];
        rx_buff[5] = rx_buff[6];
        rx_buff[6] = rx_buff[7];
        rx_buff[7] =         b ;
        
        if((rx_buff[0] == 0x11 ) &&
                        (rx_buff[1] == 0x01) &&
                        (rx_buff[2] == 0x00) &&
                        (rx_buff[3] == 0x13)
                )
        {
                modbus_read_back();//返回本機的狀態
        }

        if((rx_buff[0] == 0x11 ) &&
                        (rx_buff[1] == 0x05) &&
                        (rx_buff[2] == 0x00) &&
                        (rx_buff[3] == 0x00)    //控制第一路燈
                )
        {
                        if(rx_buff[4] == 0xff)
                        {
                                modbus_write_back(0,1);        
                                led1 = 1;
                        }
                        else
                        {
                                modbus_write_back(0,0);
                                        led1 = 0;
                        }
        }

                if((rx_buff[0] == 0x11 ) &&
                        (rx_buff[1] == 0x05) &&
                        (rx_buff[2] == 0x00) &&
                        (rx_buff[3] == 0x01)    //控制第二路燈
                )
        {
                        if(rx_buff[4] == 0xff)
                        {
                                modbus_write_back(1,1);        
                                        led2 = 1;
                        }
                        else
                        {
                                modbus_write_back(1,0);
                                        led2 = 0;
                        }
        }
        
        if((rx_buff[0] == 0x11 ) &&
                        (rx_buff[1] == 0x05) &&
                        (rx_buff[2] == 0x00) &&
                        (rx_buff[3] == 0x02)    //控制第三路燈
                )
        {
                        if(rx_buff[4] == 0xff)
                        {
                                modbus_write_back(2,1);        
                                        led3 = 1;
                        }
                        else
                        {
                                modbus_write_back(2,0);
                                        led3= 0;
                        }
        }        
        
        
                if((rx_buff[0] == 0x11 ) &&
                        (rx_buff[1] == 0x05) &&
                        (rx_buff[2] == 0x00) &&
                        (rx_buff[3] == 0x03)    //控制第四路燈
                )
        {
                        if(rx_buff[4] == 0xff)
                        {
                                modbus_write_back(3,1);        
                                        led4 = 1;
                        }
                        else
                        {
                                modbus_write_back(3,0);
                                        led4 = 0;
                        }
        }
}

void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
void Send(uchar * a,uchar b)
{
        uchar i;
        uchar *p;
        p= a;
        for(i=0;i<b;i++)
        {
        SendOneByte (*p);
                p++;
        }
}


void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFE;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
        
                TMOD |= 0x01;
    TH0 = 0x3C;
    TL0 = 0x0B0;  
    ET0 = 1;
    TR0 = 1;

}


void delay(void)                                                        
{
        _nop_();_nop_();_nop_();_nop_();_nop_();

}

//按照網頁的說明發送數據
void modbus_write_back(uchar add , uchar val)
{
uchar buff[8];
buff[0] = 0x11;
buff[1]        = 0x05;
buff[2] = 0x00;
buff[3] = add;
if(val == 1)
{
buff[4] = 0xff;
buff[5] = 0x00;               
}
else
{
buff[4] = 0x00;
buff[5] = 0x00;        
}        
temp16=Crc16(buff,6);
buff[6]         = (temp16>>8)&0x00ff;
buff[7]         = temp16&0x00ff;                        
Send(buff,8);
}
//按照網頁的說明發送數據
void modbus_read_back()
{
uchar buff[8];
buff[0] = 0x11;
buff[1]        = 0x01;
buff[2] = 0x01;
buff[3] = P1;
temp16=Crc16(buff,4);
buff[4]         = (temp16>>8)&0x00ff;
buff[5]         = temp16&0x00ff;                        
Send(buff,6);
}
全部資料51hei下載地址:

MODBUS 使用proteus仿真.zip

24.53 KB, 下載次數: 250

用proteus仿真

modbus從機源碼4路輸入4路輸出.zip

54.88 KB, 下載次數: 259

keil源碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:292427 發表于 2020-6-22 21:10 | 只看該作者
牛逼 大神
回復

使用道具 舉報

板凳
ID:789645 發表于 2020-6-25 21:19 | 只看該作者
大哥,版本太高打不開啊,不可能我再重新安裝一個吧
回復

使用道具 舉報

地板
ID:495287 發表于 2020-6-27 13:42 | 只看該作者
馬克,謝謝樓主分享,好人一生平安。
回復

使用道具 舉報

5#
ID:856085 發表于 2020-12-8 18:48 | 只看該作者
你好大哥,我下了你的keil'+proteus實現moobus通訊附件,程序燒錄到板子里,運行之后有虛擬窗口,但是沒有協議命令,請教一下為什么
回復

使用道具 舉報

6#
ID:862860 發表于 2020-12-20 16:11 | 只看該作者
樓主,為什么我用proteus仿真,虛擬窗口什么都沒有顯示啊
回復

使用道具 舉報

7#
ID:462629 發表于 2021-3-6 21:51 | 只看該作者
是完整正確的版本嗎?
回復

使用道具 舉報

8#
ID:28992 發表于 2021-3-7 01:28 | 只看該作者
正在學習,謝謝大師!
回復

使用道具 舉報

9#
ID:28992 發表于 2021-3-7 01:43 | 只看該作者
download for study, thanks a lot.
回復

使用道具 舉報

10#
ID:380987 發表于 2021-3-7 14:32 | 只看該作者
正在學習,謝謝大師! 正在學習,謝謝大師!
回復

使用道具 舉報

11#
ID:1017095 發表于 2022-5-17 20:24 來自手機 | 只看該作者
資料是不是不全呀,沒有主站的程序
回復

使用道具 舉報

12#
ID:18797 發表于 2022-6-9 23:55 | 只看該作者
有沒有實際電路中調試成功了的回復?
回復

使用道具 舉報

13#
ID:513507 發表于 2023-1-28 15:55 | 只看該作者
沒有主站資料,可能調不通的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产又色又爽又黄又免费 | 欧美成人黄色小说 | 久久久精品影院 | 欧美自拍视频 | 亚州激情| 国产在线观看av | 国产精品久久久久久妇女6080 | av永久| 精品国产乱码久久久久久丨区2区 | 三级免费网 | 99re在线视频精品 | 色网站在线免费观看 | 中文字幕精品视频 | 日韩精品1区2区3区 成人黄页在线观看 | av一级久久 | 亚洲午夜视频在线观看 | 欧美三级久久久 | 久久久久久黄 | 日韩欧美在线免费观看 | 一区二区av | 三级在线观看 | 天天操天天干天天曰 | a级片播放| 成人三级电影 | 国产免费福利 | 密桃av | 国产在线看片 | 在线观看免费毛片 | 免费观看一级特黄欧美大片 | 天天人人精品 | 国产探花在线精品一区二区 | 国产精品毛片一区二区在线看 | 一级黄色毛片a | 久久一二 | 国产成人av电影 | 人人做人人澡人人爽欧美 | 6996成人影院网在线播放 | 亚洲一区二区av | 欧美乱大交xxxxx另类电影 | 成人免费观看视频 | 免费视频一区二区 |