1、单片机实践报告模板单片机实践报告项目名称:密码保险柜专业班级:计算机科学与技术1201班姓 名: 张晨辰 时 间: 2014年12月20日 1、项目功能描述1.用户可以通过输入6位数字密码来打开保险柜;2.当密码正确时,保险柜门打开,有开门提示声,当密码不正确时,保险柜门打不开,并且提示报警; 3.用户可以自行修改密码;4.有相应的密码输入显示窗口,输入数字用相应符号替代以避免被偷窥。二、仿真电路原理图三、所用器件序号标号器件名称型号功能数量备注1-6位八段数码管7SEG-MPX6-CA-BLUE12U151单片机AT89C5213C1-C2电容CAP24C3极性电容CAP-ELEC15X1晶
2、体CRYSTAL16-4*4行列扫描键盘KEYPAD-SMALLCALC17D1-D2发光二极管(绿色)LED-GREEN28-直流电机MOTOR-DC19R1-R4,R6通用电阻RES510RP18位排阻RESPACK-8111LS1蜂鸣器SOUNDER112Q1、Q2Q5、Q6三极管TIP122413Q3、Q4三极管TIP12724、创新之外5、难点6、程序清单(添加注释)#includeunsigned int num=10;/开始让数码管什么都显示bit set=0;/定义设置密码的位char count=-1;/开始让count=-1,方便后面显示数码管sbit Beep=P12;/
3、蜂鸣器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,0xf7,0xef,0xdf;/位选码unsigned in
4、t keyscan();void delay(unsigned char z)/延时,毫秒unsigned char y;for(;z0;z-) for(y=120;y0;y-);void setpw()/设置密码函数keyscan();unsigned int keyscan()/键盘扫描函数 P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5);/键盘去抖,最好20ms以上,这里用了5ms temp=temp&0xf0; if(temp!=0xf0) count+;/按键计数加1 temp=P3; switch(temp) ca
5、se 0xee: num=7; if(count6)/六位密码,因此count6 if(set=0)/设置密码键没有被按下时 pwxcount=num;/存储按下的数字 else pwscount=num;/当密码键按下时,设置新密码 workbufcount=tabledu11; /相应位的数码管显示-,不显示相应的数字,密码是保密的 break; case 0xde: num=8; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0xbe: num=9; if
6、(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0x7e:/设置密码键按下 set=1;/设置密码标志位置1 P1_3=0;/设置密码指示灯亮 workbuf0=0x00;/数码管第一位不显示 workbuf1=0x00; workbuf2=0x00; workbuf3=0x00; workbuf4=0x00; workbuf5=0x00;/. count=-1;/按键计数复位为-1 if(count6)/密码没有设置完,继续设置密码 setpw();/设置密码 br
7、eak; while(temp!=0xf0)/按键抬起检测 temp=P3; temp=temp&0xf0; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) count+; temp=P3; switch(temp) case 0xed: num=4; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0xdd: nu
8、m=5; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0xbd: num=6; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5); temp=
9、P3;/ temp=temp&0xf0; if(temp!=0xf0) count+; temp=P3; switch(temp) case 0xeb: num=1; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0xdb: num=2; if(count6) if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; case 0xbb: num=3; if(count6)
10、 if(set=0) pwxcount=num; else pwscount=num; workbufcount=tabledu11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) count+; temp=P3; switch(temp) case 0xd7: num=0; if(count6) if(set=0) pwxcount=num;
11、else pwscount=num; workbufcount=tabledu11; break; case 0xe7:num=20;break;/确定键按下检测 case 0x77:/复位键或输入密码全部一次删除 P1_1=0;/锁关 P1_3=1;/密码设置指示灯灭 set=0;/不设置密码 num=10;/num复位 count=-1;/count复位 workbuf0=tabledu10;/第一位数码管不显示 workbuf1=tabledu10; workbuf2=tabledu10; workbuf3=tabledu10; workbuf4=tabledu10; workbuf5=
12、tabledu10;/. P1_0=1;/锁关 break; case 0xb7:/输入密码删除键(一位一位删除) count-; workbufcount=0x00; /因为确定键按下时,count也会加1,而确定键不是密码,所以这里是count,而不是count+1 count-; /因为确定键按下时,确定键不是密码,count也会加1,所以这里的count再自减1 if(count=-1) count=-1; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; return(num);void init()/利用定时显示数码管TMOD=0x
13、01;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)rightflag=1;elserightflag=0;return(rightflag);void main()unsigned int i,j;init();P0=0;P1_1=0;/锁关while(1) keyscan(); if(num=20)/如果确定键按下(修改密码和输入密码共用的
14、确定键) if(count=6) if(set=1)/修改密码确定 P1_3=1; workbuf0; workbuf1; workbuf2; workbuf3; workbuf4; workbuf5; else/输入密码确定 set=0; compare(); if(rightflag=1)/如果密码正确 P1_0=0;/锁开 P1_1=1; workbuf0=tabledu8;/数码管第一位显示8 workbuf1=tabledu8;/数码管第二位显示8 workbuf2=tabledu8; workbuf3=tabledu8; workbuf4=tabledu8; workbuf5=ta
15、bledu8; else P1_1=0;/锁仍然关 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; break; else/若输入的密码位数不为6位时 P1_1=0;/锁仍然关 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; break; void timer0() interrupt 1/数码管驱动程序 unsigned char i; TH0=(65536-500)/200; TL0=(65536-500)%200; for(i=0;i6;i+) P0=workbufi;/送出显示内容 P2=tablewei;/选中显示行 delay(5); P0=0; 7、实验心得
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1