|
基于c51的led電子鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.01 KB, 下載次數(shù): 57)
下載附件
2018-5-5 23:25 上傳
0.jpg (27.14 KB, 下載次數(shù): 51)
下載附件
2018-5-5 23:24 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<stdio.h>
- unsigned char password[6]={0,1,2,3,4,5,};//初始密碼
- sbit LED1=P1^3;
- sbit LED2=P1^4;
- sbit LED3=P1^5;
- sbit Beep=P0^5;
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^2;
- #define CHECK_BUSY
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_CLR RW=0
- #define RW_SET RW=1
- #define EN_CLR EN=0
- #define EN_SET EN=1
- #define DataPort P3
- void LCD_Write_Com(unsigned char com) ;
- void LCD_Write_Data(unsigned char Data) ;
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
- void LCD_Init(void) ;
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- unsigned char KeyScan(void)
- {
- unsigned n,key,key_r,key_c;
- n=0;
- P2=0x70;
- key_c=P2;
- key_c=key_c & 0x70;
- if(key_c!=0x70)
- {
- DelayMs(30);
- if(key_c!=0x70)
- {
- key_c=key_c | 0x07;
- P2=key_c;
- key_r=P2;
- key_r=key_r & 0x07;
- key_c=key_c & 0x70;
- key=key_c+key_r;
- key=key & 0x77;
- P2=0x70; //等待本次按鍵結(jié)束
- while(P2!=0x70);
- return key;
- }
- }
- return 0x70;
- }
- /*------------------------------------------------
- 按鍵值處理函數(shù),返回掃鍵值
- ------------------------------------------------*/
- unsigned char KeyPro(void)
- {
- int n=9;
- switch(KeyScan())
- {
- {
- case 0x66: n=0;break;
- case 0X56: n=1;break;
- case 0X36: n=2;break;
- case 0X65: n=3;break;
- case 0X55: n=4;break;
- case 0X35: n=5;break;
- case 0X63: n=6;break;
- case 0X53: n=7;break;
- case 0X33: n=8;break;
- default : break;
- }
- DelayMs(20);
- }
- return n;
- }
- /*------------------------------------------------
- 寫入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Com(unsigned char com)
- {
- DelayMs(5);
- RS_CLR;
- RW_CLR;
- EN_SET;
- DataPort= com;
- ;
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(unsigned char Data)
- {
- DelayMs(5);
- RS_SET;
- RW_CLR;
- EN_SET;
- DataPort= Data;
- ;
- EN_CLR;
- }
- /*------------------------------------------------
- 寫入字符串函數(shù)
- ------------------------------------------------*/
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- while (*s)
- {
- LCD_Write_Char(x,y,*s);
- s ++; x++;
- }
- }
- /*------------------------------------------------
- 寫入字符函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0)
- {
- LCD_Write_Com(0x80 + x);
- }
- else
- {
- LCD_Write_Com(0xC0 + x);
- }
- LCD_Write_Data( Data);
- }
- /*------------------------------------------------
- 初始化函數(shù)
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); /*顯示關(guān)閉*/
- LCD_Write_Com(0x01); /*顯示清屏*/
- LCD_Write_Com(0x06); /*顯示光標(biāo)移動(dòng)設(shè)置*/
- LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/
- }
- main()
- {
- unsigned char num,j;
- int i=0,a=0,value=9;
- unsigned char temp[6];
- bit Flag;
- LCD_Init(); //初始化液晶屏
- DelayMs(10); //延時(shí)用于穩(wěn)定,可以去掉
- LCD_Write_String(0,0," chose mode "); //寫入第一行信息,主循環(huán)中不再更改此信息,所以在while之前寫入
- LCD_Write_String(0,1," input 6or7or8 "); //寫入第二行信息
- while (1) //主循環(huán)
- {
-
- num=KeyPro(); //掃描鍵盤
- if(num!=9) //如果掃描是按鍵有效值則進(jìn)行處理
- {
- if(num==8)
- {
- LCD_Write_String(0,0,"password: ");
- LCD_Write_String(0,1," ");
- LED1=0;
- LED2=1;
- LED3=1;
- }
- if(num==7)
- {
- i--;
- LCD_Write_Char(i,1,' ');
- }
- if(num==6)
- {
- LCD_Write_String(0,0,"Set password!");
- LCD_Write_String(0,1," ");
- LED1=1;
- LED2=0;
- LED3=1;
- for(j=0;j<6;j++)
- {
- while(value==9)
- {
- value = KeyPro();
- }
- password[j]= value ;
- value=9;
-
- LCD_Write_Char(j,1, password[j]+'0');
- }
- LCD_Write_String(0,0,"Set sucessd!");
- LCD_Write_String(0,1," ");
- }
- if(num<6) //密碼是6位,大于6位時(shí)不再輸入按鍵值
- {
- temp[i]=num;
- LCD_Write_Char(i,1,num+'0');
- i++; //輸入數(shù)值累加
- }
- if(i==6)//6位后的按鍵不輸入數(shù)值,相當(dāng)于確認(rèn)按鍵(任意按鍵即可)
- {
- i=0; //計(jì)數(shù)器復(fù)位
- Flag=1;//先把比較位置1
- for(j=0;j<6;j++)//循環(huán)比較6個(gè)數(shù)值,如果有一個(gè)不等 則最終Flag值為0
- Flag=Flag&&(temp[j]==password[j]);//比較輸入值和已有密碼
- if(Flag)//如果比較全部相同,標(biāo)志位置1
- {
- LCD_Write_String(0,1,"Right Open!");//密碼正確顯示的信息
- }
- else
- {
- LCD_Write_String(0,1,"Wrong Retry!");//密碼錯(cuò)誤,提示重新輸入
- DelayMs(255);
- DelayMs(255);
- DelayMs(255);
- DelayMs(255);
- LCD_Write_String(0,1," ");
- a++;
- if(a>=3)
- {
- LCD_Write_String(0,0,"not allow input");
- LCD_Write_String(0,1,"Wrong Waring!");
- LED1=1;LED2=1;LED3=0;
- Beep=0;
- while(1);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
led電子鎖.rar
(19.42 KB, 下載次數(shù): 114)
2018-5-5 16:55 上傳
點(diǎn)擊文件名下載附件
代碼加原理圖 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|