CO 164776 开关独立检测电路
月底CO开关就要送样,上个月底答应小郑要把非独立的检测方式改为独立的方式,总不能食言。利用周末两天时间在家搞这个电路:12个微动开关(24根线)、12组LED,24+12超出89S51总的32个IO口,故增加一片74LS138进行IO扩展。通过对IO口动态扫描电平状态,检测其相对应的微动开关的状态,再将检测的结果写到相对应的LED,LED使用ULN2803进行扩流,弥补单片机驱动能力不足的弱点。
原理图
焊接完成的PCB板
由于只是扫描和写出,故程序没啥难度,这也是我写的最快的一个程序
#include "AT89X51.H"
sfr WDTRST = 0xA6;
static unsigned char code write_data[12]={0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0xfe,0xfd,0xf9,0xf7};
unsigned char i;
void init()
{
P0 = 0x00;
P1 = 0xff;
P2 = 0xff;
P3 = 0x0f;
EX0 = 0x00;
ET0 = 0x00;
EX1 = 0x00;
ET1 = 0x00;
ES = 0x00;
ET2 = 0x00;
WDTRST = 0x1E;
WDTRST = 0xE1;
}
void main()
{
init();
while(1){
WDTRST=0x1E;
WDTRST=0xE1;
for (i=0;i<12;i++)
{
P2=write_data[i] ;
switch(i)
{
case 0: P0_0=!P1_0; break;
case 1: P0_1=!P1_1; break;
case 2: P0_2=!P1_2; break;
case 3: P0_3=!P1_3; break;
case 4: P0_4=!P1_4; break;
case 5: P0_5=!P1_5; break;
case 6: P0_6=!P1_6; break;
case 7: P0_7=!P1_7; break;
case 8: P3_4=!P3_0; break;
case 9: P3_5=!P3_1; break;
case 10: P3_6=!P3_2; break;
case 11: P3_7=!P3_3; break;
default: break;
}
}
}
}
把程序编译成HEX格式,烧录到89S51中即可,有了躯干和灵魂的PCB板就跑了起来。
组装到箱子里,替换原电路板
密麻麻的线,其实很多都是相同信号线(不想再去大费周折的精简重焊,就按原本的电气特性,重新做的这个PCB兼容电路)
原电路板为立林做的,就留着做应急备用