#include "STC15F2K60S2.h"
#include "stdio.h"
uchar Uart1_Read[50]; //存储接收SBUF内容
uchar RI_ms; //第RI_ms(ms)没有接收数据
uchar Uart1_Read_count; //接收到第Uart1_Read_count个字节数据
bit Uart1_Read_flag; //0-串口1没有在接收,1-串口1正在接收数据
void Rst_Array(uchar str[])//清除数组
{
uchar i;
for(i=0;i<sizeof(str)/sizeof(uchar);i++)
{
str[i]=0;
}
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1=1;
}
void UartInit(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE8; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA=1;
TI=1;
ES=1;
}
void Timeer() interrupt 3
{
if(RI==0){RI_ms++;}//当串口没有在接收数据时开始计时
else{RI_ms=0;} //当串口在接收数据时计时清零
if(RI_ms==50){Uart1_Read_count=0;Uart1_Read_flag=0;}//当计时达到一定时间,说明数据接收完毕,将读计数Uart1_Read_flag清零
}
void Uart1() interrupt 4
{
if(RI)
{
RI=0; //重置标志位
RI_ms=0; //当串口在接收数据时计时清零
Uart1_Read_flag=1; //将正在读取标志位置1;
Uart1_Read[Uart1_Read_count++]=SBUF; //将缓冲区数据存入数组
}
}
void Uart1_Reading_Finished()//读取完毕进行字符串判断
{
if(Uart1_Read_flag==0)//当接收数据完毕时进行判断,将需要判断的字符串放入该if里
{
if(Uart1_Read[0]=='S'&&Uart1_Read[1]=='T')
{
Rst_Array(Uart1_Read);
printf("%s\n","abc");
}
}
}
void main()
{
uchar char_test=8;
uint int_test=2000;
UartInit();
Timer1Init();
// char:%bu int:%hu long:%lu;
//(1)b:八位
//(2)h:十六位(默认)
//(3)l:三十二位
//一条语句中如果有一个占位符选择错误,那么该语句中后面的占位符都将无法正常输出!
printf("char :%bu int:%hu\n",char_test,int_test);
printf("char :%hu int:%hu char:%bu\n",char_test,int_test,char_test);//该条错误;用于测试是否会影响到下面语句输出,测试得出只会影响到当前语句。
printf("char :%bu int:%hu\n",char_test,int_test);
while(1)
{
Uart1_Reading_Finished();//读取完毕进行字符串判断
}
}