51单片机期末考试设计题目

设计要求:

设计具有16个按键和1个数码管显示的密码锁,具体要求: 输入一位密码(为0~9,A~F之间的数字),密码输入正确显示“F”并将锁打开;否则显示“E”,继续保持锁定状态。

基本要求:

密码锁的基本功能如下:16个按键,分别代表数字0、1、2......9和英文字符A~F;密码在程序中事先设定为:“8”;系统上电时,数码管显示“-”,表示等待密码输入;密码输入正确时显示字符“F”约3s,并通过P3.0端口将锁打开;否则显示字符“E”约3s,继续保持锁定状态。

原理图设计如下:

 程序设计如下:

#include "regx52.h" //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16; //对数据类型进行声明定义

typedef unsigned char u8;

#define GPIO_DIG P0 //数码管

#define GPIO_KEY P3 //按键

u8 KeyValue,mark; //KeyValue用来存放读取到的键值,mark用来存取按键按下标志位

u8 code smgduan[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值

/*******************************************************************************

* 函 数 名 : Delay

* 函数功能 : 延时xms个1ms时间

***+****************************************************************************/

void Delay(u16 xms)

{

u8 i, j;

while(xms--)

{

i = 2;

j = 239;

do

{

while (--j);

} while (--i);

}

}

/*******************************************************************************

* 函 数 名 : KeyDown

* 函数功能 : 按键检测并返回键值

***+****************************************************************************/

void KeyDown(void)

{

char a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)//读取按键是否按下

{

Delay(10);//延时10ms进行消抖

if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

{

mark=1;

//测试列

GPIO_KEY=0X0F; //逐列

switch(GPIO_KEY)

{

case(0X07): KeyValue=0;break; //左1列

case(0X0b): KeyValue=1;break; // 2

case(0X0d): KeyValue=2;break; // 3

case(0X0e): KeyValue=3;break; // 4

}

//测试行

GPIO_KEY=0XF0; //逐行

switch(GPIO_KEY)

{

case(0X70): KeyValue=KeyValue;break; // 第一行

case(0Xb0): KeyValue=KeyValue+4;break; // 2

case(0Xd0): KeyValue=KeyValue+8;break; // 3

case(0Xe0): KeyValue=KeyValue+12;break; // 4

}

}

}

while((a<10)&&(GPIO_KEY!=0xf0)) //检测按键松手检测

{

Delay(1);

a++;

}

}

/*******************************************************************************

* 函 数 名 : main

* 函数功能 : 无按键按下显示默认值-,当按键按下显示键值,

如果正确显示F并亮led灯,错误显示E,各阶段延时1秒钟。

***+****************************************************************************/

void main()

{

while(1)

{

KeyDown(); //按键判断函数

P0=0xbf; //初始值 -

if(mark==1) //如果按键按下

{

if(KeyValue==8)

{

GPIO_DIG=smgduan[KeyValue];

Delay(1000);

GPIO_DIG=smgduan[15];

P2_1=0;

Delay(1000);

P2_1=1;

mark=0;

}

else

{

GPIO_DIG=smgduan[KeyValue];

Delay(1000);

GPIO_DIG=smgduan[14];

Delay(1000);

mark=0;

}

}

}

}

注意事项:

1.原理图的矩阵按键,引脚不用接错了,引脚接错那扫描结果就不一样,而且容易出现乱码的情况。

2.如果密码正确和密码错误需要显示的不是E,F,自己可以在段码表加在后面你想要的段码值,自己二进制转16进制计算咯,然后让数码管显示【你那个段码值】。

3.还有啥了,大概其实也没有什么写的应该比较简单易懂,而且可移植性很强,比如按键扫描函数,你以后需要用到矩阵按键,(噢,这个矩阵按键接线方法都和单片机开发板的一样)完全可以照搬,你只要知道怎么用就可以了。至于他的扫描方式,那注释也比较清楚,洒洒水了。

4.我这里有一整套的,程序+原理图+实验报告,需要可以私信,绝得可以,打赏一点也可以的。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: