单片机编程中使用标志位的思想可以说是非常普遍和重要,如外设遥控的接收、环境亮度的识别、电池电量的判断等等,现就结合电池电量判断的一个案子来剖析一下。
如在电池供电的设备,根据锂电池3.5V来划分电池电量是正常电量和低电量,采用if-else直接来区分虽然简单省事,不用定义标志位变量,但一定会出现状态不稳定的问题。实际产品在3.5V时来回切换正常和低电模式,所谓模式振荡现象。原因就是3.5V是一个点,而不是一个区间。要想用区间的方式那就需要使用标记位的思想来实现。
直接贴代码来说明一下:
//globle status
//[7]:phone plugged 1: pluged; 0: unpluged,
//[6]:
//[5]:
//[4]:
//[3:0]:power states 0:USB; 1:normal-battery; 2:low-battery
u8 PhoSta = 0;
main
{
g_adc_value0_temp = ADC_Get_Value_Average(2); //获取电池电量
if(g_adc_value0_temp>=2910)assignment(&PhoSta,0); //如果大于2910就标记为USB供电
if(g_adc_value0_temp<2870 && g_adc_value0_temp >= 2250)assignment(&PhoSta,1); //如果小于2870,并且大于2250,就标记为电池供电且电量充足
if(g_adc_value0_temp<2222)assignment(&PhoSta,2); //如果小于2250就标记为电池低电量
//.......
}
在上面代码中定义了一个标志变量PhoSta, 用3个if来定义了电量的3个状态,并且各状态临界处都留了一段区间, 可以有效的防止状态在临界处的振荡,来回切换的现象。