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

QQ登錄

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

搜索
查看: 4268|回復(fù): 3
收起左側(cè)

GYJ-0095單片機(jī)四路輸入輸出繼電器工控板仿modbus控制源碼與資料下載

[復(fù)制鏈接]
ID:280979 發(fā)表于 2018-3-18 01:01 | 顯示全部樓層 |閱讀模式
GYJ-0095_四路輸入輸出繼電器工控板產(chǎn)品使用說(shuō)明書(shū)
【簡(jiǎn)要說(shuō)明】
一、尺寸:長(zhǎng)145mmX寬90mmX高20mm
二、主要芯片:單片機(jī)STC89C52RC 繼電器 光耦
三、工作電壓:有直流12V及24V可選。
四、特點(diǎn):
電路結(jié)構(gòu)簡(jiǎn)單,穩(wěn)定可靠,采用最新款STC單片機(jī),運(yùn)行速度快,單片機(jī)預(yù)留擴(kuò)展接口
1、具有四路輸入信號(hào)指示燈,四路繼電器吸合指示燈,電源指示燈。
2、板子功耗小于8W
3、額定切換電流10A以內(nèi),切換電壓250V以內(nèi)
4、單路最大切換功率500W 額定功率300W
5、繼電器壽命1000000次以上。
6、電器絕緣電阻100M
7、觸電耐壓1000V
8、繼電器最大吸合時(shí)間15mS毫秒
9、繼電器最大釋放時(shí)間5mS毫秒
10、工作溫度-40度至+70度
11、工作濕度40%~80%RH
12、路光電隔離輸入,8路光電隔離輸出
13、輸入低電平有效(即:NPN輸入)
14、路輸出開(kāi)關(guān)量輸出(即:干接點(diǎn)輸出)
15、具有MAX232通訊。
16、單片機(jī)所有IO口都引出,客戶可以自己編程擴(kuò)展功能
17、可以選擇使用外部EEPROM 作為存儲(chǔ)單元
18、電路具有,防反接保護(hù)、過(guò)流保護(hù)、續(xù)流保護(hù)、壓敏保護(hù)等
19、單片機(jī)可以自行更換,可以選擇替換型的STC系列單片機(jī)
20、我們提供電路相關(guān)的,原理圖、例程、開(kāi)發(fā)環(huán)境、下載軟件等相關(guān)資料
適用場(chǎng)合:工業(yè)控制、產(chǎn)品開(kāi)發(fā)、項(xiàng)目設(shè)計(jì),自動(dòng)化改造等
【標(biāo)注說(shuō)明】
010133h5u22dccdwl2wldc.jpg
接線說(shuō)明
   
輸入控制設(shè)備
輸出控制設(shè)備

輸出舉例說(shuō)明
輸出舉例說(shuō)明(開(kāi)關(guān)量輸出、干接點(diǎn)輸出)
專業(yè)下載線接線說(shuō)明
串口通信說(shuō)明也可以通過(guò)串口下載



原理圖(提供PDF格式的原理圖及PCB)更清晰
免費(fèi)提供與此工控板有關(guān)的:資料、例程、原理圖
芯片資料、軟件。
【圖片展示】

默認(rèn)發(fā)貨程序
  1. 單片機(jī)與PC機(jī)采用9針串口,MAX232通訊,波特率默認(rèn)為9600.

  2. 單片機(jī)接收PC機(jī)發(fā)送的十六進(jìn)制碼表如下:

  3. 01、全開(kāi):PC發(fā)送'I';
  4. 02、全關(guān):PC發(fā)送'i';

  5. 03、第一路開(kāi):PC發(fā)送'A';
  6. 04、第二路開(kāi):PC發(fā)送'B';
  7. 05、第三路開(kāi):PC發(fā)送'C';
  8. 06、第四路開(kāi):PC發(fā)送'D';


  9. 11、第一路關(guān):PC發(fā)送'a';
  10. 12、第二路關(guān):PC發(fā)送'b';
  11. 13、第三路關(guān):PC發(fā)送'c';
  12. 14、第四路關(guān):PC發(fā)送'd';


  13. *********************************************************************/
  14. #include<reg52.h>                       //庫(kù)文件
  15. #define uchar unsigned char//宏定義無(wú)符號(hào)字符型
  16. #define uint unsigned int  //宏定義無(wú)符號(hào)整型
  17. /********************************************************************
  18.                             初始定義
  19. *********************************************************************/

  20. unsigned char dat; //用于存儲(chǔ)單片機(jī)接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容

  21. /*定義八位輸入為單片機(jī)P1口*/
  22. sbit IN0=P1^0;
  23. sbit IN1=P1^1;
  24. sbit IN2=P1^2;
  25. sbit IN3=P1^3;

  26. /*定義八位輸出為單片機(jī)P2口*/
  27. sbit K1=P2^0;
  28. sbit K2=P2^1;
  29. sbit K3=P2^2;
  30. sbit K4=P2^3;

  31. /********************************************************************
  32.                             延時(shí)函數(shù)
  33. *********************************************************************/
  34. void delay(uchar t)
  35. {
  36.   uchar i,j;
  37.    for(i=0;i<t;i++)
  38.    {
  39.                  for(j=13;j>0;j--);
  40.               { ;
  41.               }
  42.    }
  43. }

  44. /********************************************************************
  45.               功能:串口初始化,波特率9600,方式1
  46. *********************************************************************/
  47. void Init_Com(void)
  48. {
  49. TMOD = 0x20;
  50. PCON = 0x00;
  51. SCON = 0x50;
  52. TH1 = 0xFd;
  53. TL1 = 0xFd;
  54. TR1 = 1;
  55. }

  56. /********************************************************************
  57.                             主函數(shù)
  58. *********************************************************************/
  59. void main()
  60. {
  61. Init_Com();//串口初始化
  62. while(1)
  63. {

  64. if(IN0==0){delay(100);K1=0;while(!IN0);SBUF ='1';K1=1;} //繼電器K1按下閉合,松開(kāi)斷開(kāi)
  65. if(IN1==0){delay(100);K2=0;while(!IN1);SBUF ='2';K2=1;} //繼電器K2按下閉合,松開(kāi)斷開(kāi)
  66. if(IN2==0){delay(100);K3=0;while(!IN2);SBUF ='3';K3=1;} //繼電器K3按下閉合,松開(kāi)斷開(kāi)
  67. if(IN3==0){delay(100);K4=0;while(!IN3);SBUF ='4';K4=1;} //繼電器K4按下閉合,松開(kāi)斷開(kāi)                    
  68. if ( RI ) //掃描判斷是否接收到數(shù)據(jù),
  69. {
  70. dat = SBUF; //接收數(shù)據(jù)SBUF賦與dat
  71. RI=0; //RI 清零。
  72. SBUF = dat; //在原樣把數(shù)據(jù)發(fā)送回去
  73. }
  74. /********************************************************************
  75.                             接收數(shù)據(jù)判斷函數(shù)
  76. *********************************************************************/
  77. switch(dat) //接收數(shù)據(jù)判斷
  78. {
  79. uchar k;
  80. k=10;
  81. case 'I': P2=0X00;delay(k);break; //  全開(kāi)
  82. case 'i': P2=0XFF;delay(k);break; //  全關(guān)

  83. case 'A': K1=0;delay(k);break;                 //  第一路開(kāi)
  84. case 'B': K2=0;delay(k);break;                 //  第二路開(kāi)
  85. case 'C': K3=0;delay(k);break;                 //  第三路開(kāi)
  86. case 'D': K4=0;delay(k);break;                 //  第四路開(kāi)

  87. case 'a': K1=1;delay(k);break;                 //  第一路關(guān)
  88. case 'b': K2=1;delay(k);break;                 //  第二路關(guān)
  89. case 'c': K3=1;delay(k);break;                 //  第三路關(guān)
  90. case 'd': K4=1;delay(k);break;                 //  第四路關(guān)


  91. default:break;                                                                         //  跳出
  92. }

  93. }
  94. }
  95.             
  96. /********************************************************************
  97.                               結(jié)束
  98. *********************************************************************/

復(fù)制代碼

仿modbus通信控制程序
                           485通訊控制板通訊協(xié)議(技術(shù)QQ115451619)

波特率 9600
通訊協(xié)議格式如下:發(fā)送十六進(jìn)制
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00~FF
00~09
00~FF
BB
解釋
第一個(gè)數(shù)據(jù)
第二個(gè)數(shù)據(jù)
第三個(gè)數(shù)據(jù)
第四個(gè)數(shù)據(jù)
最后一個(gè)數(shù)據(jù)
功能1:改變板子地址
舉例:更改地址:(發(fā)貨默認(rèn)地址00注意:多個(gè)板子并聯(lián)使用時(shí)需要不同地址
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
01
01
BB
解釋
開(kāi)始數(shù)據(jù)
向00地址發(fā)送
改變地址
將地址改成01
數(shù)據(jù)結(jié)束
功能2:打開(kāi)繼電器
舉例:打開(kāi)第一塊板子的繼電器
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
02
01
BB
解釋
開(kāi)始數(shù)據(jù)
向00地址發(fā)送
打開(kāi)功能
打開(kāi)繼電器
數(shù)據(jù)結(jié)束
功能3:關(guān)閉繼電器
舉例:關(guān)閉第二路板子的繼電器
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
01
03
01
BB
解釋
開(kāi)始數(shù)據(jù)
向01地址發(fā)送
關(guān)閉功能
關(guān)閉繼電器
數(shù)據(jù)結(jié)束
功能4:打開(kāi)某塊板子的所有繼電器(單路繼電器模塊的這個(gè)功能碼和功能2一樣)
舉例:打開(kāi)第一塊板子的全部繼電器
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
04
FF
BB
解釋
開(kāi)始數(shù)據(jù)
向00地址發(fā)送
打開(kāi)所有功能
打開(kāi)所有繼電器
數(shù)據(jù)結(jié)束
功能5:關(guān)閉某塊板子的所有繼電器(單路繼電器模塊的這個(gè)功能碼和功能3一樣)
舉例:關(guān)閉第三塊板子的全部繼電器
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
02
05
00
BB
解釋
開(kāi)始數(shù)據(jù)
向02地址發(fā)送
關(guān)閉所有功能
關(guān)閉所有繼電器
數(shù)據(jù)結(jié)束
功能6:查詢繼電器狀態(tài)
舉例:查詢第一塊板子繼電器狀態(tài)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
06
01
BB
解釋
開(kāi)始數(shù)據(jù)
向00地址發(fā)送
查詢功能
查詢繼電器
數(shù)據(jù)結(jié)束
查詢返回信息分析 繼電器關(guān)閉返回值(關(guān)閉返回00)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
07
00
BB
解釋
開(kāi)始數(shù)據(jù)
00地址返回
返回功能
繼電器狀態(tài)關(guān)閉
數(shù)據(jù)結(jié)束
查詢返回信息分析 繼電器打開(kāi)返回值(打開(kāi)返回FF)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
07
FF
BB
解釋
開(kāi)始數(shù)據(jù)
00地址返回
返回功能
繼電器狀態(tài)打開(kāi)
數(shù)據(jù)結(jié)束

功能7:查詢輸入狀態(tài)
舉例:查詢第一塊板子的輸入狀態(tài)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
08
01
BB
解釋
開(kāi)始數(shù)據(jù)
向00地址發(fā)送
查詢功能
查詢輸入
數(shù)據(jù)結(jié)束
查詢返回信息分析 輸入返回值(關(guān)閉返回00)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
09
00
BB
解釋
開(kāi)始數(shù)據(jù)
00地址返回
返回功能
輸入狀態(tài)關(guān)閉
數(shù)據(jù)結(jié)束
查詢返回信息分析 輸入返回值(打開(kāi)返回01)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
09
FF
BB
解釋
開(kāi)始數(shù)據(jù)
00地址返回
返回功能
輸入狀態(tài)打開(kāi)
數(shù)據(jù)結(jié)束
功能8:輸入發(fā)送數(shù)據(jù)
當(dāng)輸入端有信號(hào)時(shí),給上位機(jī)發(fā)送數(shù)據(jù)
舉例:第一路有信號(hào)輸入時(shí)的數(shù)據(jù)為:AA 00 08 01 BB
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
08
01~08
BB
解釋
開(kāi)始數(shù)據(jù)
00地址返回
返回功能
輸入狀態(tài)
數(shù)據(jù)結(jié)束
功能9:板子地址清零控制(用于地址不清晰或者忘記,在485總線下禁止操作,只可對(duì)其單獨(dú)清零)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
00
00
BB
解釋
開(kāi)始數(shù)據(jù)
00
地址清零
數(shù)據(jù)結(jié)束
功能10:繼電器定時(shí)輸出
協(xié)議
啟始位
地址位
繼電器位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
11
00
BB
解釋
開(kāi)始數(shù)據(jù)
地址
打開(kāi)第一個(gè)繼電器
時(shí)間值單位秒
數(shù)據(jù)結(jié)束
協(xié)議
啟始位
地址位
繼電器位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
12
00
BB
解釋
開(kāi)始數(shù)據(jù)
地址
打開(kāi)第二個(gè)繼電器
時(shí)間值單位秒
數(shù)據(jù)結(jié)束
協(xié)議
啟始位
地址位
繼電器位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
13
00
BB
解釋
開(kāi)始數(shù)據(jù)
地址
打開(kāi)第三個(gè)繼電器
時(shí)間值單位秒
數(shù)據(jù)結(jié)束
協(xié)議
啟始位
地址位
繼電器位
數(shù)據(jù)位
結(jié)束位
控制
AA
00
14
00
BB
解釋
開(kāi)始數(shù)據(jù)
地址
打開(kāi)第四個(gè)繼電器
時(shí)間值單位秒
數(shù)據(jù)結(jié)束
  1. #include<reg52.h>                       //庫(kù)文件
  2. #include <intrins.H>
  3. #include<EEPROM.h>
  4. #define uchar unsigned char//宏定義無(wú)符號(hào)字符型
  5. //sfr WDT_CONTR=0Xe1;
  6. sbit K1=P2^0;
  7. sbit K2=P2^1;
  8. sbit K3=P2^2;
  9. sbit K4=P2^3;
  10. sbit K5=P2^4;
  11. sbit K6=P2^5;
  12. sbit K7=P2^6;
  13. sbit K8=P2^7;

  14. /*定義八位入為單片機(jī)P1口*/
  15. sbit IN0=P1^0;
  16. sbit IN1=P1^1;
  17. sbit IN2=P1^2;
  18. sbit IN3=P1^3;
  19. sbit IN4=P1^4;
  20. sbit IN5=P1^5;
  21. sbit IN6=P1^6;
  22. sbit IN7=P1^7;
  23. uchar dat;
  24. uchar t,r,ii;
  25. uchar k=100;
  26. uchar add;    //掉電保持485的地址
  27. uchar j=0;
  28. bit flag_zx=0;
  29. uchar sendBuf[10];                //發(fā)送緩沖區(qū)
  30. uchar receBuf[10];    //接收緩沖區(qū)
  31. uchar s1,s2,s3,s4,s5,s6,s7,s8;
  32. uchar s11,s22,s33,s44,s55,s66,s77,s88;
  33. bit busy;
  34. bit bz1=0;
  35. bit bz2=0;
  36. bit bz3=0;
  37. bit bz4=0;
  38. bit bz5=0;
  39. bit bz6=0;
  40. bit bz7=0;
  41. bit bz8=0;

  42. bit sj1=0;
  43. bit sj2=0;
  44. bit sj3=0;
  45. bit sj4=0;
  46. bit sj5=0;
  47. bit sj6=0;
  48. bit sj7=0;
  49. bit sj8=0;
  50. /********************************************************************
  51.                             初始定義
  52. *********************************************************************/
  53. uint sec; //定義計(jì)數(shù)值,每過(guò)1/10 秒,sec 加一
  54. uint tcnt; //鍵值判斷
  55. /********************************************************************
  56.                             延時(shí)函數(shù)
  57. *********************************************************************/
  58. void delay(uchar t)
  59. {
  60.   uchar i,j;
  61.    for(i=0;i<t;i++)
  62.    {
  63.                  for(j=13;j>0;j--);
  64.               { ;
  65.               }
  66.    }
  67. }

  68. /********************************************************************
  69.               功能:串口初始化,波特率9600,方式1
  70. *********************************************************************/
  71. void Init_Com(void)
  72. {
  73. TMOD|=0x20;
  74. SCON=0x50;
  75. TH1=0xfd;
  76. TL1=0xfd;
  77. TR1=1;
  78. ES=1;
  79. }

  80. /****************發(fā)送函數(shù)*********************/
  81. void senduart2()
  82. {               
  83. //RS485_DIR=1;
  84. SBUF=sendBuf[0];while(!TI);TI=0;
  85. SBUF=sendBuf[1];while(!TI);TI=0;
  86. SBUF=sendBuf[2];while(!TI);TI=0;
  87. SBUF=sendBuf[3];while(!TI);TI=0;
  88. SBUF=sendBuf[4];while(!TI);TI=0;
  89. }

  90. /****************發(fā)送函數(shù)*********************/
  91. void send1()
  92. {               
  93. //RS485_DIR=1;
  94. SBUF=0XAA;while(!TI);TI=0;
  95. SBUF=add;while(!TI);TI=0;
  96. SBUF=0X08;while(!TI);TI=0;
  97. SBUF=0X01;while(!TI);TI=0;
  98. SBUF=0XBB;while(!TI);TI=0;
  99. }
  100. /****************發(fā)送函數(shù)*********************/
  101. void send2()
  102. {               
  103. //RS485_DIR=1;
  104. SBUF=0XAA;while(!TI);TI=0;
  105. SBUF=add;while(!TI);TI=0;
  106. SBUF=0X08;while(!TI);TI=0;
  107. SBUF=0X02;while(!TI);TI=0;
  108. SBUF=0XBB;while(!TI);TI=0;
  109. }
  110. /****************發(fā)送函數(shù)*********************/
  111. void send3()
  112. {               
  113. //RS485_DIR=1;
  114. SBUF=0XAA;while(!TI);TI=0;
  115. SBUF=add;while(!TI);TI=0;
  116. SBUF=0X08;while(!TI);TI=0;
  117. SBUF=0X03;while(!TI);TI=0;
  118. SBUF=0XBB;while(!TI);TI=0;
  119. }
  120. /****************發(fā)送函數(shù)*********************/
  121. void send4()
  122. {               
  123. //RS485_DIR=1;
  124. SBUF=0XAA;while(!TI);TI=0;
  125. SBUF=add;while(!TI);TI=0;
  126. SBUF=0X08;while(!TI);TI=0;
  127. SBUF=0X04;while(!TI);TI=0;
  128. SBUF=0XBB;while(!TI);TI=0;
  129. }
  130. /****************發(fā)送函數(shù)*********************/
  131. void send5()
  132. {               
  133. //RS485_DIR=1;
  134. SBUF=0XAA;while(!TI);TI=0;
  135. SBUF=add;while(!TI);TI=0;
  136. SBUF=0X08;while(!TI);TI=0;
  137. SBUF=0X05;while(!TI);TI=0;
  138. SBUF=0XBB;while(!TI);TI=0;
  139. }
  140. /****************發(fā)送函數(shù)*********************/
  141. void send6()
  142. {               
  143. //RS485_DIR=1;
  144. SBUF=0XAA;while(!TI);TI=0;
  145. SBUF=add;while(!TI);TI=0;
  146. SBUF=0X08;while(!TI);TI=0;
  147. SBUF=0X06;while(!TI);TI=0;
  148. SBUF=0XBB;while(!TI);TI=0;
  149. }/****************發(fā)送函數(shù)*********************/
  150. void send7()
  151. {               
  152. //RS485_DIR=1;
  153. SBUF=0XAA;while(!TI);TI=0;
  154. SBUF=add;while(!TI);TI=0;
  155. SBUF=0X08;while(!TI);TI=0;
  156. SBUF=0X07;while(!TI);TI=0;
  157. SBUF=0XBB;while(!TI);TI=0;
  158. }
  159. /****************發(fā)送函數(shù)*********************/
  160. void send8()
  161. {               
  162. //RS485_DIR=1;
  163. SBUF=0XAA;while(!TI);TI=0;
  164. SBUF=add;while(!TI);TI=0;
  165. SBUF=0X08;while(!TI);TI=0;
  166. SBUF=0X08;while(!TI);TI=0;
  167. SBUF=0XBB;while(!TI);TI=0;
  168. }

  169. /*****************清空發(fā)送緩沖區(qū)*************************/
  170. void clear_receBuf()
  171. {
  172.     uchar i;
  173.               for(i=0;i<5;i++)
  174.               {
  175.                   receBuf[i]=0;
  176.               }
  177. }
  178. /********************************************************************
  179.               功能:串口初始化,波特率9600,方式1
  180. *********************************************************************/
  181. void initTimer(void)
  182. {
  183. TMOD=0x2;
  184. TH0=0x1b;
  185. TL0=0x1b;
  186. }
  187. /********************************************************************
  188.                             串口中斷服務(wù)函數(shù)
  189. *********************************************************************/
  190. void uart(void) interrupt 4
  191. {
  192. /********************************************************************
  193.                             接收數(shù)據(jù)判斷函數(shù)
  194. *********************************************************************/
  195. if(RI)  //如果有接收
  196.                  {
  197.                    RI=0; //接收標(biāo)志清零
  198.                    receBuf[r++&0x0F]=SBUF;     //把接受的數(shù)據(jù)存儲(chǔ)到BUT數(shù)組中
  199.                             if(receBuf[0]!=0xaa){r=0;}
  200.                             if(r>=5)
  201.                             {              r=0;

  202.                                 flag_zx=1;
  203.                             }
  204.                  }
  205.                  if(flag_zx==1)
  206.                  {                                

  207.                       flag_zx=0;
  208.                            
  209.                                 //0         1       2       3        4                           
  210.                                           //起始位   地址位  功能位   數(shù)據(jù)位  結(jié)束位
  211.                                           if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))                //如果開(kāi)始位和結(jié)束位,還有地址都正確,進(jìn)行下一步判斷
  212.                                           {
  213.                                              if(receBuf[2]==0x01)  //修改板子地址
  214.                                              {
  215.                                                   add=receBuf[3];
  216.                                                                       EEPROMSectorErase(0);//擦除扇區(qū)
  217.                                                   EEPROMWriteByte(0,add);//寫(xiě)入新的地址
  218.                                              }
  219.                                              else if(receBuf[2]==0x02)  //打開(kāi)單路繼電器
  220.                                              {
  221.                                                                switch(receBuf[3])
  222.                                                                       {
  223.                                                                           case 0x01: K1=0;sj1=0; break;
  224.                                                                                     case 0x02: K2=0;sj2=0; break;
  225.                                                                           case 0x03: K3=0;sj3=0; break;
  226.                                                                                     case 0x04: K4=0;sj4=0; break;
  227.                                                                           case 0x05: K5=0;sj5=0;break;
  228.                                                                                     case 0x06: K6=0;sj6=0;break;
  229.                                                                           case 0x07: K7=0;sj7=0;break;
  230.                                                                                     case 0x08: K8=0;sj8=0;break;
  231.                                                                                     default:break;
  232.                                                                       }
  233.                                              }
  234.                                              else if(receBuf[2]==0x03)  //關(guān)閉單路繼電器
  235.                                              {
  236.                                                                switch(receBuf[3])
  237.                                                                       {
  238.                                                                           case 0x01: K1=1;sj1=0; break;
  239.                                                                                     case 0x02: K2=1;sj2=0; break;
  240.                                                                           case 0x03: K3=1;sj3=0; break;
  241.                                                                                     case 0x04: K4=1;sj4=0; break;
  242.                                                                           case 0x05: K5=1;sj5=0; break;
  243.                                                                                     case 0x06: K6=1;sj6=0; break;
  244.                                                                           case 0x07: K7=1;sj7=0; break;
  245.                                                                                     case 0x08: K8=1;sj8=0; break;
  246.                                                                                     default:break;
  247.                                                                       }                                 
  248.                                              }
  249.                                              else if(receBuf[2]==0x04)  //打開(kāi)全部繼電器
  250.                                              {
  251.                                                   if(receBuf[3]==0xff)
  252.                                                   {
  253.                                                                           P2=0X00; sj1=0;sj2=0;sj3=0;sj4=0;sj5=0;sj6=0;sj7=0;sj8=0;
  254.                                                                       }
  255.                                              }
  256.                                              else if(receBuf[2]==0x05)  //關(guān)閉全部繼電器
  257.                                              {
  258.                                                   if(receBuf[3]==0x00)
  259.                                                   {
  260.                                                                           P2=0XFF; sj1=0;sj2=0;sj3=0;sj4=0;sj5=0;sj6=0;sj7=0;sj8=0;
  261.                                                                       }                                 
  262.                                              }
  263.                                              else if(receBuf[2]==0x06)  //查詢繼電器
  264.                                              {
  265.                                                                       sendBuf[0]=0xaa;
  266.                                                                       sendBuf[1]=add;
  267.                                                                       sendBuf[2]=0x07;
  268.                                                                       //sendBuf[3]=0xfe;
  269.                                                                       sendBuf[4]=0xbb;            
  270.                                                  switch(receBuf[3])
  271.                                                            {
  272.                                                                case 0x01: if(K1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  273.                                                                          case 0x02: if(K2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  274.                                                                case 0x03: if(K3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  275.                                                                          case 0x04: if(K4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  276.                                                                case 0x05: if(K5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  277.                                                                          case 0x06: if(K6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  278.                                                                case 0x07: if(K7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  279.                                                                          case 0x08: if(K8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  280.                                                                          default:break;
  281.                                                            }
  282.                                                            senduart2();
  283.                                              }
  284.                                              else if(receBuf[2]==0x08)  //查詢輸入
  285.                                              {
  286.                                                                       sendBuf[0]=0xaa;
  287.                                                                       sendBuf[1]=add;
  288.                                                                       sendBuf[2]=0x09;
  289.                                                                       //sendBuf[3]=0xfe;
  290.                                                                       sendBuf[4]=0xbb;
  291.                                                       
  292.                                                  switch(receBuf[3])
  293.                                                            {
  294.                                                                case 0x01: if(IN0==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  295.                                                                          case 0x02: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  296.                                                                case 0x03: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  297.                                                                          case 0x04: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  298.                                                                case 0x05: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  299.                                                                          case 0x06: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  300.                                                                case 0x07: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  301.                                                                          case 0x08: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  302.                                                                          default:break;
  303.                                                            }
  304.                                                                       senduart2();
  305.                                              }                                          

  306.                                                        else if(receBuf[2]==0x11)  //第1路延時(shí)控制
  307.                                           {
  308.                                           sj1=1; s11=0;
  309.                                           s1=receBuf[3];clear_receBuf();
  310.                                              }                                                                                                                                                         
  311.                                                                                     else if(receBuf[2]==0x12)  //第2路延時(shí)控制
  312.                                           {
  313.                                           sj2=1;s22=0;
  314.                                           s2=receBuf[3];clear_receBuf();
  315.                                              }
  316.                                                                                     else if(receBuf[2]==0x13)  //第3路延時(shí)控制
  317.                                           {
  318.                                           sj3=1;s33=0;
  319.                                           s3=receBuf[3];clear_receBuf();
  320.                                              }
  321.                                                                                     else if(receBuf[2]==0x14)  //第4路延時(shí)控制
  322.                                           {
  323.                                           sj4=1;s44=0;
  324.                                           s4=receBuf[3];clear_receBuf();
  325.                                              }
  326.                          else if(receBuf[2]==0x15)  //第5路延時(shí)控制
  327.                                           {
  328.                                           sj5=1; s55=0;
  329.                                           s5=receBuf[3];clear_receBuf();
  330.                                              }
  331.                                                                                     else if(receBuf[2]==0x16)  //第6路延時(shí)控制
  332.                                           {
  333.                                           sj6=1;s66=0;
  334.                                           s2=receBuf[3];clear_receBuf();
  335.                                              }
  336.                                                                                     else if(receBuf[2]==0x17)  //第7路延時(shí)控制
  337.                                           {
  338.                                           sj7=1;s77=0;
  339.                                           s77=receBuf[3];clear_receBuf();
  340.                                              }
  341.                                                                                     else if(receBuf[2]==0x18)  //第8路延時(shí)控制
  342.                                           {
  343.                                           sj8=1;s88=0;
  344.                                           s8=receBuf[3];clear_receBuf();
  345.                                              }

  346.                                           }
  347.                                           if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  348.                                           {
  349.                                                   add=0x00;
  350.                                                                       EEPROMSectorErase(0);//擦除扇區(qū)
  351.                                                   EEPROMWriteByte(0,0);//寫(xiě)入新的地址                                            
  352.                                           }
  353.                                           clear_receBuf();
  354.                             }

  355. }
  356. /********************************************************************
  357.                             主函數(shù)
  358. *********************************************************************/
  359. void main()
  360. {
  361. //WDT_CONTR=0x35;                //啟動(dòng)看門(mén)狗
  362. initTimer();
  363. Init_Com();//串口初始化
  364. add = EEPROMReadByte(0);
  365. //add = 0X00;
  366. TR0=1;
  367. ET0=1;
  368. EA=1;

  369. while(1)
  370. {



  371.     if((IN0==0)&&(bz1==0)){delay(k);if(IN0==0){delay(k);send1();clear_receBuf();bz1=1;}}if((bz1==1)&&(IN0==1)){delay(k);bz1=0;}
  372.     if((IN1==0)&&(bz2==0)){delay(k);if(IN1==0){delay(k);send2();clear_receBuf();bz2=1;}}if((bz2==1)&&(IN1==1)){delay(k);bz2=0;}
  373.     if((IN2==0)&&(bz3==0)){delay(k);if(IN2==0){delay(k);send3();clear_receBuf();bz3=1;}}if((bz3==1)&&(IN2==1)){delay(k);bz3=0;}
  374.     if((IN3==0)&&(bz4==0)){delay(k);if(IN3==0){delay(k);send4();clear_receBuf();bz4=1;}}if((bz4==1)&&(IN3==1)){delay(k);bz4=0;}

  375.     if((IN4==0)&&(bz5==0)){delay(k);if(IN4==0){delay(k);send5();clear_receBuf();bz5=1;}}if((bz5==1)&&(IN4==1)){delay(k);bz5=0;}
  376.     if((IN5==0)&&(bz6==0)){delay(k);if(IN5==0){delay(k);send6();clear_receBuf();bz6=1;}}if((bz6==1)&&(IN5==1)){delay(k);bz6=0;}
  377.     if((IN6==0)&&(bz7==0)){delay(k);if(IN6==0){delay(k);send7();clear_receBuf();bz7=1;}}if((bz7==1)&&(IN6==1)){delay(k);bz7=0;}
  378.     if((IN7==0)&&(bz8==0)){delay(k);if(IN7==0){delay(k);send8();clear_receBuf();bz8=1;}}if((bz8==1)&&(IN7==1)){delay(k);bz8=0;}
  379. /*if(write==1)
  380. {
  381. write=0;
  382.                                           KK1 = P0;
  383.                                           KK2 = P1;
  384.                                           KK3 = P2;
  385.                                           KK4 = P3;
  386.                                           EEPROMSectorErase(0);
  387.                                           EEPROMWriteByte(0,KK1);
  388.                                           EEPROMWriteByte(1,KK2);
  389.                                           EEPROMWriteByte(2,KK3);
  390.                                           EEPROMWriteByte(3,KK4);
  391. }*/
  392. }
  393. }
  394. /********************************************************************
  395.                             定時(shí)中斷服務(wù)函數(shù)
  396. *********************************************************************/
  397. void t0(void) interrupt 1 using 0 //定時(shí)中斷服務(wù)函數(shù)
  398. {
  399.               tcnt++; //每過(guò)250ust tcnt 加一
  400.               if(tcnt==3900) //計(jì)滿400 次(1秒)時(shí)
  401.               {
  402.               tcnt=0; //重新再計(jì)
  403.               // K1=!K1;
  404.               // WDT_CONTR=0x35;  //7.2s喂狗一次
  405.               if(sj1==1){K1=0;s11++;if(s11>=s1){K1=1;s11=0;sj1=0;}}
  406.               if(sj2==1){K2=0;s22++;if(s22>=s2){K2=1;s22=0;sj2=0;}}
  407.               if(sj3==1){K3=0;s33++;if(s33>=s3){K3=1;s33=0;sj3=0;}}
  408.               if(sj4==1){K4=0;s44++;if(s44>=s4){K4=1;s44=0;sj4=0;}}
  409.               }
  410.               }
  411. /********************************************************************
  412.                               結(jié)束
  413. *********************************************************************/
復(fù)制代碼


0.png 0.png

全部資料51hei下載地址:
GYJ-0095_四路輸入輸出繼電器工控板發(fā)貨資料.rar (8.74 MB, 下載次數(shù): 126)


回復(fù)

使用道具 舉報(bào)

ID:462629 發(fā)表于 2021-3-6 23:50 | 顯示全部樓層
這是好人啊,打包成一個(gè),太謝謝了
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2021-3-8 08:46 | 顯示全部樓層
也只是仿modbus,并不是真modbus通訊協(xié)議,所以不一定很通用
回復(fù)

使用道具 舉報(bào)

ID:336378 發(fā)表于 2021-3-17 11:44 | 顯示全部樓層
    能用不??
有大神用過(guò)沒(méi)??
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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