基于C51的数据排序及显示和电子密码锁设计的实验报告.docx
《基于C51的数据排序及显示和电子密码锁设计的实验报告.docx》由会员分享,可在线阅读,更多相关《基于C51的数据排序及显示和电子密码锁设计的实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
基于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#defineucharunsignedcharucharnum[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极LED段码0~9uchark;uchartemp=1;//重置密码的标志位为1uchara[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的值为20P3=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;//重置的标志位为0P0=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];}}}}
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];//送段选码,显示十位数;
while
(1)
P2=0xff;//待十个数据从大到小依次在数码管上显示完后,关闭数码管;
voiddelay(unitz)//延时函数;
unitx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
基于C51的电子密码锁设计主程序
#include
#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);//延时,软件去干扰
=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;
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;
elseif(m>=6)//当输入六位密码时,按下确认键
for(n=0;n<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;i<255;i++);
P1=0xff;
else//若密码输入错误,则在数码管上显示错误(E)
P1=0x00;//同时led常亮
elseif(k==12&&temp==0)//当原来的密码输入正确时,按下密码重置键,进行重置密码
temp=1;
a[n]=b[n];
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1