基于C51的数据排序及显示和电子密码锁设计的实验报告.docx

上传人:b****5 文档编号:8045000 上传时间:2023-01-28 格式:DOCX 页数:12 大小:203.92KB
下载 相关 举报
基于C51的数据排序及显示和电子密码锁设计的实验报告.docx_第1页
第1页 / 共12页
基于C51的数据排序及显示和电子密码锁设计的实验报告.docx_第2页
第2页 / 共12页
基于C51的数据排序及显示和电子密码锁设计的实验报告.docx_第3页
第3页 / 共12页
基于C51的数据排序及显示和电子密码锁设计的实验报告.docx_第4页
第4页 / 共12页
基于C51的数据排序及显示和电子密码锁设计的实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于C51的数据排序及显示和电子密码锁设计的实验报告.docx

《基于C51的数据排序及显示和电子密码锁设计的实验报告.docx》由会员分享,可在线阅读,更多相关《基于C51的数据排序及显示和电子密码锁设计的实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

基于C51的数据排序及显示和电子密码锁设计的实验报告.docx

基于C51的数据排序及显示和电子密码锁设计的实验报告

基于C51的数据排序及显示和电子密码锁设计的实验报告

指导老师:

吴飞青学生:

王鹏鸳

目录

实验目的与内容1

开发板电路原理图2

软件部分2

3.1KEIL软件的设置2

编程界面3

《1》基于C51的数据排序及显示4

3.2软件流程图和程序4

《2》基于C51的电子密码锁设计5

3.3软件流程图和程序5

短学期的感想与体会6

附录6

基于C51的数据排序及显示主程序6

基于C51的电子密码锁设计主程序8

实验目的与内容

单片机是现代控制领域中不可缺少的核心部件,是掌握电子应用技术和自动控制技术的必要一课。

实验是提高同学们深入理解课堂内容的重要环节。

本实验课程的任务是巩固和加深学生对单片微机的原理知识的理解,目的在于培养学生分析问题和解决问题的能力以及实践动手能力。

要求每位学生能用C语言编写C51的数据排序及显示和电子密码锁设计程序,在实验板上能正常工作。

开发板电路原理图

软件部分

3.1KEIL软件的设置

打开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"

#include"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]

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

 

for(i=0;i<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];//送段选码,显示十位数;

delay(20);//延时一会儿(时间小于20ms);

}

}

while

(1)

P2=0xff;//待十个数据从大到小依次在数码管上显示完后,关闭数码管;

}

voiddelay(unitz)//延时函数;

{

unitx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

基于C51的电子密码锁设计主程序

#include

#include

#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>0;i--)

for(j=112;j>0;j--);

}

voidshow(unitx)//数码管显示程序(显示8)

{

P0=num[8];

switch(x)

{

case0:

P2=0x7f;break;

case1:

P2=0x3f;break;

case2:

P2=0x1f;break;

case3:

P2=0x0f;break;

case4:

P2=0x07;break;

case5:

P2=0x03;break;

}

}

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;break;

case0x7d:

k=2;break;

case0x7e:

k=3;break;

case0xb7:

k=4;break;

case0xbb:

k=5;break;

case0xbd:

k=6;break;

case0xbe:

k=7;break;

case0xd7:

k=8;break;

case0xdb:

k=9;break;

case0xdd:

k=10;break;//清空

case0xde:

k=11;break;//确认

case0xe7:

k=12;break;//重置

}

}

}

}

voidmain(void)

{

ucharm=0;

ucharn=0;

uchard=0;

inti,s;

while

(1)

{

GetKey();//得到键值

Delay_nms(150);//延时

if(k!

=20&&k!

=10&&k!

=11&&k!

=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)//当输入六位密码时,按下确认键

{

for(n=0;n<6;n++)//将输入的密码与与原来的六位正确的密码

{

if(b[n]==a[n])//逐个比较

{

d++;

}}

if(d==6)//若正确,则在一位数码管上显示(P)

{

temp=0;//重置的标志位为0

P0=0x73;

P2=0xfe;

d=0;

m=0;

s=200;

while(s--)//同时让led灯亮2秒后熄灭

{

P1=0x00;

for(i=0;i<255;i++);

P1=0xff;

for(i=0;i<255;i++);

}}

else//若密码输入错误,则在数码管上显示错误(E)

{

P0=0x79;

P2=0xfe;

d=0;

m=0;

P1=0x00;//同时led常亮

}

}

}

elseif(k==12&&temp==0)//当原来的密码输入正确时,按下密码重置键,进行重置密码

{

P2=0xff;

m=0;

temp=1;

for(n=0;n<6;n++)

{

a[n]=b[n];

}

}

}

}

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

当前位置:首页 > 工作范文 > 行政公文

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

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