51單片機期末考試設(shè)計題目
設(shè)計要求:
設(shè)計具有16個按鍵和1個數(shù)碼管顯示的密碼鎖,具體要求: 輸入一位密碼(為0~9,A~F之間的數(shù)字),密碼輸入正確顯示“F”并將鎖打開;否則顯示“E”,繼續(xù)保持鎖定狀態(tài)。
基本要求:
密碼鎖的基本功能如下:16個按鍵,分別代表數(shù)字0、1、2......9和英文字符A~F;密碼在程序中事先設(shè)定為:“8”;系統(tǒng)上電時,數(shù)碼管顯示“-”,表示等待密碼輸入;密碼輸入正確時顯示字符“F”約3s,并通過P3.0端口將鎖打開;否則顯示字符“E”約3s,繼續(xù)保持鎖定狀態(tài)。
原理圖設(shè)計如下:
?程序設(shè)計如下:
#include "regx52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0 //數(shù)碼管
#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的值
/*******************************************************************************
* 函 數(shù) 名 : Delay
* 函數(shù)功能 : 延時xms個1ms時間
***+****************************************************************************/
void Delay(u16 xms)
{
u8 i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/*******************************************************************************
* 函 數(shù) 名 : KeyDown
* 函數(shù)功能 : 按鍵檢測并返回鍵值
***+****************************************************************************/
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++;
}
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 無按鍵按下顯示默認值-,當按鍵按下顯示鍵值,
如果正確顯示F并亮led燈,錯誤顯示E,各階段延時1秒鐘。
***+****************************************************************************/
void main()
{
while(1)
{
KeyDown(); //按鍵判斷函數(shù)
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.原理圖的矩陣按鍵,引腳不用接錯了,引腳接錯那掃描結(jié)果就不一樣,而且容易出現(xiàn)亂碼的情況。
2.如果密碼正確和密碼錯誤需要顯示的不是E,F(xiàn),自己可以在段碼表加在后面你想要的段碼值,自己二進制轉(zhuǎn)16進制計算咯,然后讓數(shù)碼管顯示【你那個段碼值】。
3.還有啥了,大概其實也沒有什么寫的應該比較簡單易懂,而且可移植性很強,比如按鍵掃描函數(shù),你以后需要用到矩陣按鍵,(噢,這個矩陣按鍵接線方法都和單片機開發(fā)板的一樣)完全可以照搬,你只要知道怎么用就可以了。至于他的掃描方式,那注釋也比較清楚,灑灑水了。文章來源:http://www.zghlxwxcb.cn/news/detail-507745.html
4.我這里有一整套的,程序+原理圖+實驗報告,需要可以私信,絕得可以,打賞一點也可以的。文章來源地址http://www.zghlxwxcb.cn/news/detail-507745.html
到了這里,關(guān)于51單片機制作簡易密碼鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!