单片机实践报告模板.docx
《单片机实践报告模板.docx》由会员分享,可在线阅读,更多相关《单片机实践报告模板.docx(16页珍藏版)》请在冰豆网上搜索。
单片机实践报告模板
单片机实践报告
项目名称:
密码保险柜
专业班级:
计算机科学与技术1201班
姓名:
张晨辰
时间:
2014年12月20日
1、项目功能描述
1.用户可以通过输入6位数字密码来打开保险柜;
2.当密码正确时,保险柜门打开,有开门提示声,当密码不正确时,保险柜门打不开,并且提示报警;
3.用户可以自行修改密码;
4.有相应的密码输入显示窗口,输入数字用相应符号替代以避免被偷窥。
二、仿真电路原理图
三、所用器件
序号
标号
器件名称
型号
功能
数量
备注
1
-
6位八段数码管
7SEG-MPX6-CA-BLUE
1
2
U1
51单片机
AT89C52
1
3
C1-C2
电容
CAP
2
4
C3
极性电容
CAP-ELEC
1
5
X1
晶体
CRYSTAL
1
6
-
4*4行列扫描键盘
KEYPAD-SMALLCALC
1
7
D1-D2
发光二极管(绿色)
LED-GREEN
2
8
-
直流电机
MOTOR-DC
1
9
R1-R4,R6
通用电阻
RES
5
10
RP1
8位排阻
RESPACK-8
1
11
LS1
蜂鸣器
SOUNDER
1
12
Q1、Q2
Q5、Q6
三极管
TIP122
4
13
Q3、Q4
三极管
TIP127
2
4、创新之外
5、难点
6、程序清单(添加注释)
#include
unsignedintnum=10;//开始让数码管什么都显示
bitset=0;//定义设置密码的位
charcount=-1;//开始让count=-1,方便后面显示数码管
sbitBeep=P1^2;//蜂鸣器
unsignedchartemp;
unsignedcharpws[6]={1,2,3,4,5,6};//原始密码
unsignedcharpwx[6];//按下的数字存储区
bitrightflag;//密码正确的标志位
unsignedcharworkbuf[6];
unsignedcharcodetabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
};//段选码,共阴极
unsignedcharcodetablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};//位选码
unsignedintkeyscan();
voiddelay(unsignedcharz)//延时,毫秒
{
unsignedchary;
for(;z>0;z--)
for(y=120;y>0;y--);
}
voidsetpw()//设置密码函数
{
keyscan();
}
unsignedintkeyscan()//键盘扫描函数
{
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)
{
case0xee:
{
num=7;
if(count<6)//六位密码,因此count<6
{
if(set==0)//设置密码键没有被按下时
pwx[count]=num;//存储按下的数字
else
pws[count]=num;//当密码键按下时,设置新密码
workbuf[count]=tabledu[11];
//相应位的数码管显示"-",不显示相应的数字,密码是保密的
}
}
break;
case0xde:
{
num=8;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbe:
{
num=9;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0x7e:
//设置密码键按下
{
set=1;//设置密码标志位置1
P1_3=0;//设置密码指示灯亮
workbuf[0]=0x00;//数码管第一位不显示
workbuf[1]=0x00;
workbuf[2]=0x00;
workbuf[3]=0x00;
workbuf[4]=0x00;
workbuf[5]=0x00;//...
count=-1;//按键计数复位为-1
if(count<6)//密码没有设置完,继续设置密码
{
setpw();//设置密码
}
}
break;
}
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)
{
case0xed:
{
num=4;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xdd:
{
num=5;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbd:
{
num=6;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;//
temp=temp&0xf0;
if(temp!
=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case0xeb:
{
num=1;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xdb:
{
num=2;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbb:
{
num=3;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
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)
{
case0xd7:
{
num=0;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xe7:
num=20;break;//确定键按下检测
case0x77:
//复位键或输入密码全部一次删除
{
P1_1=0;//锁关
P1_3=1;//密码设置指示灯灭
set=0;//不设置密码
num=10;//num复位
count=-1;//count复位
workbuf[0]=tabledu[10];//第一位数码管不显示
workbuf[1]=tabledu[10];
workbuf[2]=tabledu[10];
workbuf[3]=tabledu[10];
workbuf[4]=tabledu[10];
workbuf[5]=tabledu[10];//...
P1_0=1;//锁关
}
break;
case0xb7:
//输入密码删除键(一位一位删除)
{
count--;
workbuf[count]=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);
}
voidinit()//利用定时显示数码管
{
TMOD=0x01;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
ET0=1;
EA=1;
TR0=1;
}
bitcompare()//密码比较函数
{
if((pwx[0]==pwx[0])&(pwx[1]==pwx[1])&(pwx[2]==pwx[2])&(pwx[3]==pwx[3])&(pwx[4]==pwx[4])&(pwx[5]==pwx[5]))
rightflag=1;
else
rightflag=0;
return(rightflag);
}
voidmain()
{
unsignedinti,j;
init();
P0=0;
P1_1=0;//锁关
while
(1)
{
keyscan();
if(num==20)//如果确定键按下(修改密码和输入密码共用的确定键)
{
if(count==6)
{
if(set==1)//修改密码确定
{
P1_3=1;
workbuf[0];
workbuf[1];
workbuf[2];
workbuf[3];
workbuf[4];
workbuf[5];
}
else//输入密码确定
{
set=0;
compare();
if(rightflag==1)//如果密码正确
{
P1_0=0;//锁开
P1_1=1;
workbuf[0]=tabledu[8];//数码管第一位显示"8"
workbuf[1]=tabledu[8];//数码管第二位显示"8"
workbuf[2]=tabledu[8];
workbuf[3]=tabledu[8];
workbuf[4]=tabledu[8];
workbuf[5]=tabledu[8];
}
else
{
P1_1=0;//锁仍然关
workbuf[0]=0X71;//数码管第一位显示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71;//...
for(i=0;i<1000;i++)//密码错误报警
{
for(j=0;j<80;j++)
Beep=~Beep;
}
break;
}
}
}
else//若输入的密码位数不为6位时
{
P1_1=0;//锁仍然关
workbuf[0]=0X71;//数码管第一位显示"F"
workbuf[1]=0X71;
workbuf[2]=0X71;
workbuf[3]=0X71;
workbuf[4]=0X71;
workbuf[5]=0X71;//...
for(i=0;i<1000;i++)
{
for(j=0;j<80;j++)
Beep=~Beep;
}
break;
}
}
}
}
voidtimer0()interrupt1//数码管驱动程序
{
unsignedchari;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
for(i=0;i<6;i++)
{
P0=workbuf[i];//送出显示内容
P2=tablewe[i];//选中显示行
delay(5);
P0=0;
}
}
7、实验心得