单片机论坛

 找回密码
 立即注册
QQ登录 只需一步,快速开始
搜索
查看: 63|回复: 0
收起左侧

单片机根据串口接收字符串执行命令,适合串口控制

[复制链接]
79981045 发表于 2018-2-9 18:50 | 显示全部楼层 |阅读模式
单片机串口接收字符串    然后根据接收到的字符串执行命令,适合各种串口通讯实现控制

单片机源程序如下:
  • /*************** ***********************************************************************
  • *                              串口通信控制                                                                                                  *
  • 实现现象:下载程序后打开串口调试助手,将波特率设置为4800,根据串口接收到的数据执行不同命令。
  • 注意事项:无。                                                                                                                                                                  
  • ***************************************************************************************/

  • #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  • #include "string.h"
  • #include "intrins.h"
  • typedef unsigned int u16;          //对数据类型进行声明定义
  • typedef unsigned char u8;
  • char jiesuo[10] = {'l','j','t','a','o','0','5','2','1','\0'};
  • char suoche[10] = {'q','l','w','q','e','p','5','2','0','\0'};
  • char qixihuo[10] = {'9','1','1','2','1','7','5','2','1','\0'};
  • char receiveDatas[10];
  • sbit k1 = P1^4;
  • sbit k2 = P2^2;
  • sbit k3 = P2^1;
  • sbit k4 = P2^0;
  • sbit da = P1^3;
  • sbit v = P1^5;
  • sbit gnd = P1^2;
  • int br=1;
  • int i=0;
  • int s=0;
  • int t=0;
  • int m=0;
  • void Receive(char x);
  • void result();
  • void delay500ms();
  • void delay1s();
  • sfr WDT_CONTR=0xe1;
  • /*******************************************************************************
  • * 函数名         :UsartInit()
  • * 函数功能                   :设置串口
  • * 输入           : 无
  • * 输出                  : 无
  • *******************************************************************************/
  • void UsartInit()
  • {
  •         SCON=0X50;                        //设置为工作方式1
  •         TMOD=0X21;                        //设置计数器工作方式2
  •         PCON=0X80;                        //波特率加倍
  •         TH1=0XF4;                                //计数器初始值设置,注意波特率是4800的,晶振11.0592
  •         TL1=0XF4;
  •         ES=1;                                                //打开接收中断
  •         EA=1;                                                //打开总中断
  •         TR1=1;                                                        //打开计数器
  •         ET0 = 1;
  •     TR0 = 1;
  •         TH0 = 0x4C;
  •     TL0 = 0x00;       
  •         WDT_CONTR=0x35;                       
  • }

  • /*******************************************************************************
  • * 函 数 名       : main
  • * 函数功能                 : 主函数
  • * 输    入       : 无
  • * 输    出             : 无
  • *******************************************************************************/
  • void main()
  • {       
  •         UsartInit();  //        串口初始化
  •         v=1;
  •         da=1;
  •         gnd=0;
  •         k1=0;
  •         k2=0;
  •         k3=0;
  •         k4=0;
  •         while(1)
  •         {
  •          delay1s();
  •          delay500ms();
  •          WDT_CONTR=0x35;
  •         };               
  • }

  • /*******************************************************************************
  • * 函数名         : Usart() interrupt 4
  • * 函数功能                  : 串口通信中断函数
  • * 输入           : 无
  • * 输出                  : 无
  • *******************************************************************************/
  • void Usart() interrupt 4
  • {
  •         u8 receiveData;

  •         receiveData=SBUF;//出去接收到的数据
  •         Receive(receiveData);

  •         RI = 0;//清除接收中断标志位
  •         SBUF=receiveData;//将接收到的数据放入到发送寄存器
  •         while(!TI);                         //等待发送数据完成
  •         TI=0;                                                 //清除发送完成标志位
  • }

  • /**************************************************
  • 将接收到的字符存入字符串
  • ***************************************************/
  • void Receive(char x)
  •   {
  •   receiveDatas[i]=x        ;
  •   i++;
  •                   if(i==9){
  •                 i=0;
  •                 result();
  •   
  •    }
  •   }

  • /*******************************************
  • 对比字符串执行命令
  • *********************************/
  • void result()
  • {
  •     int a= strcmp(receiveDatas,jiesuo) ;
  •         int b= strcmp(receiveDatas,suoche);
  •         int c= strcmp(receiveDatas,qixihuo);
  •          if(a==0)
  •          {k3=1;
  •           
  •            delay500ms();
  •                    WDT_CONTR=0x35;       
  •            k3=0;
  •                           }
  •           if(b==0)
  •           {
  •           k1=1;
  •           delay500ms();
  •                   WDT_CONTR=0x35;       
  •           k1=0;
  •                      }
  •           if(c==0)
  •           {k2=1;
  •           delay1s();
  •                    WDT_CONTR=0x35;       
  •           delay1s();
  •           
  •           delay1s();
  •                 WDT_CONTR=0x35;                       
  •           delay1s();
  •                
  •           delay1s();
  •                         WDT_CONTR=0x35;       
  •           delay1s();
  •       k2=0;
  •           }
  •           }  


  • /***********************************************
  • 定时器中断
  • *****************************************/
  • void Timer0Interrupt(void) interrupt 1
  • {
  •     TH0 = 0x4C;
  •     TL0 = 0x00;
  •         s++;
  •         t++;

  •          if(s==10){
  •          i=0;
  •          s=0;                    
  •          }
  •          if(t==30)
  •          {
  •                   WDT_CONTR=0x35;       
  •                 t=0;
  •          }
  •          
  •          if(da==0)
  •          {
  •          if (br==1)
  •          {
  •           m++;
  •          if(m==30000)
  •         { k4=1;
  •         delay1s();
  •         delay500ms();
  •                  WDT_CONTR=0x35;       
  •         delay500ms();
  •         delay1s();

  •          k1=1;
  •          br=0;
  •          delay500ms();
  •          k1=0;
  •                 WDT_CONTR=0x35;       
  •         delay1s();
  •         delay500ms();
  •                  WDT_CONTR=0x35;       
  •         delay500ms();
  •         delay1s();
  •                  WDT_CONTR=0x35;       
  •         k4=0;

  •          }
  •          }
  •          }
  •          else
  •          {
  •          br=1;
  •          m=0;
  •          }
  •           
  •     //add your code here!
  • }


  • /*********************************************
  • 延时0.5秒  和延时1秒 9秒
  • *******************************************/
  • void delay1s()   //误差 -0.000000000227us
  • {
  •     unsigned char a,b,c;
  •     for(c=13;c>0;c--)
  •         for(b=247;b>0;b--)
  •             for(a=142;a>0;a--);
  •     _nop_();  //if Keil,require use intrins.h
  • }


  • void delay500ms()   //误差 -0.000000000114us
  • {
  •     unsigned char a,b,c;
  •     for(c=98;c>0;c--)
  •         for(b=127;b>0;b--)
  •             for(a=17;a>0;a--);
  •     _nop_();  //if Keil,require use intrins.h
  • }

  • 复制代码

    所有资料51hei提供下载:
    串口控制.7z (15.52 KB, 下载次数: 0)
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 立即注册
    本版积分规则
    QQ|手机版|小黑屋|单片机论坛
    Powered by 单片机教程网
    快速回复 返回顶部 返回列表