月底CO开关就要送样,上个月底答应小郑要把非独立的检测方式改为独立的方式,总不能食言。利用周末两天时间在家搞这个电路:12个微动开关(24根线)、12组LED,24+12超出89S51总的32个IO口,故增加一片74LS138进行IO扩展。通过对IO口动态扫描电平状态,检测其相对应的微动开关的状态,再将检测的结果写到相对应的LED,LED使用ULN2803进行扩流,弥补单片机驱动能力不足的弱点。

原理图
3edd751ex9e586829ee35.jpg
焊接完成的PCB板
3edd751exa6ec5bcc6206.jpg
3edd751exa6ec5f8db1da.jpg
由于只是扫描和写出,故程序没啥难度,这也是我写的最快的一个程序

#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板就跑了起来。

组装到箱子里,替换原电路板
3edd751exa6ec4b2b2794.jpg
密麻麻的线,其实很多都是相同信号线(不想再去大费周折的精简重焊,就按原本的电气特性,重新做的这个PCB兼容电路)
3edd751exa6ec4d31f9d2.jpg
3edd751exa6ec4f75c221.jpg
3edd751exa6ec53dee883.jpg
3edd751exa6ec573582b5.jpg
原电路板为立林做的,就留着做应急备用
3edd751exa6eceefa87b7.jpg

标签: none

添加新评论