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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6228|回復: 1
收起左側

電腦COM口命令51單片機串口控制IO開關輸出 含源碼+Proteus+工具

[復制鏈接]
ID:286803 發表于 2018-3-2 09:53 | 顯示全部樓層 |閱讀模式
一個用電腦的com串口命令單片機控制開關輸出的小程序,如串口發送led0_open回車后,單片機點亮led0
請多指教!.......

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
模擬圖.JPG 添加虛擬串口.JPG

0.png
單片機源程序如下:
  1. /* 發一個用串口命令單片機控制開關輸出的小程序,如串口發送led0_open回車后,單片機點亮led0  */

  2. #include<reg51.h>
  3. #include<string.h> //后面有一個比較函數

  4. bit  UART_Flag=0;             //定義串口接收標志位
  5. idata unsigned char str[50];  //定義一數組,用于串口接收命令緩存
  6. unsigned char length=0;       //數組長度從0開始

  7. unsigned char ID=0;           //用于查找命令數組ID

  8. sbit led0=P1^0; //定義led接口
  9. sbit led1=P1^1; //同上
  10. sbit led2=P1^2; //同上
  11. sbit led3=P1^3; //同上
  12. sbit led4=P1^4; //同上
  13. sbit led5=P1^5; //同上
  14. sbit led6=P1^6; //同上
  15. sbit led7=P1^7; //同上

  16. code unsigned char *coun[16]=  //命令數組(字符串數組必須定義為指針型),用于查找swtish case命令對應ID執行對應功能
  17.               {
  18.                       {"led0_open"},   //ID 0
  19.                       {"led0_close"},
  20.                       {"led1_open"},
  21.                       {"led1_close"},
  22.                       {"led2_open"},
  23.                       {"led2_close"},
  24.                       {"led3_open"},
  25.                       {"led3_close"},
  26.                       {"led4_open"},
  27.                       {"led4_close"},
  28.                       {"led5_open"},
  29.                       {"led5_close"},
  30.                       {"led6_open"},
  31.                       {"led6_close"},
  32.                       {"led7_open"},
  33.                       {"led7_close"}  //ID 15
  34.               };
  35.                                                         
  36. code char *com_face[19]=  //分配使用 idata\xdata\code.
  37.                {
  38.                          "  ~★★   ★★~* \r\n",
  39.                          " *★  ∴*★ *  ∴°★\r\n",
  40.                          "★        *°★\r\n",
  41.                          "★°*   心想事成  *°★\r\n",
  42.                          "  ★‘& ?*°∴°°☆☆★ *°☆☆\r\n",
  43.                          "   ★ °∴°°☆°∴★*°☆∴新°∴*☆\r\n",
  44.                          "    ★*°∴°°☆★∴°∴*°年°∴*°☆\r\n",
  45.                          "     ★°∴★☆∴° ∴*快°∴*°☆\r\n",
  46.                          "      ★  ☆∴*樂°∴°☆\r\n",
  47.                          "       ﹨  ☆*  ☆\r\n",
  48.                          "        ﹨   ☆\r\n",
  49.                          "         ﹨ │\r\n",
  50.                          "          ﹨/ \r\n",
  51.                          "           ▏\r\n",
  52.                          "           ﹨● \r\n",
  53.                          "             ■﹨\r\n",
  54.                          "   A.y            / ﹨\r\n",
  55.                          "-----------------------------------------------\r\n",
  56.                          "                 串口通信測試v2.0\r\n"
  57.                };

  58. /****************************************************************************************************
  59. //  SCON    D7    D6    D5    D4    D3    D2    D1    D0
  60. //  98H   SM0   SM1   SM2   REN   TB8   RB8    TI    RI
  61. // SM0、SM1:串行口工作方式選擇 01 為方式1、8位異步通信、波特率可變。SM2多機通訊控制位
  62. // REN:接收允許控制位,TB8:要發送數據的第9位,RB8:接收到的數據的第9位。
  63. // TI: 發送中斷標志,RI:接收中斷標志。
  64. *****************************************************************************************************/
  65. void init() //串口初始化
  66. {
  67.     /******************設定定時器*********************/
  68.     TMOD=0X20;   //定時器1定時器方式  工作模式2,可自動重載的8位計數器常把定時/計數器1以模式2作為串行口波特率發生器.
  69.     TH1=0XFD;    //11.0592 19200MHz=9600*2
  70.     TL1=0XFD;  
  71.     ET1=0;       //打開定時器中斷
  72.     TR1=1;       //打開中時器

  73.    /*******************設定串口**********************/
  74.     SCON=0X50;   //選擇工作模式1使能接收,允許發送,允許接收

  75.    /*******************設定中斷**********************/
  76.     EA=1;        //開總中斷
  77.     ES=1;        //打開串口中斷

  78.    /****************設定波特率加倍*******************/
  79.     PCON=0X80;   //8位自動重載,波特率加倍
  80. }

  81. void UART_Send_Byte(unsigned char dat)  //輸出一個字符
  82. {
  83. SBUF=dat;       //把數據送給sbuf緩存器中
  84. while(TI!=1);   //發送標志位 TI如果發送了為1,沒發送為0,沒發送等待,到了退出循環
  85. TI=0;           //到了,TI清為0
  86. }

  87. void UART_Send_Enter() //改送回車換行(\r\n 或 0x0d、0x0a)
  88. {
  89.     UART_Send_Byte(0x0d);
  90.     UART_Send_Byte(0x0a);
  91. }

  92. void UART_Send_String(unsigned char *p) //串口發送字符串
  93. {
  94.         EA=0;
  95.   while(*p != '\0')                                       //字符串會以 '\0'結束存在,遇到'\0'則結束發送
  96.   {
  97.           UART_Send_Byte(*p);                 //發送單個字符
  98.           p++;
  99.   }
  100.     EA=1;
  101. }

  102. void UART_service() interrupt 4   //uart中斷服務 ,4為串口中斷
  103. {

  104.     if(RI==1)  //如果數據已經接收完,即RI=1
  105.     {

  106.         unsigned char m=SBUF;  //m為計算機發送給串口的數據,例,open //總體思想是,計算機通知串口,我要發數據了
  107.         RI=0;                  //收到清0
  108.   
  109.         if(m=='\r')            //判斷m這位數據有無\r
  110.         {
  111.             UART_Send_Enter(); //回車換行
  112.             str[length]='\0';  //數據最后位加0標志位表示發完了數據
  113.             UART_Flag=1;       // 傳 完 標 志 位
  114.         }
  115.         else if(m=='\n')
  116.         { }
  117.             else if(m=='\b')   //b表退格 //下面幾句不要刪除
  118.             {
  119.                 UART_Send_Byte('\b');
  120.                 UART_Send_Byte(' ');
  121.                 UART_Send_Byte('\b');
  122.                 length=length-1;  //刪除了后總長度減一
  123.             }
  124.         else
  125.         {
  126.             str[length++]=m;      //比如m為open,先傳0后傳p,length加一
  127.             if(length>45)         //命令緩存數組最大是50.
  128.             length=0;             //防止接收過長錯誤命令造成檔機
  129.             UART_Send_Byte(m);    //輸出 比如open
  130.         }
  131.     }
  132. }

  133. void Get_command_ID(unsigned char *str) //獲取命令在命令數組中的ID
  134. {
  135.         for (ID = 0; ID < 16; ID++)           //"16"為命令數組的層數
  136.         {
  137.                 if(strcmp(coun[ID],str)==0)         //"strcmp"函數用于命令數組的命令與接收到的命令進行對比,相同結果為0.
  138.                         break;                            //相同則結束對比
  139.         }

  140.         if (ID >= 16) //所有命令不符。
  141.         {
  142.                  ID=255;    //得到提示命令錯誤的ID
  143.         }
  144. }

  145. void Command_function()  //得到命令對應命令數組的層數ID后執行相對功能
  146. {
  147.         switch(ID)
  148.         {
  149.                 case 0:          //命令數組第1個命令
  150.                      led0 = 0;
  151.                      UART_Send_String("led0_open OK\r\n\r\n");
  152.                      break;
  153.                 case 1:          //命令數組第2個命令
  154.                      led0 = 1;
  155.                      UART_Send_String("led0_close OK\r\n\r\n");
  156.                      break;
  157.                 case 2:
  158.                      led1 = 0;
  159.                      UART_Send_String("led1_open OK\r\n\r\n");
  160.                      break;
  161.                 case 3:
  162.                      led1 = 1;
  163.                      UART_Send_String("led1_close OK\r\n\r\n");
  164.                      break;
  165.                 case 4:
  166.                      led2 = 0;
  167.                      UART_Send_String("led2_open OK\r\n\r\n");
  168.                      break;
  169.                 case 5:
  170.                      led2 = 1;
  171.                      UART_Send_String("led2_close OK\r\n\r\n");
  172.                      break;
  173.                 case 6:
  174.                      led3 = 0;
  175.                      UART_Send_String("led3_open OK\r\n\r\n");
  176.                      break;
  177.                 case 7:
  178.                      led3 = 1;
  179.                      UART_Send_String("led3_close OK\r\n\r\n");
  180.                      break;
  181.                 case 8:
  182.                      led4 = 0;
  183.                      UART_Send_String("led4_open OK\r\n\r\n");
  184.                      break;
  185.                 case 9:
  186.                      led4 = 1;
  187.                      UART_Send_String("led4_close OK\r\n\r\n");
  188.                      break;        
  189.                 case 10:
  190.                      led5 = 0;
  191.                      UART_Send_String("led5_open OK\r\n\r\n");
  192.                      break;
  193.                 case 11:
  194.                      led5 = 1;
  195.                      UART_Send_String("led5_close OK\r\n\r\n");
  196.                      break;        
  197.                 case 12:
  198.                      led6 = 0;
  199.                      UART_Send_String("led6_open OK\r\n\r\n");
  200.                      break;
  201.                 case 13:
  202.                      led6 = 1;
  203.                      UART_Send_String("led6_close OK\r\n\r\n");
  204.                      break;
  205.                 case 14:
  206.                      led7 = 0;
  207.                      UART_Send_String("led7_open OK\r\n\r\n");
  208.                      break;
  209.                 case 15:
  210.                      led7 = 1;
  211.                      UART_Send_String("led7_close OK\r\n\r\n");
  212.                      break;        
  213.                 case 255:
  214.                      UART_Send_String("Error:-999 --> Command error\r\n\r\n");
  215.                      break;                                       
  216.                 default:
  217.                break;
  218.         }
  219. }

  220. void main(void)
  221. {
  222.           unsigned char i;
  223.     P0=0xff;
  224.     init();
  225.           for (i = 0; i < 19; i++)
  226.     {
  227.               UART_Send_String(com_face[i]);
  228.     }
  229.                 UART_Send_Enter();
  230.     UART_Send_String("初始化......... OK!\r\n");
  231.     while(1)
  232.     {
  233.         if(UART_Flag==1)             //接收標志位表示接收完成
  234.         {
  235.             Get_command_ID(str);     //查檢所收命令與命令數組所對應的導數
  236.             Command_function();      //執行功能
  237.             length=0;                //長度清0
  238.          //   memset(str,'\0',50);     //清空str命令緩存數組(memset函數須包含“string.h”頭文件)
  239.             UART_Flag=0;             //標志位清0
  240.         }
  241.     }
  242. }
復制代碼

所有資料51hei提供下載:
51 串口通信程序.7z (660.33 KB, 下載次數: 91)
回復

使用道具 舉報

ID:338810 發表于 2018-10-12 16:15 | 顯示全部樓層
希望有用。下載需用5黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品乱码久久久久久按摩观 | 亚洲精品一区国语对白 | 久久综合国产 | 国产东北一级毛片 | 欧美日韩大片 | 精品一区国产 | 国产精品久久久久久久久久久久 | 九九热在线视频免费观看 | 国产一区二区三区久久久久久久久 | 亚洲一区二区三区四区五区中文 | 中文日韩在线 | www.国产精品 | 中文字幕在线观看精品 | 久久久久黑人 | 99久久精品免费视频 | 国产精品久久久久久一区二区三区 | 免费久久久| 国产精品不卡一区 | 性网站免费| 国产精品久久久久久久久 | 精品视频一区二区三区在线观看 | 久久亚洲视频网 | 欧美一二三 | 亚洲精品一级 | 黄色网一级片 | 中文字幕在线不卡 | 久久久精品一区二区三区 | 亚洲 自拍 另类 欧美 丝袜 | 日本国产一区二区 | 狠狠涩 | 免费黄色av网站 | 成人国产精品色哟哟 | 精品动漫一区 | 日韩精品一区二区三区免费视频 | 日韩精品1区2区3区 成人黄页在线观看 | 国产一级毛片视频 | 久久国产成人午夜av影院武则天 | 日韩精品视频一区二区三区 | 色视频在线观看 | avmans最新导航地址 | 中文精品视频 |