基于C51的数据排序及显示和电子密码锁设计的实验报告Word下载.docx
- 文档编号:21181253
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:12
- 大小:203.92KB
基于C51的数据排序及显示和电子密码锁设计的实验报告Word下载.docx
《基于C51的数据排序及显示和电子密码锁设计的实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《基于C51的数据排序及显示和电子密码锁设计的实验报告Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
打开KEIL软件,点击Project,新建一个Project工程并保存,然后进行芯片选择,根据实验板上的芯片类型,我们选择Atmel公司的AT89C52,然后确定。
选择optionsfortarget,点击output,在CreateHEXFile选项上打勾,并确定,这样keil在编译程序的同时能生成.hex文件。
接着新建一个.C的文件,将其导入到工程,在里面编程并编译,然后用STC_ISP_V479软件将.hex文件烧录到单片机。
编程界面
《1》基于C51的数据排序及显示
3.2软件流程图和程序
1、数据排序的流程图(冒泡排序)
2、将排序好后的数从大到小在数码管上显示流程图
《2》基于C51的电子密码锁设计
3.3软件流程图和程序
1、键盘扫描的流程图
2、密码输入及显示的流程图
短学期的感想与体会
经过这7天短学期的锻炼,自己收获了不少。
原来自己的C语言基础比较薄弱,通过老师的讲解和自己的复习,自己已经渐渐将C语言捡起来了,并且能够编写一些简单的程序来控制单片机实现某些功能,虽然中间遇到很多的问题,但通过问老师和同学,自己知道了原因,最终解决了这些难点。
通过编程,自己对单片机的原理有了进一步的理解。
附录
基于C51的数据排序及显示主程序
#include"
reg52.h"
stdio.h"
#defineunitunsignedint
voiddelay(unit);
//声明延时函数
unita[]={99,15,30,13,27,28,7,0,33,67};
//定义一维数组,用来存放10个数据;
unittable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴极led数码管段选码;
voidmain()
{
uniti,m,n;
unitj,temp;
for(i=0;
i<
9;
i++)//冒泡排序的算法;
for(j=0;
j<
9-i;
j++)
{
if(a[j]<
a[j+1])
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
10;
i++)
{
unitp=25;
while(p--)//数码管的动态扫描;
m=a[i]%10;
//取个位数;
n=a[i]/10;
//取十位数;
P2=0x7f;
//个位数码管亮;
P0=table[n];
//送段选码,显示个位数;
delay(20);
//延时一会儿(时间小于20ms);
P2=0xbf;
//十位数码管亮;
P0=table[m];
//送段选码,显示十位数;
//延时一会儿(时间小于20ms);
while
(1)
P2=0xff;
//待十个数据从大到小依次在数码管上显示完后,关闭数码管;
}
voiddelay(unitz)//延时函数;
unitx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
基于C51的电子密码锁设计主程序
#include<
reg52.h>
stdio.h>
#defineunitunsignedint
#defineucharunsignedchar
ucharnum[10]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//共阴极LED段码0~9
uchark;
uchartemp=1;
//重置密码的标志位为1
uchara[6]={1,2,3,4,5,6};
ucharb[6],c[6];
//定义两个数组,存六位密码
/*************延时Xms*****************/
voidDelay_nms(unitn)//延时程序
uniti,j;
for(i=n;
i>
i--)
for(j=112;
j>
j--);
voidshow(unitx)//数码管显示程序(显示8)
P0=num[8];
switch(x)
case0:
P2=0x7f;
break;
case1:
P2=0x3f;
case2:
P2=0x1f;
case3:
P2=0x0f;
case4:
P2=0x07;
case5:
P2=0x03;
voidGetKey()//键盘扫描函数,用于识别哪一个键按下,并读取键值
{
ucharX,Y,Z;
k=20;
//若无键按下,则返回k的值为20
P3=0x0f;
//先对P1置数行扫描
if(P3!
=0x0f)//判断是否有键按下
Delay_nms(10);
//延时,软件去干扰
if(P3!
=0x0f)//确认按键按下X=P3;
{
X=P3&
0x0f;
//保存行扫描时有键按下时状态
P3=0xf0;
//列扫描
Y=P3&
0xf0;
//保存列扫描时有键按下时状态
Z=X|Y;
//取出键值
switch(Z)//判断键值(那一个键按下)
{
case0x77:
k=0;
break;
//对键值赋值
case0x7b:
k=1;
case0x7d:
k=2;
case0x7e:
k=3;
case0xb7:
k=4;
case0xbb:
k=5;
case0xbd:
k=6;
case0xbe:
k=7;
case0xd7:
k=8;
case0xdb:
k=9;
case0xdd:
k=10;
//清空
case0xde:
k=11;
//确认
case0xe7:
k=12;
//重置
}
}
voidmain(void)
ucharm=0;
ucharn=0;
uchard=0;
inti,s;
while
(1)
GetKey();
//得到键值
Delay_nms(150);
//延时
if(k!
=20&
&
k!
=10&
=11&
=12)//判断有无键按下
b[m]=k;
//若有键按下,将按下的键值存到数组里
show(m);
//按下键就在数码管上显示,且只能显示六位
m++;
elseif(k==10)//清空程序
P2=0xff;
for(n=0;
n<
6;
n++)
b[n]=c[n];
m=0;
P3=0xff;
elseif(k==11)//确认程序
if(m<
6)//当输入的密码少于六位时,按下确认键,显示错误(E)
P0=0x79;
P2=0xfe;
P3=0x00;
m=0;
elseif(m>
=6)//当输入六位密码时,按下确认键
n++)//将输入的密码与与原来的六位正确的密码
if(b[n]==a[n])//逐个比较
d++;
}}
if(d==6)//若正确,则在一位数码管上显示(P)
{
temp=0;
//重置的标志位为0
P0=0x73;
d=0;
s=200;
while(s--)//同时让led灯亮2秒后熄灭
P1=0x00;
for(i=0;
255;
i++);
P1=0xff;
}}
else//若密码输入错误,则在数码管上显示错误(E)
//同时led常亮
elseif(k==12&
temp==0)//当原来的密码输入正确时,按下密码重置键,进行重置密码
P2=0xff;
temp=1;
a[n]=b[n];
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 C51 数据 排序 显示 电子 密码锁 设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)