找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:286803 發(fā)表于 2018-3-2 09:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一個用電腦的com串口命令單片機控制開關(guān)輸出的小程序,如串口發(fā)送led0_open回車后,單片機點亮led0
請多指教!.......

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



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

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

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

  7. unsigned char ID=0;           //用于查找命令數(shù)組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]=  //命令數(shù)組(字符串數(shù)組必須定義為指針型),用于查找swtish case命令對應(yīng)ID執(zhí)行對應(yīng)功能
  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:要發(fā)送數(shù)據(jù)的第9位,RB8:接收到的數(shù)據(jù)的第9位。
  63. // TI: 發(fā)送中斷標志,RI:接收中斷標志。
  64. *****************************************************************************************************/
  65. void init() //串口初始化
  66. {
  67.     /******************設(shè)定定時器*********************/
  68.     TMOD=0X20;   //定時器1定時器方式  工作模式2,可自動重載的8位計數(shù)器常把定時/計數(shù)器1以模式2作為串行口波特率發(fā)生器.
  69.     TH1=0XFD;    //11.0592 19200MHz=9600*2
  70.     TL1=0XFD;  
  71.     ET1=0;       //打開定時器中斷
  72.     TR1=1;       //打開中時器

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

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

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

  81. void UART_Send_Byte(unsigned char dat)  //輸出一個字符
  82. {
  83. SBUF=dat;       //把數(shù)據(jù)送給sbuf緩存器中
  84. while(TI!=1);   //發(fā)送標志位 TI如果發(fā)送了為1,沒發(fā)送為0,沒發(fā)送等待,到了退出循環(huán)
  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) //串口發(fā)送字符串
  93. {
  94.         EA=0;
  95.   while(*p != '\0')                                       //字符串會以 '\0'結(jié)束存在,遇到'\0'則結(jié)束發(fā)送
  96.   {
  97.           UART_Send_Byte(*p);                 //發(fā)送單個字符
  98.           p++;
  99.   }
  100.     EA=1;
  101. }

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

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

  106.         unsigned char m=SBUF;  //m為計算機發(fā)送給串口的數(shù)據(jù),例,open //總體思想是,計算機通知串口,我要發(fā)數(shù)據(jù)了
  107.         RI=0;                  //收到清0
  108.   
  109.         if(m=='\r')            //判斷m這位數(shù)據(jù)有無\r
  110.         {
  111.             UART_Send_Enter(); //回車換行
  112.             str[length]='\0';  //數(shù)據(jù)最后位加0標志位表示發(fā)完了數(shù)據(jù)
  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)         //命令緩存數(shù)組最大是50.
  128.             length=0;             //防止接收過長錯誤命令造成檔機
  129.             UART_Send_Byte(m);    //輸出 比如open
  130.         }
  131.     }
  132. }

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

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

  145. void Command_function()  //得到命令對應(yīng)命令數(shù)組的層數(shù)ID后執(zhí)行相對功能
  146. {
  147.         switch(ID)
  148.         {
  149.                 case 0:          //命令數(shù)組第1個命令
  150.                      led0 = 0;
  151.                      UART_Send_String("led0_open OK\r\n\r\n");
  152.                      break;
  153.                 case 1:          //命令數(shù)組第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);     //查檢所收命令與命令數(shù)組所對應(yīng)的導(dǎo)數(shù)
  236.             Command_function();      //執(zhí)行功能
  237.             length=0;                //長度清0
  238.          //   memset(str,'\0',50);     //清空str命令緩存數(shù)組(memset函數(shù)須包含“string.h”頭文件)
  239.             UART_Flag=0;             //標志位清0
  240.         }
  241.     }
  242. }
復(fù)制代碼

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


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

使用道具 舉報

沙發(fā)
ID:338810 發(fā)表于 2018-10-12 16:15 | 只看該作者
希望有用。下載需用5黑幣
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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