0.png (31.56 KB, 下載次數(shù): 104)
下載附件
2016-1-13 22:48 上傳
51單片機源碼+protues仿真 帶蜂鳴器電路LCD1602顯示
1.png (48.17 KB, 下載次數(shù): 79)
下載附件
2016-1-13 22:49 上傳
51單片機電子密碼鎖仿真+全部程序下載:
電子密碼鎖.rar
(110.47 KB, 下載次數(shù): 99)
2016-1-13 14:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
以下是主程序預覽:
- /**************************************************************** ***************
- 閱讀提示:1.所有的數(shù)組以 名字_功能_pad[]
- 例如code_intput_pad[]; 為密碼輸入數(shù)組
- 2.所有的函數(shù)以 類型_功能_名字()
- 例如desplay_set_code(); 為密碼設(shè)置函數(shù)
- desplay_input_code(); 為密碼輸入函數(shù)
- 3.調(diào)用函數(shù)大家可以多用局部變量方便,空間占用又少
- (以上名字方式純屬本人自己感到合適的,大家也可以用適合自己的方式,但是
- 不管是什么樣的命名方式都得有一套方式,這樣做一個比較復雜的程序方便點)
- 4.由于小弟第一次用這種方式寫代碼,所以在寫這個程序中也有些地方?jīng)]注意;
- 給大家?guī)聿槐阏堈徑狻?nbsp;
- 5.廣告王,這里也插播下吧
- 單片機交流群--best單片機交流群,歡迎你的加入一起學習交流
- *********************************************************************************/
- #include<reg52.h>
- #include"delay.h"
- #include"1602.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define port_key P1 //矩陣鍵盤輸入口
- uchar key_num; //鍵盤掃描讀回值須為全局變量
- uchar keypad[]={0xfe,0xfd,0xfb,0xf7}; //鍵盤掃描分別將各行置0
- uchar code_new_pad[6]={1,1,1,1,1,' '}; //6位的設(shè)置密碼存儲‘ ’用來判斷是否輸入第六位密碼
- uchar code_input_pad[6]={1,1,1,1,1,' '}; //用來存儲輸入的密碼
- sbit buzzer=P2^7; //buzzzer接口
- sbit led_r=P2^3;
- sbit led_l=P2^4;
- bit key_pd=0; //按鍵標志
- bit code_compare=0; //密碼對比標志
- uint key_time=0; //記錄鍵盤按下的次數(shù)
- uchar temp=0;
- void init_T1() //定時器1初始化 利用定時器提高鍵盤的掃描速度
- {
- EA=1;
- ET1=1;
- TMOD=0x10; //定時器工作方式選擇16位定時
- TH1=(65536-1000)/256; //定時器高八位
- TL1=(65536-1000)%256; //定時器低八位
- TR1=1; //開啟定時器1
- }
- void play_buzzer(uint j,uint k) //蜂鳴器
- {
- uchar i=0;
- for(j;j>0;j--)
- {
- for(i=0;i<=100;i++)
- {
- buzzer=~buzzer;
- delayms(k);
- }
- }
- }
- uint key_scan() //4*3矩陣鍵盤掃描
- {
- uint i=0;
- uchar key_temp;
- for(i=0;i<4;i++)
- {
- port_key=keypad[i];
- key_temp=port_key;
- key_temp=key_temp&0xf0;
- if(key_temp!=0xf0) //判斷是否有鍵盤被按下
- {
- delayms(15); //延遲15ms,去除鍵盤的抖動
- key_temp=port_key; //重新讀回key_port的值
- key_temp=key_temp&0xf0;
- if(key_temp!=0xf0) //說明確實有鍵被按下
- {
- key_temp=port_key;
- key_pd=1; //鍵盤按下標志
- key_time++; //鍵盤按下次數(shù)標志
- switch(key_temp)
- {
- case 0xee: key_num=1+0x30;play_buzzer(2,50); break; //將數(shù)字轉(zhuǎn)化為ASC
- case 0xde: key_num=2+0x30;play_buzzer(2,50); break;
- case 0xbe: key_num=3+0x30;play_buzzer(2,50); break; //以上3行代碼為第一行掃描
- case 0xed: key_num=4+0x30;play_buzzer(2,50); break;
- case 0xdd: key_num=5+0x30;play_buzzer(2,50); break;
- case 0xbd: key_num=6+0x30;play_buzzer(2,50); break; //第二行掃描
- case 0xeb: key_num=7+0x30;play_buzzer(2,50); break;
- case 0xdb: key_num=8+0x30;play_buzzer(2,50); break;
- case 0xbb: key_num=9+0x30;play_buzzer(2,50); break; //第三行掃描
- case 0xe7: key_num=10;play_buzzer(1,50); break; //...10代表確定鍵
- case 0xd7: key_num=0+0x30;play_buzzer(2,50); break;
- case 0xb7: key_num=11;play_buzzer(1,50); break; //第四行掃描..11代表刪除鍵
- }
- while(key_temp!=0xf0) //松手檢測
- {
- key_temp=port_key;
- key_temp=key_temp&0xf0;
- }
- }
- }
- }
- return key_num;
- }
- void new_save_code() //將設(shè)置密碼存入code_new_pad
- {
- if(key_time<=6) //防止密碼輸入超過6位
- {
- code_new_pad[key_time-1]=key_num;
- gotoxy(2,key_time-1);
- w_dat_lcd(code_new_pad[key_time-1]);
- }
- }
- void input_save_code() //將輸入的密碼存入code_input_pad
- {
- if(key_time<=6)
- {
- code_input_pad[key_time-1]=key_num; //注意key_time的控制須好好把握
- gotoxy(2,key_time-1);
- w_dat_lcd(code_input_pad[key_time-1]);
- }
- }
- uint compare_code() //輸入密碼與設(shè)置密碼對比
- {
- uint i=0;
- for(i=0;i<6;i++)
- {
- if(code_input_pad[i]==code_new_pad[i])
- {
- if(i==5)
- code_compare=1;
- else continue;
- }
- else
- {
- code_compare=0;
- break; //只要有一位密碼不對就跳出循環(huán)
- }
- }
- return code_compare;
- }
- void key_serve() //鍵盤服務(wù)程序
- {
- if(key_pd==1) //判斷是否有鍵被按下
- {
- key_pd=0;
- if(key_num==11) //是否按下刪除鍵
- {
- gotoxy(2,key_time-2);
- w_dat_lcd(' '); //刪除當前數(shù)字
- key_time=key_time-2;
- }
- else if(key_num==10&&temp==0) //是否按下設(shè)置密碼時的確定鍵
- {
- if(code_new_pad[5]!=' ') //判斷是否輸入了第六個密碼
- {
- key_time=0;
- w_com_lcd(0x01); //清屏指令
- desplay_set_succ();
- delaylong(500);
- desplay_input_code();
- temp=1;
- }
- else //沒有輸入6位密碼
- {
- key_time=0;
- w_com_lcd(0x01);
- desplay_set_error();
- delaylong(500);
- desplay_set_code();
- }
- }
- else
- {
- if(temp==0) //利用temp的數(shù)值判斷將鍵盤密碼存入那個數(shù)組中
- new_save_code();
- else if(temp==1)
- {
- input_save_code();
- if(code_input_pad[5]!=' ') //判斷是否輸入了6位密碼
- {
- if(key_num==10)
- {
- compare_code(); //密碼判斷函數(shù)
- if(code_compare==1)
- {
- w_com_lcd(0x01);
- desplay_input_succ();
- led_r=1;
- play_buzzer(20,88);
- }
- else
- {
- w_com_lcd(0x01);
- desplay_input_error();
- led_l=1;
- play_buzzer(20,50);
- led_l=0;
- desplay_input_code();
- key_time=0;
- }
- }
- }
- }
- }
- }
- }
- void main() //主函數(shù)
- {
- led_r=0;
- led_l=0;
- init_lcd();
- init_T1();
- desplay_set_code();
- for(;;)
- {
- key_serve();
- }
- }
- void timer1() interrupt 3 // 定時器1中斷服務(wù)
- {
- TH1=(65536-1000)/256;
- TL1=(65536-1000)%256;
- key_scan(); //按鍵掃描程序放入中斷提高掃描速度
- }
復制代碼
|