1、基于C51的数据排序及显示和电子密码锁设计的实验报告 基于C51的数据排序及显示和电子密码锁设计的实验报告指导老师:吴飞青 学生:王鹏鸳 目录实验目的与内容 1开发板电路原理图 2软件部分 23.1 KEIL软件的设置 2编程界面 31基于C51的数据排序及显示 43.2软件流程图和程序 42基于C51的电子密码锁设计 53.3软件流程图和程序 5短学期的感想与体会 6附录 6基于C51的数据排序及显示主程序 6基于C51的电子密码锁设计主程序 8实验目的与内容单片机是现代控制领域中不可缺少的核心部件,是掌握电子应用技术和自动控制技术的必要一课。实验是提高同学们深入理解课堂内容的重要环节。本实
2、验课程的任务是巩固和加深学生对单片微机的原理知识的理解,目的在于培养学生分析问题和解决问题的能力以及实践动手能力。要求每位学生能用C语言编写C51的数据排序及显示和电子密码锁设计程序,在实验板上能正常工作。开发板电路原理图软件部分3.1 KEIL软件的设置打开KEIL软件,点击Project,新建一个Project工程并保存,然后进行芯片选择,根据实验板上的芯片类型,我们选择Atmel公司的AT89C52,然后确定。选择optionsfor target,点击output,在Create HEX File 选项上打勾,并确定,这样keil在编译程序的同时能生成.hex文件。接着新建一个.C的文
3、件,将其导入到工程,在里面编程并编译,然后用STC_ISP_V479软件将.hex文件烧录到单片机。 编程界面1基于C51的数据排序及显示3.2软件流程图和程序1、数据排序的流程图(冒泡排序) 2、将排序好后的数从大到小在数码管上显示流程图2基于C51的电子密码锁设计3.3软件流程图和程序 1、键盘扫描的流程图2、密码输入及显示的流程图短学期的感想与体会经过这7天短学期的锻炼,自己收获了不少。原来自己的C语言基础比较薄弱,通过老师的讲解和自己的复习,自己已经渐渐将C语言捡起来了,并且能够编写一些简单的程序来控制单片机实现某些功能,虽然中间遇到很多的问题,但通过问老师和同学,自己知道了原因,最终
4、解决了这些难点。通过编程,自己对单片机的原理有了进一步的理解。附录基于C51的数据排序及显示主程序#includereg52.h #includestdio.h#define unit unsigned int void delay(unit);/声明延时函数unit a=99,15,30,13,27,28,7,0,33,67;/定义一维数组,用来存放10个数据;unit table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极led数码管段选码;void main()unit i,m,n;unit j,temp;for(i=0;
5、i9;i+)/冒泡排序的算法;for(j=0;j9-i;j+) if(ajaj+1) temp=aj; aj=aj+1; aj+1=temp; for(i=0;i0;x-) for(y=110;y0;y-); 基于C51的电子密码锁设计主程序#include#include#define unit unsigned int#define uchar unsigned charuchar num10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /共阴极LED段码09uchar k;uchar temp=1;/重置密码的标志位为1uchar
6、 a6=1,2,3,4,5,6;uchar b6,c6; /定义两个数组,存六位密码/*延时Xms*/void Delay_nms(unit n) /延时程序 unit i,j; for(i=n;i0;i-) for(j=112;j0;j-);void show(unit x)/数码管显示程序(显示8) P0=num8; switch(x) case 0:P2=0x7f;break; case 1:P2=0x3f;break; case 2:P2=0x1f;break; case 3:P2=0x0f;break; case 4:P2=0x07;break; case 5:P2=0x03;bre
7、ak; void GetKey ( )/键盘扫描函数,用于识别哪一个键按下,并读取键值 uchar X,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) /判断键值(那一个键按下) case 0x77: k=0; brea
8、k; /对键值赋值 case 0x7b: k=1; break; case 0x7d: k=2; break; case 0x7e: k=3; break; case 0xb7: k=4; break; case 0xbb: k=5; break; case 0xbd: k=6; break; case 0xbe: k=7; break; case 0xd7: k=8; break; case 0xdb: k=9; break; case 0xdd: k=10;break;/清空 case 0xde: k=11;break;/确认 case 0xe7: k=12;break;/重置 void
9、main(void) uchar m=0; uchar n=0; uchar d=0; int i,s; while(1) GetKey();/得到键值 Delay_nms(150);/ 延时 if(k!=20&k!=10&k!=11&k!=12)/判断有无键按下 bm=k;/若有键按下,将按下的键值存到数组里 show(m);/按下键就在数码管上显示,且只能显示六位 m+; else if(k=10)/清空程序 P2=0xff; for(n=0;n6;n+) bn=cn; m=0; P3=0xff; else if(k=11)/确认程序 if(m=6)/当输入六位密码时,按下确认键 for(
10、n=0;n6;n+)/将输入的密码与与原来的六位正确的密码 if(bn=an)/逐个比较 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;i255;i+); P1=0xff; for(i=0;i255;i+); else/若密码输入错误,则在数码管上显示错误(E) P0=0x79; P2=0xfe; d=0; m=0; P1=0x00;/同时led常亮 else if(k=12&temp=0)/当原来的密码输入正确时,按下密码重置键,进行重置密码 P2=0xff; m=0; temp=1; for(n=0;n6;n+) an=bn;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1