欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

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

用51做了個(gè) PLC:X、Y、高速計(jì)數(shù)輸入、高速輸出、Modbus等直接用,超低學(xué)習(xí)成本

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:353115 發(fā)表于 2026-3-3 08:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 qsssuv 于 2026-3-14 16:40 編輯

大家好,我是一名嵌入式開發(fā)者。一直覺得工業(yè) PLC 價(jià)格高、定制難,于是決定用 51 單片機(jī)從零做一個(gè)小型 PLC。現(xiàn)在已經(jīng)實(shí)現(xiàn)了DI、DO、AI、AO、高速計(jì)數(shù)輸入、Modbus RTU 通信、輔助繼電器、通用數(shù)據(jù)寄存器、16位通用加計(jì)數(shù)器、32位通用加減計(jì)數(shù)器、1ms定時(shí)器、10ms定時(shí)器、100ms定時(shí)器、1s定時(shí)器、1min定時(shí)器,這個(gè)帖子將逐步介紹,項(xiàng)目在proteus上的STC15W4K32S4上實(shí)現(xiàn),若有需要可提供實(shí)板原理圖,進(jìn)行定制專用的MCU-PLC。

2026.3.14
視頻教程已上傳到B站

51hei1.jpg (240.86 KB, 下載次數(shù): 0)

51hei1.jpg

51hei2.jpg (183.39 KB, 下載次數(shù): 0)

51hei2.jpg

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:353115 發(fā)表于 2026-3-3 17:01 | 只看該作者
本項(xiàng)目是一個(gè)已建立好的KEIL工程,下載后直接打開即可。

直接在app_plc文件夾編寫自己的代碼就好了,
圖片中的程序代碼是在Y103輸出500Hz,占空比50%的PWM波形
高速計(jì)數(shù)輸入計(jì)250時(shí),即250/500為0.5s,
在仿真中,將Y103連接到了X0,Y0接了一個(gè)LED燈,可以看到LED閃爍。


回復(fù)

使用道具 舉報(bào)

板凳
ID:353115 發(fā)表于 2026-3-3 17:33 | 只看該作者
這里放上proteus的仿真(需要8.15版本)、工程(內(nèi)含設(shè)計(jì)說明書)。

PLC單片機(jī)proteus仿真(需8.15版本).zip

21.79 KB, 下載次數(shù): 0, 下載積分: 黑幣 -5

v1.0.0.260228.zip

562.76 KB, 下載次數(shù): 0, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

地板
ID:353115 發(fā)表于 2026-3-4 08:14 | 只看該作者
本帖最后由 qsssuv 于 2026-3-11 08:20 編輯

【通用輸入/通用輸出操作】
X為輸入,Y為輸出。
讀取輸入,直接寫名稱即可。
  1. IF (X0)
  2. {
  3.     ……
  4. }
復(fù)制代碼
將輸出置為0的三種寫法:
  1. RST(Y0);
  2. Y0=0;
  3. MOV(0,Y0);
復(fù)制代碼
將輸出置為1的三種寫法:
  1. SET(Y0);
  2. Y0=1;
  3. MOV(1,Y0);
復(fù)制代碼
將輸入短路至輸出的兩種寫法:
  1. Y0=X0;
  2. MOV(X0,Y0);
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

5#
ID:283207 發(fā)表于 2026-3-4 10:11 | 只看該作者
感謝樓主,下載學(xué)習(xí)一下。51做PLC僅供學(xué)習(xí)原理應(yīng)該是沒什么問題的
回復(fù)

使用道具 舉報(bào)

6#
ID:647576 發(fā)表于 2026-3-4 13:40 | 只看該作者
提議降分, 代碼不全, 功能關(guān)鍵代碼缺失
回復(fù)

使用道具 舉報(bào)

7#
ID:353115 發(fā)表于 2026-3-5 13:46 | 只看該作者
本帖最后由 qsssuv 于 2026-3-11 08:20 編輯

【模擬量輸入】
直接讀取值即可:
D0=AI0;
回復(fù)

使用道具 舉報(bào)

8#
ID:258566 發(fā)表于 2026-3-5 17:31 | 只看該作者
plc相關(guān)提供一個(gè)外部頭文件,而不是在幾個(gè)頭文件中
mcu plc。lib中有沒有使用時(shí)間限制。
回復(fù)

使用道具 舉報(bào)

9#
ID:353115 發(fā)表于 2026-3-5 20:03 | 只看該作者
cccc888 發(fā)表于 2026-3-5 17:31
plc相關(guān)提供一個(gè)外部頭文件,而不是在幾個(gè)頭文件中
mcu plc。lib中有沒有使用時(shí)間限制。

這個(gè)LIB沒有使用限制,但是只在仿真中測(cè)試通過
回復(fù)

使用道具 舉報(bào)

10#
ID:353115 發(fā)表于 2026-3-6 08:00 | 只看該作者
【定時(shí)器】
所有的定時(shí)器,都是倒計(jì)時(shí)定時(shí)器,將從設(shè)置的值開始倒計(jì)時(shí),若計(jì)數(shù)值達(dá)到0,運(yùn)行狀態(tài)T_STA_RUN,將轉(zhuǎn)變?yōu)橛?jì)時(shí)到達(dá)狀態(tài)T_STA_OK。
定時(shí)器有4種狀態(tài)、5種使用方法。
4種狀態(tài)分別是:停止(T_STA_STOP)、運(yùn)行(T_STA_RUN)、暫停(T_STA_PAUSE)、計(jì)時(shí)到達(dá)(T_STA_OK)。
5種使用方法分別是TON、TPAUSE、TRST、TGetSta、TGetVal,用以下例子加以說明。
//若T0定時(shí)10ms時(shí)間到,則輸出Y0。
IF (TON(T0,10)==T_STA_OK)
{
    SET(Y0);
} ELSE {
    RST(Y0);
}
//時(shí)間未到時(shí),若X0輸入,則暫停定時(shí)器,若X1輸入,則重置定時(shí)器
IF (TGetSta(T0)!=T_STA_OK)
{
    IF (X0) TPAUSE(T0);
    IF (X1) TRST(T0);
}
//將計(jì)數(shù)值導(dǎo)出到D0
D0 = TGetVal(T0);
注意,定時(shí)器定時(shí)值的單位為對(duì)應(yīng)時(shí)基:如1ms定時(shí)器T0,TON(T0,10)表示定時(shí)10ms;100ms定時(shí)器T100,TON(T100,5)表示定時(shí)500ms,以此類推。
回復(fù)

使用道具 舉報(bào)

11#
ID:353115 發(fā)表于 2026-3-6 16:56 | 只看該作者
【計(jì)數(shù)器】
計(jì)數(shù)器有3種狀態(tài),分別是停止(C_STA_STOP)、運(yùn)行(C_STA_RUN)、計(jì)數(shù)到達(dá)(C_STA_OK)。
16位通用加計(jì)數(shù)器有2種方法。
第1種方法,加計(jì)數(shù):CTU(要使用的計(jì)數(shù)器,信號(hào)源,計(jì)數(shù)目標(biāo)值)。
例如使用計(jì)數(shù)器C0對(duì)X0的上升沿,進(jìn)行加計(jì)數(shù),到達(dá)10次時(shí),Y0輸出1s后重新開始計(jì)數(shù)。
  1. IF (CTU(C0,X0,10)==C_STA_OK)  //若計(jì)數(shù)器C0,捕捉到X0上升沿10次
  2. {
  3.     TON(T50,100);  //啟動(dòng)1s定時(shí)器
  4.     SET(Y0);  //輸出Y0
  5. } ELSE {
  6.     RST(Y0);  //清除Y0
  7. }
  8. IF (TGetSta(T50)==T_STA_OK)  //若1s時(shí)間到
  9. {
  10.     RST(Y0);  //清除Y0
  11.     TRST(T50);  //重置定時(shí)器
  12.     C16RST(C0);  //重置計(jì)數(shù)器
  13. }
復(fù)制代碼



第2種方法,減計(jì)數(shù):CTD(要使用的計(jì)數(shù)器,信號(hào)源,計(jì)數(shù)目標(biāo)值)。
例如使用計(jì)數(shù)器C1對(duì)X1的下降沿,進(jìn)行減計(jì)數(shù),到達(dá)10次時(shí),Y1輸出2s后重新開始計(jì)數(shù)。
  1. IF (CTD(C1,NOT(X1),10)==C_STA_OK)  //若計(jì)數(shù)器C1,捕捉到X0下降沿10次
  2. {
  3.     TON(T50,200);  //啟動(dòng)2s定時(shí)器
  4.     SET(Y1);  //輸出Y1
  5. } ELSE {
  6.     RST(Y1);  //清除Y1
  7. }
  8. IF (TGetSta(T50)==T_STA_OK)  //若計(jì)時(shí)時(shí)間到
  9. {
  10.     RST(Y1);  //清除Y1
  11.     TRST(T50);  //重置定時(shí)器
  12.     C16RST(C1);  //重置計(jì)數(shù)器
  13. }
復(fù)制代碼

32位通用計(jì)數(shù)器有1種方法。CTUD(計(jì)數(shù)器,加計(jì)數(shù)信號(hào)源,減計(jì)數(shù)信號(hào)源,計(jì)數(shù)目標(biāo)值)。
例如使用計(jì)數(shù)器C200,X0作為加計(jì)數(shù)信號(hào)源,X1作為減計(jì)數(shù)信號(hào)源,當(dāng)數(shù)值到達(dá)200時(shí),Y0輸出2s,然后重新計(jì)數(shù)。
由于32位通用計(jì)數(shù)器在計(jì)數(shù)完成后,仍會(huì)受到加減操作的影響,導(dǎo)致狀態(tài)變更,因此引入輔助繼電器,避免Y0的輸出波動(dòng)。
  1. IF (M0==0)  //若M0為0
  2. {
  3.     IF (CTUD(C200,X0,X1,200)==C_STA_OK)  //若計(jì)數(shù)器C200,在X0和X1的計(jì)數(shù)信號(hào)下,達(dá)到200次
  4.     {
  5.         TON(T50,200);  //啟動(dòng)2s定時(shí)器
  6.         SET(Y0);  //輸出Y0
  7.         SET(M0);  //置位M0
  8.     } ELSE {
  9.         RST(Y0);  //清除Y0
  10.     }
  11. }
  12. IF (TGetSta(T50)==T_STA_OK)  //若定時(shí)時(shí)間到
  13. {
  14.     RST(Y0);  //清除Y0
  15.     C32RST(C200);  //重置計(jì)數(shù)器
  16.     RST(M0);  //清除M0
  17.     TRST(T50);  //重置定時(shí)器
  18. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

12#
ID:353115 發(fā)表于 2026-3-7 11:00 | 只看該作者
【高速輸出/PWM】
控制高速輸出有4種方法。分別為以下:
以Y100為例。
輸出控制:PWM_OUT(Y100,頻率,占空比)。頻率范圍為400Hz~100KHz,占空比范圍為0-100,為整數(shù),請(qǐng)勿使用小數(shù)。占空比0=無輸出,100=持續(xù)高電平。
獲取輸出頻率:PWM_GetFre(Y100)。返回設(shè)置的頻率,若未設(shè)置,返回0。
獲取輸出占空比:PWM_GetDuty(Y100)。返回設(shè)置的占空比,若未設(shè)置,返回255。
停止輸出:PWM_STOP(Y100)。Y100將為0。
注:若不進(jìn)行高速輸出,其默認(rèn)將為一個(gè)通用輸出。
回復(fù)

使用道具 舉報(bào)

13#
ID:90212 發(fā)表于 2026-3-8 10:30 | 只看該作者
要做PLC起碼也得用STC32吧
回復(fù)

使用道具 舉報(bào)

14#
ID:353115 發(fā)表于 2026-3-8 16:12 | 只看該作者
gongzhu 發(fā)表于 2026-3-8 10:30
要做PLC起碼也得用STC32吧

PCB可以用STC32,但是仿真上沒有,所以用了STC15,其實(shí)任何單片機(jī)都可以
回復(fù)

使用道具 舉報(bào)

15#
ID:353115 發(fā)表于 2026-3-9 10:31 | 只看該作者
本帖最后由 qsssuv 于 2026-3-11 08:21 編輯

【高速計(jì)數(shù)輸入】
需要用到特殊輔助繼電器、特殊數(shù)據(jù)寄存器,這里使用了一看就明白的變量值。
使能高速計(jì)數(shù)輸入X0,注意使能后,請(qǐng)勿將其用作通用輸入接口:
  1. DX0_CNT=0;  //設(shè)置起始計(jì)數(shù)值
  2. MX0_OUT=0;  //清除溢出標(biāo)志
  3. DX0_MAX=100;  //定義設(shè)置上限
  4. SET(MX0_EN);  //啟動(dòng)
復(fù)制代碼
停用高速計(jì)數(shù)輸入X0,停用后,可用作通用輸入接口:
  1. RST(MX0_EN);  //清除使能。除非用戶手動(dòng)清除計(jì)數(shù)值DX0_CNT,否則啟動(dòng)后繼續(xù)計(jì)數(shù)
復(fù)制代碼
當(dāng)起始計(jì)數(shù)值DX0_CNT達(dá)到設(shè)置上限D(zhuǎn)X0_MAX,溢出標(biāo)志MX0_OUT會(huì)置1,并且DX0_CNT從0開始。需要用戶手動(dòng)清除溢出標(biāo)志MX0_OUT。
需要注意,受限于MCU的性能,若值范圍為0~255,則計(jì)數(shù)的設(shè)置上限,以及起始計(jì)數(shù)值,設(shè)置時(shí)均不可超出此范圍。
若需要使用高速計(jì)數(shù)輸入X3,將以上代碼中的X0修改為X3使用即可。
回復(fù)

使用道具 舉報(bào)

16#
ID:353115 發(fā)表于 2026-3-10 08:20 | 只看該作者
【日期和時(shí)間】
dhms是一個(gè)集合了設(shè)備已運(yùn)行時(shí)間的對(duì)象。包含天數(shù)、時(shí)、分、秒。
dhms.day,天,最大到32767。
dhms.hour,時(shí)。
dhms.min,分。
dhms.sec,秒。
用戶可將其加載至通用數(shù)據(jù)寄存器。
回復(fù)

使用道具 舉報(bào)

17#
ID:353115 發(fā)表于 2026-3-11 08:21 | 只看該作者
【Modbus-RTU從站協(xié)議】
通信配置:4800,N,8,1。訪問地址固定為1。
寄存器表就不貼圖了,可以下載下來看設(shè)計(jì)說明中的詳細(xì)內(nèi)容。
總之,就是直接連上Modscan工具就可以使用,很方便。

在仿真上,你需要安裝虛擬串口驅(qū)動(dòng),才能使用modscan連接到proteus仿真
在app_plc_reg_update文件中,填寫了默認(rèn)的更新事件內(nèi)容,用戶可自定義其它行為
回復(fù)

使用道具 舉報(bào)

18#
ID:353115 發(fā)表于 2026-3-13 11:02 | 只看該作者
本 log 函數(shù)是針對(duì) MCU-PLC 硬件場(chǎng)景定制的日志輸出函數(shù)。
/********************************
功能描述:打印到控制臺(tái)(串口輸出)
參數(shù)說明:*format:格式控制。支持以下格式:
        %d:s16數(shù)據(jù)
        %u:u16數(shù)據(jù)
        %ld:s32數(shù)據(jù)
        %lu:u32數(shù)據(jù)
        %s:字符串
        %c:ASCII字符
        %X:u16數(shù)據(jù)的16進(jìn)制字符串
        %lX:u32數(shù)據(jù)的16進(jìn)制字符串
        %[0][1-5]u:以n的寬度顯示u16數(shù)據(jù),不足時(shí)可前置添0,超過時(shí)寬度限制無效
        %[0][1-10]lu:以n的寬度顯示u32數(shù)據(jù),不足時(shí)可前置添0,超過時(shí)寬度限制無效
        %.[0-4]d:對(duì)s16數(shù)據(jù)以小數(shù)形式呈現(xiàn)
        %.[0-9]ld:對(duì)s32數(shù)據(jù)以小數(shù)形式呈現(xiàn)
        %.[0-4]u:對(duì)u16數(shù)據(jù)以小數(shù)形式呈現(xiàn)
        %.[0-9]lu:對(duì)u32數(shù)據(jù)以小數(shù)形式呈現(xiàn)
        %.nd:參數(shù)1為保留小數(shù)位數(shù),參數(shù)為2為s16數(shù)據(jù)
        %.nld:參數(shù)1為保留小數(shù)位數(shù),參數(shù)為2為s32數(shù)據(jù)
        %.nu:參數(shù)1為保留小數(shù)位數(shù),參數(shù)為2為u16數(shù)據(jù)
        %.nlu:參數(shù)1為保留小數(shù)位數(shù),參數(shù)為2為u32數(shù)據(jù)
        %t:參數(shù)1為字符串指針。參數(shù)2為限制長度,可以是參數(shù)1的空間大小-1。將此字符之前的格式化的字符復(fù)制到第1個(gè)字符串指針位置
        %hs:參數(shù)1為u8指針。參數(shù)2為限制長度。將此數(shù)據(jù)轉(zhuǎn)為十六進(jìn)制字符串。
        %hn:參數(shù)1為u8指針。參數(shù)2為限制長度。直接拷貝源數(shù)據(jù)。
返回值:指向數(shù)據(jù)緩沖區(qū)的指針,除%t參數(shù)外,其它功能都會(huì)使得該數(shù)據(jù)區(qū)以字符串結(jié)束符結(jié)束(\0)
********************************/
char *log(char *format, ...);
例如,將AI0打印至窗口
  1. log("AI0:%u\r\n",AI0);
復(fù)制代碼

受限MCU的資源,打印多個(gè)參數(shù)時(shí),可能輸出異常,可以分解進(jìn)行單個(gè)打印。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表