实现功能:写一个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';
}
}
}
}