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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于依然王的人Modbus RTU 從機程序修改的通用版

  [復制鏈接]
跳轉到指定樓層
樓主
在上班摸魚時看到溫柔的郎的貼子
當晚成功測試出適用于STC89單片機的代碼
在春節假期空閑時修改并測試成功用于STC12/15/8的程序
現分享給大家,歡迎測試交流

Readme20220204.txt:
  1. Modbus RTU 示范程序
  2. 此程序修改后在以下單片機上測試通過
  3. STC89C52RC/STC12C4052AD/STC15W408AS/STC8F1K08/STC8G1K08A
  4. 單片機要求:Ram >= 256, Code >= 3k
  5. Function 15 設置多個線圈不能使用

  6. 通訊設置:
  7. 波特率:9600(1T單片機可于System.h中選擇)
  8. 數據位:8
  9. 停止位:1
  10. 檢驗位:無

  11. 程序默認地址:1  (可以通過修改Modbus.c: localAddr變量改變地址)
  12. 程序默認數據長度:16  (可以通過修改Modbus.h: RegisterMax變量改變長度,但要注意生成代碼Ram不可多于256)
  13. 程序默認晶振頻率:11.0592M(可以于System.h中選擇)
  14. 程序默認單片機:STC89C52RC(可以通過修改Project.h: MCU_Type選擇單片機類型)
  15. 工程編譯環境:KeilC V5.14.2.1
復制代碼





地址4x00002:閃燈時間10ms
地址4x00004:閃燈累計數


Modbus 8051 Client.rar (184.26 KB, 下載次數: 152)






評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:476652 發表于 2022-2-4 22:56 | 只看該作者
NB的大神!!
現在做工控,做控制器,要是沒有通信,或者不能通信,那簡直就是個雞肋!
51單片機再便宜,不能與其他設備Modbus RTU通信,那照樣沒人選擇!!
回復

使用道具 舉報

板凳
ID:476652 發表于 2022-2-5 10:24 | 只看該作者
敢問大神,請教幾個問題
1 你這測試時,單片機和電腦硬件連接是通過RS232還是RS485接口的?
   若用RS485接口,程序里是要切換485使能端的,
  沒看見對485使能端的操作,你這應該是用的是RS232接口吧。
2 你這通信應該用的是串口1吧。
  看程序里對串口初始化的操作,都是串口1的地址,

回復

使用道具 舉報

地板
ID:161164 發表于 2022-2-5 11:59 | 只看該作者
溫柔的郎 發表于 2022-2-5 10:24
敢問大神,請教幾個問題
1 你這測試時,單片機和電腦硬件連接是通過RS232還是RS485接口的啊?
   若用RS4 ...

1。不是232或485,是用USB轉串口下載線CP2102
如果想加485使能控制
可在Modbus.c內的beginSend內加上相關代碼,例
  1. void beginSend(void)
  2. {
  3.         EN_485 = 1;
  4.     UartSendBytes (sendBuf, sendCount);
  5.         EN_485 = 0;
  6. }
復制代碼


2。對~因為某些型號只有一個串口
回復

使用道具 舉報

5#
ID:476652 發表于 2022-2-5 16:22 | 只看該作者
感謝感謝。崿FModbus控制的途徑有好幾種,大神引導大家在STC單片機上走了一條正確,簡單,快速的路!!
回復

使用道具 舉報

6#
ID:525244 發表于 2022-2-8 11:43 來自手機 | 只看該作者
溫柔的郎 發表于 2022-2-5 10:24
敢問大神,請教幾個問題
1 你這測試時,單片機和電腦硬件連接是通過RS232還是RS485接口的啊?
   若用RS4 ...

有可能串口輸出接一個非門,控制485模式,做一個自控流電路,就不用程序控制485模式了
回復

使用道具 舉報

7#
ID:476652 發表于 2022-2-9 15:27 | 只看該作者
NB的lkc8210大神,又來打擾你了!!你的程序用到是串口1通信,我試著改成串口2通信,但中斷用的定時器沒改,依然用的是定時器0,
改完編譯無誤,下載進芯片,用Modbus Poll軟件通信連接,通信不通,
檢查,測試后發現定時器0中斷不運行,這是什么原因?
難道串口1中斷只能用定時器0嗎?我改成串口2,也得用定時器2嗎?這是對應捆綁著的嗎?
請大神有時間指導指導!!
感謝!

定時器程序如下(串口1通信時也用的這個定時器0)
Timer.c
#include "Project.h"

UINT8        idata c10ms;                        //10ms 計時
bit                b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;        //定義定時標志位
//定時器0初始化
void TimerInit(void)
{
    TMOD = (TMOD & 0XF0) | 0X01;//定時器0模式配置
    TH0 = TIMER_HIGHT;//定義初始裝載值
    TL0 = TIMER_LOW;//定義初始裝載值
    TR0 = 1;     //定時器0開始計時
    ET0 = 1;     //使能定時器0的溢出中斷允許位
}

//定時處理//timerProc定時器0回調函數
//在C中,static主要定義全局靜態變量、定義局部靜態變量、定義靜態函數。
void timerProc(void)
{
    static UINT8 c200ms;
    static UINT8 c1s;

    b1ms = 0;
    b10ms = 0;
    b100ms = 0;

    ET0 = 0;//復位定時器0溢出中斷允許位
    //dwTickCount = dwIntTick;
    ET0 = 1;//置位定時器0溢出中斷允許位

    if(bt1ms)
    {                       
        bt1ms = 0;
        b1ms = 1;
        if(receTimeOut>0)//若接收超時>0
        {
            receTimeOut--;
            if(receTimeOut==0 && receCount>0)   //判斷通訊接收是否超時
            {
              receCount = 0;    //將接收地址偏移寄存器清零
              checkoutError = 0;//校驗錯標志位復位                                                       
            }
        }                       
    }

    if(bt100ms)
    {
      bt100ms = 0;
      b100ms = 1;
    }
    if(bt10ms)//判斷中斷10ms標志位是否1
    {
      bt10ms = 0; //清中斷10ms標志位
      b10ms = 1;

      c200ms++;        //200ms計時器加1
        if(c200ms >= 20) //判斷是否計時到200ms
          {
            c200ms = 0;  //清200ms計時器
          }
      c1s++;           //1s計時器加1
        if(c1s >= testRegister[2]) //判斷是否計時到1s
        {
          c1s = 0;     //清1s計時器
                                        testCoil[0]++;
                                        testRegister[4]++;
//                                        P14 ^= 1;
        }
    }
}

//定時器0 1ms 中斷
void timer0IntProc() interrupt 1
{
    TL0 = TIMER_LOW;
    TH0 = TIMER_HIGHT;
    //dwIntTick++;
    bt1ms = 1;//設bt1ms初值=1
    c10ms++;  //c10ms自+1
    if(c10ms >= 10)//如果c10ms>=10
    {
      c10ms = 0; //把c10ms計時器清零
      bt10ms = 1;//把bt10ms置1
    }
       
}


回復

使用道具 舉報

8#
ID:161164 發表于 2022-2-10 09:31 | 只看該作者
如果你沒動過Timer.c和Timer.h的代碼
那肯定是你的串口設置影響了定時器0

你要把你改過的代碼貼上來
貼原代碼上來干嘛呢?

定時器0的主要功作只是產生1毫秒的節拍
對Modbus信號計時看有沒有超時
  1.    
  2.         if(bt1ms)
  3.     {                       
  4.         bt1ms = 0;
  5.         b1ms = 1;
  6.         if(receTimeOut>0)//若接收超時>0
  7.         {
  8.             receTimeOut--;
  9.             if(receTimeOut==0 && receCount>0)   //判斷通訊接收是否超時
  10.             {
  11.               receCount = 0;    //將接收地址偏移寄存器清零
  12.               checkoutError = 0;//校驗錯標志位復位                                                      
  13.             }
  14.         }                       
  15.     }
復制代碼

沒有捆不捆綁的說法
回復

使用道具 舉報

9#
ID:476652 發表于 2022-2-10 11:14 | 只看該作者
感謝大神指點
這是我的2個工程文件,
文件3,是大神的源文件,我經過整理,借鑒一些其他大神的風格,把一些子程序從主程序里分離出來,單獨存放,增加了OLED顯示程序,可以查看程序一些參數,把說明文字單獨歸類,
程序主控用的是STC8A8K控制器,依然用的是串口1通信,通信正常,Modbus上位軟件可以修改STC8的內部寄存器文件5,是在程序3的基礎上,增加了RS485接口,準備改成用串口2通信,但通信不成功,就是上面我發的那些情況,
煩勞大神有時間指點指點!感謝!
我是做PLC電氣自動化控制工作的,閑了沒事也學習下單片機。
在plc行業里,通信已經做成個模塊了,不需要懷疑他的好壞,因為專業的工程師已經驗證過了,
開發人員只需要集中精力做好自己的控制就行了。
可單片機的里面,STM32已經有人做成模塊了,但51依然是需要開發者自己搭建,測試每個模塊,若用于開發,效率極其低下。
Modbus Client3.rar (195.5 KB, 下載次數: 37) Modbus Client5.rar (198.49 KB, 下載次數: 31)

回復

使用道具 舉報

10#
ID:137005 發表于 2022-2-11 08:28 | 只看該作者
modbus rtu有些轉成modbus tcp了,通過串口透傳,哪位大俠有示例可參考?
回復

使用道具 舉報

11#
ID:476652 發表于 2022-2-11 12:48 | 只看該作者
lkc8210大神,我的串口1改串口2好像成功了,軟件編譯通過了,下載運行,計數啥的都正常,但是加入串口2中斷后,程序運行速度明顯變得很慢很慢了,有網友說這是程序頻繁進入串口2中斷導致的,我看了半天也沒看明白,道行太淺!
這個串口2 RS485通信估計就差一點了,但還不成功啊,還望大神指點指點啊!感謝感謝。
回復

使用道具 舉報

12#
ID:161164 發表于 2022-2-11 14:15 | 只看該作者
溫柔的郎 發表于 2022-2-10 11:14
感謝大神指點
這是我的2個工程文件,
文件3,是大神的源文件,我經過整理,借鑒一些其他大神的風格,把一 ...

看了一下你的串口2相關代碼
有很多錯處

串口2的寄存器不是位于位可尋的地址
所以位操作串口2的寄存器的時候要用"&","|","~"等運算子

不同的串口有不同的中斷數,詳情請看手冊

STP-ISP軟件里已經有串口2用定時器2的例程
照著設定就可以

以下是錯處截圖
Uart.c







Uart.h



我手上沒STC8A, 你照著改看看有沒有問題

回復

使用道具 舉報

13#
ID:90212 發表于 2022-2-11 21:46 | 只看該作者
樓主的電腦可能中毒了,每個文件夾下都有 desktop.ini !
回復

使用道具 舉報

14#
ID:99525 發表于 2022-2-12 17:03 | 只看該作者
gongzhu 發表于 2022-2-11 21:46
樓主的電腦可能中毒了,每個文件夾下都有 desktop.ini !

那是微軟的文件夾信息文件!正常的!
回復

使用道具 舉報

15#
ID:1104510 發表于 2024-7-13 13:11 | 只看該作者
lkc8210 發表于 2022-2-5 11:59
1。不是232或485,是用USB轉串口下載線CP2102
如果想加485使能控制
可在Modbus.c內的beginSend內加上相 ...

我加了這個代碼   編譯報錯
回復

使用道具 舉報

16#
ID:161164 發表于 2024-7-13 23:19 | 只看該作者
鄭效桂 發表于 2024-7-13 13:11
我加了這個代碼   編譯報錯

那段只是示范,你要先定義EN_485引腳
回復

使用道具 舉報

17#
ID:492633 發表于 2024-7-28 19:07 來自手機 | 只看該作者
溫柔的郎 發表于 2022-2-5 10:24
敢問大神,請教幾個問題
1 你這測試時,單片機和電腦硬件連接是通過RS232還是RS485接口的?
   若用RS4 ...

485不一定要用IO口做流控,直接用非門就可以,要會靈活用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美在线一区 | 欧美在线资源 | 金莲网| 国产免费又色又爽又黄在线观看 | 99亚洲精品| 国产99热 | 国产午夜精品一区二区三区四区 | 欧美自拍视频 | 91亚洲国产成人精品一区二三 | 夜夜爽99久久国产综合精品女不卡 | 羞羞网站在线免费观看 | 一区二区日韩精品 | 羞羞视频免费观看 | 日日拍夜夜 | 欧美视频在线观看 | 国产视频一区二区 | 精品国产一区二区国模嫣然 | cao视频 | 男女视频免费 | 精品视频免费 | 综合久久综合久久 | 久久亚洲一区二区 | 亚洲成人第一页 | 欧美中文在线 | 精品久久久久久亚洲综合网 | 久久精品国产一区二区三区不卡 | 久久精品国产v日韩v亚洲 | 亚洲色图综合 | 亚洲一区二区三区视频 | 亚洲第一在线 | 国产精品日日摸夜夜添夜夜av | 国产片侵犯亲女视频播放 | 久久久女女女女999久久 | 男女激情网站免费 | 美女人人操 | 中文字幕视频在线观看 | www.一级毛片 | 亚洲精品一区二区三区四区高清 | 欧美成人一区二免费视频软件 | 成人综合一区 | 欧美日韩综合一区 |