亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2434|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

MCU51-PC通訊協(xié)議

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-13 02:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*                Copyright (c) 2016, 老馬工作室                            */
  4. /*                     All rights reserved.                                 */
  5. /*                                                                          */
  6. /*      Email:pcwebmaster@163.com                                           */
  7. /****************************************************************************/
  8. /****************************************************************************/
  9. /* 文 件 名:comint.c                                                       */
  10. /* 版    本:Version 1.0                                                    */
  11. /* 描    述:串行口中斷帶通訊協(xié)議測(cè)試                                       */
  12. /* 主控芯片:STC89LE54RD*/
  13. /* 晶振頻率:22.1184MHz*/
  14. /* 作    者:pcwebmaster                                                    */
  15. /* 函    數(shù):                                                               */
  16. /*         system_init                                                     */
  17. /*         com_send_command                                                */
  18. /*         com_command_receive*/
  19. /*CalCRC16_1021*/
  20. /*command_decoder*/
  21. /*send_command*/
  22. /* 測(cè)    試: 發(fā)送:16 16 02 01 02 01 00 35 03 94 BD接收:49 16 16 06 AA 55 */
  23. /* 測(cè)試現(xiàn)象:P05/P06/P07三個(gè)LED取反*/
  24. /* 歷史記錄:20016.02.09測(cè)試通過(guò)                                            */
  25. /* 北極狼          20016-02-09     Creat Inital version. (Version 1.0)      */
  26. /****************************************************************************/
  27. #include "comint.h"

  28. void main(void)
  29. {
  30.     u_char i = 0;
  31.     system_init();   
  32.     while(1)
  33.     {
  34.         com_command_receive();
  35.     }
  36. }


  37. #include "comint.h"

  38. u_char  data  pint_buf[MAX_RINTL];   /* 串口接收緩沖區(qū)       */
  39. u_char  data  pint_read;             /* 串口緩沖區(qū)讀指針     */
  40. u_char  data  pint_write;            /* 串口緩沖區(qū)寫指針     */
  41. u_char  data  psend_int;             /* 串口發(fā)送允許標(biāo)志     */
  42. u_char serial_flag = 0;              /* 串口接收數(shù)據(jù)標(biāo)志位   */


  43. u_char  idata prec_buf[MAX_COMMAND_LEN];/* 命令接收緩沖區(qū)    */
  44. u_char  prec_num;                    /* 命令接收緩沖區(qū)字節(jié)數(shù) */

  45. u_char serial_lengthl = 0;           /* 消息命令長(zhǎng)度低8位    */
  46. u_int  serial_length = 0;            /* 消息命令長(zhǎng)度16位     */

  47. u_char ADDRESS[2]={ZU,ZHAN};       /* byte0:通訊組地址, byte1:開(kāi)發(fā)板地址 */

  48. /* 串口發(fā)送一個(gè)字節(jié) */
  49. void com_send_command(char onebyte)
  50. {
  51.     psend_int = 0;
  52.     SBUF = onebyte;
  53.     while (psend_int != 1);
  54. }

  55. /* 串口接收數(shù)據(jù)處理 */
  56. void com_command_receive(void)
  57. {
  58.     u_char var1,var4;
  59.     u_int crc_data = 0;
  60.     var4 = pint_read;

  61.     if (var4 != pint_write)
  62.     {
  63.         var1 = pint_buf[var4];
  64.         var4 = var4+1;
  65.         if (var4 >= MAX_RINTL)
  66.             var4=0;

  67.         pint_read = var4;

  68.         switch(serial_flag)
  69.         {
  70.             case 0: /*收到起始位*/
  71.                 if (var1 == SYN)
  72.                 {
  73.                     serial_flag = 1;
  74. //com_send_command(0x01); //測(cè)試
  75.                 }
  76.                 else
  77.                 {
  78.                     serial_flag = 0;
  79.                 }
  80.                 break;

  81.             case 1:/*收到起始位*/
  82.                 if (var1 == SYN)
  83.                 {
  84.                     serial_flag = 2;
  85. //com_send_command(0x02); //測(cè)試
  86.                 }
  87.                 else
  88.                 {
  89.                     serial_flag = 0;
  90.                 }
  91.                 break;

  92.             case 2:/*收到同步位*/
  93.                 if (var1 == STX)
  94.                 {
  95.                     serial_flag = 3;
  96. //com_send_command(0x03);//測(cè)試
  97.                 }
  98.                 else
  99.                 {
  100.                     serial_flag = 0;
  101.                 }
  102.                 break;

  103.             case 3: /*收到組地址*/
  104.                 if (var1 == ADDRESS[0])
  105.                 {
  106.                     serial_flag = 4;
  107.                     prec_num = 1;
  108.                     prec_buf[0] = var1;
  109. //com_send_command(0x04); //測(cè)試
  110.                 }
  111.                 else
  112.                 {
  113.                     serial_flag = 0;
  114.                 }
  115.                 break;

  116.             case 4:/*收到本機(jī)地址或者廣播地址*/
  117.                 if ( (var1 == ADDRESS[1]) || (var1 == 0) )
  118.                 {
  119.                     prec_num = 2;
  120.                     prec_buf[1] = var1;
  121.                     serial_flag = 5;
  122. //com_send_command(0x05); //測(cè)試
  123.                 }
  124.                 else
  125.                 {
  126.                     serial_flag = 0;
  127.                 }
  128.                 break;

  129.             case 5:/*數(shù)據(jù)長(zhǎng)度*/
  130.                 prec_num = 3;
  131.                 prec_buf[2] = var1;
  132.                 serial_lengthl = var1;
  133.                 serial_flag = 6;
  134. //com_send_command(0x06);//測(cè)試
  135.                 break;

  136.             case 6:
  137.                 prec_num = 4;
  138.                 prec_buf[3] = var1;
  139.                 serial_length |= var1;
  140.                 serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
  141.                 serial_flag = 7;
  142. //com_send_command(0x07);//測(cè)試
  143.                 break;

  144.             case 7:
  145.                 prec_buf[prec_num] = var1;
  146.                 prec_num++;
  147.                 serial_length--;
  148.                 if (serial_length == 0)
  149.                 {
  150.                     crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 計(jì)算crc校驗(yàn)和(從組地址開(kāi)始到ETX )*/

  151.                     if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校驗(yàn)和正確 */
  152.                     {
  153.                         prec_num = 1;
  154.                         var1 = 0;

  155.                         if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */
  156.                         {
  157.                             if (prec_buf[1] != 0x00) /* 如果不是廣播地址則回應(yīng)ACK*/
  158. com_send_command(0x49);//測(cè)試                                msg_last_push(MSG_ACK,0);
  159. send_command(ACK); //測(cè)試   

  160.                             command_decoder(); /* 如果校驗(yàn)和正確,則進(jìn)行命令解碼 */
  161.                         }
  162.                         else
  163.                         {

  164. send_command(NAK); //測(cè)試
  165.                         }
  166.                     }
  167.                     else
  168.                     {

  169. send_command(NAK); //測(cè)試
  170.                     }
  171.                     serial_flag = 0;
  172.                     prec_num = 1;
  173.                 }
  174.                 break;

  175.             default:
  176.                 serial_flag = 0;
  177.                 prec_num = 1;
  178.                 break;
  179.         }
  180.     }
  181. }
  182. /* 命令解碼子程序 */
  183. void command_decoder(void)
  184. {
  185.     u_char i = 0;

  186.     if (prec_buf[4] == 0x31)       /* 設(shè)置報(bào)警閾值   */
  187.     {  
  188. P05 = !P05;//測(cè)試
  189.         return;
  190.     }
  191.     else if (prec_buf[4] == 0x32)  /* 請(qǐng)求報(bào)警閾值 */
  192.     {
  193. P05 = !P06;//測(cè)試
  194.         return;
  195.     }
  196.     else if (prec_buf[4] == 0x33)  /* 修改當(dāng)前時(shí)間 */
  197.     {
  198. P07 = !P07;//測(cè)試
  199.         return;
  200.     }
  201.     else if (prec_buf[4] == 0x34)  /* 請(qǐng)求當(dāng)前時(shí)間 */
  202.     {
  203. P05 = !P05;//測(cè)試
  204. P07 = !P07;//測(cè)試
  205.         return;
  206.     }
  207.     else if (prec_buf[4] == 0x35)  /* 請(qǐng)求當(dāng)前數(shù)據(jù) */
  208.     {
  209. com_send_command(0xAA);//測(cè)試
  210. com_send_command(0x55);//測(cè)試
  211. P0 = ~P0;//測(cè)試
  212.         return;
  213.     }
  214.     else if (prec_buf[4] == 0x36)  /* 請(qǐng)求看門狗信息*/
  215.     {
  216. com_send_command(0xFF);//測(cè)試
  217.         return;
  218.     }
  219.     else if (prec_buf[4] == 0x37)  /* 請(qǐng)求報(bào)警情況 */
  220.     {
  221. com_send_command(0xFF);//測(cè)試
  222.         return;
  223.     }
  224.     else if (prec_buf[4] == 0x38)  /* 配置設(shè)備地址 */
  225.     {
  226.         ADDRESS[0] = prec_buf[5];  /* 通訊組地址   */
  227.         ADDRESS[1] = prec_buf[6];  /* 站地址   */

  228. com_send_command(0xFF);//測(cè)試
  229.         return;
  230.     }
  231.     else if (prec_buf[4] == 0x39)  /* 請(qǐng)求設(shè)備地址 */
  232.     {
  233. com_send_command(0xFF);//測(cè)試
  234.         return;
  235.     }
  236.     else if (prec_buf[4] == 0x3a)  /* 控制模擬量輸出 */
  237.     {
  238. com_send_command(0xFF);//測(cè)試
  239.         return;
  240.     }
  241.     else if (prec_buf[4] == 0x3b)  /* 控制開(kāi)關(guān)量輸出 */
  242.     {
  243. com_send_command(0xFF);//測(cè)試

  244.         return;
  245.     }
  246. }

  247. /* 向PC主機(jī)發(fā)送消息幀,入口參數(shù):消息類型 */
  248. void send_command(u_char command)
  249. {

  250.     switch (command)
  251.     {
  252.         case ACK:
  253.             com_send_command(SYN);
  254.             com_send_command(SYN);
  255.             com_send_command(ACK);
  256.             break;

  257.         case NAK:
  258.             com_send_command(SYN);
  259.             com_send_command(SYN);
  260.             com_send_command(NAK);
  261.             break;

  262.         default:
  263.             break;
  264.     }
  265. }
  266. void system_init()
  267. {
  268.     u_char loop;

  269.     EA = 0;         /* CPU關(guān)中斷      */
  270.     pint_read  = 0; /* 串口緩沖讀指針 */
  271.     pint_write = 0; /* 串口緩沖寫指針 */

  272. //
  273.     SCON = 0x48; //主控芯片STC89LE54RD
  274.     PCON = 0x80;
  275.     TMOD = 0x20;
  276.     TCON = 0x50;
  277.     TH1  = 0xFD;    // 波特率為19200  
  278.     TL1  = 0xFD;
  279.     TR1  = 1;       // 定時(shí)器1啟動(dòng)計(jì)數(shù)*/
  280.     ES   = 1;       /* 串口開(kāi)中斷     */
  281.     PS   = 0;       /* 串口低優(yōu)先級(jí)   */
  282.     REN  = 1;       /* 串口接收允許   */
  283.     EA   = 1;       /* 開(kāi)CPU中斷      */

  284.     loop = SBUF;    /* 清串口緩沖區(qū)   */
  285.     for (loop=0; loop<MAX_RINTL; loop++)
  286.     {
  287.         pint_buf[loop] = 0;
  288.     }
  289. }
  290. /*計(jì)算CRC校驗(yàn)和使用MTT(0X1021)
  291. 參數(shù):
  292. pBuff 為需計(jì)算CRC的緩沖區(qū)的頭指針
  293. BufferLen 緩沖區(qū)長(zhǎng)度(以字節(jié)計(jì))
  294. */
  295. u_short CalCRC16_1021(u_char x[], u_short BufferLen)
  296. {
  297.     u_short i;
  298.     u_char  j;
  299.     u_short crc16 = 0;
  300.     u_short mask = 0x1021;
  301.     u_char *pByteBuffer;
  302.     u_char tmpbyte;
  303.     u_short calval;

  304.     pByteBuffer = &x[0];

  305.     for (i = 0; i < BufferLen; i++)
  306.     {
  307.         tmpbyte = *pByteBuffer;
  308.         calval = tmpbyte << 8;
  309.         for (j = 0; j < 8; j++)
  310.         {
  311.             if ((crc16 ^ calval) & 0x8000)
  312.                 crc16 = (crc16 << 1) ^ mask;
  313.             else
  314.                 crc16 <<= 1;

  315.             calval <<= 1;
  316.         }
  317.         pByteBuffer++;
  318.     }
  319.     return crc16;
  320. }
  321. /* 串口中斷服務(wù)程序,使用第3組寄存器 */
  322. void com_int_proc(void) interrupt 4 using 3
  323. {
  324.     u_char temp;
  325.     u_char temp1;

  326.     if (TI == 1)                /* 是發(fā)送中斷       */
  327.     {
  328.         TI = 0;
  329.         psend_int = 1;          /* 可以發(fā)送         */
  330.     }

  331.     if (RI == 1)                /* 是接收中斷       */
  332.     {
  333.         RI = 0;                 /* 清串口接收中斷   */
  334.         temp1 = SBUF;
  335.         temp  = pint_write + 1; /* 判斷是否可以寫入 */
  336.         if (temp == MAX_RINTL)
  337.         {
  338.             temp=0;
  339.         }

  340.         if (temp != pint_read)
  341.         {
  342.             pint_buf[pint_write] = temp1; /* 讀取數(shù)據(jù) */
  343.             pint_write = temp;
  344.         }
  345.     }
  346. }


  347. #ifndef __COMINT_H__
  348. #define __COMINT_H__

  349. #define ZU0x01 /*組地址*///通訊地址修改這兩項(xiàng)
  350. #define ZHAN0x02 /*站地址*///通訊地址修改這兩項(xiàng)

  351. #include "STC.h"
  352. #include <absacc.h>
  353. #include <intrins.h>
  354. #include <string.h>

  355. typedef unsigned char u_char;
  356. typedef unsigned int  u_int;
  357. typedefunsigned shortu_short;

  358. #define MAX_RINTL        8   /* 串口接收緩沖區(qū)長(zhǎng)度   */
  359. #define SYN           0x16   /* 通訊同步位*/
  360. #define STX           0x02   /* 通訊起始位*/
  361. #define ETX           0x03   /* 通訊結(jié)束位*/

  362. #define ACK           0x06
  363. #define NAK           0x15

  364. #define MSG_ACK          2    /* 正確應(yīng)答信息         */
  365. #define MSG_NAK          3    /* 錯(cuò)誤應(yīng)答信息         */
  366. #define MAX_COMMAND_LEN  16   /* 串口接受命令長(zhǎng)度     */

  367. extern char str_test[25]  ;
  368. extern u_char  data  pint_read;             // 串口緩沖區(qū)讀指針     */
  369. extern u_char  data  pint_write;            // 串口緩沖區(qū)寫指針
  370. //extern u_char  data  psend_int;             // 串口發(fā)送允許標(biāo)志   
  371. extern u_char  data  pint_buf[MAX_RINTL];   // 串口接收緩沖區(qū)      
  372. extern u_char serial_flag;              /* 串口接收數(shù)據(jù)標(biāo)志位   */

  373. extern u_char  idata prec_buf[MAX_COMMAND_LEN];/* 命令接收緩沖區(qū) */

  374. /* 串口發(fā)送一個(gè)字節(jié) */
  375. extern void com_send_command(char onebyte);
  376. /* 串口接收數(shù)據(jù)處理 */
  377. extern void com_command_receive(void);
  378. /* 系統(tǒng)初始化 */
  379. extern void system_init();

  380. ///* 串口接收一字節(jié)數(shù)據(jù) */
  381. //unsigned char UartReadChar(void); //reentrant
  382. /*計(jì)算CRC校驗(yàn)和使用MTT(0X1021)
  383. 參數(shù):
  384. pBuff 為需計(jì)算CRC的緩沖區(qū)的頭指針
  385. BufferLen 緩沖區(qū)長(zhǎng)度(以字節(jié)計(jì))
  386. */
  387. u_short CalCRC16_1021(u_char x[], u_short BufferLen);

  388. /* 命令解碼子程序 */
  389. void command_decoder(void);
  390. /* 向主機(jī)發(fā)送消息幀,入口參數(shù):消息類型 */
  391. void send_command(u_char command);

  392. #endif
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:83138 發(fā)表于 2016-2-15 10:04 | 只看該作者
51黑有你更精彩...................
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表