[蓝桥杯单片机15]模拟题14-3串口

实现功能:写一个51程序,实现以下功能:

1)当串口发送指令:“Open\r\n”时,3s后,串口返回:“Over! "
2)当串口发送指令数字“1”时,串口返回:“C:23.5”;
当串口发送指令数字“2”时,串口返回:“D:5.35ppm”。

"\r\n" 是两个字符的组合,它们分别代表了回车符和换行符。因此,"\r\n" 共有两个字符。其中,"\r" 表示回车符,其ASCII码为13(0x0D),"\n" 表示换行符,其ASCII码为10(0x0A)。在很多情况下,上位机软件需要在发送数据时在每行末尾添加 "\r\n" 这两个字符,以便与下位机通过串口进行通信。

发送新行(Send a new line)通常是指在文本或数据通信中通过发送回车符和换行符来开始新的一行。回车符和换行符通常被组合在一起使用,形成 "\r\n" 这个组合字符来表示一个新行的开始。

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "string.h"

unsigned char uart_r,i = 0,j = 0;
int ret = 1;
unsigned int time = 0;
bit flag = 0;
unsigned char Rec[8];   //串口接收到的数据
unsigned char openstr[8]="Open\r\n";
unsigned char str[20];
/***************定时器初始化******/
void Timer0Init(void)		//10毫秒@12MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值
	TF0 = 0;		//清除TF0标志
  
  EA = 1;
  ET0 = 1;
	TR0 = 1;		//定时器0开始计时
}

void UartInit(void)		//9600bps@11.0592MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE8;		//设定定时初值
	TH1 = 0xFF;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
  
  EA = 1;
  ES = 1;
	TR1 = 1;		//启动定时器1
}

void SendByte(unsigned char dat)
{
    SBUF = dat;
    while(TI==0);
    TI=0;
}
void SendString(unsigned char* str)
{
  while(*str != '\0')
  {
    SendByte(*str++);
  }
}
void Timer0_Service() interrupt 1
{
  if(ret==0)
  {
    time++;
    if(time == 300)//3s到了
    {
      SendString("Over! ");
      time = 0;
      ret = 1;
//      for(j=0;j<8;j++)
//      {
//        Rec[j]='\0';
//      }
    }
  }
  
}
void Uart_Service() interrupt 4
{
  if(RI==1)
  {
    RI = 0;
    uart_r = SBUF;
    if(uart_r == '1')
    {
      SendString("C:23.5");
    }
    else if(uart_r == '2')
    {
      SendString("D:5.35ppm");
    }
    else if(uart_r != '\n')
    {
      Rec[i++] = uart_r;   
    }
    else
    {
      Rec[i] = uart_r;
      flag = 1;
      i = 0;
    }    
  }
}
void main()
{
  Timer0Init();
  UartInit();
  for(j=0;j<8;j++)
  {
    Rec[j]='\0';
  }
  SendString("IamOk\r\n");
  while(1)
  {
    if(flag==1)
    {
      flag = 0;
      ret = strcmp(Rec,openstr);
      sprintf(str,"\r\nret:%d,Rec:%s",ret,Rec);
      SendString(str);
      if(ret!=0)
        SendString("Error!\r\n");
      for(j=0;j<8;j++)
      {
        Rec[j]='\0';
      }
    }
    
  }

 
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值