[蓝桥杯国赛]第七届国赛模拟总结

框框闪烁

方法一:
利用定时器,定义一个1s取反的标志位
方法二(RTC中推荐使用):
扛扛一般出现在rtc中,故也可以对秒%2,为1时框框亮,为0时框框灭

加减按键选择、调整选择位置

要点①:只有在第一次按下时保存一下数据,然后以后对这个保存的数据进行操作(不能对一直更新变化的进行操作)
要点②:通过设置index来选择位置(!保存时转十进制方面后面的加减操作)
//设第一个全局变量settime_index=0;如果按下按键settime_index==0则保存时间

超声波和AD转换需要注意

注意①:adc和超声波都要一个采样时间的,如果采样频繁的话会出问题。超声波50ms采样一次

AD转换计算

如何将adc的0 ~ 255值对应到0 ~ 5000
volt=read_adc(0x0c)*5000/255会有问题

建议都使用乘小数形式

(重要)如何记录并比较
//u8 volt_state=0;	//0:正常	1:超过上限 	2:超过下限
switch(volt_state == 0)
{
	case 0:		//正常模式
				if(read_adc_vol>threshold_high)
				{
				
				}
				if(read_adc_vol<threshold_low)
				{
				
				}
				break;
	case 1:		//高于上限->正常
				if(read_adc_vol<threshold_high)
				{
					question_vol_state=0;
				}
				break;
	case 2:		//低于下限->正常
				if(read_adc_vol>threshold_low)
				{
					question_vol_state=0;
				}
				break;
}

这个状态机的好处在于只记忆超过范围的一次数据,一超过就切换状态,知道恢复正常状态才能回到正常模式,所以不用再定义save_miao=miao;直接用miao就行
但是要注意,由于我用的查询也是在display_mode里,如果切换到查询模式,时钟和电压都没工作,要在时钟工作判断里或上if(display_mode= =2 || display_mode= =5)
电压或查询模式都可以进入电压采集

//下面本第7届代码中相应部分
				switch(question_vol_state)
				{
					//正常模式
					case 0:
						if(read_adc_vol>threshold_high)	//事件0
						{
							question_vol_state=1;		
							question_event_number[0]=0x00;question_event_number[1]=0x00;question_event_number[2]=0x00;
							question_event_number[3]=0x00;question_event_number[4]=0x00;question_event_number[5]=0x00;
							question_event_number[6]=smg_duan[0];question_event_number[7]=smg_duan[0];
							
							question_time[0]=smg_duan[shi/10];question_time[1]=smg_duan[shi%10];question_time[2]=0x40;
							question_time[3]=smg_duan[fen/10];question_time[4]=smg_duan[fen%10];question_time[5]=0x40;
							question_time[6]=smg_duan[miao/10];question_time[7]=smg_duan[miao%10];
				
						}
						if(read_adc_vol<threshold_low)
						{
							question_vol_state=2;
							question_event_number[0]=0x00;question_event_number[1]=0x00;question_event_number[2]=0x00;
							question_event_number[3]=0x00;question_event_number[4]=0x00;question_event_number[5]=0x00;
							question_event_number[6]=smg_duan[0];question_event_number[7]=smg_duan[1];
							
							question_time[0]=smg_duan[shi/10];question_time[1]=smg_duan[shi%10];question_time[2]=0x40;
							question_time[3]=smg_duan[fen/10];question_time[4]=smg_duan[fen%10];question_time[5]=0x40;
							question_time[6]=smg_duan[miao/10];question_time[7]=smg_duan[miao%10];
						}
						break;
					//大于max
					case 1:if(read_adc_vol<threshold_high)question_vol_state=0;	break;
					//小于min
					case 2:if(read_adc_vol>threshold_low)question_vol_state=0;break;
				}
EEPROM存数据如何一上电显示默认值

假如我们要读取的是0x01,在main一开始读取eeprom里找个其他单元例如0x68的值,如果成立等于68,则读取0x01,不成立就 让0x68里的数为68且向0x11、0x12里写预设值
连续写一定要延时!每次写中一定要!一定要!!一定要!!!

	temp_chaxun=read_24c02(0x68);
	if(temp_chaxun==68)
	{
		threshold_high=(unsigned int)read_24c02(0x11)*100;
		threshold_low=(unsigned int)read_24c02(0x12)*100;
	}
	else
	{
		write_24c02(0x78,68);
		Delay_10ms();
		write_24c02(0x11,20);
		Delay_10ms();
		write_24c02(0x12,10);
		Delay_10ms();
	}
提醒

①unsigned char是不能小于0的,如果这save_shi定义为unsigned char是不可能小于0的
在这里插入图片描述
②bug
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: ?DT?USART_READWRITE
LENGTH: 007AH
*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: USARTREADWAVEDATA
MODULE: .\Timer_DAC.obj (TIMER_DAC)
ADDRESS: 0367H
出现以上错误的原因主要是第一个原因,第一个原因导致了它下面所有错误,第一个原因是:
ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: ?DT?GMNS_3V4
LENGTH: 0014H
说明data空间已经不够用,原因是你可能有好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会将变量分配到你在Otions for Target 对话框里的设置的空间。如果你在下图所示中的 Memory Model 里设置成 Small:variables in DATA,则DATA空间很快便用完,导致data空间不够用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值