找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12928|回复: 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, 下载次数: 166)


分享到:  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 单片机教程网

快速回复 返回顶部 返回列表