蓝桥杯单片机 ——接收字符、字符串

 1定时器中断方法 (完整代码在文末!!)

 2.定时的方法(推荐):蓝桥杯单片机第十四届第三次模拟题_让我来瞅一瞅的博客-CSDN博客

  • 定时器0——定时功能

       判断接受数据是否完成 

  • 定时器1——串口功能

          接受、发送数据

一、主机接收下位机(client)-———发送的字符、字符串

//====================接受函数===================================
void ServiceUart() interrupt 4 
{
	if(RI==1)
	{
		RI=0;
		client[R_I++]=SBUF;
	}
}

二、定时器0定时、判断数据是否完成接受

   if(TF0==1)   //10ms溢出接受字符、字符串完成
	  {
			TF0=0;    
			if(R_I !=6)  //R_I计数超过或者少于6  “return” 
			{
				for(i=0;i<7;i++)
				client[i++]=0;  //数组置0
			 }
      }

三、判断接受到的字符、字符串

if((client[0]=='r')&&(client[1]=='e')&&(client[2]=='t')&&(client[3]=='u')&& (client[4]=='r')&&(client[5]=='n')) 
  {  
   Sendstring("点赞收藏老穆雷\r\n"); } //向下位机发送字符串
  }

 完整代码

#include <STC15F2K60S2.H>
unsigned char client[6]; //接受数据的数组长度为6   "return"
unsigned char R_I=0;      //接受计数{接受到了第几个}
unsigned char clientflag=0;  //接受字符完成标志
unsigned char i;
//====================初始化函数===========================
void Timer0Init()		//[email protected](没有中断、只定时溢出、16位不自动重装)
{

	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0xF0;				//设置定时初始值
	TH0 = 0xD8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
}
void Inituart()//串口1定时器1,16位自动重装
{
	Timer0Init();
	SCON = 0x50;	//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE6;		//设定定时初值
	TH1 = 0xFF;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA=1;ES=1;
}
//=======================发送函数=============================
void SendByte(unsigned char dat)
{
	SBUF=dat;
	while(TI==0);
	TI=0;
}
void Sendstring( unsigned char *str)
{
	while(*str !='\0')
	{
		SendByte(*str++);
	}
}
//====================接受函数===================================
void ServiceUart() interrupt 4 
{
	if(RI==1)
	{
		RI=0;
		client[R_I++]=SBUF;
	}
}
//==================主函数===================================
void main()
{
	Inituart();
	Timer0Init();	
	while(1)
	{
	   if(TF0==1)   //10ms溢出接受字符、字符串完成
	  {
			  TF0=0;    
			if(R_I !=6)  //R_I计数超过或者少于6  “return” 
			{
				for(i=0;i<7;i++)
				client[i++]=0;  //数组置0
			 }
		else        //R_I计数刚好等于6
		{
			client[R_I]='\0';  //在return第6位放置‘\0’表示字符串结束
	    
            if((client[0]=='r')&&(client[1]=='e')&&(client[2]=='t')&&(client[3]=='u')&& 
            (client[4]=='r')&&(client[5]=='n')) //判断接受的字符串
			 {
              Sendstring("点赞收藏老穆雷\r\n"); } //向下位机发送字符串
	         }
			R_I=0;  //计数置0
        }
    }
}

 15f98a6ef2114862bd8734e39cd5a3f4.png

常见问题 

1.接受、发送 均为文本模式

2.直接发送数据

3.怎么判断下位机发出的回车

 if((client[0]=='\r')  '\r'为回车

4.怎么判断单个字符

unsigned char client[6]; //接受数据的数组”return为6个字符

数组位置为 0、1、2、3、4、5、6“ "第6位放置‘\0’表示字符串结束

unsigned char client[1]; //接受数据的数组”为1个字符

数组位置为 0、1“ "第1位放置‘\0’表示字符接受

5.下位机的命令需要区分大小写

5.常见题型

cdcac81cf12648108a504fdb183fc701.png

e9df3a1884f7447d9962924e6b5aa400.png

猜你喜欢

转载自blog.csdn.net/qq_56095985/article/details/129820449
今日推荐