1、2U151单片机AT89C523C1-C2电容CAP4C3极性电容CAP-ELEC5X1晶体CRYSTAL64*4行列扫描键盘KEYPAD-SMALLCALC7D1-D2发光二极管(绿色)LED-GREEN8直流电机MOTOR-DC9R1-R4,R6通用电阻RES10RP18位排阻RESPACK-811LS1蜂鸣器SOUNDER12Q1、Q2Q5、Q6三极管TIP12213Q3、Q4TIP1274、创新之外5、难点6、程序清单(添加注释)#includeunsigned int num=10;/开始让数码管什么都显示bit set=0;/定义设置密码的位char count=-1;/开始让co
2、unt=-1,方便后面显示数码管sbit Beep=P12;/蜂鸣器unsigned char temp;unsigned char pws6=1,2,3,4,5,6;/原始密码unsigned char pwx6;/按下的数字存储区bit rightflag;/密码正确的标志位unsigned char workbuf6;unsigned char code tabledu=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; /段选码,共阴极unsigned char code tablewe=0xfe,0xfd,0xfb
3、,0xf7,0xef,0xdf/位选码unsigned int keyscan();void delay(unsigned char z)/延时,毫秒unsigned char y;for(;z0;z-) for(y=120;yy-);void setpw()/设置密码函数keyscan();unsigned int keyscan()/键盘扫描函数 P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5);/键盘去抖,最好20ms以上,这里用了5ms count+;/按键计数加1 switch(temp) case 0xee: num
4、=7; if(count6)/六位密码,因此count if(set=0)/设置密码键没有被按下时 pwxcount=num;/存储按下的数字 else pwscount=num;/当密码键按下时,设置新密码 workbufcount=tabledu11; /相应位的数码管显示-,不显示相应的数字,密码是保密的 break; case 0xde: num=8;6) if(set=0) case 0xbe: num=9; case 0x7e:/设置密码键按下 set=1;/设置密码标志位置1 P1_3=0;/设置密码指示灯亮 workbuf0=0x00;/数码管第一位不显示 workbuf1=0
5、x00; workbuf2=0x00; workbuf3=0x00; workbuf4=0x00; workbuf5=0x00;/. count=-1;/按键计数复位为-16)/密码没有设置完,继续设置密码 setpw();/设置密码 while(temp!=0xf0)/按键抬起检测 P3=0xfd; case 0xed: num=4; case 0xdd: num=5; case 0xbd: num=6; P3=0xfb;/ case 0xeb: num=1; case 0xdb: num=2; case 0xbb: num=3; P3=0xf7; case 0xd7: num=0; cas
6、e 0xe7:num=20;break;/确定键按下检测 case 0x77:/复位键或输入密码全部一次删除 P1_1=0;/锁关 P1_3=1;/密码设置指示灯灭 set=0;/不设置密码 num=10;/num复位/count复位 workbuf0=tabledu10;/第一位数码管不显示 workbuf1=tabledu10; workbuf2=tabledu10; workbuf3=tabledu10; workbuf4=tabledu10; workbuf5=tabledu10; P1_0=1; case 0xb7:/输入密码删除键(一位一位删除) count-; workbufco
7、unt=0x00; /因为确定键按下时,count也会加1,而确定键不是密码,所以这里是count,而不是count+1 /因为确定键按下时,确定键不是密码,count也会加1,所以这里的count再自减1=-1) return(num);void init()/利用定时显示数码管TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;bit compare()/密码比较函数if(pwx0=pwx0)&(pwx1=pwx1)&(pwx2=pwx2)&(pwx3=pwx3)&(pwx4=pwx4)&(pwx5=pwx5
8、)rightflag=1;elserightflag=0;return(rightflag);void main()unsigned int i,j;init();P0=0;P1_1=0;while(1) keyscan(); if(num=20)/如果确定键按下(修改密码和输入密码共用的确定键) if(count=6) if(set=1)/修改密码确定 workbuf0; workbuf1; workbuf2; workbuf3; workbuf4; workbuf5; else/输入密码确定 compare(); if(rightflag=1)/如果密码正确 P1_0=0;/锁开 P1_1
9、=1; workbuf0=tabledu8;/数码管第一位显示8 workbuf1=tabledu8;/数码管第二位显示 workbuf2=tabledu8; workbuf3=tabledu8; workbuf4=tabledu8; workbuf5=tabledu8;/锁仍然关 workbuf0=0X71;F workbuf1=0X71; workbuf2=0X71; workbuf3=0X71; workbuf4=0X71; workbuf5=0X71; for(i=0;i1000;i+)/密码错误报警 for(j=0;j80;j+) Beep=Beep; else/若输入的密码位数不为6位时i+)void timer0() interrupt 1/数码管驱动程序 unsigned char i; TH0=(65536-500)/200; TL0=(65536-500)%200;6; P0=workbufi;/送出显示内容 P2=tablewei;/选中显示行 P0=0;7、实验心得
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1