单片机实践报告模板文档格式.docx
《单片机实践报告模板文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实践报告模板文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![单片机实践报告模板文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/22/ad39a6ef-7831-4ad3-9037-99dcf0ca5ff9/ad39a6ef-7831-4ad3-9037-99dcf0ca5ff91.gif)
2
U1
51单片机
AT89C52
3
C1-C2
电容
CAP
4
C3
极性电容
CAP-ELEC
5
X1
晶体
CRYSTAL
6
4*4行列扫描键盘
KEYPAD-SMALLCALC
7
D1-D2
发光二极管(绿色)
LED-GREEN
8
直流电机
MOTOR-DC
9
R1-R4,R6
通用电阻
RES
10
RP1
8位排阻
RESPACK-8
11
LS1
蜂鸣器
SOUNDER
12
Q1、Q2
Q5、Q6
三极管
TIP122
13
Q3、Q4
TIP127
4、创新之外
5、难点
6、程序清单(添加注释)
#include<
AT89X52.h>
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>
y--);
}
voidsetpw()//设置密码函数
keyscan();
unsignedintkeyscan()//键盘扫描函数
P3=0xfe;
temp=P3;
temp=temp&
0xf0;
if(temp!
=0xf0)
{
delay(5);
//键盘去抖,最好20ms以上,这里用了5ms
count++;
//按键计数加1
switch(temp)
case0xee:
num=7;
if(count<
6)//六位密码,因此count<
if(set==0)//设置密码键没有被按下时
pwx[count]=num;
//存储按下的数字
else
pws[count]=num;
//当密码键按下时,设置新密码
workbuf[count]=tabledu[11];
//相应位的数码管显示"
-"
不显示相应的数字,密码是保密的
}
break;
case0xde:
num=8;
6)
if(set==0)
case0xbe:
num=9;
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
6)//密码没有设置完,继续设置密码
setpw();
//设置密码
while(temp!
=0xf0)//按键抬起检测
{
P3=0xfd;
case0xed:
num=4;
case0xdd:
num=5;
case0xbd:
num=6;
P3=0xfb;
//
case0xeb:
num=1;
case0xdb:
num=2;
case0xbb:
num=3;
P3=0xf7;
case0xd7:
num=0;
case0xe7:
num=20;
break;
//确定键按下检测
case0x77:
//复位键或输入密码全部一次删除
P1_1=0;
//锁关
P1_3=1;
//密码设置指示灯灭
set=0;
//不设置密码
num=10;
//num复位
//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;
case0xb7:
//输入密码删除键(一位一位删除)
count--;
workbuf[count]=0x00;
//因为确定键按下时,count也会加1,而确定键不是密码,所以这里是count,而不是count+1
//因为确定键按下时,确定键不是密码,count也会加1,所以这里的count再自减1
=-1)
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)//修改密码确定
workbuf[0];
workbuf[1];
workbuf[2];
workbuf[3];
workbuf[4];
workbuf[5];
else//输入密码确定
compare();
if(rightflag==1)//如果密码正确
P1_0=0;
//锁开
P1_1=1;
workbuf[0]=tabledu[8];
//数码管第一位显示"
8"
workbuf[1]=tabledu[8];
//数码管第二位显示"
workbuf[2]=tabledu[8];
workbuf[3]=tabledu[8];
workbuf[4]=tabledu[8];
workbuf[5]=tabledu[8];
//锁仍然关
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;
else//若输入的密码位数不为6位时
i++)
voidtimer0()interrupt1//数码管驱动程序
unsignedchari;
TH0=(65536-500)/200;
TL0=(65536-500)%200;
6;
P0=workbuf[i];
//送出显示内容
P2=tablewe[i];
//选中显示行
P0=0;
7、实验心得