專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)電子密碼鎖程序(2)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年10月16日   【字體:

仿真文件和完整源碼下載地址:http://www.torrancerestoration.com/bbs/dpj-22586-1.html
論文下載地址:http://www.torrancerestoration.com/f/電子密碼鎖論文最終稿.docx
下面是main.c文件:
 

#include <reg52.h>
#include "delay_ms.h"
#include  "矩陣鍵盤(pán).h"
#include "i2c.h"
#include "1602.h"
#include "delay_ms.h"
#include "mima.h"
#define uchar unsigned char
#define uint unsigned int
#define A 0x0a //輸入密碼
#define B 0x0b  //修改密碼
#define D 0x0d //關(guān)鎖
#define enter 0x0c //確認(rèn)
#define backspace 0x0f //退格鍵
sbit baojing = P3^7; //蜂鳴器接口
sbit lock = P3^3;//鎖信號(hào)
sbit set = P3^2;
uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密碼
uchar flag_change; 
uchar aa;//存放密碼錯(cuò)誤的次數(shù),夠三次報(bào)警
uchar bb;
uchar flag_t0;
void baoj1()//報(bào)警函數(shù)
{
	int i;
	for(i = 0;i < 5; i++)
	{
		baojing = 1;
		delay_ms(5);
		baojing = 0;
		delay_ms(5);	
	}

}
void baoj()
{
	uchar i;
	for(i = 0; i < 10; i++)
		baoj1();
}
/*密碼處理函數(shù)*/
void mimachuli() 
{
	uchar key,i;
	uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密碼緩沖區(qū)
	uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
	uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};

	key = step_choose();
	if(key == A)//A被按下,接收輸入密碼,處理
	{
		read_n_add(mima_1,0x00,6);
		write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
		write_com(0x0f);//顯示光標(biāo)
		lcd_pos(0,0);
		write_n_char(" press password ");		
	
		if(input_mima(mima_2)) //處理輸入密碼
		{
			if(mimaduibi(mima_2,mima_1)) //密碼正確
			{
				lcd_pos(0,0);
				write_com(0x0c);
	        	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
	         	write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
				write_n_char(" password right ");
				aa = 0; //清除密碼錯(cuò)誤次數(shù)
				lock = 0; //開(kāi)鎖
				baojing = 1; //響一下
				delay_ms(1000);
				baojing = 0;
				TR0 = 1;
				flag_t0 = 1;
				while(key != D && flag_t0) //D沒(méi)按下一直開(kāi)
				{			
					key = keyscan();
				}
				TR0 = 0;
				lock = 1;//D按下了關(guān)鎖
			}
			else //密碼 不正確
			{
				lcd_pos(0,0);
				write_com(0x0c); //關(guān)光標(biāo)
				write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
				write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
				write_n_char(" password wrong");
				delay_ms(1000);
				aa++;
				if(aa == 4)
				{
					aa = 0;
			    	i = 20; //密碼不正確報(bào)警
					while(i--)
					 baoj();
				}

			}
		}
		else //密碼沒(méi)有輸入正確或完成
		{
			lcd_pos(0,0);
			write_com(0x0c); //關(guān)光標(biāo)
	   	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		   write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
			write_n_char(" password wrong");
			delay_ms(1000);
			aa++;
			if(aa == 4)
			{
				aa = 0;
		    	i = 20; //密碼不正確報(bào)警
				while(i--)
				 baoj();
			}

		}
	}

	if(key == B)//B被按下,修改密碼
	{
		read_n_add(mima_1,0x00,6);
		write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
		write_com(0x0f);//顯示光標(biāo)
		lcd_pos(0,0);
		write_n_char(" input password");		
		write_com(0x0f);//顯示光標(biāo)	
		if(input_mima(mima_2)) //處理輸入密碼
		{
			if(mimaduibi(mima_2,mima_1)) //密碼正確
			{
				lcd_pos(0,0);
				write_com(0x0c);
	      	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
	      	write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
				write_n_char("password right ");
				aa = 0; //清除密碼錯(cuò)誤次數(shù)
				delay_ms(1500);
				flag_change = 1;
				while(flag_change) //下面開(kāi)始修改密碼
				{
					write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
					write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
					write_com(0x0f);//顯示光標(biāo)
					lcd_pos(0,0);
					write_n_char("In new password");
					delay_ms(1500);
					if(input_mima(mima_2)) //處理輸入密碼
					{

						lcd_pos(0,0);
						write_com(0x0c);
			         write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
			         write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
						write_n_char("Input new pass"); //確定新密碼
						lcd_pos(1,0);
						write_n_char("word again");
						delay_ms(2000);
						lcd_pos(0,0);
						write_com(0x0f);//顯示光標(biāo)
			         write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
			         write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
						write_n_char("In new password");						
							if(input_mima(mima_3)) //處理輸入密碼
							{
								if(mimaduibi(mima_2,mima_3)) //密碼正確
								{
									lcd_pos(0,0);
									write_com(0x0c);
						      	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
						      	write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
									write_n_char("password has");
									lcd_pos(1,0);
									write_n_char("change already");
									write_n_add(mima_3,0x00,6); //把修改的密碼存進(jìn)24C02
									delay_ms(2000);
									flag_change = 0;
								}
								else //密碼 不正確
								{
									lcd_pos(0,0);
									write_com(0x0c); //關(guān)光標(biāo)
									write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
									write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
									write_n_char("password wrong");
									delay_ms(1000);
									aa++;
									if(aa == 4)
									{
										aa = 0;
								    	i = 20; //3次輸入密碼不正確報(bào)警
										while(i--)
										 baoj();
									}
									flag_change = 0;
								}
							}
							else //密碼沒(méi)有輸入正確或完成
							{
								lcd_pos(0,0);
								write_com(0x0c); //關(guān)光標(biāo)
						   	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
							   write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
								write_n_char(" password wrong");
								delay_ms(1000);
								aa++;
								if(aa == 4)
								{
									aa = 0;
							    	i = 20; //3次輸入密碼不正確報(bào)警
									while(i--)
									 baoj();
								}
							}
						
					}
					else //密碼沒(méi)有輸入正確或完成
					{
						lcd_pos(0,0);
						write_com(0x0c); //關(guān)光標(biāo)
				   	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
					   write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
						write_n_char("password wrong");
						delay_ms(1000);
						flag_change = 0;
						aa++;
						if(aa == 4)
						{
							aa = 0;
					    	i = 20; //3次輸入密碼不正確報(bào)警
							while(i--)
							 baoj();
						}
					}
									
				}
			}
			else //密碼 不正確
			{
				lcd_pos(0,0);
				write_com(0x0c); //關(guān)光標(biāo)
				write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
				write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
				write_n_char("password wrong");
				delay_ms(1000);
				aa++;
				if(aa == 4)
				{
					aa = 0;
			    	i = 20; //3次輸入密碼不正確報(bào)警
					while(i--)
					 baoj();
				}
			}
		}
		else //密碼沒(méi)有輸入正確或完成
		{
			lcd_pos(0,0);
			write_com(0x0c); //關(guān)光標(biāo)
	   	write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		   write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
			write_n_char("password wrong");
			delay_ms(1000);
			aa++;
			if(aa == 4)
			{
				aa = 0;
		    	i = 20; //3次輸入密碼不正確報(bào)警
				while(i--)
				 baoj();
			}
		}		
	}

}
 /*外部中斷函數(shù),恢復(fù)出廠設(shè)置,長(zhǎng)按set鍵恢復(fù)*/

void int0() interrupt 0
{
	delay_ms(2000);
	if(!set)
	{
		lcd_pos(0,0);
		write_com(0x0c); //關(guān)光標(biāo)
	   write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
		i2cinit();//24C02總線(xiàn)初始化
		write_n_add(mima_5,0x00,6);
		write_n_char("password renew");
		lcd_pos(1,0);
		write_n_char("already");
		delay_ms(1000);
		lcd_pos(0,0);
		write_com(0x0c); //關(guān)光標(biāo)
	   write_com(0x06);//寫(xiě)一個(gè)字符后地址指針加 1 
		write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
		write_n_char("Input password");
		lcd_pos(1,0);
		write_n_char("Press key A");

	}// 引起了三個(gè)警告
}

void timer0() interrupt 1 //定時(shí)器0中斷,50ms定時(shí)
{
	TH0 = 0x4c;//50ms定時(shí)
	TL0 = 0x00;
	bb++;
	if(bb == 200)//10秒時(shí)間到
	{
		bb = 0;
		flag_t0 = 0;
	}

}
void main()
{
	yjinit();//液晶初始化
	i2cinit();//24C02總線(xiàn)初始化
	baojing = 0;
	lock = 1; //關(guān)鎖
	TMOD = 0x01;//選擇定時(shí)器0方式1
	EA = 1;//打開(kāi)總中斷
	ET0 = 1;//打開(kāi)定時(shí)器0中斷
	EX0 = 1; //打開(kāi)外部中斷0
	IT0 = 1;//下降沿觸發(fā)
	TR0 = 0;//關(guān)閉定時(shí)器
	TH0 = 0x4c;//50ms裝初值
	TL0 = 0x00;
	while(1)
	{
	  mimachuli(); 

	}
}



關(guān)閉窗口

相關(guān)文章