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

標題: 組態(tài)王與單片機通訊上位機及下位機源碼 附測試數(shù)據(jù)與協(xié)議 [打印本頁]

作者: 商務(wù)旗艦    時間: 2018-9-14 10:01
標題: 組態(tài)王與單片機通訊上位機及下位機源碼 附測試數(shù)據(jù)與協(xié)議
組態(tài)王與單片機通訊親測.



/*********************字節(jié)讀寫****************************************/
組態(tài)王向地址是1的單片機讀取1byte數(shù)據(jù)組態(tài)王選擇效驗沒變化都是一樣的數(shù)據(jù)
40 30 31 41 30 30 30 30 30 30 31 37 31 0D--寄存器選擇X0---BYTE---160-----14個字節(jié)07 D0 31 30 31 30 31 45 31 0D
40 30 31 41 30 30 30 30 30 30 31 37 31 0D
40 30 31 41 32 30 30 30 30 30 31 37 33 0D----162----打包與不打包除了格式和效驗位的數(shù)值不一樣了,好像沒啥區(qū)別,呵呵!!

40 30 31 41 30 30 30 36 34 30 31 37 33 0D--寄存器選擇X100---BYTE--0X64=100
40 30 31 41 30 30 30 43 38 30 31 30 41 0D--寄存器選擇X200---BYTE--0XC8=200
40 30 31 41 30 30 31 32 43 30 31 30 31 0D--寄存器選擇X300---BYTE--0X12C=300
40 30 31 41 30 30 37 44 30 30 31 30 32 0D--寄存器選擇X2000---BYTE--0X7D0=2000
40   30 31 41 30 34 45 32 30 30 31  30 32 0D--寄存器選擇X20000---BYTE--0X4E20=20000
字頭-地址--模 式-數(shù)據(jù)-- 地址-字-節(jié)--異-或
組態(tài)王向地址是1的單片機寫入1byte數(shù)據(jù)組--------------81--------------------16個字節(jié)
40 30 31 35 31 30 30 30 30 30 31 30 31 30 35 0D--寄存器選擇X0---BYTE--數(shù)據(jù)是1                            40 30 31 23 23 30 31 0D
40  30 31 35 31 30 30 30 30 30 31  30 41  37 35 0D--寄存器選擇X0---BYTE--數(shù)據(jù)是10--0X41-0X37=0X0A=10     40 30 31 23 23 30 31 0D
40  30 31 35 31 30 30 30 30 30 31  36 34  30 36 0D--寄存器選擇X0---BYTE--數(shù)據(jù)是100
40  30 31 35 31 30 30 30 30 30 31  43 38  37 46 0D--寄存器選擇X0---BYTE--數(shù)據(jù)是200
字頭-地址--模 式-數(shù)據(jù)-- 地址-字-節(jié)--數(shù)-值--異-或
  0--1--2--3---4-5--6--7--8--9--10-11-12--13-14-15
/*********************字讀寫****************************************/
組態(tài)王向地址是1的單片機讀2byte數(shù)據(jù)組------------------164------------------14個字節(jié)
40 30 31 41 34 30 30 30 30 30 32 37 36 0D--寄存器選擇X0---USHORT--數(shù)據(jù)0                        40 30 31 30 32 30 30 30 31 30 32 0D
40 30 31 41 34 30 30 30 41 30 32 30 37 0D--寄存器選擇X10---USHORT--數(shù)據(jù)10  0X41-0X37=0X0A=10   40 30 31 30 32 30 37 44 30 37 30 0D
40 30 31 41 34 45 41 36 30 30 32 37 34 0D--寄存器選擇X60000---USHORT--EA60=60000               40 30 31 30 32 46 46 46 41 30 34 0D
字頭-地址模式-數(shù)據(jù)----地址--字節(jié)-異或值
組態(tài)王向地址是1的單片機寫入2byte數(shù)據(jù)組----------------85------------------18個字節(jié)
40 30 31 35 35 30 30 30 41 30 32 30 37 44 30 30 31 0D--寄存器選擇X10---USHORT--數(shù)據(jù)是2000      40 30 31 23 23 30 31 0D
40 30 31 35 37 30 30 30 41 30 32 30 37 44 30 30 33 0D----87-----打包                           40 30 31 23 23 30 31 0D

/*********************浮點數(shù)讀寫****************************************/
組態(tài)王向地址是1的單片機讀4byte數(shù)據(jù)組--------------168--------------------14個字節(jié)
40 30 31 41 38 30 30 30 30 30 34 37 43 0D--寄存器選擇X0---FLOAT---14個字節(jié)
40 30 31 41 38 30 30 36 34 30 34 37 45 0D--寄存器選擇X100---FLOAT
字頭-地址模式-數(shù)據(jù)---地址--字節(jié)-異或值
組態(tài)王向地址是1的單片機寫入4byte數(shù)據(jù)組---------------89-----------------22個字節(jié)
40 30 31 35 39 30 30 30 41 30 34 30 37 43 37 46 41 45 31 37 38 0D--寄存器選擇X10---FLOAT--數(shù)據(jù)是99.99   40 30 31 23 23 30 31 0D
40 30 31 35 39 30 30 36 34 30 34 31 31 38 32 33 35 30 30 30 37 0D--寄存器選擇X100---FLOAT--數(shù)據(jù)是66666  40 30 31 23 23 30 31 0D


40 30 31 41 34 30 30 36 34 30 32 37 34 0D---SHORT讀
40 30 31 41 34 30 30 36 34 30 32 37 34 0D

40 30 31 41 34 30 30 36 34 30 32 37 34 0D---USHORT讀
40 30 31 41 34 30 30 36 34 30 32 37 34 0D


40 30 31 32 30 30 30 30 30 30 31 30 32 0D
40 30 31 32 30 30 30 30 30 30 31 30 32 0D
40 30 31  30 31 36 34 30 32 0D


40 30 31 39 30 30 30 30 30 30 31 30 39 0D
40 30 31 30 31 36 34 30 32 0D


40 30 31 39 32 30 30 30 30 30 31 30 42 0D


40 30 31 39 30 30 30 30 30 30 31 30 39 0D


40 30 31 23 23 30 31 0D

單片機源程序如下:
  1. /***************寫在前面*************************************************************************************
  2. 程序思路:組態(tài)王向單片機通訊總共就兩條命令讀命令和寫命令
  3.           讀命令共分三條,字節(jié)讀和雙字和浮點讀三條命令
  4.                   寫命令也分三條,字節(jié)讀和雙字和浮點讀三條命令
  5.                   讀時的三條命令的數(shù)據(jù)長度都一樣都是14個ASSIC碼
  6.                   而且單片機回傳的數(shù)據(jù)分別是10個ASSIC碼和12個ASSIC碼和16個ASSIC碼
  7.                     40  30 31 30 32 30 30 30 31  0D                                 數(shù)據(jù)是1個字節(jié)2個ASSIC碼
  8.                   [字頭-地-址-字節(jié)--數(shù)-據(jù)-異或值-字尾]
  9.                     40  30 31 30 32 30 30 30 31 30--30  0D                         數(shù)據(jù)是2個字節(jié)4個ASSIC碼
  10.                   [字頭-地-址-字節(jié)--數(shù)-------據(jù)-異或值-字尾]
  11.                     40  30 31 30 32 30 30 30 30 30-30-30-30----31-30--0D         數(shù)據(jù)是4個字節(jié)8個ASSIC碼
  12.                   [字頭-地-址-字節(jié)--數(shù)-------------------據(jù)---異或值-字尾]
  13.                   寫時的命令組態(tài)王分別發(fā)送字節(jié)16個ASSIC到單片機,雙字節(jié)是18個ASSIC和浮點22個2ASSIC碼
  14.                   單片機只需回答正確和不正確的倆條命令 40 30 31 23 23 30 31 0D
  15.                   然后再把數(shù)據(jù)處理就可以了如果不理解請仔細閱讀組態(tài)王與單片劫ASSIC通訊手冊。
  16.           與組態(tài)王通訊時請注意選擇的單片機晶震頻率和波特率及效驗否則無法通訊成功
  17.           本次測試組態(tài)王只支持19200波特率,再高的波特率沒有成功,
  18.           不知道是何原因難道組態(tài)的原因嗎?
  19. **        功能描述:                        接收組態(tài)王的數(shù)據(jù)
  20. **(組態(tài)王發(fā)送來的數(shù)據(jù)有讀都是14個ASSIC,
  21.                        bite寫16個ASSIC,
  22.                        word寫18個ASSIC,
  23.                                           FLOAT寫22個ASSIC,
  24. **單片機回傳----讀單字節(jié)時正確回傳10個個ASSIC,讀雙字節(jié)時正確回傳12個個ASSIC,讀浮點時正確回傳16個個ASSIC,
  25.                 讀時不正確回傳8個個ASSIC
  26. **單片機回傳----寫時正確回傳  8個個ASSIC,
  27.                 寫時不正確回傳8個個ASSIC  
  28. //data_num=1byte;data_num=2word;data_num=4folat                          
  29.                                                                    
  30. **        創(chuàng) 建 者:                        李文杰
  31. **        創(chuàng)建時間:                        2017-11-28 3:48
  32. **        版    本:                        v1.0.0
  33. ************************************************************************************************************/
  34. #include "kongview.h"
  35. //#define MODE1T                        //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode
  36. #ifdef  MODE1T
  37. #define T1MS (65536-(MAIN_Fosc/1000))      //1ms timer calculation method in 1T mode
  38. #else
  39. #define T1MS (65536-(MAIN_Fosc/12/1000))      //1ms timer calculation method in 12T mode
  40. #endif
  41. #define N 5                             //ADC采樣使用遞推平均濾波算法,采樣次數(shù)
  42. /*------------------選擇波特率改CH1--------------------------------------------*/
  43. #define CH4   1200             //串口波特率
  44. #define CH2   2400             //串口波特率
  45. #define CH3   4800             //串口波特率
  46. #define CH5   9600             //串口波特率
  47. #define CH1  19200             //串口波特率
  48. #define CH0 115200             //串口波特率
  49. #if (CH1==     1200)
  50.     #define                BAUD        CH1
  51. #elif (CH1==   2400)
  52.         #define                BAUD        CH1
  53. #elif (CH1==   4800)
  54.         #define                BAUD        CH1
  55. #elif (CH1==   9600)
  56.         #define                BAUD        CH1
  57. #elif (CH1==  19200)
  58.         #define                BAUD        CH1
  59. #elif (CH1== 115200)
  60.         #define                BAUD        CH1
  61. #endif
  62. /*------------------選擇校驗改PARITYBIT---------------------------------------------*/
  63. #define NONE_PARITY     0               //無校驗
  64. #define ODD_PARITY      1               //奇校驗
  65. #define EVEN_PARITY     2               //偶校驗
  66. #define MARK_PARITY     3               //標記校驗
  67. #define SPACE_PARITY    4               //空白校驗
  68. #define PARITYBIT EVEN_PARITY           //定義校驗位
  69. #define ReadMode        14              //根據(jù)組態(tài)王發(fā)送來的數(shù)據(jù)14個字節(jié)都是讀
  70. #define WritMode1byte   16              //16個字節(jié)是寫1bite
  71. #define WritMode2byte   18              //18個字節(jié)是寫整數(shù)
  72. #define WritMode4byte   22              //22個字節(jié)是寫浮點數(shù)
  73. /**********組態(tài)王讀寫標記固定在recbuf[3],recbuf[4]******************************************/
  74. #define TYPEReadB            160        //字節(jié)讀
  75. #define TYPEReadB2           162        //打包字節(jié)讀
  76. #define TYPEWrirB             81        //字節(jié)寫
  77. #define TYPEWrirB2            83        //打包字節(jié)寫
  78. #define TYPEReadW            164                //字讀
  79. #define TYPEReadW2           166                //打包字讀
  80. #define TYPEWritw             85                //字節(jié)寫
  81. #define TYPEWritw2            87                //打包字寫
  82. #define TYPEReadF            168                //雙字讀
  83. #define TYPEReadF2           170                //打包雙字讀
  84. #define TYPEWritF             89                //雙字讀
  85. #define TYPEWritF2            71                //打包雙字讀
  86. #define Control_MCUIO         P1        //組態(tài)王要控制的IO
  87. unsigned char DateRitLen;    //計算組態(tài)王傳到單片機的數(shù)據(jù)格式是否匹配
  88. unsigned char ReceiveLen;    //計算組態(tài)王傳到單片機的字節(jié)長度
  89. /*************單片機向組態(tài)王回傳的信息有***********************/
  90. #define TYPEReadOK                        10      //讀正確回傳10字節(jié)
  91. #define TYPEReadER                         8      //讀錯誤回傳8字節(jié)
  92. #define TYPEWritOK                         8      //寫正確回傳8字節(jié)
  93. #define TYPEWritER                         8      //寫錯誤回傳8字節(jié)
  94. #define Div(X) (X/10)
  95. #define ANL(X) (X%10)
  96. #define ASSICDEC(X) (((X<<4)&0XF0) + (X&0x0F))      //宏
  97. unsigned char  xdata datBYTE[3]={ 0,
  98.                                                                   0,
  99.                                                                   0,

  100.                                  };
  101. //unsigned int   xdata datWORD[10];
  102. //unsigned long  xdata datFOALT[10];       




  103. unsigned char  recbuf[22]={     0x40,          //字頭---------組態(tài)王向單片機回讀寫的數(shù)據(jù)
  104.                                                                 0x30,          //設(shè)備地址2
  105.                                                                 0x31,          //設(shè)備地址1
  106.                                                                 0x30,          //標志11111111   B(000001100)
  107.                                                                 0x31,          //標志bit0= 0:讀,bit0= 1:寫 bit1= 0:不打包。
  108.                                                                    0,          //數(shù)據(jù)地址
  109.                                                                    0,          //數(shù)據(jù)地址
  110.                                                                    0,          //數(shù)據(jù)地址
  111.                                                                    0,          //數(shù)據(jù)地址
  112.                                                                    0,          //數(shù)據(jù)字節(jié)數(shù)
  113.                                                                    0,          //數(shù)據(jù)字節(jié)數(shù)
  114.                                                                    0,          //數(shù)據(jù)
  115.                                                                    0,          //數(shù)據(jù)
  116.                                                                    0,          //數(shù)據(jù) CR結(jié)束符號讀寫數(shù)據(jù)類型為字節(jié)為14個數(shù)據(jù)
  117.                                                                    0,          //數(shù)據(jù)
  118.                                                                    0,          //異或
  119.                                                                    0,          //異或
  120.                                                                 0x0d,          //CR結(jié)束符號讀寫數(shù)據(jù)類型為字為18個數(shù)據(jù)
  121.                                                                    0,
  122.                                                                 0x0d,          //CR結(jié)束符號讀寫數(shù)據(jù)類型為浮點型為20個數(shù)據(jù)
  123.                                                                    0,
  124.                                                                 0X0D,          //CR結(jié)束符號讀寫數(shù)據(jù)類型為浮點型為22個數(shù)據(jù)
  125.                                 };
  126. unsigned char xdata sendbuf[16]={0x40,          //字頭---------單片機向組態(tài)王回復(fù)讀一個BYTE數(shù)據(jù)
  127.                                  0x30,          //設(shè)備地址
  128.                                                                  0x31,          //設(shè)備地址
  129.                                                                  0x30,          //標志bit0~bit7-bit0= 0:讀,bit0= 1:寫。bit1= 0:不打包。bit3bit2 = 00,數(shù)據(jù)類型為字節(jié)。
  130.                                                                  0x31,          //標志bit3bit2 = 01,數(shù)據(jù)類型為字。1bit3bit2 = 1x,數(shù)據(jù)類型為浮點數(shù)
  131.                                                                  0X36,          //數(shù)據(jù)字節(jié)數(shù)2
  132.                                                                  0X34,          //數(shù)據(jù)字節(jié)數(shù)。
  133.                                                                  0X30,          //異或
  134.                                                                  0X32,          //異或
  135.                                                                  0x0D,          //CR結(jié)束符號
  136.                                                                         };          //sendbuf[1-2]本機地址位,多機修改此處
  137. unsigned char xdata Answer[8]={0x40,                //字頭---------單片機向組態(tài)王回復(fù)讀一個BYTE數(shù)據(jù)        40        30        31        23        23        30        31        0d
  138.                                0x30,                //設(shè)備地址
  139.                                                            0x31,                //設(shè)備地址
  140.                                                               0,                //數(shù)據(jù)高位若正確回復(fù)23不正確回復(fù)2a
  141.                                                               0,                //數(shù)據(jù)低位若正確回復(fù)23不正確回復(fù)2a
  142.                                                            0X30,                //異或
  143.                                                            0X31,                //異或
  144.                                                            0x0D,                //CR結(jié)束符號
  145.                                                            };
  146. unsigned char count=0; //接收組態(tài)王的數(shù)據(jù)字節(jié)計數(shù)
  147. BIT flag=0;                    //單片機接收計算機字頭正確標記
  148. BIT recok=0;                   //接收組態(tài)王的數(shù)據(jù)成功
  149. unsigned char Li=0;    //動態(tài)顯示用
  150. unsigned char SendNum; //組態(tài)王讀單片機回傳的字節(jié)數(shù)
  151. unsigned char Pv1;           //數(shù)碼管顯示
  152. //定義一個指針
  153. /*------------------數(shù)碼管腳定義------------------------------------------*/
  154. sbit     Led_Bit_A   = P3^7;   //段碼A段
  155. sbit     Led_Bit_B   = P2^1;   //段碼B段
  156. sbit     Led_Bit_C   = P2^2;   //段碼C段
  157. sbit     Led_Bit_D   = P2^3;   //段碼D段
  158. sbit     Led_Bit_E   = P2^4;   //段碼E段
  159. sbit     Led_Bit_F   = P2^5;   //段碼F段
  160. sbit     Led_Bit_G   = P2^6;   //段碼G段
  161. sbit     Led_Bit_dip = P2^7;   //小數(shù)點
  162. sbit     COM1        = P3^6;//數(shù)碼管個位位選為P3.7
  163. sbit     COM2        = P3^5;//數(shù)碼管十位位選為P3.6
  164. sbit     COM3        = P3^4;//數(shù)碼管百位位選為P3.5
  165. /*******************************************************************************************
  166. 三位數(shù)碼管        LEDTYPE =1,共陽數(shù)碼管 ;LEDTYPE =0,共陰數(shù)碼管試 LED顯示相關(guān)定義
  167.     a
  168.    |---|
  169. f |__g| b
  170.    |   |
  171. e |___| c
  172.     d
  173. ** 作 者: 李文杰
  174. ** 日 期: 2017年11月28日
  175. ** 說  明:
  176.         ______       ______       ______      
  177.        |      |     |      |     |      |     
  178.        |      |     |      |     |      |     
  179.        |   1  |     |   2  |     |   3  |   
  180.        |      |     |      |     |      |   
  181.        |______| 3   |______| 2   |______| 1  
  182.            |    |       |    |       |    |      
  183.            |   dot      |   dot      |   dot   
  184.            |            |            |           
  185.       ShowCase[0]  ShowCase[1]  ShowCase[2]  
  186. ********************************************************************************************************/
  187. #define LEDTYPE        0         //如果用共陰還是共陽數(shù)碼管只要改變這里就行了
  188. #if LEDTYPE
  189. #define        LED_TYPE        0xFF         //定義LED類型, 0x00--共陰, 0xff--共陽
  190. #define        LED_TYP2        0x00
  191. #else
  192. #define        LED_TYPE        0x00         //定義LED類型, 0x00--共陰, 0xff--共陽
  193. #define        LED_TYP2        0xFF
  194. #endif
  195. /*************************************************************************************************************/
  196. #define                  b_0000_0001             1
  197. #define                  b_0000_0010                     2        
  198. #define                  b_0000_0100                     4        
  199. #define                  b_0000_1000                     8        
  200. #define                  b_0001_0000                        16                
  201. #define                  b_0010_0000                 32
  202. #define                  b_0100_0000                        64        
  203. #define                  b_1000_0000                128  
  204. /*------------------------------------------------------------------------------------------------------------*/  
  205. #define _a               b_0000_0001
  206. #define _b                      b_0000_0010
  207. #define _c                      b_0000_0100   
  208. #define _d                      b_0000_1000   
  209. #define _e                      b_0001_0000   
  210. #define _f                      b_0010_0000   
  211. #define _g                      b_0100_0000   
  212. #define _p                      b_1000_0000   
  213. /**************************************************************************************************************/       
  214. #define LED_0                 LED_TYPE^(_a|_b|_c|_d| _e|_f)
  215. #define LED_1                 LED_TYPE^(_b|_c)
  216. #define LED_2                 LED_TYPE^(_a|_b|_g|_e|_d)
  217. #define LED_3                 LED_TYPE^(_a|_b|_g|_c|_d)
  218. #define LED_4            LED_TYPE^(_f|_g|_b|_c)
  219. #define LED_5            LED_TYPE^(_a|_f|_g|_c|_d)
  220. #define LED_6            LED_TYPE^(_a|_f|_g|_c|_d|_e)
  221. #define LED_7            LED_TYPE^(_a|_b|_c)
  222. #define LED_8            LED_TYPE^(_a|_b|_c|_d|_e|_f|_g)
  223. #define LED_9            LED_TYPE^(_a|_b|_c|_d|_f|_g)
  224. #define LED_a            LED_TYPE^(_a|_b|_c|_e|_f|_g)
  225. #define LED_H            LED_TYPE^(_b|_c|_e|_f|_g)
  226. #define LED_V            LED_TYPE^(_b|_c|_d|_e|_f)
  227. #define LED_e            LED_TYPE^(_a|_d|_d|_e|_f|_g)
  228. #define LED_OF           LED_TYP2^(_a|_b|_c|_d|_e|_f|_g|_p)
  229. #define LED_Y            LED_TYPE^(_b|_c|_d|_f|_g)
  230. #define LED_U            LED_TYPE^(_c|_d|_e)
  231. #define LED_L            LED_TYPE^(_f|_e|_d)
  232. #define LED_P            LED_TYPE^(_a|_b|_e|_f|_g)
  233. #define LED_I            LED_TYPE^(_e|_f )
  234. #define LED_d            LED_TYPE^(_b|_c |_d|_e|_g)
  235. #define LED_r            LED_TYPE^(_e|_g)
  236. #define LED_T            LED_TYPE^(_a|_e|_f)
  237. #define LED_b            LED_TYPE^(_c|_d|_e|_f|_g)
  238. #define LED_c            LED_TYPE^(_a|_d|_e|_f)
  239. #define LED_K            LED_TYPE^(_b|_d|_e|_f|_g)
  240. #define LED_S            LED_TYPE^(_a|_c|_d|_f|_g)
  241. #define LED_O_1                 LED_TYPE^(_a|_b|_f|_g)                                //上層'o'
  242. #define LED_O_2          LED_TYPE^(_c|_d|_e|_g)                             //下層'o'      
  243. #define LED_Z                 LED_TYPE^(_a|_b|_e|_d)  
  244. #define LED_f                 LED_TYPE^(_a|_e|_f|_g)   
  245. #define LED_n            LED_TYPE^(_c|_e|_g)
  246. #define LED_fu           LED_TYPE^(_g)
  247. #define LED_DROP         LED_TYPE^(_p)
  248. /*------------------數(shù)碼管段碼表----------------------------------------*/
  249. unsigned char code table[18]=         {                 //需要顯示的段選碼
  250.                                       LED_0,         //0
  251.                                   LED_1,         //1
  252.                                                                   LED_2,         //2
  253.                                                                   LED_3,         //3
  254.                                                                   LED_4,         //4
  255.                                                                   LED_5,         //5
  256.                                                                   LED_6,         //6
  257.                                                                   LED_7,         //7
  258.                                                                   LED_8,         //8
  259.                                                                   LED_9,         //9
  260.                                                                   LED_a,
  261.                                                                   LED_b,
  262.                                                                   LED_c,
  263.                                                                   LED_d,
  264.                                                                   LED_e,
  265.                                                                   LED_f,
  266.                                                                   LED_fu,
  267.                                                                   LED_P,
  268.                                                                  };
  269. /********************************************************************************************************
  270. **         函數(shù)名稱:                        void        digital_CODE()
  271. **        功能描述:                        驅(qū)動數(shù)碼管位碼
  272. **        創(chuàng) 建 者:                        李文杰
  273. **        創(chuàng)建時間:                        2017-11-28 3:48
  274. **        版    本:                        v1.0.0
  275. *********************************************************************************************************/
  276. void digital_CODE(unsigned char ch)  //led段碼發(fā)送函數(shù)開始  
  277. {          ACC=ch;
  278.         COM1=COM2=COM3=1;
  279.     Led_Bit_A  = ACC0;
  280.         Led_Bit_B  = ACC1;
  281.         Led_Bit_C  = ACC2;
  282.         Led_Bit_D  = ACC3;
  283.         Led_Bit_E  = ACC4;
  284.         Led_Bit_F  = ACC5;
  285.         Led_Bit_G  = ACC6;
  286.     Led_Bit_dip= ACC7;
  287. }
  288. /********************************************************************************************************
  289. **         函數(shù)名稱:                        void        uartsends()
  290. **        功能描述:                        串口發(fā)送數(shù)據(jù)串
  291. **        創(chuàng) 建 者:                        李文杰
  292. **        創(chuàng)建時間:                        2017-11-28 3:48
  293. **        版    本:                        v1.0.0
  294. *********************************************************************************************************/
  295. void uartsends(unsigned char buff[],uchar len)
  296. {   unsigned char i;
  297.         for(i=0;i<len;i++)
  298.         {   SBUF=buff[i];
  299.                 while(!TI);
  300.                 TI=0;
  301.         }
  302. }
  303. /*************把組態(tài)王中的ASSIC碼轉(zhuǎn)換成16進制兩個ASSIC組成1BYTE16進制碼與常規(guī)的ASSIC轉(zhuǎn)法不一樣*********/
  304. unsigned char CharToHex(unsigned char bHex)  
  305. {   unsigned char temp;
  306.         if(   bHex>0x40)
  307.         temp=(bHex-0x37)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  308.         else
  309.         temp=(bHex-0x30)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  310.         return temp;   
  311. }
  312. unsigned int CharToHexn(unsigned char bHex)  
  313. {   unsigned char temp;
  314.         if(   bHex>0x40)
  315.         temp=(bHex-0x37)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  316.         else
  317.         temp=(bHex-0x30)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  318.         return temp;   
  319. }



  320. unsigned int CharToHexnall(unsigned char *redata,unsigned char number)  
  321. {   unsigned int temp,i;
  322.         if(number==1)        {
  323.         for(i=0;i<2;i++)  {
  324.         temp=CharToHexn(*redata);
  325.         temp=temp<<4|temp;
  326.         redata++;
  327.           }
  328. //        temp=(temp<<4+temp1);

  329.        
  330.         }       

  331.         if(number==2)        {
  332.         if(   temp>0x40)
  333.         temp=(temp-0x37)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  334.         else
  335.         temp=(temp-0x30)&0x0f;}        //只取低四位00001111----bit0-bit1--bit2--bit3

  336.         if(number==4)        {
  337.         if(   temp>0x40)
  338.         temp=(temp-0x37)&0x0f;        //只取低四位00001111----bit0-bit1--bit2--bit3
  339.         else
  340.         temp=(temp-0x30)&0x0f;}        //只取低四位00001111----bit0-bit1--bit2--bit3


  341.         return temp;   
  342. }



  343. /********************************************************************************************************
  344. **         函數(shù)名稱:                        data_num(void)
  345. **        功能描述:                        判斷發(fā)送和寫的字節(jié)數(shù)
  346. **        創(chuàng) 建 者:                        李文杰
  347. **        創(chuàng)建時間:                        2017-11-28 3:48
  348. **        版    本:                        v1.0.0
  349. *********************************************************************************************************/
  350. unsigned char data_num(void)                //data_num=1byte;data_num=2word;data_num=4folat
  351. {                                                                       
  352.     unsigned char temp;
  353.         temp=CharToHex(recbuf[9]);
  354.         temp=(temp<<4)&0XF0;
  355.         temp+=CharToHex(recbuf[10]);
  356.         return temp;
  357. }
  358. /****************根據(jù)接收到的信息處理回傳的信息**************************/
  359. void Information_processing(void)
  360. {
  361. unsigned char ctmp1=0,ctmp2=0,xordat=0,i;
  362. unsigned int send_temp=0;
  363. sendbuf[1]=recbuf[1];         //地址同步
  364. sendbuf[2]=recbuf[2];
  365. sendbuf[3]=recbuf[9];         //字節(jié)數(shù)同步
  366. sendbuf[4]=recbuf[10];
  367. /********讀1字節(jié)數(shù)************************************/
  368. if(data_num()==1) {
  369.   datBYTE[0]=Control_MCUIO;                //組態(tài)王讀單片機時只要把P0,P1,P2的數(shù)據(jù)放到datBYTE[0]中就可以讀出MCUIO的狀態(tài)
  370.   ctmp1=(datBYTE[0]>>4)&0x0f;
  371.   if(ctmp1>9)                                    //把十六進制碼轉(zhuǎn)化成ASSIC碼放入sendbuf[5]sendbuf[6]中以便發(fā)送
  372.   sendbuf[5]=ctmp1%9+0x40;
  373.   else
  374.   sendbuf[5]=ctmp1+0x30;  
  375.   ctmp2=datBYTE[0]&0x0f;             //把十六進制碼轉(zhuǎn)化成ASSIC碼放入sendbuf[5]sendbuf[6]中以便發(fā)送
  376.   if(ctmp2>9)                                 
  377.   sendbuf[6]=ctmp2%9+0x40;       
  378.   else
  379.   sendbuf[6]=ctmp2+0x30;   
  380.   xordat=0;
  381.   for(i=1;i<7;i++)
  382.   xordat^=sendbuf[i];           //異或之和
  383.   send_temp=xordat;
  384.   ctmp1=(send_temp>>4)&0x0f;
  385.   if(ctmp1>9)                                //異或高位
  386.   sendbuf[7]=ctmp1%9+0x40;
  387.   else
  388.   sendbuf[7]=ctmp1+0x30;         
  389.   ctmp2=send_temp&0x0f;
  390.   if(ctmp2>9)                                //異或低位
  391.   sendbuf[8]=ctmp2%9+0x40;       
  392.   else
  393.   sendbuf[8]=ctmp2+0x30;
  394.   sendbuf[9]=0X0D;       
  395.   SendNum=10;                                //字節(jié)讀回傳10個數(shù)據(jù)
  396.   uartsends(sendbuf,SendNum);
  397.                                    }
  398. /********讀2字節(jié)數(shù)************************************/
  399. //40 30 31 41 34 30 30 30 30 30 32 37 36 0D
  400. //40 30 31 30 32 30 30 36 34 30 33 0D
  401. if(data_num()==2) {
  402. sendbuf[5]=0X30;         //00
  403. sendbuf[6]=0X30;
  404. sendbuf[7]=0X36;         //120
  405. sendbuf[8]=0X34;
  406. xordat=0;
  407. for(i=1;i<9;i++)                                   //異或之和8個數(shù)據(jù)
  408. xordat^=sendbuf[i];
  409. send_temp=xordat;
  410. ctmp1=(send_temp>>4)&0x0f;
  411. if(ctmp1>9)                                                //異或高位
  412. sendbuf[9]=ctmp1%9+0x40;
  413. else sendbuf[9]=ctmp1+0x30;
  414. ctmp2=send_temp&0x0f;
  415. if(ctmp2>9)                                                //異或低位
  416. sendbuf[10]=ctmp2%9+0x40;
  417. else sendbuf[10]=ctmp2+0x30;
  418. sendbuf[11]=0x0D;
  419. uartsends(sendbuf,12);                        //字節(jié)讀回傳12個數(shù)據(jù)
  420.                                    }                 
  421. /********讀4字節(jié)數(shù)************************************/

  422. if(data_num()==4) {
  423. sendbuf[5] =0X30;         //字節(jié)數(shù)同步
  424. sendbuf[6] =0X30;
  425. sendbuf[7] =0X46;         //字節(jié)數(shù)同步
  426. sendbuf[8] =0X46;
  427. sendbuf[9] =0X46;         //字節(jié)數(shù)同步
  428. sendbuf[10]=0X46;
  429. sendbuf[11]=0X30;         //字節(jié)數(shù)同步
  430. sendbuf[12]=0X30;
  431. xordat=0;
  432. for(i=1;i<13;i++)                         //異或之和12個數(shù)據(jù)
  433. xordat^=sendbuf[i];
  434. send_temp=xordat;
  435. ctmp1=(send_temp>>4)&0x0f;
  436. if(ctmp1>9)
  437. sendbuf[13]=ctmp1%9+0x40;
  438. else
  439. sendbuf[13]=ctmp1+0x30;         //異或高位
  440. ctmp2=send_temp&0x0f;
  441. if(ctmp2>9)
  442. sendbuf[14]=ctmp2%9+0x40;        //異或低位
  443. else
  444. sendbuf[14]=ctmp2+0x30;        //異或低位
  445. sendbuf[15]=0X0D;
  446. SendNum=16;                                //字節(jié)讀回傳16個數(shù)據(jù)
  447. uartsends(sendbuf,SendNum);
  448.                                    }

  449. }

  450. /****************組態(tài)王寫字節(jié)數(shù)據(jù)處理**************************/
  451. // 40  30 31 35 31 30 30 30 30 30 31  30 31  30 35 0D
  452. // 40  30 31 35 31 30 30 30 30 30 31  43 38  37 46 0D--寄存器選擇X0---BYTE--數(shù)據(jù)是200
  453. //字頭-地址--模 式-數(shù)據(jù)-- 地址-字-節(jié)--數(shù)-值--異-或
  454. //--0  1  2  3  4  5--6--7--8  9  10  11 12  13 14 15

  455. void writeMCU()
  456. {   unsigned char temp;                  //組態(tài)王寫入MCU的數(shù)據(jù)值
  457.     unsigned int  tempAddr;          //組態(tài)王寫入MCU的地址值X0,X1--X200
  458.         temp=CharToHex(recbuf[11]);
  459.         temp=(temp<<4)&0XF0;
  460.         temp+=CharToHex(recbuf[12]);
  461.         datBYTE[0]=temp;                          //寫入單片機的內(nèi)存
  462.         Control_MCUIO=datBYTE[0];                  //單片機的IO等于組態(tài)王寫過來的數(shù)據(jù)組態(tài)王寫入MCU的數(shù)據(jù)值
  463.         tempAddr=CharToHex(recbuf[5]);
  464.         tempAddr=(tempAddr<<4)&0XF0;
  465.         tempAddr+=CharToHex(recbuf[6]);
  466.         tempAddr=(tempAddr<<4)&0XF0;
  467.         tempAddr+=CharToHex(recbuf[7]);
  468.     tempAddr=(tempAddr<<4)&0XF0;
  469.         tempAddr+=CharToHex(recbuf[8]);

  470. //        Pv1=tempAddr;          //寫入單片機的地址變量



  471. }
  472. /********************************************************************************************************
  473. **         函數(shù)名稱:                        write_inform(unsigned char dat)
  474. **        功能描述:                        單片機向計算機組態(tài)王發(fā)送8字節(jié)數(shù)據(jù)
  475. **        創(chuàng) 建 者:                        李文杰
  476. **        創(chuàng)建時間:                        2017-11-28 3:48
  477. **        版    本:                        v1.0.0
  478. *********************************************************************************************************/
  479. void write_inform(unsigned char dat)
  480. {
  481. unsigned char xordat,i,ctmp1,ctmp2,send_temp;
  482. Answer[1]=recbuf[1];
  483. Answer[2]=recbuf[2];
  484. Answer[3]=dat;             //數(shù)據(jù)高位若正確回復(fù)23不正確回復(fù)2a
  485. Answer[4]=dat;             //數(shù)據(jù)低位若正確回復(fù)23不正確回復(fù)2a
  486. xordat=0;
  487. for(i=1;i<5;i++)
  488. xordat^=Answer[i];
  489. send_temp=xordat;
  490. ctmp1=(send_temp>>4)&0x0f;
  491. if(ctmp1>9)
  492. Answer[5]=ctmp1%9+0x40;
  493. else
  494. Answer[5]=ctmp1+0x30;         //異或高位
  495. ctmp2=send_temp&0x0f;
  496. if(ctmp2>9)
  497. Answer[6]=ctmp2%9+0x40;        //異或低位
  498. else
  499. Answer[6]=ctmp2+0x30;        //異或低位
  500. uartsends(Answer,8);
  501. }
  502. /********************************************************************************************************
  503. **         函數(shù)名稱:                        AddrInit()
  504. **        功能描述:                        地址數(shù)據(jù)初始化
  505. **        創(chuàng) 建 者:                        李文杰
  506. **        創(chuàng)建時間:                        2017-11-28 3:48
  507. **        版    本:                        v1.0.0
  508. *********************************************************************************************************/
  509. /*void AddrInit(void)
  510. {
  511. unsigned char ctmp;
  512. ctmp=(MyAddr>>4);
  513. if(ctmp>9)
  514. {
  515. sendbuf [1]=0x40+ctmp%9;
  516. sendbuf1[1]=0x40+ctmp%9;
  517. }
  518. else
  519. {
  520. sendbuf [1]=ctmp+0x30;
  521. sendbuf1[1]=ctmp+0x30;
  522. }
  523. ctmp=MyAddr&0x0f;
  524. if(ctmp>9)
  525. {
  526. sendbuf [2]=0x40+ctmp%9;
  527. sendbuf1[2]=0x40+ctmp%9;
  528. }
  529. else
  530. {
  531. sendbuf [2]=ctmp+0x30;
  532. sendbuf1[2]=ctmp+0x30;
  533. }
  534. }

  535. /********************************************************************************************************
  536. **         函數(shù)名稱:                        void Write_byte()
  537. **        功能描述:                        轉(zhuǎn)換組態(tài)王發(fā)送的字節(jié)到dat區(qū)
  538. **        創(chuàng) 建 者:                        李文杰
  539. **        創(chuàng)建時間:                        2017-11-28 3:48
  540. **        版    本:                        v1.0.0
  541. *********************************************************************************************************/
  542. void Sendkingviow()
  543. {                    switch(ReceiveLen)
  544.                                            {
  545.                                                    /*組態(tài)王讀數(shù)據(jù)單片機回傳*/
  546.                                  case 14:   
  547.                                                                                   Information_processing();                                                                     
  548.                                                                     ;break;
  549.                                                    /*組態(tài)王寫字節(jié)數(shù)據(jù)單片機回傳40        30        31        23        23        30        31        0d不正確回傳40        30        31        2A        2A        30        31        0d*/
  550.                                             case 16:   
  551.                                                                     write_inform('#');
  552.                                                                                 writeMCU();
  553.                                                                    ;break;
  554.                                                         /*組態(tài)王寫雙字節(jié)數(shù)據(jù)單片機回傳*/
  555.                                                         case 18:   
  556.                                                                     write_inform('#');
  557.                                                                    ;break;
  558.                                                         /*組態(tài)王寫四字節(jié)數(shù)據(jù)單片機回傳*/
  559.                                                         case 22:   
  560.                                                                     write_inform('#');
  561.                                                                    ;break;
  562.                                                         default://write_inform('*');
  563.                                                                     write_inform('*');
  564.                                                                             break;       
  565.                                            }
  566. }
  567. /*float C4toD(char * c)
  568. {
  569.         BYTE     Hd[30], Jiema[30];
  570.         float   DTc[30];
  571.         float  Decimal = 0;
  572.         float   returnflo = 0;
  573.         BOOL     ShuFU = FALSE, JieFU = FALSE;
  574.         memset(Hd, 0, sizeof(Hd));
  575.         memset(Jiema, 0, sizeof(Jiema));
  576.         memset(DTc, 0, sizeof(DTc));
  577.         if((c[7] > 0x40) && (c[7] < 0x47))
  578.                 Hd[7] = ((c[7]  - 0x37) & 0x0f);
  579.         else if((c[7] > 0x60) && (c[7] < 0x67))
  580.                 Hd[7] = ((c[7]  - 0x57) & 0x0f);
  581.         else
  582.                 Hd[7] = ((c[7]  - 0x30) & 0x0f);

  583.         if((c[6] > 0x40) && (c[6] < 0x47))
  584.                 Hd[6] = ((c[6]  - 0x37) & 0x0f);
  585.         else if((c[6] > 0x60) && (c[6] < 0x67))
  586.                 Hd[6] = ((c[6]  - 0x57) & 0x0f);
  587.         else
  588.                 Hd[6] = ((c[6]  - 0x30) & 0x0f);

  589.         DTc[2] = (float)(((float)(Hd[6] * 16.0) + (float)(Hd[7])) / 256.0);

  590.         if((c[5] > 0x40) && (c[5] < 0x47))
  591.                 Hd[5] = ((c[5]  - 0x37) & 0x0f);
  592.         else if((c[5] > 0x60) && (c[5] < 0x67))
  593.                 Hd[5] = ((c[5]  - 0x57) & 0x0f);
  594.         else
  595.                 Hd[5] = ((c[5]  - 0x30) & 0x0f);

  596.         if((c[4] > 0x40) && (c[4] < 0x47))
  597.                 Hd[4] = ((c[4]  - 0x37) & 0x0f);
  598.         else if((c[4] > 0x60) && (c[4] < 0x67))
  599.                 Hd[4] = ((c[4]  - 0x57) & 0x0f);
  600.         else
  601.                 Hd[4] = ((c[4]  - 0x30) & 0x0f);

  602.         DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0);

  603.         if((c[3] > 0x40) && (c[3] < 0x47))
  604.                 Hd[3] = ((c[3]  - 0x37) & 0x0f);
  605.         else if((c[3] > 0x60) && (c[3] < 0x67))
  606.                 Hd[3] = ((c[3]  - 0x57) & 0x0f);
  607.         else
  608.                 Hd[3] = ((c[3]  - 0x30) & 0x0f);

  609.         if((c[2] > 0x40) && (c[2] < 0x47))
  610.                 Hd[2] = ((c[2]  - 0x37) & 0x0f);
  611.         else if((c[2] > 0x60) && (c[2] < 0x67))
  612.                 Hd[2] = ((c[2]  - 0x57) & 0x0f);
  613.         else
  614.                 Hd[2] = ((c[2]  - 0x30) & 0x0f);

  615.         Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0);

  616.         if((c[1] > 0x40) && (c[1] < 0x47))
  617.                 Jiema[1] = ((c[1]  - 0x37) & 0x0f);
  618.         else if((c[1] > 0x60) && (c[1] < 0x67))
  619.                 Jiema[1] = ((c[1]  - 0x57) & 0x0f);       
  620.         else
  621.                 Jiema[1] = ((c[1]  - 0x30) & 0x0f);

  622.         if((c[0] > 0x40) && (c[0] < 0x47))
  623.                 Jiema[0] = ((c[0]  - 0x37) & 0x0f);
  624.         else if((c[0] > 0x60) && (c[0] < 0x67))
  625.                 Jiema[0] = ((c[0]  - 0x57) & 0x0f);
  626.         else
  627.                 Jiema[0] = ((c[0]  - 0x30) & 0x0f);


  628.         ShuFU = ((Jiema[0] & 0x08) >> 3) > 0;
  629.         JieFU = ((Jiema[0] & 0x04) >> 2) > 0;

  630.         Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1];
  631.        
  632.         if(JieFU)
  633.                 returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal;
  634.         else
  635.                 returnflo = (float)pow(2, Jiema[2]) * Decimal;

  636.         if(ShuFU)
  637.                 returnflo = (-1) * returnflo;

  638.         return returnflo;
  639. }  *******************************************/
  640. /********************************************************************************************************
  641. **         函數(shù)名稱:                        serial_init()
  642. **        功能描述:                        串口1初始化函數(shù)
  643. **        創(chuàng) 建 者:                        李文杰
  644. **        創(chuàng)建時間:                        2017-11-28 3:48
  645. **        版    本:                        v1.0.0
  646. *********************************************************************************************************/
  647. void serial_init()
  648. {
  649. /*****************AT89C52單片機定時器1做波特率發(fā)生器***************************/
  650. /*
  651.     SCON=0x50;
  652.     TMOD=0X20;
  653.     TH1=0xfd;
  654.     TL1=0xfd;
  655.     TR1=1;           */
  656. /*****************STC15F2K60S2定時器1做波特率發(fā)生器***************************/
  657. /*        PCON &= 0x7F;                //波特率不倍速
  658.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  659.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  660.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器
  661.         TMOD &= 0x0F;                //清除定時器1模式位
  662.         TMOD |= 0x21;                //設(shè)定定時器1為8位自動重裝方式
  663. #if (CH1==   9600)
  664.         TL1 = 0xdc;                //設(shè)定定時初值
  665.         TH1 = 0xdc;                //設(shè)定定時器重裝值 0xdc
  666. #elif (CH1==   19200)
  667.         TL1 = 0xEE;                //設(shè)定定時初值
  668.         TH1 = 0xEE;                //設(shè)定定時器重裝值
  669. #endif
  670.         ET1 = 0;                //禁止定時器1中斷
  671.         TR1 = 1;                //啟動定時器1
  672. /*****************STC15F2K60S2定時器2做波特率發(fā)生器**************************/
  673.     T2L = (65536 - (MAIN_Fosc/4/BAUD));   //設(shè)置波特率重裝值
  674.     T2H = (65536 - (MAIN_Fosc/4/BAUD))>>8;
  675.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  676.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發(fā)生器         
  677. #if (PARITYBIT   == NONE_PARITY)
  678.     SCON = 0X50;                //8位可變波特率
  679. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
  680.     SCON = 0XDA;                //9位可變波特率,校驗位初始為1
  681. #elif (PARITYBIT == SPACE_PARITY)
  682.     SCON = 0XD2;                //9位可變波特率,校驗位初始為0
  683. #endif         
  684.     ES = 1;                     //使能串口1中斷
  685.     EA = 1;                                                //使能總中斷

  686. }
  687. /********************************************************************************************************
  688. **         函數(shù)名稱:                        void        main()
  689. **        功能描述:                        主函數(shù)
  690. **        創(chuàng) 建 者:                        李文杰
  691. **        創(chuàng)建時間:                        2017-11-28 3:48
  692. **        版    本:                        v1.0.0
  693. *********************************************************************************************************/
  694. void main (void)//主函數(shù)
  695. { TH0=T1MS>>8;                                                  //1MS
  696.   TL0=T1MS;
  697.   ET0=1;
  698.   TR0=1;
  699. ……………………

  700. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
組態(tài)王單片機通訊1.0.rar (2.47 MB, 下載次數(shù): 159)



作者: liyun656338152    時間: 2018-11-7 10:22
樓主,試過你的,stc89c52
作者: weidoit    時間: 2019-9-9 20:52
很好的參考資料
作者: zjgeser    時間: 2020-1-31 11:00
請問組態(tài)王怎樣向單片機發(fā)送讀取指令呢?不用系統(tǒng)自動發(fā)送的。例如我想通過一個按鈕實現(xiàn)向單片機發(fā)送讀取X6的指令?

作者: hyzqq    時間: 2020-2-1 16:24
謝樓主分享




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1