找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

GYJ-0099_458通訊控制工控板(八路控制)單片機源碼與資料分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:280979 發(fā)表于 2018-3-18 01:05 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
GYJ-0099_458通訊控制工控板八路控制產(chǎn)品使用說明書
【簡要說明】
一、尺寸:長176mmX寬72mmX高20mm
二、主要芯片:單片機STC12C2052AD 繼電器 光耦
三、工作電壓:有直流12V及24V可選。
四、特點:
電路結構簡單,穩(wěn)定可靠,采用最新款STC單片機,運行速度快。
1、具有8繼電器吸合指示燈,電源指示燈。
2、板子功耗小于5W
3、額定切換電流10A以內(nèi),切換電壓250V以內(nèi)
4、單路最大切換功率500W 額定功率300W
5、繼電器壽命1000000次以上。
6、電器絕緣電阻100M
7、觸電耐壓1000V
8、繼電器最大吸合時間15mS毫秒
9、繼電器最大釋放時間5mS毫秒
10、工作溫度-40度至+70度
11、工作濕度40%~80%RH
12、8路光電隔離輸出
13、485通信控制,可以多塊聯(lián)機。
14、8路輸出開關量輸出(即:干接點輸出)
15、具有TTL(UART)通訊和RS485通訊兩種模式可選。
16、資料開源,客戶可以自己編程
17、可以選擇使用內(nèi)部EEPROM 作為存儲單元
18、電路具有,防反接保護、過流保護、續(xù)流保護等
19、單片機可以自行更換,可以選擇替換型的STC系列單片機
20、我們提供電路相關的,原理圖、例程、開發(fā)環(huán)境、下載軟件等相關資料
適用場合:工業(yè)控制、產(chǎn)品開發(fā)、項目設計,自動化改造等
【標注說明】
接線說明
  
輸出控制設備

輸出舉例說明(開關量輸出、干接點輸出)
下載口說明也可以UART

485通信說明
默認發(fā)貨程序協(xié)議提供源代碼客戶可以自己更改。
485通訊控制板通訊協(xié)議
波特率 9600
通訊協(xié)議格式如下:發(fā)送十六進制
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00~FF
01~05
00~FF
BB
解釋
第一個數(shù)據(jù)
第二個數(shù)據(jù)
第三個數(shù)據(jù)
第四個數(shù)據(jù)
最后一個數(shù)據(jù)
功能1:改變板子地址
舉例:更改地址:(發(fā)貨默認地址00注意:多個板子并聯(lián)使用時需要不同地址

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
01
01
BB
解釋
開始數(shù)據(jù)
向00地址發(fā)送
改變地址
將地址改成01
數(shù)據(jù)結束
功能2:打開某個繼電器
舉例:打開第一塊板子的第一個繼電器

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
02
01
BB
解釋
開始數(shù)據(jù)
向00地址發(fā)送
打開某路功能
打開第一路
數(shù)據(jù)結束
功能3:關閉某個繼電器
舉例:關閉第二路板子的第三個繼電器

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
01
03
03
BB
解釋
開始數(shù)據(jù)
向01地址發(fā)送
關閉某路功能
關閉第三路
數(shù)據(jù)結束
功能4:打開某塊板子的所有繼電器
舉例:打開第一塊板子的全部繼電器

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
04
FF
BB
解釋
開始數(shù)據(jù)
向00地址發(fā)送
打開所有功能
打開所有繼電器
數(shù)據(jù)結束
功能5:關閉某塊板子的所有繼電器
舉例:關閉第三塊板子的全部繼電器

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
02
05
00
BB
解釋
開始數(shù)據(jù)
向02地址發(fā)送
關閉所有功能
關閉所有繼電器
數(shù)據(jù)結束
功能6:查詢繼電器狀態(tài)
舉例:查詢第一塊板子的第二路狀態(tài)

協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
06
02
BB
解釋
開始數(shù)據(jù)
向00地址發(fā)送
查詢功能
查詢第二路
數(shù)據(jù)結束
查詢返回信息分析 繼電器關閉返回值(關閉返回00)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
07
00
BB
解釋
開始數(shù)據(jù)
00地址返回
返回功能
繼電器狀態(tài)關閉
數(shù)據(jù)結束
查詢返回信息分析 繼電器打開返回值(打開返回01)
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
07
01
BB
解釋
開始數(shù)據(jù)
00地址返回
返回功能
繼電器狀態(tài)打開
數(shù)據(jù)結束
板子地址清零控制
協(xié)議
啟始位
地址位
功能位
數(shù)據(jù)位
結束位
控制
AA
00
00
00
BB
解釋
開始數(shù)據(jù)
00
地址清零

數(shù)據(jù)結束

原理圖(提供PDF格式的原理圖及PCB)更清晰
免費提供與此工控板有關的:資料、例程、原理圖
芯片資料、軟件。
尺寸圖
【圖片展示】
配套DIN外殼效果

默認發(fā)貨程序提供源代碼客戶可以自己更改。
  1. #include "main.h"
  2. #include "init.h"

  3. //#define address 0x00                    //板子地址
  4. #define ENABLE_IAP 0x83 //系統(tǒng)工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
  5. #define CMD_IDLE 0jm
  6. #define CMD_READ 1
  7. #define CMD_PROGRAM 2
  8. #define CMD_ERASE 3
  9. #define ENABLE_IAP 0x83//SYSCLK<12MH
  10. #define IAP_ADDRESS 0x0000              //存儲地址
  11. sfr IAP_DATA = 0xE2;
  12. sfr IAP_ADDRH = 0xE3;
  13. sfr IAP_ADDRL = 0xE4;
  14. sfr IAP_CMD = 0xE5;
  15. sfr IAP_TRIG = 0xE6;
  16. sfr IAP_CONTR = 0xE7;

  17. uint8 add;    //掉電保持485的地址
  18. uint8 j=0;
  19. uint8 dat=0X00;   
  20. bit flag_zx=0;

  21. uint8 sendPosi=0;     //發(fā)送緩沖區(qū)指針
  22. uint8 receCount=0;    //接收緩沖區(qū)指針
  23. uint8 sendCount=0;    //需要發(fā)送數(shù)據(jù)個數(shù)
  24. uint8 receTimeOut=0;  //通訊超時值
  25. uint8 byteCount=5;    //發(fā)送個數(shù)

  26. uint8 sendBuf[10];                //發(fā)送緩沖區(qū)
  27. uint8 receBuf[10];    //接收緩沖區(qū)
  28. /********************************************************************
  29.                             定義 ISP/IAP/EEPROM 命令
  30. *********************************************************************/

  31. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態(tài)
  32. uint8 IapReadByte(uint16 addr);//讀數(shù)據(jù)
  33. void IapProgramByte(uint16 addr, uint8 dat);//寫數(shù)據(jù)
  34. void IapEraseSector(uint16 addr);//擦除數(shù)據(jù)


  35. void delay()//延時程序
  36. {
  37.               uint8 m,n,s;
  38.               for(m=100;m>0;m--)
  39.               for(n=200;n>0;n--)
  40.               for(s=248;s>0;s--);
  41. }




  42. /****************發(fā)送函數(shù)*********************/
  43. void senduart2()
  44. {
  45.     sendPosi++;
  46.     SBUF=sendBuf[0];
  47. }
  48. /*****************清空發(fā)送緩沖區(qū)*************************/
  49. void clear_receBuf()
  50. {
  51.     uint8 i;
  52.               for(i=0;i<8;i++)
  53.               {
  54.                   receBuf[i]=0;
  55.               }
  56. }
  57. void main()
  58. {
  59.               delay();
  60.     clear_receBuf();
  61.     add= IapReadByte(0x01);//讀取存儲的值
  62.               if(add==0xff)
  63.                  add=0x00;
  64.     t0_init(1);     //1ms
  65.     ConfigUART1(9600);
  66.               TR0=1;
  67.               EA=1;

  68.                                  

  69.     while(1)
  70.               {

  71.                  if(flag_zx==1)
  72.                  {  
  73.                       flag_zx=0;
  74.                                 //0         1       2       3        4                           
  75.                                           //起始位   地址位  功能位   數(shù)據(jù)位  結束位
  76.                                           if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))                //如果開始位和結束位,還有地址都正確,進行下一步判斷
  77.                                           {
  78.                                              if(receBuf[2]==0x01)  //修改板子地址
  79.                                              {
  80.                                                   add=receBuf[3];
  81.                                                             IapEraseSector(0);  //擦除扇區(qū)
  82.                     IapProgramByte(0x01,add);//寫入新的地址                                      
  83.                                              }
  84.                                              else if(receBuf[2]==0x02)  //打開單路繼電器
  85.                                              {
  86.                                                                switch(receBuf[3])
  87.                                                                       {
  88.                                                                           case 0x01: OUT1=0; break;
  89.                                                                                     case 0x02: OUT2=0; break;
  90.                                                                                     case 0x03: OUT3=0; break;
  91.                                                                                     case 0x04: OUT4=0; break;
  92.                                                                                     case 0x05: OUT5=0; break;
  93.                                                                                     case 0x06: OUT6=0; break;
  94.                                                                                     case 0x07: OUT7=0; break;
  95.                                                                                     case 0x08: OUT8=0; break;
  96.                                                                       }
  97.                                              }
  98.                                              else if(receBuf[2]==0x03)  //關閉單路繼電器
  99.                                              {
  100.                                                                switch(receBuf[3])
  101.                                                                       {
  102.                                                                           case 0x01: OUT1=1; break;
  103.                                                                                     case 0x02: OUT2=1; break;
  104.                                                                                     case 0x03: OUT3=1; break;
  105.                                                                                     case 0x04: OUT4=1; break;
  106.                                                                                     case 0x05: OUT5=1; break;
  107.                                                                                     case 0x06: OUT6=1; break;
  108.                                                                                     case 0x07: OUT7=1; break;
  109.                                                                                     case 0x08: OUT8=1; break;
  110.                                                                       }                                 
  111.                                              }
  112.                                              else if(receBuf[2]==0x04)  //打開全部繼電器
  113.                                              {
  114.                                                   if(receBuf[3]==0xff)
  115.                                                   {
  116.                                                                           OUT1=0;
  117.                                                                                     OUT2=0;
  118.                                                                                     OUT3=0;
  119.                                                                                     OUT4=0;
  120.                                                                                     OUT5=0;
  121.                                                                                     OUT6=0;
  122.                                                                                     OUT7=0;
  123.                                                                                     OUT8=0;
  124.                                                                       }
  125.                                              }
  126.                                              else if(receBuf[2]==0x05)  //關閉全部繼電器
  127.                                              {
  128.                                                   if(receBuf[3]==0x00)
  129.                                                   {
  130.                                                                           OUT1=1;
  131.                                                                                     OUT2=1;
  132.                                                                                     OUT3=1;
  133.                                                                                     OUT4=1;
  134.                                                                                     OUT5=1;
  135.                                                                                     OUT6=1;
  136.                                                                                     OUT7=1;
  137.                                                                                     OUT8=1;
  138.                                                                       }                                 
  139.                                              }
  140.                                              else if(receBuf[2]==0x06)  //查詢繼電器
  141.                                              {
  142.                                                                       sendBuf[0]=0xaa;
  143.                                                                       sendBuf[1]=add;
  144.                                                                       sendBuf[2]=0x07;
  145.                                                                       //sendBuf[3]=0xfe;
  146.                                                                       sendBuf[4]=0xbb;
  147.                                                                       senduart2();
  148.                                                  switch(receBuf[3])
  149.                                                            {
  150.                                                                case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  151.                                                                          case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  152.                                                                          case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  153.                                                                          case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  154.                                                                          case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  155.                                                                          case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  156.                                                                          case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  157.                                                                          case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  158.                                                                          default:break;
  159.                                                            }
  160.                                              }                                          
  161.                                           }
  162.                                           if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  163.                                           {
  164.                                                   add=0x00;
  165.                                                             IapEraseSector(0);  //擦除扇區(qū)
  166.                     IapProgramByte(0x01,0x00);//寫入新的地址                                                         
  167.                                           }
  168.                                           clear_receBuf();
  169.                             }
  170.               }
  171. }


  172. /**********************************************************
  173. 放在主函數(shù),定時0溢出中斷函數(shù),
  174. *********************/
  175. void t0(void) interrupt 1 using 0 //定時中斷服務函數(shù)
  176. {
  177.                 TH0=T0RH;
  178.               TL0=T0RL;
  179.               if(receTimeOut>0)                 
  180.               {
  181.                     receTimeOut--;
  182.                               if((receTimeOut==0)&&(receCount>0))    //如果10ms接收不到數(shù)據(jù),把數(shù)據(jù)指針清零,重新更新緩沖區(qū)
  183.                               {
  184.                                              receCount=0;                      //接收緩沖區(qū)指針
  185.                               }
  186.               }
  187. }
  188. /********************* 串口1中斷服務函數(shù) ********************************/
  189. void InterruptUART() interrupt 4
  190. {
  191.               if(TI)
  192.               {
  193.                             TI = 0;
  194.                             if(sendPosi<byteCount)
  195.         {
  196.                      SBUF=sendBuf[sendPosi];                           
  197.                      sendPosi++;
  198.                   }
  199.                   else
  200.                      sendPosi=0;
  201.                    }
  202.               else if(RI)
  203.               {
  204.                             RI = 0;
  205.                             receTimeOut = 10;    //通訊超時值
  206.                             receBuf[receCount] = SBUF;
  207.                             receCount++;          //接收地址偏移寄存器加1
  208.                             if(receCount>4)
  209.                               flag_zx=1;
  210.                             receCount &= 0x0f;    //最多一次只能接收16個字節(jié)
  211.               }
  212. }

  213. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機 在 一 安全 狀態(tài)
  214.     IAP_CONTR = 0;                 //
  215.               IAP_CMD = 0;                 //
  216.               IAP_TRIG = 0;                 //
  217.               IAP_ADDRH = 0x80;  //
  218.               IAP_ADDRL = 0;                 //
  219. }
  220. uint8 IapReadByte(uint16 addr){//讀數(shù)據(jù)
  221.    uint8 dat;
  222.    IAP_CONTR = ENABLE_IAP;
  223.    IAP_CMD = CMD_READ;
  224.    IAP_ADDRL = addr;
  225.    IAP_ADDRH = addr >> 8;
  226.    IAP_TRIG = 0x46;
  227.    IAP_TRIG = 0xb9;
  228.    _nop_();
  229.    dat = IAP_DATA;
  230.    IapIdle();
  231.    return dat;
  232. }
  233. void IapProgramByte(uint16 addr, uint8 dat){//寫數(shù)據(jù)
  234.    IAP_CONTR = ENABLE_IAP;
  235.    IAP_CMD = CMD_PROGRAM;
  236.    IAP_ADDRL = addr;
  237.    IAP_ADDRH = addr >> 8;
  238.    IAP_DATA = dat;
  239.    IAP_TRIG = 0x46;
  240.    IAP_TRIG = 0xb9;
  241.    _nop_();
  242.    IapIdle();
  243. }
  244. void IapEraseSector(uint16 addr){//擦除數(shù)據(jù)
  245.    IAP_CONTR = ENABLE_IAP;
  246.    IAP_CMD = CMD_ERASE;
  247.    IAP_ADDRL = addr;
  248.    IAP_ADDRH = addr >> 8;
  249.    IAP_TRIG = 0x46;
  250.    IAP_TRIG = 0xb9;
  251.    _nop_();
  252.    IapIdle();
  253. }
復制代碼


全部資料51hei下載地址:
GYJ-0099_458通訊控制工控板八路控制發(fā)貨資料.rar (9.45 MB, 下載次數(shù): 28)


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

使用道具 舉報

板凳
ID:140085 發(fā)表于 2018-11-9 15:26 | 只看該作者
波特率可以修改嗎,只能9600?
回復

使用道具 舉報

沙發(fā)
ID:338810 發(fā)表于 2018-10-12 13:28 | 只看該作者
黑幣太貴了,希望有用
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表