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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14682|回復: 9
打印 上一主題 下一主題
收起左側

單片機根據串口接收字符串執行命令,適合串口控制

  [復制鏈接]
跳轉到指定樓層
樓主
ID:283384 發表于 2018-2-9 18:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機串口接收字符串    然后根據接收到的字符串執行命令,適合各種串口通訊實現控制

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

  6. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  7. #include "string.h"
  8. #include "intrins.h"
  9. typedef unsigned int u16;          //對數據類型進行聲明定義
  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. * 函數名         :UsartInit()
  34. * 函數功能                   :設置串口
  35. * 輸入           : 無
  36. * 輸出                  : 無
  37. *******************************************************************************/
  38. void UsartInit()
  39. {
  40.         SCON=0X50;                        //設置為工作方式1
  41.         TMOD=0X21;                        //設置計數器工作方式2
  42.         PCON=0X80;                        //波特率加倍
  43.         TH1=0XF4;                                //計數器初始值設置,注意波特率是4800的,晶振11.0592
  44.         TL1=0XF4;
  45.         ES=1;                                                //打開接收中斷
  46.         EA=1;                                                //打開總中斷
  47.         TR1=1;                                                        //打開計數器
  48.         ET0 = 1;
  49.     TR0 = 1;
  50.         TH0 = 0x4C;
  51.     TL0 = 0x00;       
  52.         WDT_CONTR=0x35;                       
  53. }

  54. /*******************************************************************************
  55. * 函 數 名       : main
  56. * 函數功能                 : 主函數
  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. * 函數名         : Usart() interrupt 4
  79. * 函數功能                  : 串口通信中斷函數
  80. * 輸入           : 無
  81. * 輸出                  : 無
  82. *******************************************************************************/
  83. void Usart() interrupt 4
  84. {
  85.         u8 receiveData;

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

  88.         RI = 0;//清除接收中斷標志位
  89.         SBUF=receiveData;//將接收到的數據放入到發送寄存器
  90.         while(!TI);                         //等待發送數據完成
  91.         TI=0;                                                 //清除發送完成標志位
  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. 對比字符串執行命令
  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, 下載次數: 168)


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

使用道具 舉報

沙發
ID:317307 發表于 2018-4-26 20:04 | 只看該作者
正好需要這個。感謝樓主
回復

使用道具 舉報

板凳
ID:192893 發表于 2018-4-27 09:00 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

地板
ID:318243 發表于 2018-7-6 14:44 | 只看該作者
看你Receive函數差一個字符沒接收吧?
回復

使用道具 舉報

5#
ID:490633 發表于 2019-3-14 14:25 | 只看該作者
正好需要這個。感謝樓主分享。
回復

使用道具 舉報

6#
ID:85743 發表于 2019-4-12 09:39 | 只看該作者

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

使用道具 舉報

7#
ID:584695 發表于 2019-8-6 00:54 來自手機 | 只看該作者
到處delay不影響串口實時嗎
回復

使用道具 舉報

8#
ID:85743 發表于 2019-9-2 17:05 | 只看該作者

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

使用道具 舉報

9#
ID:896249 發表于 2021-3-26 22:04 | 只看該作者
字符串接收不了超過10個的怎么辦呢
回復

使用道具 舉報

10#
ID:59884 發表于 2024-1-8 13:18 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看视频h | 国产亚洲精品成人av久久ww | 日韩精品久久久 | 亚洲精品国产一区 | 久久精品97| 欧美v日韩v | 又黄又爽的网站 | 成人av在线播放 | 日本午夜精品 | 成人欧美 | 福利视频一区二区 | 欧美日韩亚 | 一区福利视频 | 欧美乱大交xxxxx另类电影 | 日韩电影免费在线观看中文字幕 | 懂色中文一区二区三区在线视频 | 天天操天天摸天天干 | 日韩欧美国产一区二区 | 国产精品有限公司 | 99re在线视频 | 香蕉大人久久国产成人av | 日本成人在线播放 | 91精品国产高清一区二区三区 | 久久精品国产久精国产 | 九九久久国产 | 成人精品视频在线观看 | 亚州综合在线 | 国产精品久久久久久久模特 | 在线日韩在线 | 成人在线一级片 | 国产一区二区电影 | 日韩在线不卡 | 亚洲一区视频在线 | 国产福利免费视频 | 精品久久1| 91文字幕巨乱亚洲香蕉 | 亚洲精品欧美一区二区三区 | 97精品超碰一区二区三区 | 国产乱码精品一区二区三区中文 | 久久a久久 | 国产国产精品久久久久 |