[蓝桥杯国赛]串口通讯

出错点
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;              
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值