【蓝桥杯】My Bug Note

本文详细讨论了在嵌入式系统开发中遇到的问题,包括温度传感器DS18B20的读取、定时器2驱动串口通信、按键处理、LED闪烁频率调整以及超声波测距的数码管显示格式,同时涉及字符串通过串口发送的优化。
摘要由CSDN通过智能技术生成

测温不正常

原因:

unsigned long Temp;

unsigned long GetTemp()
{
	unsigned char low,high;
	unsigned long temp;

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=high&0x0f;
	temp<<=8;
	temp|=low;
	temp=temp*625;
	return temp;
}

main中的Temp大小定义应该与后面ds18b20中返回值定义一致,否则会发生错误。
涉及到的地方:

unsigned long Temp;
unsigned long GetTemp()
unsigned long temp;

定时器2作串口1收不到信息

使用stc-isp自动生成波特率设置后,要注意两点:

  1. 下载时设置的的频率要与生成代码时设置的频率一致
    在这里插入图片描述
  2. 初始化要打开CPU的总中断允许控制位,即EA=1;
    还要打开串行口1中断允许位,即ES=1;
void Uart1Init(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0xC7;			//设置定时初始值
	T2H = 0xFE;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	EA=1;ES=1;			//这一句自己加的
}

关于按键问题

刚开始按键任务里面是用swich写的,所以没发生问题
现在没用switch问题就出现了
注意写条件的时候要加上key!=0

void Task_Key()
{
	if((Key==11)&(show==1))
	{
		State[0]=20;State[1]=20;State[2]=20;State[3]=20;
		weiflag=1;show=2;
	}
	else if((Key!=0)&(show==2))
	{
		LEDx_ON(weiflag);weiflag++;
	}

}

关于LED闪烁频率变换

在定时器中写的时候要注意不要写==
比如定时器已经数到333了此时要数到400
而此时频率修改从400变成了200,此时就需要把==变成>=

if(++shijian_tt>=shijian_flag){shijian_Ref=1;shijian_tt=0;}

关于写闪烁逻辑正确却没有闪烁现象

最简单的错了,那就是定义
往往定义是一秒,那在写的时候往往是复制粘贴改的,所以发生了错误
比如这是时钟的定义

u8 DS_tt;
bit DS_Ref;

往往我是复制这个的,昨天明明还在写,今天却没出现闪烁现象
检查一番发现是定义错了

void Task_Timer()
{
    if(++SEG_tt==50){SEG_Ref=1;SEG_tt=0;}
    if(++DS_tt==100){DS_Ref=1;DS_tt=0;}
    if(++TEMP_tt==100){TEMP_Ref=1;TEMP_tt=0;}
    if(++SS_tt==500){SS_Ref=1;SS_tt=0;}
}

应该是这样

u16 SS_tt;
bit SS_Ref;

关于闪烁的改进

原来的:

void Task_Timer()
{
    if(++SS_tt==500){SS_Ref=1;SS_tt=0;}
}
///
void Task_Cpu()
{
	if (SS_Ref==1)
    {
        SS_Ref=0;
		ssflag=!ssflag;
    }
}


现在的:

void Task_Timer()
{
    if(++SS_tt==500){SS_Ref=!SS_Ref;SS_tt=0;}
}

关于超声波测距数码管显示

!(https://img-blog.csdnimg.cn/direct/b44951ba3a6a4745ac2783839d63f2b3.png)
在这很明显可以看到中间不显示的地方只有三位而不是四位
当距离是三位数时,显示三位,而两位则只显示两位,而不是百位上显示0

		if(Sonic_Value>=100)
		{
			DigBuf[5]=Sonic_Value/100;DigBuf[6]=Sonic_Value%100/10;DigBuf[7]=Sonic_Value%10;
		}
		else
		{
			DigBuf[5]=20;DigBuf[6]=Sonic_Value%100/10;DigBuf[7]=Sonic_Value%10;
		}

关于串口发送字符串

void Uartsend(unsigned char byte)//发送
{
	SBUF=byte;//把数据写入发送缓冲区SBUF
	//数据发送完成的标志是TI=1;所以等待数据传送完
	while(TI==0);
	TI=0;//软件清零
}


void Uartsend_Str(u8 *str)
{
	while(*str!='\0')
	{
		Uartsend(*str);
		str++;
	}
	
}

题目要求:
在这里插入图片描述
则:

		if(Sonic_Value<100)
		{
			x1=Sonic_Value/10+48;x2=Sonic_Value%10+48;
			Uartsend_Str("Distance:");
			Uartsend(x1);
			Uartsend(x2);
			Uartsend_Str("cm");
		}
		else
		{
			x1=Sonic_Value/100+48;x2=Sonic_Value%100/10+48;x3=Sonic_Value%10+48;
			Uartsend_Str("Distance:");
			Uartsend(x1);
			Uartsend(x2);
			Uartsend(x3);
			Uartsend_Str("cm");
		}

需要吧数字拆开分别发送,而且因为是文本模式不能直接发送数字
要在数字原本的基础上+48发送

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

略不世出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值