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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6899|回復: 9
收起左側

組態王與單片機通訊上位機下位機源程序與協議等資料下載

  [復制鏈接]
ID:69175 發表于 2018-1-10 15:14 | 顯示全部樓層 |閱讀模式
組態王單片機通訊資料包:
0.png

組態王與單片機通訊協議:

0.png 0.jpg

單片機源程序如下:
  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.   serial_init();
  700.   P1M0=B(00000000);//P1除P1.0,P1.1,P1.2為輸入模式外均為正常模式
  701.   P1M1=B(00000000);
  702.   P1ASF=(00000000);//設置P1相應ADC轉換的I/O口為ADC輸入模式
  703.   P2M0=B(11111111);//P2都是推挽模式
  704.   P2M1=B(00000000);
  705.   P3M0=B(11110000);//P3.4,P3.5,P3.6,P3.7為推挽模式,P3.2,P3.3為輸入模式,其余正常模式
  706.   P3M1=B(00000000);
  707.   while(1){        
  708.                          if(recok)          //把數據發送到上位機
  709.                         {
  710. ……………………

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

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

評分

參與人數 3黑幣 +67 收起 理由
danpianji3501 + 7 這個貼 可是 技術含量貼,建議加精!若有MC.
tieq1952 + 10 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:7485 發表于 2018-1-11 07:31 | 顯示全部樓層
這個好!
回復

使用道具 舉報

ID:253767 發表于 2018-1-11 08:21 | 顯示全部樓層
這個好,太有用了
回復

使用道具 舉報

ID:279184 發表于 2018-1-24 10:36 | 顯示全部樓層
不知道能不能下載
回復

使用道具 舉報

ID:300126 發表于 2018-3-31 22:00 | 顯示全部樓層
好資料,學習一下
回復

使用道具 舉報

ID:46475 發表于 2018-4-3 21:48 | 顯示全部樓層
技術含量貼
回復

使用道具 舉報

ID:268395 發表于 2018-4-9 23:27 來自手機 | 顯示全部樓層
支持大佬
回復

使用道具 舉報

ID:380052 發表于 2018-8-29 22:44 | 顯示全部樓層
非常需要,樓主給力
回復

使用道具 舉報

ID:463013 發表于 2019-1-18 15:53 | 顯示全部樓層
真好啊這個!!!!!!!!!!
回復

使用道具 舉報

ID:670806 發表于 2019-12-22 23:18 | 顯示全部樓層
值得學習!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 日韩在线观看 | 国产成人精品在线 | 欧美日韩精品中文字幕 | 久久精品 | 色资源在线观看 | 成人免费一区二区三区视频网站 | 亚洲影视在线 | 午夜视频在线免费观看 | 91免费视频 | 亚洲国产精品第一区二区 | 欧美一区2区三区4区公司二百 | 你懂的在线视频播放 | 日韩a视频 | 欧美区日韩区 | 日本三级日产三级国产三级 | 国产精品一区二区久久 | 精品一区av | 欧美极品在线播放 | 99久久婷婷国产综合精品电影 | 亚洲a视频 | 亚洲一区国产精品 | 欧美簧片 | 福利视频网址 | 在线国产视频 | 久草热视频 | 国产成人久久精品一区二区三区 | 精品一区在线看 | 日本精品视频一区二区 | 成人亚洲片 | 中文字幕av高清 | 久久久久久久久91 | 久久精品日产第一区二区三区 | 成人国产网站 | 久久久久久91 | 欧美精品一二区 | 亚洲三级在线 | 国产亚洲一区二区精品 | 九九在线视频 | 国产精品久久国产精品久久 | 日韩一区在线播放 |