找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14731|回復: 9
收起左側(cè)

單片機根據(jù)串口接收字符串執(zhí)行命令,適合串口控制

  [復制鏈接]
ID:283384 發(fā)表于 2018-2-9 18:50 | 顯示全部樓層 |閱讀模式
單片機串口接收字符串    然后根據(jù)接收到的字符串執(zhí)行命令,適合各種串口通訊實現(xiàn)控制

單片機源程序如下:
  1. /*************** ***********************************************************************
  2. *                              串口通信控制                                                                                                  *
  3. 實現(xiàn)現(xiàn)象:下載程序后打開串口調(diào)試助手,將波特率設(shè)置為4800,根據(jù)串口接收到的數(shù)據(jù)執(zhí)行不同命令。
  4. 注意事項:無。                                                                                                                                                                  
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  7. #include "string.h"
  8. #include "intrins.h"
  9. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  10. typedef unsigned char u8;
  11. char jiesuo[10] = {'l','j','t','a','o','0','5','2','1','\0'};
  12. char suoche[10] = {'q','l','w','q','e','p','5','2','0','\0'};
  13. char qixihuo[10] = {'9','1','1','2','1','7','5','2','1','\0'};
  14. char receiveDatas[10];
  15. sbit k1 = P1^4;
  16. sbit k2 = P2^2;
  17. sbit k3 = P2^1;
  18. sbit k4 = P2^0;
  19. sbit da = P1^3;
  20. sbit v = P1^5;
  21. sbit gnd = P1^2;
  22. int br=1;
  23. int i=0;
  24. int s=0;
  25. int t=0;
  26. int m=0;
  27. void Receive(char x);
  28. void result();
  29. void delay500ms();
  30. void delay1s();
  31. sfr WDT_CONTR=0xe1;
  32. /*******************************************************************************
  33. * 函數(shù)名         :UsartInit()
  34. * 函數(shù)功能                   :設(shè)置串口
  35. * 輸入           : 無
  36. * 輸出                  : 無
  37. *******************************************************************************/
  38. void UsartInit()
  39. {
  40.         SCON=0X50;                        //設(shè)置為工作方式1
  41.         TMOD=0X21;                        //設(shè)置計數(shù)器工作方式2
  42.         PCON=0X80;                        //波特率加倍
  43.         TH1=0XF4;                                //計數(shù)器初始值設(shè)置,注意波特率是4800的,晶振11.0592
  44.         TL1=0XF4;
  45.         ES=1;                                                //打開接收中斷
  46.         EA=1;                                                //打開總中斷
  47.         TR1=1;                                                        //打開計數(shù)器
  48.         ET0 = 1;
  49.     TR0 = 1;
  50.         TH0 = 0x4C;
  51.     TL0 = 0x00;       
  52.         WDT_CONTR=0x35;                       
  53. }

  54. /*******************************************************************************
  55. * 函 數(shù) 名       : main
  56. * 函數(shù)功能                 : 主函數(shù)
  57. * 輸    入       : 無
  58. * 輸    出             : 無
  59. *******************************************************************************/
  60. void main()
  61. {       
  62.         UsartInit();  //        串口初始化
  63.         v=1;
  64.         da=1;
  65.         gnd=0;
  66.         k1=0;
  67.         k2=0;
  68.         k3=0;
  69.         k4=0;
  70.         while(1)
  71.         {
  72.          delay1s();
  73.          delay500ms();
  74.          WDT_CONTR=0x35;
  75.         };               
  76. }

  77. /*******************************************************************************
  78. * 函數(shù)名         : Usart() interrupt 4
  79. * 函數(shù)功能                  : 串口通信中斷函數(shù)
  80. * 輸入           : 無
  81. * 輸出                  : 無
  82. *******************************************************************************/
  83. void Usart() interrupt 4
  84. {
  85.         u8 receiveData;

  86.         receiveData=SBUF;//出去接收到的數(shù)據(jù)
  87.         Receive(receiveData);

  88.         RI = 0;//清除接收中斷標志位
  89.         SBUF=receiveData;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  90.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  91.         TI=0;                                                 //清除發(fā)送完成標志位
  92. }

  93. /**************************************************
  94. 將接收到的字符存入字符串
  95. ***************************************************/
  96. void Receive(char x)
  97.   {
  98.   receiveDatas[i]=x        ;
  99.   i++;
  100.                   if(i==9){
  101.                 i=0;
  102.                 result();
  103.   
  104.    }
  105.   }

  106. /*******************************************
  107. 對比字符串執(zhí)行命令
  108. *********************************/
  109. void result()
  110. {
  111.     int a= strcmp(receiveDatas,jiesuo) ;
  112.         int b= strcmp(receiveDatas,suoche);
  113.         int c= strcmp(receiveDatas,qixihuo);
  114.          if(a==0)
  115.          {k3=1;
  116.           
  117.            delay500ms();
  118.                    WDT_CONTR=0x35;       
  119.            k3=0;
  120.                           }
  121.           if(b==0)
  122.           {
  123.           k1=1;
  124.           delay500ms();
  125.                   WDT_CONTR=0x35;       
  126.           k1=0;
  127.                      }
  128.           if(c==0)
  129.           {k2=1;
  130.           delay1s();
  131.                    WDT_CONTR=0x35;       
  132.           delay1s();
  133.           
  134.           delay1s();
  135.                 WDT_CONTR=0x35;                       
  136.           delay1s();
  137.                
  138.           delay1s();
  139.                         WDT_CONTR=0x35;       
  140.           delay1s();
  141.       k2=0;
  142.           }
  143.           }  


  144. /***********************************************
  145. 定時器中斷
  146. *****************************************/
  147. void Timer0Interrupt(void) interrupt 1
  148. {
  149.     TH0 = 0x4C;
  150.     TL0 = 0x00;
  151.         s++;
  152.         t++;

  153.          if(s==10){
  154.          i=0;
  155.          s=0;                    
  156.          }
  157.          if(t==30)
  158.          {
  159.                   WDT_CONTR=0x35;       
  160.                 t=0;
  161.          }
  162.          
  163.          if(da==0)
  164.          {
  165.          if (br==1)
  166.          {
  167.           m++;
  168.          if(m==30000)
  169.         { k4=1;
  170.         delay1s();
  171.         delay500ms();
  172.                  WDT_CONTR=0x35;       
  173.         delay500ms();
  174.         delay1s();

  175.          k1=1;
  176.          br=0;
  177.          delay500ms();
  178.          k1=0;
  179.                 WDT_CONTR=0x35;       
  180.         delay1s();
  181.         delay500ms();
  182.                  WDT_CONTR=0x35;       
  183.         delay500ms();
  184.         delay1s();
  185.                  WDT_CONTR=0x35;       
  186.         k4=0;

  187.          }
  188.          }
  189.          }
  190.          else
  191.          {
  192.          br=1;
  193.          m=0;
  194.          }
  195.           
  196.     //add your code here!
  197. }


  198. /*********************************************
  199. 延時0.5秒  和延時1秒 9秒
  200. *******************************************/
  201. void delay1s()   //誤差 -0.000000000227us
  202. {
  203.     unsigned char a,b,c;
  204.     for(c=13;c>0;c--)
  205.         for(b=247;b>0;b--)
  206.             for(a=142;a>0;a--);
  207.     _nop_();  //if Keil,require use intrins.h
  208. }


  209. void delay500ms()   //誤差 -0.000000000114us
  210. {
  211.     unsigned char a,b,c;
  212.     for(c=98;c>0;c--)
  213.         for(b=127;b>0;b--)
  214.             for(a=17;a>0;a--);
  215.     _nop_();  //if Keil,require use intrins.h
  216. }

復制代碼

所有資料51hei提供下載:
串口控制.7z (15.52 KB, 下載次數(shù): 168)


回復

使用道具 舉報

ID:317307 發(fā)表于 2018-4-26 20:04 | 顯示全部樓層
正好需要這個。感謝樓主
回復

使用道具 舉報

ID:192893 發(fā)表于 2018-4-27 09:00 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:318243 發(fā)表于 2018-7-6 14:44 | 顯示全部樓層
看你Receive函數(shù)差一個字符沒接收吧?
回復

使用道具 舉報

ID:490633 發(fā)表于 2019-3-14 14:25 | 顯示全部樓層
正好需要這個。感謝樓主分享。
回復

使用道具 舉報

ID:85743 發(fā)表于 2019-4-12 09:39 | 顯示全部樓層

感謝樓主分享,正在學習這段
回復

使用道具 舉報

ID:584695 發(fā)表于 2019-8-6 00:54 來自手機 | 顯示全部樓層
到處delay不影響串口實時嗎
回復

使用道具 舉報

ID:85743 發(fā)表于 2019-9-2 17:05 | 顯示全部樓層

正好需要這個。感謝樓主!
回復

使用道具 舉報

ID:896249 發(fā)表于 2021-3-26 22:04 | 顯示全部樓層
字符串接收不了超過10個的怎么辦呢
回復

使用道具 舉報

ID:59884 發(fā)表于 2024-1-8 13:18 | 顯示全部樓層
謝謝樓主分享!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表