出错点
if(rx_buffer_date[0]=='A' && rx_buffer_date[1]=='B' && rx_buffer_date[2]=='C')
一个字符用单引号,字符串才用多引号
分析
找到STCF1的例程,定时器2串口1或者定时器1串口1(只有串口1可以用来进行通讯)
建议使用定时器1作为波特率发生器,定时器2作为数码管刷新定时器,
优先级:定时器0>定时器1>定时器2
如果使用定时器0作为数码管刷新电路,定时器1作为波特率发生器,则偶尔会发生串口通讯被定时器0打断,也就会出现得发几次数据发生实现我们的功能
bit busy=0;
unsigned char rx_buffer[10];
unsigned char rx_buffer_size=0;
①创建uart.c和uart.h文件
②赋值函数SendString()
③赋值SendData()删除奇偶检验部分
④写Uart1_Init_time2部分
打开stc波特率发生选择串口1定时1 8位数据
再加上ES=1;EA=1;
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE0; //设定定时初值
TH1 = 0xFE; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
⑤void Uart() interrupt 4 using 1 复制
修改一些如下。我觉得之前可能出错在于使用了定时器2作为波特率发生器,而中断服务函数使用了定时器1的ISR
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
rx_buffer[rx_buffer_size]=SBUF;
rx_buffer_size++; //在这里出过错,写错成rx_buffer
if(rx_buffer_size==3)
{
if(rx_buffer[0]= ='H' && rx_buffer[1]= ='E' && rx_buffer[2]= ='L')
{
relay_flag=1;
}
else
{
relay_flag=0;
}
rx_buffer_size=0;//!!一定要写在外面,不然结果就是发生正确字符后,一直要等待buffer区域被重新覆盖才会实现新功能
}
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
补充
字符0对应的ascii是48,所以如果串口发送-0-23
如果读取第一位则结果是48,所以如果要正常十进制数的话需要减去48
if(rx_buffer[0]=='-' &&rx_buffer[2]=='-')
{
uart_flag=1;
uart_one=rx_buffer[1];
uart_two=rx_buffer[3]-48;
uart_three=rx_buffer[4]-48;
}
举例
PC向设备发送字符串“-#-**(波特率为9600)
#只能是1,2,3代表设置(时分秒)
代表要设置时、分、秒,且注意边界
if(uart_flag==1)
{
uart_flag=0;
if(uart_one==1)
{
set_sfm(uart_two*10+uart_three,fen,miao);
}
if(uart_one==2)
{
set_sfm(shi,uart_two*10+uart_three,miao);
}
if(uart_one==3)
{
set_sfm(shi,fen,uart_two*10+uart_three);
}
}
ET0=0;
shi=Read_Ds1302(0x85);
fen=Read_Ds1302(0x83);
miao=Read_Ds1302(0x81);
ET0=1;
shi=(shi/16)*10+shi%16;
fen=(fen/16)*10+fen%16;
miao=(miao/16)*10+miao%16;
//注意字符0对应48
//使用完后最好把缓冲区清除一下
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
rx_buffer[rx_buffer_index]=SBUF;
rx_buffer_index++;
if(rx_buffer_index==5)
{
if(rx_buffer[0]=='-' &&rx_buffer[2]=='-')
{
uart_flag=1;
uart_one=rx_buffer[1]-48;
uart_two=rx_buffer[3]-48;
uart_three=rx_buffer[4]-48;
}
else
{
relay_flag=0;
// P2=0xA0;P0=0x00;P2=0x00;
}
rx_buffer_index=0;
rx_buffer[0]=0;rx_buffer[1]=0;rx_buffer[2]=0;rx_buffer[3]=0;rx_buffer[4]=0;
}
}
if (TI)
{
TI = 0;
busy = 0;
}
}