實現一個簡單地密碼鎖設計,適合入門級。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.76 KB, 下載次數: 25)
下載附件
2018-5-16 18:03 上傳
0.jpg (30.7 KB, 下載次數: 22)
下載附件
2018-5-16 18:03 上傳
單片機源程序如下(帶有詳細的代碼注釋):
- //程序:ex4_12.c
- //功能:一位數碼管顯示的密碼鎖,假定密碼為8,可以輸入的數字有0~9 ,A~F
- #include <reg51.h> //包含頭文件reg51.h,定義51單片機的專用寄存器
- char scan_key (void); //鍵盤掃描函數
- void delay (unsigned int i); //延時函數聲明
- sbit P30=P3^0; //位定義,控制發光二極管,其亮滅表示鎖的打開和鎖定狀態
- void main() //主函數
- {
- unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //0~9、A~F的共陽極顯示碼
- unsigned char led1[]={0xbf,0x8c,0x86}; //" "、"P"和"E"的共陽極顯示碼
- unsigned char i;
- P1=led1[0]; //數碼管顯示" "
- P30=1; //開鎖指示燈關閉
- P0=0xff; //P0口低四位做輸入口,先輸出全1
- while(1)
- {
- i=scan_key(); //調用鍵盤函數
- if(i==-1)continue; //沒有鍵按下,繼續循環
- else if(i!=8){ //按鍵不是密碼8
- P1=led[i]; //顯示按下鍵的數字號
- delay(10000); //延時
- P1=led1[2]; //顯示E
- delay(50000); //延時
- P1=led1[0]; //顯示" "
- }
- else //按鍵是密碼8
- {
- P1=led[i]; //顯示按下鍵的數字號
- delay(10000); //延時
- P1=led1[1]; //顯示P
- P30=0; //開鎖
- delay(50000); //延時
- P1=led1[0]; //數碼管顯示" "
- P30=1; //開鎖指示燈關閉
- }
- }
- }
- //函數名:scan_key
- //函數功能:判斷是否有鍵按下,如果有鍵按下,逐列掃描法得到鍵值
- //形式參數:無
- //返回值:鍵值0~15,-1表示無鍵按下
- char scan_key ( )
- {
- char i, temp,m,n;
- bit find=0; //有鍵按下標志位
- P2=0xf0; //向所有的列線上輸出低電平
- i=P0; //讀入行值
- i&=0x0f; //屏蔽掉高四位
- if(i!=0x0f) //行值不為全1,有鍵按下
- {
- delay(1200); //延時消抖
- i=P0; //再次讀入行值
- i&=0x0f; //屏蔽掉高四位
- if(i!=0x0f)
- { //第二次判斷有鍵按下
- for(i=0;i<4;i++)
- {
- P2=0xfe<<i; //逐列送出低電平
- temp=~P0; //讀行值,并取反,全1→全0
- temp=temp&0x0f; //屏蔽掉行值高4位
- if(temp!=0x00) //判斷有無鍵按下,為0則無鍵按下,否則有鍵按下
- { m=i; //保存列號至m變量
- find=1; //置找到按鍵標志
- switch(temp) //判斷哪一行有鍵按下,記錄行號到n變量
- { case 0x01:n=0;break; //第0行有鍵按下
- case 0x02: n=1;break; //第1行有鍵按下
- case 0x04: n=2;break; //第2行有鍵按下
- case 0x08: n=3;break; //第3行有鍵按下
- default:break;
- }
- break; //有鍵按下,退出for循環
- }
- }
- }
- }
- if(find==0) return -1; //無鍵按下則返回-1
- else return(n*4+m); //否則返回鍵值,鍵值=列號*4+行號
- }
- //函數名:delay
- //函數功能:實現軟件延時
- //形式參數:無符號整型變量i,控制空循環的循環次數
- //返回值:無
- void delay(unsigned int i) //延時函數
- {
- unsigned int k;
- for(k=0;k<i;k++);
- }
復制代碼
所有資料51hei提供下載:
密碼鎖.rar
(48.94 KB, 下載次數: 16)
2018-5-16 10:39 上傳
點擊文件名下載附件
實現一個簡單的密碼鎖程序設計 下載積分: 黑幣 -5
|