单片机中电子锁驱动电路。。跪求

核心提示不知道你电子锁功耗多大。。给你画个大的。这个可以驱动30W?不过要是负载真有30W。。如果负载电流有2A或以上,那个200欧电阻要改成20欧/2W的。没时间给你算。。要算的得准确知道负载电源电压。三极管你选那个,放大系数多少。。都得算。不过

不知道你电子锁功耗多大。。

给你画个大的。这个可以驱动30W?

不过要是负载真有30W。。如果负载电流有2A或以上,那个200欧电阻要改成20欧/2W的。

没时间给你算。。要算的得准确知道负载电源电压。三极管你选那个,放大系数多少。。都得算。

不过你现在过可直接用20欧/2W的的电阻。图中200那个位置。

见:

程序

//晶振11.0592MHz,T1每250微秒中断,按键P1.0-P1.7,发光二极管接P3.0-P3.3,p3.4

#include "reg51.h"

sbit relay_open=P3^0; //电磁锁开锁驱动

sbit pw_error=P3^1; //密码错误信号

sbit alarm_out=P3^2; //报警输出

sbit open_lock=P3^3; //已开锁指示信号

sbit audio_out=P3^4; //有源蜂鸣器

unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state;

unsigned int data T1_cnt;

unsigned char data key_val,key_index,key_val_old;

unsigned char data state_val,error_num;

unsigned char data show_val[6];

char code init_val[6]=;

char code led_seg_code[11]=;

//led_seg_code[0-9]代表0-9 led_seg_code[10]=0x00数码管不显示任何内容

//--------延时程序----------------

void delay(unsigned int i)//延时

//--------清除输入内容----------

void init_variant()

{unsigned char i;

for(i=0;i<6;i++)

show_val[i]=10; //led_seg_code[10]=0x00表示数码管不显示任何内容

key_index=0; //没有任何输入或清除所有输入时,保存当前键的位置

}

//---------按键扫描---------------

unsigned char scan_key()

{ unsigned char i,k;

i=P1;

if (i==0xff && cnt_state!=2)

//无键按下

else //有键按下

{ delay(500); //延时去抖动

if(i!=P1)

else

{ TR1=1; //有键按下则开定时器,启动待机计时

cnt_val_5s=0;

switch (i)

{ case 0xfe: k=0; break;

case 0xfd: k=1; break;

case 0xfb: k=2; break;

case 0xf7: k=3; break;

case 0xef: k=4; break;

case 0xdf: k=5; break;

case 0xbf: k=6; break;

case 0x7f: k=7; break;

}

}

}

return k;

}

//---------数码管显示---------------

void led_show()

{P0=led_seg_code[show_val[0]];

P2=0xdf;

delay(500);

P0=led_seg_code[show_val[1]];

P2=0xef;

delay(500);

P0=led_seg_code[show_val[2]];

P2=0xf7;

delay(500);

P0=led_seg_code[show_val[3]];

P2=0xfb;

delay(500);

P0=led_seg_code[show_val[4]];

P2=0xfd;

delay(500);

P0=led_seg_code[show_val[5]];

P2=0xfe;

delay(500);

}

//--------定时器T1中断服务程序-----------------

void timer1() interrupt 3 //T1中断

{ T1_cnt++;

if(T1_cnt>3999) //如果计数>3999, 计时1s

{ T1_cnt=0;

switch (cnt_state)

{ case 0: //待机,需要计时5s

if(cnt_val_5s<5)

else

{ cnt_val_5s=0;

init_variant();//待机计时到5秒时,清除输入的内容

TR1=0; //停止计时

}

break;

case 1://密码输入正确,需要计时4s

if(cnt_val_4s<4)

else

{ cnt_val_4s=0;

init_variant();//密码输入正确,计时到4秒时,清除输入的内容

open_lock=1; //已开锁信号清零

relay_open=1; //开锁信号清零

cnt_state=0;

TR1=0; //停止计时

}

break;

case 2: //密码输入错误3次,计时15s

if(cnt_val_15s<15)

else

{ cnt_val_15s=0;

init_variant();//三次密码错误时,计时15秒,清除输入的内容

open_lock=1; // 清除所有指示和报警

relay_open=1;

alarm_out=1;

pw_error=1;

cnt_state=0;

TR1=0; //停止计时

}

break;

}

}

}

//--------判断键盘输入内容与密码是否一致------

unsigned char check_input_pw()

{ unsigned char i,k;

k=1;

for(i=0;i<6;i++)

return k;

}

//---------主程序----------------

main()

{ //初始化各变量

audio_out=1;

P3=0xff;

cnt_val_15s=0;

cnt_val_5s=0;

cnt_val_4s=0;

cnt_state=0;

//0-待机计时5s状态;1-密码正确,计时4s状态 ;2-三次密码错误,处于计时15秒状态。

T1_cnt=0;

error_num=0;

key_val_old=255;

init_variant();

//初始化51的寄存器

TMOD=0x20; //用T1计时 8位自动装载定时模式

TH1=0x19; //500微秒溢出一次; 250=(256-x)*12/11.0592 -> x=19

TL1=0x19;

EA=1; //开中断

ET1=1;

TR1=0; //开定时器T1

while(1)

{ key_val=scan_key(); //按键输入,有键按下key_val为0-7,无键按下key_val为255。

if (key_val!=key_val_old)

{ key_val_old=key_val;

if (key_val!=255&& cnt_state!=2)

{ audio_out=0;

delay(100); //延时去抖动

audio_out=1;

switch (key_val)

{ case 0:

case 1:

case 2:

case 3:

case 4:

case 5:

if(key_index<6) //密码为6位,超过6位视为输入无效

{ show_val[key_index]=key_val;

key_index++; }

break;

case 6: //确认键

if(check_input_pw())

{//密码正确

error_num=0; //密码输入错误次数清零

//---------

pw_error=1; //密码错误指示灯灭

relay_open=0; //开锁驱动信号灯亮

open_lock=0; //已开锁信号灯亮

//---------

delay(50000); //两声短“滴”声

audio_out=0;

delay(50000);

audio_out=1;

delay(50000);

audio_out=0;

delay(50000);

audio_out=1;

//---------

cnt_state=1; //下一状态处于4秒计时的状态

TR0=1; //启动定时

}

else

{ if (error_num<2)

{error_num++; //输入错误次数小于3次时,没错一次error_num增一

pw_error=0; //密码错误指示灯亮

//-----------

delay(20000);//一声长“滴”声,提示错误

audio_out=0;

delay(60000);

audio_out=1;

//-----------

init_variant();//清除所有输入,等待下一次输入

}

else //输入错误次数超过3次

{ alarm_out=0; //报警灯亮

pw_error=0; //密码错误指示灯亮

error_num=0; //密码输入错误次数清零

//----------

audio_out=0; //长鸣声报警

delay(60000);

delay(60000);

delay(60000);

delay(60000);

delay(60000);

delay(60000);

delay(60000);

delay(60000);

delay(60000);

audio_out=1;

//-------------

TR1=1; //打开定时器计时

cnt_state=2; //下一状态处于15秒计时的状态

}

}

break;

case 7://取消键

init_variant();

break;

}

}

}

led_show();

}

}

//-----程序结束-----------------

 
友情链接
鄂ICP备19019357号-22