楼梯上下口各设置一个感应开关,有人上时,灯从下往上亮,有人下时,灯从上往下亮,同时有人,灯从两边往中间亮。感谢平台好友的指导。需要什么设备来实现这个控制系统?

单片机系统就可以实现这样的功能。前提是你需要懂单片机的知识,会使用C语言编程。

你可以使用两个红外反射型光电二极管,用来检测是否有人通过,然后把检测到的开关信号送给单片机。单片机再通过继电器,可控硅等器件来控制LED灯或其它灯具实现你想要达到的目的。

如果你觉得用单片机太麻烦,你还可以用plc可编程控制器,就是成本高一些,并且你也会plc的编程。

控制器通过三极管输出控制LED灯带的电源,当上下楼梯的两个红外传感器检测到有人体靠近时,则按照时间先后依次输出导通LED,延时一段时间之后,再依次断开LED灯带。

通过我们自定义的中文编程指令实现起来比较麻烦,不易理解。

因此,直接修改控制器的程序实现了这一功能。

下图是客户用按键模拟测试该功能,当按键闭合时,三极管输出按顺序闭合,延时之后,按顺序反向断开。

正如题目所说,难度在于,当两边同时有人下来或上去时,需要从两边往中间亮,再从中间开始灭,这个需要用一些比较特殊的数据结构和算法。

通过三极管输出的LED指示灯可以很直观看到整个控制过程。

以下部分是实现该功能的单片机程序代码,用了一些算法。

U16 lednum;

U8 i,ni;

U8 j;

U16 offtimer;

U16 ontimer;

U8 pos;

U8 hasadd;

U8 triggerflag = 0;

U16 pertimer;

U32 flags;

U8 dectime;

if((g_sw_stRegs[0].m_uchState)

|| (g_sw_stRegs[1].m_uchState)){

switchtimer = 15;

}

if(g_tm_stTimerFlag.Bits.bTimer100ms){

if(switchtimer > 0){

switchtimer --;

}

}

if((g_sw_stRegs[0].m_uchTrigger)

&& (g_sw_stRegs[0].m_uchState))

{

triggerflag = 1;

}

if((g_sw_stRegs[1].m_uchTrigger)

&& (g_sw_stRegs[1].m_uchState))

{

triggerflag = 2;

}

if(CT_GET_VAR(100)

CT_WRITE_VAR(100, 1);

}

if(CT_GET_VAR(100) > 32){

CT_WRITE_VAR(100, 32);

}

if(CT_GET_VAR(101)

CT_WRITE_VAR(101, 1);

}

if(triggerflag > 0){

lednum =(U8)CT_GET_VAR(100);

pertimer = (U16)CT_GET_VAR(101);

for(i = 0; i

ni = i;

if(triggerflag == 2){

ni = lednum - 1 - i;

}

ontimer = (U16)i * pertimer;

offtimer = ontimer + (U16)lednum * pertimer + CT_GET_VAR(102);

CT_WRITE_VAR(160, ontimer);

CT_WRITE_VAR(161, offtimer);

pos = 0;

hasadd = FALSE;

for(j = 0; j

{

if(led_stcon[ni].ledslot[j].used == TRUE){

if((led_stcon[ni].ledslot[j].ontimer

&& (led_stcon[ni].ledslot[j].offtimer

{

led_stcon[ni].ledslot[j].offtimer = offtimer;

hasadd = TRUE;

break;

}

}else{

if(pos

pos = j + 1;

}

}

}

if(hasadd == FALSE){

if(pos > 0){

led_stcon[ni].ledslot[pos - 1].ontimer = ontimer;

led_stcon[ni].ledslot[pos - 1].offtimer = offtimer;

led_stcon[ni].ledslot[pos - 1].used = TRUE;

}

}

}

}

if(g_tm_stTimerFlag.Bits.bTimer100ms){

flags = 0;

for(i = 0; i

hasadd = FALSE;

ni = i;

for(j = 0; j

{

if(led_stcon[ni].ledslot[j].used == TRUE){

dectime = FALSE;

if(fnUser_AllZeros())

{

if(switchtimer == 0){

dectime = TRUE;

}

}else

{

dectime = TRUE;

}

if(dectime){

if(led_stcon[ni].ledslot[j].ontimer > 0){

led_stcon[ni].ledslot[j].ontimer --;

}

if(led_stcon[ni].ledslot[j].offtimer > 0)

{

led_stcon[ni].ledslot[j].offtimer --;

}

}

if(0 == led_stcon[ni].ledslot[j].ontimer){

if(0 == led_stcon[ni].ledslot[j].offtimer){

led_stcon[ni].ledslot[j].used = FALSE;

}else{

hasadd = TRUE;

}

}

}

}

CT_WRITE_VAR(120 + i, hasadd);

if(hasadd == TRUE){

flags |= (1

}

}

CT_WRITE_VAR(159, flags);

}

if(g_tm_stTimerFlag.Bits.bTimer1s)

{

fnUser_CalEnv();

}

if(g_user_stRegs.m_uchFlag)

{

for(i = 0; i

{

g_ct_uiVarComp[VARS_SYSTEM_OFFSET_INCOUNT + i] = g_user_stRegs.m_uchXTCount;

g_ct_uiVarComp[VARS_SYSTEM_OFFSET_INCOUNT + XRNUM + i] += g_user_stRegs.m_uchXTCount;

}

g_user_stRegs.m_uchFlag = FALSE;

}