单片机实践报告模板.docx

上传人:b****5 文档编号:7753141 上传时间:2023-01-26 格式:DOCX 页数:16 大小:17.53KB
下载 相关 举报
单片机实践报告模板.docx_第1页
第1页 / 共16页
单片机实践报告模板.docx_第2页
第2页 / 共16页
单片机实践报告模板.docx_第3页
第3页 / 共16页
单片机实践报告模板.docx_第4页
第4页 / 共16页
单片机实践报告模板.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机实践报告模板.docx

《单片机实践报告模板.docx》由会员分享,可在线阅读,更多相关《单片机实践报告模板.docx(16页珍藏版)》请在冰豆网上搜索。

单片机实践报告模板.docx

单片机实践报告模板

 

单片机实践报告

项目名称:

密码保险柜

 

专业班级:

计算机科学与技术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、实验心得

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1