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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7023|回復: 8
收起左側

單片機15路繼電器RS485 232通訊可編程控制板源碼等開發資料 仿modbus 國產仿PLC

  [復制鏈接]
ID:280979 發表于 2018-2-24 13:20 | 顯示全部樓層 |閱讀模式
15路繼電器可編程模塊485及232使用手冊
簡要說明:
一、 尺寸:長181mmX寬152mmX高25mm
二、 主要芯片:STC12C5A60S2(支持51單片機)
三、 工作電壓:直流12伏(另有24V繼電器)
四、串口下載程序
五、輸出供電采用延時接通電路
       功能:當輸出接有被控制設備,避免單片機初次上電(或下載程序)時,輸出設備誤動作。此功能在實際應用中起到很大作用
六、 特點:
             1、具有電源指示。
             2、15路輸入光電隔離引入信號。
             3、15路輸出光電隔離輸出控制繼電器。
             4、標準的11.0592M晶振。(便于設置串口波特率)
             5、具有上電復位和手動復位。
             6、標準雙獨立通信功能,一個RS485另外一個RS232。
             7、帶有掉電存儲功能,該單片機內部集成。
             8、輸入15路具有LED指示。
             9、輸出15路具有LED指示。
             10、15路12V繼電器控制,控制設備。
             11、可控制交流220V/10A一下設備。
             12、具有雙通信功能(可以上位機控制)。
             13、單片機無加密,可插拔更換,帶有程序下載口,可隨意更改程序。
使用說明:
【標注說明】
接線圖
應用舉例
可以作為輸入設備的產品

可作為輸出控制的設備
原理圖
由于原理圖比較大,購買后提供PDF格式的。
PCB
上位機控制界面



通過串口1或2與上位機通訊可查詢輸入輸出狀態單片機源程序:
/********************************************************************
                            匯誠科技
實現功能:串口控制繼電器程序
使用芯片:AT89S52
晶振:11.0592MHZ
波特率:9600
編譯環境:Keil
作者:zhangxinchunleo
【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!     
*********************************************************************/
/********************************************************************
單片機與PC機采用9針串口,MAX232通訊,波特率默認為9600.

單片機接收PC機發送的十六進制碼表如下:

01、全開:PC發送'I';
02、全關:PC發送'i';

03、第一路開:PC發送'A';
04、第二路開:PC發送'B';
05、第三路開:PC發送'C';
06、第四路開:PC發送'D';
07、第五路開:PC發送'E';
08、第六路開:PC發送'F';
09、第七路開:PC發送'G';
10、第八路開:PC發送'H';
11、第九路開:PC發送'J';
12、第十路開:PC發送'K';
13、第十一路開:PC發送'L';
14、第十二路開:PC發送'M';
15、第十三路開:PC發送'N';
16、第十四路開:PC發送'O';
17、第十五路開:PC發送'P';



18、第一路關:PC發送'a';
19、第二路關:PC發送'b';
20、第三路關:PC發送'c';
21、第四路關:PC發送'd';
22、第五路關:PC發送'e';
23、第六路關:PC發送'f';
24、第七路關:PC發送'g';
25、第八路關:PC發送'h';
26、第九路關:PC發送'j';
27、第十路關:PC發送'k';
28、第十一路關:PC發送'l';
29、第十二路關:PC發送'm';
30、第十三路關:PC發送'n';
31、第十四路關:PC發送'o';
32、第十五路關:PC發送'p';


查詢輸入狀態:

查詢第1路輸入輸入‘1’ 如果有輸入返回‘1’沒有輸入返回‘6’
查詢第2路輸入輸入‘2’ 如果有輸入返回‘2’沒有輸入返回‘7’
查詢第3路輸入輸入‘3’ 如果有輸入返回‘3’沒有輸入返回‘8’
查詢第4路輸入輸入‘4’ 如果有輸入返回‘4’沒有輸入返回‘9’
查詢第5路輸入輸入‘5’ 如果有輸入返回‘5’沒有輸入返回‘0’
查詢第6路輸入輸入‘Q’ 如果有輸入返回‘Q’沒有輸入返回‘q’
查詢第7路輸入輸入‘R’ 如果有輸入返回‘R’沒有輸入返回‘r’
查詢第8路輸入輸入‘S’ 如果有輸入返回‘S’沒有輸入返回‘s’
查詢第9路輸入輸入‘T’ 如果有輸入返回‘T’沒有輸入返回‘t’
查詢第10路輸入輸入‘U’ 如果有輸入返回‘U’沒有輸入返回‘u’
查詢第11路輸入輸入‘V’ 如果有輸入返回‘V’沒有輸入返回‘v’
查詢第12路輸入輸入‘W’ 如果有輸入返回‘W’沒有輸入返回‘w’
查詢第13路輸入輸入‘X’ 如果有輸入返回‘X’沒有輸入返回‘x’
查詢第14路輸入輸入‘Y’ 如果有輸入返回‘Y’沒有輸入返回‘y’
查詢第15路輸入輸入‘Z’ 如果有輸入返回‘Z’沒有輸入返回‘z’

*********************************************************************/
源碼可以從51黑附件下載:
0.png


2.【仿modbus程序 232和485通信 輸入查詢方式測試程序

協議說明:


通訊說明:
  波特率
  
  9600,8,N,1
  
  通訊方式
  
  485
  
  數據格式
  
  起始位+地址位+功能位+數據位+結束位
  

功能碼說明:
  功能碼
  
  功能碼作用
  
  00
  
  將地址清零 默認為“00”
  
  01
  
  設置板子地址
  
  02
  
  打開某路輸出
  
            03
  
  關閉某路輸出
  
            04
  
  查詢某路輸出狀態  
  
            05
  
  返回輸出狀態:‘’00“ 標示沒有輸出“FF”標示有輸出
  
            06
  
  查詢某路輸入狀態
  
            07
  
  返回輸入狀態:‘’00“ 標示沒有輸入“FF”標示有輸入
  
指令詳細說明及例子:
1.功能碼00(將地址清零)
  上位機發送
  
  AA
  
       00
  
        00
  
        00
  
        BB
  
   
  
  起始位
  
  地址00
  
  地址清零
  
  清零
  
    結束位
  
  控制器返回
  
  AA
  
  00
  
  00
  
  00
  
  BB
  
   
  
  起始位
  
  地址00
  
  00
  
  00
  
    結束位
  




例:將地址清零(任何狀態下都可以使用)
上位機發送: AA  00 00 00 BB
控制器返回: AA  00 00 00 BB        //表示地址清零完成 地址為“00”

指令詳細說明及例子:
2.功能碼01(改變地址)
  上位機發送
  
  AA
  
       00~FF
  
        01
  
         00~FF
  
        BB
  
   
  
  起始位
  
  地址碼
  
  功能碼
  
  設為的地址
  
    結束位
  
  控制器返回
  
  AA
  
       00~FF
  
  01
  
       00~FF
  
  BB
  
   
  
  起始位
  
  設置的地址
  
  功能碼
  
  設置的地址
  
    結束位
  

例:當前地址為 “00”時,將地址改為“03”
上位機發送: AA  00 01 03 BB
控制器返回: AA  03 01 03 BB        //表示地址設置成功
     當前地址為 “03”時,將地址改為“05”

上位機發送:  AA  0301 05 BB

控制器返回: AA  05 01 05 BB         //表示地址設置成功
3.功能碼02(打開輸出)
  上位機發送
  
  AA
  
       01
  
        02
  
        01
  
        BB
  
   
  
  起始位
  
  地址01時
  
  打開輸出
  
  第一個輸出
  
    結束位
  
  此命令無返回值
  




例:打開地址01中的第5路輸出
上位機發送: AA  01 02 05 BB
           打開地址03中的第2路輸出

上位機發送:  AA  0302 02 BB


4.功能碼03(關閉輸出)
  上位機發送
  
  AA
  
  01
  
        03
  
        01
  
        BB
  
   
  
  起始位
  
  地址01時
  
  關閉輸出
  
  第一個輸出
  
    結束位
  

例:    關閉地址02中的第3路輸出
上位機發送: AA  02 03 03 BB
           關閉地址05中的第2路繼電器

上位機發送:  AA  0503 02 BB


5.功能碼04(查詢輸出狀態)
  上位機發送
  
  
AA
  
  
01
  
  
04
  
  
01
  
  
BB
  
   
  
  起始位
  
  地址01時
  
  查詢碼
  
  第一個輸出
  
    結束位
  
  
控制器返回
  
  
AA
  
  
01
  
  
05
  
     FF或00
  
  
BB
  
   
  
  起始位
  
  地址01
  
  返回碼
  
  狀態碼
  
    結束位
  

例:    當前地址為 “00”時,將查詢第3路輸出狀態
上位機發送: AA  00 04 03 BB
輸出為打開狀態時:控制器返回:AA  00 05 FF BB   //表示輸出狀態為打開
輸出為關閉狀態時:控制器返回:AA  00 05 00 BB   //表示輸出狀態為關閉
          當前地址為 “01”時,將查詢第4路輸出狀態
上位機發送: AA  01 04 04 BB
輸出為打開狀態時:控制器返回:AA  01 05 FF BB   //表示輸出狀態為打開
輸出為關閉狀態時:控制器返回:AA  01 05 00 BB   //表示輸出狀態為打開

5.功能碼06(查詢輸入狀態)
  上位機發送
  
  
AA
  
  
01
  
  
06
  
  
01
  
  
BB
  
   
  
  起始位
  
  地址01時
  
  查詢碼
  
  第一個輸入
  
    結束位
  
  
控制器返回
  
  
AA
  
  
01
  
  
07
  
     FF或00
  
  
BB
  
   
  
  起始位
  
  地址01
  
  返回碼
  
  狀態碼
  
    結束位
  

例:    當前地址為 “00”時,將查詢第3路輸入狀態
上位機發送: AA  00 06 03 BB
輸入為輸入狀態時:   控制器返回: AA  00 06 FF BB   //表示輸入狀態為接通
輸入為非輸入狀態時:控制器返回:AA  00 07 00 BB   //表示輸入狀態為斷開
          當前地址為 “01”時,將查詢第4路輸入狀態
上位機發送: AA  01 06 04 BB
輸入為輸入狀態時:   控制器返回: AA  01 06 FF BB   //表示輸入狀態為接通
輸入為非輸入狀態時:控制器返回:AA  01 07 00 BB   //表示輸入狀態為斷開

  1. /********************************************************************
  2.                 河南鈺平電子科技有限公司
  3. 實現功能:應用程序
  4. 使用芯片:STC12C6A60S2
  5. 晶振:11.0592MHZ
  6. 波特率:9600
  7. 編譯環境:Keil 4
  8. 作者:張新春
  9. 【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!     
  10. *********************************************************************/
  11. #include "hedder\\STC12C5A60S2.h"
  12. #include"hedder\\DODI.h"
  13. #include <intrins.H>
  14. #define  uchar unsigned char
  15. #define  uint  unsigned int
  16. /*
  17. sfr IAP_DATA    = 0xC2;
  18. sfr IAP_ADDRH   = 0xC3;
  19. sfr IAP_ADDRL   = 0xC4;
  20. sfr IAP_CMD     = 0xC5;
  21. sfr IAP_TRIG    = 0xC6;
  22. sfr IAP_CONTR   = 0xC7;
  23. sfr P4   = 0xC0;
  24. */
  25. //定義Flash 操作等待時間及允許IAP/ISP/EEPROM 操作的常數
  26. //#define ENABLE_ISP 0x80 //系統工作時鐘<30MHz 時,對IAP_CONTR 寄存器設置此值
  27. //#define ENABLE_ISP 0x81 //系統工作時鐘<24MHz 時,對IAP_CONTR 寄存器設置此值
  28. #define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
  29. //#define ENABLE_ISP 0x83 //系統工作時鐘<12MHz 時,對IAP_CONTR 寄存器設置此值
  30. //#define ENABLE_ISP 0x84 //系統工作時鐘<6MHz 時,對IAP_CONTR 寄存器設置此值
  31. //#define ENABLE_ISP 0x85 //系統工作時鐘<3MHz 時,對IAP_CONTR 寄存器設置此值
  32. //#define ENABLE_ISP 0x86 //系統工作時鐘<2MHz 時,對IAP_CONTR 寄存器設置此值
  33. //#define ENABLE_ISP 0x87 //系統工作時鐘<1MHz 時,對IAP_CONTR 寄存器設置此值

  34. uchar dat;
  35. uchar add;
  36. uchar t,r,ii;
  37. bit flag_zx=0;
  38. uchar sendBuf[10];//發送緩沖區
  39. uchar receBuf[10];//接收緩沖區
  40. /********************************************************************
  41.                             函數聲明
  42. *********************************************************************/
  43. union union_temp16
  44. {
  45. uint un_temp16;
  46. uchar  un_temp8[2];
  47. }
  48. my_unTemp16;

  49. uchar Byte_Read(uint add);              //讀一字節,調用前需打開IAP 功能
  50. void Byte_Program(uint add, uchar ch);  //字節編程,調用前需打開IAP 功能
  51. void Sector_Erase(uint add);            //擦除扇區
  52. void IAP_Disable();
  53. /********************************************************************
  54.                                 串口初始化
  55. *********************************************************************/
  56. void init ()
  57. {
  58.    //串口2波特率
  59.         TMOD = 0x20;                                  //定時器1產生波特率
  60.         SCON = 0x50;                                 //方式1,8位數據,波特率可變
  61.         TH1=0xfd;
  62.         TL1 = 0xfd;                         //波特率 9600

  63.   //串口1波特率        
  64.         S2CON = 0x50;                                 //方式1,八位數據,可變波特率
  65.         BRT=0XFD;                                  //設置波特率9600
  66.         TR1=1;                                          //啟動定時器產生串口2波特率        
  67.         AUXR=0x10;                                 //啟動串口1波特率發生器
  68.         IP=0x00;                                 //優先級默認
  69.         EA=1;                                  //開總中斷
  70.         ES=1;                                         //開串口1中斷
  71.         IE2=0x01;                                 //開串口2中斷
  72. }


  73. /****************發送函數*********************/
  74. void senduart2()
  75. {           
  76. //RS485_DIR=1;
  77. SBUF=sendBuf[0];while(!TI);TI=0;
  78. SBUF=sendBuf[1];while(!TI);TI=0;
  79. SBUF=sendBuf[2];while(!TI);TI=0;
  80. SBUF=sendBuf[3];while(!TI);TI=0;
  81. SBUF=sendBuf[4];while(!TI);TI=0;
  82. }
  83. /****************發送函數*********************/
  84. void senduart1()
  85. {           
  86. //RS485_DIR=1;
  87. S2BUF=sendBuf[0];while(!(S2CON & 0x02));S2CON &= ~0x02;
  88. S2BUF=sendBuf[1];while(!(S2CON & 0x02));S2CON &= ~0x02;
  89. S2BUF=sendBuf[2];while(!(S2CON & 0x02));S2CON &= ~0x02;
  90. S2BUF=sendBuf[3];while(!(S2CON & 0x02));S2CON &= ~0x02;
  91. S2BUF=sendBuf[4];while(!(S2CON & 0x02));S2CON &= ~0x02;
  92. //RS485_DIR=0;
  93. }

  94. /*****************清空發送緩沖區*************************/
  95. void clear_receBuf()
  96. {
  97.     uchar i;
  98.         for(i=0;i<5;i++)
  99.         {
  100.             receBuf[i]=0;
  101.         }
  102. }

  103. /********************************************************************
  104.                                     主函數
  105. *********************************************************************/
  106. void main()
  107. {
  108.    uchar k=10;
  109.     //配置P4.4為IO口
  110.    P4SW|=0x70;                  
  111.    P4M0&=0x80;                  
  112.    P4M1&=0x80;
  113.    add = Byte_Read(0);;
  114.    init();   //串口初始化
  115. //q   RS485_DIR=0;
  116.    while(1)
  117.    {

  118. }        
  119. }
  120. /********************************************************************
  121.                          串口一 發送接收中斷函數
  122. *********************************************************************/
  123. void uart_isr()  interrupt 4
  124. {
  125. if(RI)  //如果有接收
  126.            {
  127.              RI=0; //接收標志清零
  128.              receBuf[r++&0x0F]=SBUF;     //把接受的數據存儲到BUT數組中
  129.                  if(receBuf[0]!=0xaa){r=0;}
  130.                  if(r>=5)
  131.                  {        r=0;

  132.                     flag_zx=1;
  133.                  }
  134.            }
  135.            if(flag_zx==1)
  136.            {                     

  137.                 flag_zx=0;
  138.                
  139.                     //0         1       2       3        4               
  140.                         //起始位   地址位  功能位   數據位  結束位
  141.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果開始位和結束位,還有地址都正確,進行下一步判斷
  142.                         {
  143.                             if(receBuf[2]==0x01)  //修改板子地址
  144.                            {
  145.                                 add=receBuf[3];
  146.                         Sector_Erase(0);           //擦除整個扇區
  147.                     Byte_Program(0,add);//將 數據 寫入 EEPROM
  148.                                 sendBuf[0]=0xaa;
  149.                                 sendBuf[1]=add;
  150.                                 sendBuf[2]=0x01;
  151.                                 sendBuf[3]=add;
  152.                                 sendBuf[4]=0xbb;
  153.                                 senduart2();
  154.                            }
  155.                            else if(receBuf[2]==0x02)  //打開單路輸出
  156.                            {
  157.                                        switch(receBuf[3])
  158.                                         {
  159.                                            case 0x01:OUT1=0;break;
  160.                                            case 0x02:OUT2=0;break;
  161.                                            case 0x03:OUT3=0;break;
  162.                                            case 0x04:OUT4=0;break;
  163.                                            case 0x05:OUT5=0;break;
  164.                                            case 0x06:OUT6=0;break;
  165.                                            case 0x07:OUT7=0;break;
  166.                                            case 0x08:OUT8=0;break;
  167.                                            case 0x09:OUT9=0;break;
  168.                                            case 0x010:OUT10=0;break;
  169.                                            case 0x011:OUT11=0;break;
  170.                                            case 0x012:OUT12=0;break;
  171.                                            case 0x013:OUT13=0;break;
  172.                                            case 0x014:OUT14=0;break;
  173.                                            case 0x015:OUT15=0;break;
  174.                                         default:break;
  175.                                         }
  176.                            }
  177.                            else if(receBuf[2]==0x03)  //關閉單路輸出
  178.                            {
  179.                                        switch(receBuf[3])
  180.                                         {
  181.                                            case 0x01:OUT1=1;break;
  182.                                            case 0x02:OUT2=1;break;
  183.                                            case 0x03:OUT3=1;break;
  184.                                            case 0x04:OUT4=1;break;
  185.                                            case 0x05:OUT5=1;break;
  186.                                            case 0x06:OUT6=1;break;
  187.                                            case 0x07:OUT7=1;break;
  188.                                            case 0x08:OUT8=1;break;
  189.                                            case 0x09:OUT9=1;break;
  190.                                            case 0x010:OUT10=1;break;
  191.                                            case 0x011:OUT11=1;break;
  192.                                            case 0x012:OUT12=1;break;
  193.                                            case 0x013:OUT13=1;break;
  194.                                            case 0x014:OUT14=1;break;
  195.                                            case 0x015:OUT15=1;break;
  196.                                         default:break;
  197.                                         }                       
  198.                            }
  199.                            else if(receBuf[2]==0x04)//查詢輸出狀態
  200.                            {
  201.                                        switch(receBuf[3])
  202.                                    {
  203.                                        case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  204.                                            case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  205.                                        case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  206.                                            case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  207.                                        case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  208.                                            case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  209.                                        case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  210.                                            case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  211.                                        case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  212.                                            case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  213.                                        case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  214.                                            case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  215.                                        case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  216.                                            case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  217.                                        case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  218.                                            default:break;
  219.                                    }
  220.                                            sendBuf[0]=0xaa;
  221.                                          sendBuf[1]=add;
  222.                                         sendBuf[2]=0x05;
  223.                                         sendBuf[4]=0xbb;  
  224.                                         senduart2();
  225.       
  226.                            }
  227.                            else if(receBuf[2]==0x06)//查詢輸入狀態
  228.                            {
  229.                                        switch(receBuf[3])
  230.                                    {
  231.                                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  232.                                            case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  233.                                        case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  234.                                            case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  235.                                        case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  236.                                            case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  237.                                        case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  238.                                            case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  239.                                        case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  240.                                            case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  241.                                        case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  242.                                            case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  243.                                        case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  244.                                            case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  245.                                        case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  246.                                            default:break;
  247.                                    }
  248.                                     sendBuf[0]=0xaa;
  249.                                          sendBuf[1]=add;
  250.                                         sendBuf[2]=0x07;
  251.                                         sendBuf[4]=0xbb;
  252.                                         senduart2();
  253.       
  254.                            }
  255.                           
  256.                         }
  257.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  258.                         {
  259.                         add=0x00;
  260.                     Sector_Erase(0);           //擦除整個扇區
  261.             Byte_Program(0, add);//將 數據 寫入 EEPROM
  262.                         sendBuf[0]=0xaa;
  263.                         sendBuf[1]=add;
  264.                         sendBuf[2]=0x00;
  265.                         sendBuf[3]=0x00;
  266.                         sendBuf[4]=0xbb;
  267.                         senduart2();
  268.                         }
  269.                         clear_receBuf();

  270. } }
  271. /********************************************************************
  272.                          串口二    發送接收中斷函數
  273. *********************************************************************/
  274. void uart2_isr()  interrupt 8
  275. {
  276.    if( S2CON & 0x01 )
  277.          {
  278.              S2CON &= ~0x01;
  279.              receBuf[r++&0x0F]=S2BUF;     //把接受的數據存儲到BUT數組中
  280.                  if(receBuf[0]!=0xaa){r=0;}
  281.                  if(r>=5)
  282.                  {        r=0;

  283.                     flag_zx=1;
  284.                  }
  285.            }
  286.            if(flag_zx==1)
  287.            {                     

  288.                 flag_zx=0;
  289.                
  290.                     //0         1       2       3        4               
  291.                         //起始位   地址位  功能位   數據位  結束位
  292.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果開始位和結束位,還有地址都正確,進行下一步判斷
  293.                         {
  294.                             if(receBuf[2]==0x01)  //修改板子地址
  295.                            {
  296.                                 add=receBuf[3];
  297.                         Sector_Erase(0);           //擦除整個扇區
  298.                     Byte_Program(0,add);//將 數據 寫入 EEPROM
  299.                                 sendBuf[0]=0xaa;
  300.                                 sendBuf[1]=add;
  301.                                 sendBuf[2]=0x01;
  302.                                 sendBuf[3]=add;
  303.                                 sendBuf[4]=0xbb;
  304.                                 senduart1();
  305.                            }
  306.                            else if(receBuf[2]==0x02)  //打開單路輸出
  307.                            {
  308.                                        switch(receBuf[3])
  309.                                         {
  310.                                            case 0x01:OUT1=0;break;
  311.                                            case 0x02:OUT2=0;break;
  312.                                            case 0x03:OUT3=0;break;
  313.                                            case 0x04:OUT4=0;break;
  314.                                            case 0x05:OUT5=0;break;
  315.                                            case 0x06:OUT6=0;break;
  316.                                            case 0x07:OUT7=0;break;
  317.                                            case 0x08:OUT8=0;break;
  318.                                            case 0x09:OUT9=0;break;
  319.                                            case 0x010:OUT10=0;break;
  320.                                            case 0x011:OUT11=0;break;
  321.                                            case 0x012:OUT12=0;break;
  322.                                            case 0x013:OUT13=0;break;
  323.                                            case 0x014:OUT14=0;break;
  324.                                            case 0x015:OUT15=0;break;
  325.                                         default:break;
  326.                                         }
  327.                            }
  328.                            else if(receBuf[2]==0x03)  //關閉單路輸出
  329.                            {
  330.                                        switch(receBuf[3])
  331.                                         {
  332.                                            case 0x01:OUT1=1;break;
  333.                                            case 0x02:OUT2=1;break;
  334.                                            case 0x03:OUT3=1;break;
  335.                                            case 0x04:OUT4=1;break;
  336.                                            case 0x05:OUT5=1;break;
  337.                                            case 0x06:OUT6=1;break;
  338.                                            case 0x07:OUT7=1;break;
  339.                                            case 0x08:OUT8=1;break;
  340.                                            case 0x09:OUT9=1;break;
  341.                                            case 0x010:OUT10=1;break;
  342.                                            case 0x011:OUT11=1;break;
  343.                                            case 0x012:OUT12=1;break;
  344.                                            case 0x013:OUT13=1;break;
  345.                                            case 0x014:OUT14=1;break;
  346.                                            case 0x015:OUT15=1;break;
  347.                                         default:break;
  348.                                         }                       
  349.                            }
  350.                            else if(receBuf[2]==0x04)//查詢輸出狀態
  351.                            {
  352.                                        switch(receBuf[3])
  353.                                    {
  354.                                        case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  355.                                            case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  356.                                        case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  357.                                            case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  358.                                        case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  359.                                            case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  360.                                        case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  361.                                            case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  362.                                        case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  363.                                            case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  364.                                        case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  365.                                            case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  366.                                        case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  367.                                            case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  368.                                        case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  369.                                            default:break;
  370.                                    }
  371.                                            sendBuf[0]=0xaa;
  372.                                          sendBuf[1]=add;
  373.                                         sendBuf[2]=0x05;
  374.                                         sendBuf[4]=0xbb;  
  375.                                         senduart1();
  376.       
  377.                            }
  378.                            else if(receBuf[2]==0x06)//查詢輸入狀態
  379.                            {
  380.                                        switch(receBuf[3])
  381.                                    {
  382.                                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  383.                                            case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  384.                                        case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  385.                                            case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  386.                                        case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  387.                                            case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  388.                                        case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  389.                                            case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  390.                                        case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  391.                                            case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  392.                                        case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  393.                                            case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  394.                                        case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  395.                                            case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  396.                                        case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  397.                                            default:break;
  398.                                    }
  399.                                     sendBuf[0]=0xaa;
  400.                                          sendBuf[1]=add;
  401.                                         sendBuf[2]=0x07;
  402.                                         sendBuf[4]=0xbb;
  403.                                         senduart1();
  404.       
  405.                            }
  406.                           
  407.                         }
  408.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  409.                         {
  410.                         add=0x00;
  411.                     Sector_Erase(0);           //擦除整個扇區
  412.             Byte_Program(0, add);//將 數據 寫入 EEPROM
  413.                         sendBuf[0]=0xaa;
  414.                         sendBuf[1]=add;
  415.                         sendBuf[2]=0x00;
  416.                         sendBuf[3]=0x00;
  417.                         sendBuf[4]=0xbb;
  418.                         senduart1();
  419.                         }
  420.                         clear_receBuf();

  421. }


  422. }
  423. /********************************************************************
  424.                             結束主函數
  425. *********************************************************************/
  426. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
  427. uchar Byte_Read(uint add)
  428. {
  429.     IAP_DATA = 0x00;
  430.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  431.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

  432.     my_unTemp16.un_temp16 = add;
  433.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  434.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  435.     //EA = 0;
  436.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  437.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  438.     _nop_();
  439.     //EA = 1;
  440.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  441.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  442.     return (IAP_DATA);
  443. }

  444. //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
  445. void Byte_Program(uint add, uchar ch)
  446. {
  447.     IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設置Flash 操作等待時間
  448.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令

  449.     my_unTemp16.un_temp16 = add;
  450.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  451.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  452.     IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
  453.     //EA = 0;
  454.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  455.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  456.     _nop_();
  457.     //EA = 1;
  458.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  459.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  460. }

  461. //擦除扇區, 入口:DPTR = 扇區地址
  462. void Sector_Erase(uint add)
  463. {
  464.     IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
  465.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

  466.     my_unTemp16.un_temp16 = add;
  467.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
  468.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

  469.     //EA = 0;
  470.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
  471.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被觸發起動
  472.     _nop_();
  473.     //EA = 1;
  474.     IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  475.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  476. }

  477. void IAP_Disable()
  478. {
  479.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  480.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  481.     IAP_CONTR = 0;      //關閉IAP 功能
  482.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  483.     IAP_TRIG  = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
  484.     IAP_ADDRH = 0;
  485.     IAP_ADDRL = 0;
  486. }

  487. /********************************************************************
  488.                               結束
  489. *********************************************************************/
復制代碼




【圖片預覽】

【下載說明】
第一步:準備工控板、電源、串口通訊線、電腦
第二步:串口線連接工控板和電腦。
第三步:打開下載軟件。(STC_ISP_V479
步:下載設置。(查看串口號)
步:選擇單片機型號,并選擇對應的串口號。
注意:下載前一定要先安裝串口線驅動程序。
第六步:調入要下載的文件(擴展名為:HEX的文件)
第七步:點擊Download/下載等待軟件提示給工控板供電。
第八步:給工控板供電并等待下載完成。
第九步:下載進行中。。。。。。等待下載完成!
第十步:下載完成。即可進行測試。



全部資料51hei下載地址(包含源碼 原理圖等詳細資料):

15路繼電器可編程模塊485及232產品使用手冊設計資料.pdf

2.46 MB, 下載次數: 85, 下載積分: 黑幣 -5

GYJ-0065_15路繼電器可編程模塊485及232產品使用手冊.doc

9.94 MB, 下載次數: 101, 下載積分: 黑幣 -5

GYJ-0065_15路繼電器可編程模塊485及232原理圖及PCB圖.pdf

1.66 MB, 下載次數: 103, 下載積分: 黑幣 -5

仿modbus程序 232和485通信 輸入查詢方式.rar

60.55 KB, 下載次數: 107, 下載積分: 黑幣 -5

通過串口1或2與上位機通訊可查詢輸入輸出狀態.rar

101.84 KB, 下載次數: 100, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:84765 發表于 2018-2-26 16:55 | 顯示全部樓層
通過串口1或2與上位機通訊可查詢輸入輸出狀態.rar  這都下載不了
回復

使用道具 舉報

ID:47652 發表于 2018-2-27 15:22 | 顯示全部樓層
很好的資料,多謝分享
回復

使用道具 舉報

ID:164172 發表于 2018-4-7 10:11 | 顯示全部樓層
沒有模擬量輸入  差評
回復

使用道具 舉報

ID:352811 發表于 2018-6-16 22:06 | 顯示全部樓層

很好的資料,多謝分享
回復

使用道具 舉報

ID:352984 發表于 2018-6-17 09:27 來自觸屏版 | 顯示全部樓層
要是能支持RTU協議就可以做SCADA了
回復

使用道具 舉報

ID:356451 發表于 2018-6-22 09:19 | 顯示全部樓層
剛剛同一個鏈接點了兩下,就浪費了5黑幣,怎么沒有預防設置呢
回復

使用道具 舉報

ID:462629 發表于 2019-5-2 11:03 | 顯示全部樓層
這個好用不,可以PLC編程的嗎
回復

使用道具 舉報

ID:462629 發表于 2019-5-2 11:10 | 顯示全部樓層
最后只好全部下了,還是沒有原理圖的一些元件參數
還扣了那么多分,這也太不厚道了
樓主是不是故意騙分的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩精品一区二区天天拍 | 国产农村妇女精品一二区 | 日本精品免费 | 国产成人福利在线观看 | 欧美一区二区黄 | 欧美一区二区三区在线视频 | 国产精品a久久久久 | 69精品久久久久久 | 天天躁日日躁aaaa视频 | 亚洲精品一区二区三区 | 一区二区三区高清在线观看 | 国产剧情久久 | 国产日韩欧美中文 | 久久免费看 | www.一区二区 | av中文字幕在线观看 | 亚洲精品一区av在线播放 | 日本在线看片 | 日韩精品免费 | 国产精品成人一区 | 99久久成人| 一级免费视频 | 欧美午夜在线 | 成人国产精品久久久 | 日韩高清一区 | 你懂的国产 | 免费观看一级特黄欧美大片 | 99精品一级欧美片免费播放 | 美日韩精品| 亚洲狠狠 | 久久精品视频在线免费观看 | 女女百合av大片一区二区三区九县 | 日韩免 | 亚洲热在线视频 | 欧美日韩中文在线 | 亚洲91精品| 一区二区三区欧美大片 | 欧美freesex黑人又粗又大 | 日韩在线欧美 | 成年人在线观看视频 | 日韩精品免费一区二区在线观看 |