本帖最后由 jinglixixi 于 2021-9-8 23:48 编辑
除了以数码管来显示模拟量的值之外,更直观的是以LED模块来指示液位的状态。为此,我们可在前面的检测上再添加上LED指示液位的功能,使整体的结构如图1所示。
图1检测结构图
所添加的LED模块连接到RB4~RB7来控制,其指示范围则如下:
LED1: 0~1.25V
LED2: 1.25 ~2.5V
LED3: 2.5~3.75 V
LED3: 3.75~ 5V
因此,在MCC中是按图2所示来配置引脚,对应的引脚命名见图3所示。
图2 MCC引脚配置
图3 引脚命名
实现液位指示的主程序则为:
void main(void)
{
int v,d;
float s;
SYSTEM_Initialize();
DELAY_milliseconds(50);
Init_MAX7219();
DELAY_milliseconds(200);
Write_Max7219(0xff,0x00);
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
ADCC_Initialize();
ADCC_StartConversion(channel_ANC2);
LED1_SetHigh();
LED2_SetHigh();
LED3_SetHigh();
LED4_SetHigh();
while (1)
{
v=ADCC_GetSingleConversion(channel_ANC2); // A/D为12位
Write_Max7219(1,v%10);
if(v>10) Write_Max7219(2,v%100/10);
else Write_Max7219(2,0x0f);
if(v>100) Write_Max7219(3,v%1000/100);
else Write_Max7219(3,0x0f);
if(v>1000) Write_Max7219(4,v/1000);
else Write_Max7219(4,0x0f);
s=v*5.0/409.5;
d=s;
Write_Max7219(5,0x0f);
Write_Max7219(6,d%10);
Write_Max7219(7,(d%100/10)|0x80);
Write_Max7219(8,0x0f);
LED2_SetHigh();
LED3_SetHigh();
if((s>2)&&(s<12.5)) LED1_SetLow();
else LED1_SetHigh();
if((s>=12.5)&&(s<25.0)) LED2_SetLow();
if((s>=25.0)&&(s<37.5)) LED3_SetLow();
if(s>=37.5) LED4_SetLow();
else LED4_SetHigh();
DELAY_milliseconds(1000);
}
}
经程序的编译下载,其运行效果如图4所示。
图4 运行效果
若将循环内的程序修改为下面的内容,则可实现图5所示的指示效果。
while (1)
{
v=ADCC_GetSingleConversion(channel_ANC2); // A/D为12位
Write_Max7219(1,v%10);
if(v>10) Write_Max7219(2,v%100/10);
else Write_Max7219(2,0x0f);
if(v>100) Write_Max7219(3,v%1000/100);
else Write_Max7219(3,0x0f);
if(v>1000) Write_Max7219(4,v/1000);
else Write_Max7219(4,0x0f);
s=v*5.0/409.5;
d=s;
Write_Max7219(5,0x0f);
Write_Max7219(6,d%10);
Write_Max7219(7,(d%100/10)|0x80);
Write_Max7219(8,0x0f);
LED2_SetHigh();
LED3_SetHigh();
if(s<2) LED1_SetHigh();
else LED1_SetLow();
if(s>=12.5)
{
LED1_SetLow();
LED2_SetLow();
}
if(s>=25.0)
{
LED1_SetLow();
LED2_SetLow();
LED3_SetLow();
}
if(s>=37.5)
{
LED1_SetLow();
LED2_SetLow();
LED3_SetLow();
LED4_SetLow();
}
else LED4_SetHigh();
DELAY_milliseconds(1000);
}
注:此时已将LED的共阴极接法,该为共阳极接法,以减弱驱动负担。
图5 指示效果
在接入传感器之后,其检测效果如图6所示。稍感遗憾的是似乎传感器出现了问题,无论是侵入水中还是放在空气中,其检测值变换的极小基本无法识别液位的差异性。若当初申请2个就好了,起码能做个比对呀!
此外,传感器的集成性还不够好,使得测试电路连线过多、易产生不稳定问题,不如电容-非接触式传感器好用。
图6 指示效果
|