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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7376|回復: 4
收起左側

組態王與單片機通訊上位機及下位機源碼 附測試數據與協議

  [復制鏈接]
ID:397797 發表于 2018-9-14 10:01 | 顯示全部樓層 |閱讀模式
組態王與單片機通訊親測.
0.jpg

0.png
/*********************字節讀寫****************************************/
組態王向地址是1的單片機讀取1byte數據組態王選擇效驗沒變化都是一樣的數據
40 30 31 41 30 30 30 30 30 30 31 37 31 0D--寄存器選擇X0---BYTE---160-----14個字節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----打包與不打包除了格式和效驗位的數值不一樣了,好像沒啥區別,呵呵!

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
字頭-地址--模 式-數據-- 地址-字-節--異-或
組態王向地址是1的單片機寫入1byte數據組--------------81--------------------16個字節
40 30 31 35 31 30 30 30 30 30 31 30 31 30 35 0D--寄存器選擇X0---BYTE--數據是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--數據是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--數據是100
40  30 31 35 31 30 30 30 30 30 31  43 38  37 46 0D--寄存器選擇X0---BYTE--數據是200
字頭-地址--模 式-數據-- 地址-字-節--數-值--異-或
  0--1--2--3---4-5--6--7--8--9--10-11-12--13-14-15
/*********************字讀寫****************************************/
組態王向地址是1的單片機讀2byte數據組------------------164------------------14個字節
40 30 31 41 34 30 30 30 30 30 32 37 36 0D--寄存器選擇X0---USHORT--數據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--數據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
字頭-地址模式-數據----地址--字節-異或值
組態王向地址是1的單片機寫入2byte數據組----------------85------------------18個字節
40 30 31 35 35 30 30 30 41 30 32 30 37 44 30 30 31 0D--寄存器選擇X10---USHORT--數據是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

/*********************浮點數讀寫****************************************/
組態王向地址是1的單片機讀4byte數據組--------------168--------------------14個字節
40 30 31 41 38 30 30 30 30 30 34 37 43 0D--寄存器選擇X0---FLOAT---14個字節
40 30 31 41 38 30 30 36 34 30 34 37 45 0D--寄存器選擇X100---FLOAT
字頭-地址模式-數據---地址--字節-異或值
組態王向地址是1的單片機寫入4byte數據組---------------89-----------------22個字節
40 30 31 35 39 30 30 30 41 30 34 30 37 43 37 46 41 45 31 37 38 0D--寄存器選擇X10---FLOAT--數據是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--數據是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. 程序思路:組態王向單片機通訊總共就兩條命令讀命令和寫命令
  3.           讀命令共分三條,字節讀和雙字和浮點讀三條命令
  4.                   寫命令也分三條,字節讀和雙字和浮點讀三條命令
  5.                   讀時的三條命令的數據長度都一樣都是14個ASSIC碼
  6.                   而且單片機回傳的數據分別是10個ASSIC碼和12個ASSIC碼和16個ASSIC碼
  7.                     40  30 31 30 32 30 30 30 31  0D                                 數據是1個字節2個ASSIC碼
  8.                   [字頭-地-址-字節--數-據-異或值-字尾]
  9.                     40  30 31 30 32 30 30 30 31 30--30  0D                         數據是2個字節4個ASSIC碼
  10.                   [字頭-地-址-字節--數-------據-異或值-字尾]
  11.                     40  30 31 30 32 30 30 30 30 30-30-30-30----31-30--0D         數據是4個字節8個ASSIC碼
  12.                   [字頭-地-址-字節--數-------------------據---異或值-字尾]
  13.                   寫時的命令組態王分別發送字節16個ASSIC到單片機,雙字節是18個ASSIC和浮點22個2ASSIC碼
  14.                   單片機只需回答正確和不正確的倆條命令 40 30 31 23 23 30 31 0D
  15.                   然后再把數據處理就可以了如果不理解請仔細閱讀組態王與單片劫ASSIC通訊手冊。
  16.           與組態王通訊時請注意選擇的單片機晶震頻率和波特率及效驗否則無法通訊成功
  17.           本次測試組態王只支持19200波特率,再高的波特率沒有成功,
  18.           不知道是何原因難道組態的原因嗎?
  19. **        功能描述:                        接收組態王的數據
  20. **(組態王發送來的數據有讀都是14個ASSIC,
  21.                        bite寫16個ASSIC,
  22.                        word寫18個ASSIC,
  23.                                           FLOAT寫22個ASSIC,
  24. **單片機回傳----讀單字節時正確回傳10個個ASSIC,讀雙字節時正確回傳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. **        創 建 者:                        李文杰
  31. **        創建時間:                        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采樣使用遞推平均濾波算法,采樣次數
  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              //根據組態王發送來的數據14個字節都是讀
  70. #define WritMode1byte   16              //16個字節是寫1bite
  71. #define WritMode2byte   18              //18個字節是寫整數
  72. #define WritMode4byte   22              //22個字節是寫浮點數
  73. /**********組態王讀寫標記固定在recbuf[3],recbuf[4]******************************************/
  74. #define TYPEReadB            160        //字節讀
  75. #define TYPEReadB2           162        //打包字節讀
  76. #define TYPEWrirB             81        //字節寫
  77. #define TYPEWrirB2            83        //打包字節寫
  78. #define TYPEReadW            164                //字讀
  79. #define TYPEReadW2           166                //打包字讀
  80. #define TYPEWritw             85                //字節寫
  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        //組態王要控制的IO
  87. unsigned char DateRitLen;    //計算組態王傳到單片機的數據格式是否匹配
  88. unsigned char ReceiveLen;    //計算組態王傳到單片機的字節長度
  89. /*************單片機向組態王回傳的信息有***********************/
  90. #define TYPEReadOK                        10      //讀正確回傳10字節
  91. #define TYPEReadER                         8      //讀錯誤回傳8字節
  92. #define TYPEWritOK                         8      //寫正確回傳8字節
  93. #define TYPEWritER                         8      //寫錯誤回傳8字節
  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,          //字頭---------組態王向單片機回讀寫的數據
  104.                                                                 0x30,          //設備地址2
  105.                                                                 0x31,          //設備地址1
  106.                                                                 0x30,          //標志11111111   B(000001100)
  107.                                                                 0x31,          //標志bit0= 0:讀,bit0= 1:寫 bit1= 0:不打包。
  108.                                                                    0,          //數據地址
  109.                                                                    0,          //數據地址
  110.                                                                    0,          //數據地址
  111.                                                                    0,          //數據地址
  112.                                                                    0,          //數據字節數
  113.                                                                    0,          //數據字節數
  114.                                                                    0,          //數據
  115.                                                                    0,          //數據
  116.                                                                    0,          //數據 CR結束符號讀寫數據類型為字節為14個數據
  117.                                                                    0,          //數據
  118.                                                                    0,          //異或
  119.                                                                    0,          //異或
  120.                                                                 0x0d,          //CR結束符號讀寫數據類型為字為18個數據
  121.                                                                    0,
  122.                                                                 0x0d,          //CR結束符號讀寫數據類型為浮點型為20個數據
  123.                                                                    0,
  124.                                                                 0X0D,          //CR結束符號讀寫數據類型為浮點型為22個數據
  125.                                 };
  126. unsigned char xdata sendbuf[16]={0x40,          //字頭---------單片機向組態王回復讀一個BYTE數據
  127.                                  0x30,          //設備地址
  128.                                                                  0x31,          //設備地址
  129.                                                                  0x30,          //標志bit0~bit7-bit0= 0:讀,bit0= 1:寫。bit1= 0:不打包。bit3bit2 = 00,數據類型為字節。
  130.                                                                  0x31,          //標志bit3bit2 = 01,數據類型為字。1bit3bit2 = 1x,數據類型為浮點數
  131.                                                                  0X36,          //數據字節數2
  132.                                                                  0X34,          //數據字節數。
  133.                                                                  0X30,          //異或
  134.                                                                  0X32,          //異或
  135.                                                                  0x0D,          //CR結束符號
  136.                                                                         };          //sendbuf[1-2]本機地址位,多機修改此處
  137. unsigned char xdata Answer[8]={0x40,                //字頭---------單片機向組態王回復讀一個BYTE數據        40        30        31        23        23        30        31        0d
  138.                                0x30,                //設備地址
  139.                                                            0x31,                //設備地址
  140.                                                               0,                //數據高位若正確回復23不正確回復2a
  141.                                                               0,                //數據低位若正確回復23不正確回復2a
  142.                                                            0X30,                //異或
  143.                                                            0X31,                //異或
  144.                                                            0x0D,                //CR結束符號
  145.                                                            };
  146. unsigned char count=0; //接收組態王的數據字節計數
  147. BIT flag=0;                    //單片機接收計算機字頭正確標記
  148. BIT recok=0;                   //接收組態王的數據成功
  149. unsigned char Li=0;    //動態顯示用
  150. unsigned char SendNum; //組態王讀單片機回傳的字節數
  151. unsigned char Pv1;           //數碼管顯示
  152. //定義一個指針
  153. /*------------------數碼管腳定義------------------------------------------*/
  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;   //小數點
  162. sbit     COM1        = P3^6;//數碼管個位位選為P3.7
  163. sbit     COM2        = P3^5;//數碼管十位位選為P3.6
  164. sbit     COM3        = P3^4;//數碼管百位位選為P3.5
  165. /*******************************************************************************************
  166. 三位數碼管        LEDTYPE =1,共陽數碼管 ;LEDTYPE =0,共陰數碼管試 LED顯示相關定義
  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         //如果用共陰還是共陽數碼管只要改變這里就行了
  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. /*------------------數碼管段碼表----------------------------------------*/
  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. **         函數名稱:                        void        digital_CODE()
  271. **        功能描述:                        驅動數碼管位碼
  272. **        創 建 者:                        李文杰
  273. **        創建時間:                        2017-11-28 3:48
  274. **        版    本:                        v1.0.0
  275. *********************************************************************************************************/
  276. void digital_CODE(unsigned char ch)  //led段碼發送函數開始  
  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. **         函數名稱:                        void        uartsends()
  290. **        功能描述:                        串口發送數據串
  291. **        創 建 者:                        李文杰
  292. **        創建時間:                        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. /*************把組態王中的ASSIC碼轉換成16進制兩個ASSIC組成1BYTE16進制碼與常規的ASSIC轉法不一樣*********/
  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. **         函數名稱:                        data_num(void)
  345. **        功能描述:                        判斷發送和寫的字節數
  346. **        創 建 者:                        李文杰
  347. **        創建時間:                        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. /****************根據接收到的信息處理回傳的信息**************************/
  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];         //字節數同步
  366. sendbuf[4]=recbuf[10];
  367. /********讀1字節數************************************/
  368. if(data_num()==1) {
  369.   datBYTE[0]=Control_MCUIO;                //組態王讀單片機時只要把P0,P1,P2的數據放到datBYTE[0]中就可以讀出MCUIO的狀態
  370.   ctmp1=(datBYTE[0]>>4)&0x0f;
  371.   if(ctmp1>9)                                    //把十六進制碼轉化成ASSIC碼放入sendbuf[5]sendbuf[6]中以便發送
  372.   sendbuf[5]=ctmp1%9+0x40;
  373.   else
  374.   sendbuf[5]=ctmp1+0x30;  
  375.   ctmp2=datBYTE[0]&0x0f;             //把十六進制碼轉化成ASSIC碼放入sendbuf[5]sendbuf[6]中以便發送
  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;                                //字節讀回傳10個數據
  396.   uartsends(sendbuf,SendNum);
  397.                                    }
  398. /********讀2字節數************************************/
  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個數據
  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);                        //字節讀回傳12個數據
  420.                                    }                 
  421. /********讀4字節數************************************/

  422. if(data_num()==4) {
  423. sendbuf[5] =0X30;         //字節數同步
  424. sendbuf[6] =0X30;
  425. sendbuf[7] =0X46;         //字節數同步
  426. sendbuf[8] =0X46;
  427. sendbuf[9] =0X46;         //字節數同步
  428. sendbuf[10]=0X46;
  429. sendbuf[11]=0X30;         //字節數同步
  430. sendbuf[12]=0X30;
  431. xordat=0;
  432. for(i=1;i<13;i++)                         //異或之和12個數據
  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;                                //字節讀回傳16個數據
  447. uartsends(sendbuf,SendNum);
  448.                                    }

  449. }

  450. /****************組態王寫字節數據處理**************************/
  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--數據是200
  453. //字頭-地址--模 式-數據-- 地址-字-節--數-值--異-或
  454. //--0  1  2  3  4  5--6--7--8  9  10  11 12  13 14 15

  455. void writeMCU()
  456. {   unsigned char temp;                  //組態王寫入MCU的數據值
  457.     unsigned int  tempAddr;          //組態王寫入MCU的地址值X0,X1--X200
  458.         temp=CharToHex(recbuf[11]);
  459.         temp=(temp<<4)&0XF0;
  460.         temp+=CharToHex(recbuf[12]);
  461.         datBYTE[0]=temp;                          //寫入單片機的內存
  462.         Control_MCUIO=datBYTE[0];                  //單片機的IO等于組態王寫過來的數據組態王寫入MCU的數據值
  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. **         函數名稱:                        write_inform(unsigned char dat)
  474. **        功能描述:                        單片機向計算機組態王發送8字節數據
  475. **        創 建 者:                        李文杰
  476. **        創建時間:                        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;             //數據高位若正確回復23不正確回復2a
  485. Answer[4]=dat;             //數據低位若正確回復23不正確回復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. **         函數名稱:                        AddrInit()
  504. **        功能描述:                        地址數據初始化
  505. **        創 建 者:                        李文杰
  506. **        創建時間:                        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. **         函數名稱:                        void Write_byte()
  537. **        功能描述:                        轉換組態王發送的字節到dat區
  538. **        創 建 者:                        李文杰
  539. **        創建時間:                        2017-11-28 3:48
  540. **        版    本:                        v1.0.0
  541. *********************************************************************************************************/
  542. void Sendkingviow()
  543. {                    switch(ReceiveLen)
  544.                                            {
  545.                                                    /*組態王讀數據單片機回傳*/
  546.                                  case 14:   
  547.                                                                                   Information_processing();                                                                     
  548.                                                                     ;break;
  549.                                                    /*組態王寫字節數據單片機回傳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.                                                         /*組態王寫雙字節數據單片機回傳*/
  555.                                                         case 18:   
  556.                                                                     write_inform('#');
  557.                                                                    ;break;
  558.                                                         /*組態王寫四字節數據單片機回傳*/
  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. **         函數名稱:                        serial_init()
  642. **        功能描述:                        串口1初始化函數
  643. **        創 建 者:                        李文杰
  644. **        創建時間:                        2017-11-28 3:48
  645. **        版    本:                        v1.0.0
  646. *********************************************************************************************************/
  647. void serial_init()
  648. {
  649. /*****************AT89C52單片機定時器1做波特率發生器***************************/
  650. /*
  651.     SCON=0x50;
  652.     TMOD=0X20;
  653.     TH1=0xfd;
  654.     TL1=0xfd;
  655.     TR1=1;           */
  656. /*****************STC15F2K60S2定時器1做波特率發生器***************************/
  657. /*        PCON &= 0x7F;                //波特率不倍速
  658.         SCON = 0x50;                //8位數據,可變波特率
  659.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  660.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  661.         TMOD &= 0x0F;                //清除定時器1模式位
  662.         TMOD |= 0x21;                //設定定時器1為8位自動重裝方式
  663. #if (CH1==   9600)
  664.         TL1 = 0xdc;                //設定定時初值
  665.         TH1 = 0xdc;                //設定定時器重裝值 0xdc
  666. #elif (CH1==   19200)
  667.         TL1 = 0xEE;                //設定定時初值
  668.         TH1 = 0xEE;                //設定定時器重裝值
  669. #endif
  670.         ET1 = 0;                //禁止定時器1中斷
  671.         TR1 = 1;                //啟動定時器1
  672. /*****************STC15F2K60S2定時器2做波特率發生器**************************/
  673.     T2L = (65536 - (MAIN_Fosc/4/BAUD));   //設置波特率重裝值
  674.     T2H = (65536 - (MAIN_Fosc/4/BAUD))>>8;
  675.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  676.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器         
  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. **         函數名稱:                        void        main()
  689. **        功能描述:                        主函數
  690. **        創 建 者:                        李文杰
  691. **        創建時間:                        2017-11-28 3:48
  692. **        版    本:                        v1.0.0
  693. *********************************************************************************************************/
  694. void main (void)//主函數
  695. { TH0=T1MS>>8;                                                  //1MS
  696.   TL0=T1MS;
  697.   ET0=1;
  698.   TR0=1;
  699. ……………………

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

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

使用道具 舉報

ID:243220 發表于 2018-11-7 10:22 來自手機 | 顯示全部樓層
樓主,試過你的,stc89c52
回復

使用道具 舉報

ID:149389 發表于 2019-9-9 20:52 來自手機 | 顯示全部樓層
很好的參考資料
回復

使用道具 舉報

ID:95120 發表于 2020-1-31 11:00 | 顯示全部樓層
請問組態王怎樣向單片機發送讀取指令呢?不用系統自動發送的。例如我想通過一個按鈕實現向單片機發送讀取X6的指令?
回復

使用道具 舉報

ID:283207 發表于 2020-2-1 16:24 | 顯示全部樓層
謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄片毛片 | 男女羞羞视频网站 | 日韩高清一区二区 | 亚洲毛片| 国内精品久久久久久 | 久久精品亚洲 | 国产精品视频免费看 | 亚洲一二三区精品 | 在线中文视频 | 天天看逼| 999免费视频| 亚洲国产18 | 国产成人精品区一区二区不卡 | 欧美国产中文 | 欧美色人| 亚洲国产精品精华素 | 国产精品视频免费观看 | 久久精品国产一区 | 亚洲va在线va天堂va狼色在线 | 久久99久久久久 | 日本理论片好看理论片 | 午夜精品久久久久久 | 青青久久 | 国产欧美久久精品 | 免费欧美| 欧美一区视频 | 欧美视频日韩 | 久久一区二区三区四区 | 国产网站在线免费观看 | 看毛片的网站 | 亚洲国产激情 | 日本一卡精品视频免费 | 国产在线观看一区二区 | 涩色视频在线观看 | 国产中文在线 | 精品久久久久久久久久久 | 龙珠z在线观看 | 国产一二三视频在线观看 | 麻豆hd | 综合久 | 综合中文字幕 |