首页 > 其他分享 >基于单片机的蓝牙密码锁系统设计(#0532)

基于单片机的蓝牙密码锁系统设计(#0532)

时间:2024-01-13 13:31:37浏览次数:26  
标签:P2 输出 0532 P1 P0 单片机 密码锁 管脚 输入


功能描述

1、采用51/52单片机(通用)作为主控芯片;
2、采用1602液晶显示使用过程及状态,液晶屏亮度会随光线自动调整;
3、按键输入6位密码,输入密码正确则锁打开,显示open!输入密码错误次数超过3次,蜂鸣器报警并且锁定键盘;
4、密码可以自己修改,必须是锁打开时才能改密,为防止误操作,修改密码得输入两次;
5、采用24C02保存密码,掉电不丢失;
6、可通过手机蓝牙软件输入密码操作锁的状态;

电路设计

采用Altium Designer作为电路设计工具。Altium Designer通过把原理图设计、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。

基于单片机的蓝牙密码锁系统设计(#0532)_单片机

单片机管脚说明:

P0端口(P0.0-P0.7):P0口为一个8位漏极开路双向I/O口,每个引脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2端口(P2.0-P2.7):P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口,用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3端口(P3.0-P3.7):P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(ILL)。P3口同时为闪烁编程和编程校验接收一些控制信号。

仿真设计

采用Proteus作为仿真设计工具。Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

基于单片机的蓝牙密码锁系统设计(#0532)_上拉_02

主程序设计

void main(void)
{
 	unsigned char KEY,NUM;
	unsigned char i,j;
 	P1=0xFF; 				   //P1口复位
	TMOD=0x12;				   //定义工作方式
 	TH0=0xB0;
 	TL0=0x3C;				   //定时器赋初值
 	EA=1;					   //打开中断总开关
 	ET0=1;					   //打开中断允许开关
 	TR0=0;					   //打开定时器开关
	TH1=0Xfd;
	TL1=0Xfd;	    //9600
	TR1=1; 		    // 定时器1启动  
	SM0=1;	    // 设置串口的工作模式
	SM1=1; 	    //方式1
	REN=1; 		 // 允许串口接收数据 	 
	ES=1; 	     // 串口中断应许 
 	
 	Delay400Ms(); 	//启动等待,等LCM讲入工作状态
 	lcd_init(); 	//LCD初始化
	write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
	for(i=0;i<16;i++)
	{
		write_1602dat(name[i]);//向液晶屏写开机画面
	}
	write_1602com(er);
	for(i=0;i<16;i++)
	{
		write_1602dat(start_line[i]);//写输入密码等待界面
	}
	write_1602com(er+9);	//设置光标位置
	write_1602com(0x0f);	//设置光标为闪烁
 	Delay5Ms(); //延时片刻(可不要)

 	N=0;														//初始化数据输入位数
	RdFromROM(MM,17,1);
	M=MM[0];
		if(M==0||M>16)
	{
	 M=6;
	 MM[0]=6;
	 WrToROM(MM,17,1);
	}
 	while(1)		 //进入循环
 	{
		if(key_disable==1)						//锁定键盘标志为1时
			Alam_KeyUnable();					//报警键盘锁
		else
			ALAM=1;								//关报警

		KEY=keynum();							//读按键的位置码
		if(KEY!=0)								//当有按键按下时
		{	
			if(key_disable==1)					//锁定键盘标志为1时
			{
				second=0;						//秒清零
			}
			else								//没有锁定键盘时
			{
				NUM=coding(KEY);				//根据按键的位置将其编码,编码值赋值给NUM
				{
					switch(NUM)					//判断按键值
					{
						case ('A'): 	; 					break;
						case ('B'):		;     				break;
						case ('C'): 
								write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
								for(i=0;i<16;i++)
								{
									write_1602dat(name[i]);//向液晶屏写开机画面
								}
						       if(N>=1) N--;	OneAlam();								//按键提示音						
								//DisplayOneChar(6+N,1,'*');
							   for(j=N;j<16;j++)
							  {
							  write_1602com(er+j);
							       write_1602dat(' ');
							  }
						 	  for(j=0;j<N;j++)
							  {
									write_1602com(er+j);				//显示位数随输入增加而增加
									write_1602dat('*');					//但不显示实际数字,用*代替
								}  
									InputData[N]=N+6;
											break;		//ABC是无定义按键
						case ('D'): ResetPassword();		break;      //重新设置密码
						case ('*'): Cancel();				break;      //取消当前输入
						case ('#'): Ensure(); 				break;   	//确认键,
						default: 										//如果不是功能键按下时,就是数字键按下
						{	
							//DisplayListChar(0,1,Input);
							write_1602com(yi);
							for(i=0;i<16;i++)
							{
								write_1602dat(Input[i]);				//显示输入画面
							}
						    operation=0;								//操作标志清零
							if(N<16)                   					//当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
							{  
								OneAlam();								//按键提示音						
								//DisplayOneChar(6+N,1,'*');
						 		for(j=0;j<16;j++)
								{
								    if(j>N)
									{
									  write_1602com(er+j);
									  write_1602dat(' ');
									}
								    if(j<=N)
									{
									write_1602com(er+j);				//显示位数随输入增加而增加
									write_1602dat('*');					//但不显示实际数字,用*代替	  
									}
								}
								InputData[N]=NUM;						//将数字键的码赋值给InputData[]数组暂存
								N++;									//密码位数加
							}
							else										//输入数据位数大于6后,忽略输入
							{
								N=16;									//密码输入大于6位时,不接受输入
						 		break;
							}
							write_1602com(er+N);
							if(ReInputEn==1&&ReInputCont==0)
							M=N;
						}
					}
				}
			}
	 	} 
	}
}

//*********************************中断服务函数**************************************
void  time0_int(void) interrupt 1 		   //定时器T0
{
 	TH0=0xB0;
 	TL0=0x3C;		  //定时器重新赋初值
 	//TR0=1;
 	countt0++;			   //计时变量加,加1次时50ms
  	if(countt0==20)		   //加到20次就是1s
   	{
		countt0=0;		   //变量清零
		second++;		   //秒加
		if(pass==1)		   //开锁状态时
		{
			if(second==1)			//秒加到1s时
			{
			 
				TR0=0;				//关定时器
				TH0=0xB0;
 				TL0=0x3C;			//再次赋初值
				second=0;			//秒清零
			}
		}
		else						//不在开锁状态时
		{
			if(second==3)			//秒加到3时
			{
				TR0=0;				//关闭定时器
				second=0;			//秒清零
				key_disable=0;		//锁定键盘清零
				s3_keydown=0;	
				TH0=0xB0;
				TL0=0x3C;			//重新赋初值
			}
			else
			    TR0=1;				//打开定时器
		}
			
   	}
}

源文件获取

关注公众号-电子开发圈,首页发送 “密码锁” 获取;

标签:P2,输出,0532,P1,P0,单片机,密码锁,管脚,输入
From: https://blog.51cto.com/u_15856507/9232029

相关文章

  • 51单片机中断系统编程
    一.外部中断1.编程思想中断准备:中断初始化函数打开中断开关,选择中断传输方式中断处理:为了便于观察,让我们知道单片机进入中断处理函数,在这里我们选择打开流水灯电路搭建:由于P3^3引脚不便直接接地,我们把P3^3和P3^7连接起来,用P3^7来控制P3^3的电平变化2.实践代码#include<reg52.h>#......
  • 使用51单片机点亮你的灯
    1.项目结构 2.源代码main.c#include<reg52.h>sbitled=P1^0;voidmain(){while(1){led=0;}}3.仿真电路 4.仿真效果 6.项目仓库https://gitee.com/navysummer/at89c51.git ......
  • 常用单片机认识
    单片机有哪些类型:  51单片机AVR单片机 MSP430STM8STM32 DSP Linux FPGA   ......
  • 89C51单片机实现五个步进电机和显示实时时钟和日历功能的代码
    为了实现五个步进电机和显示实时时钟和日历功能,我们需要使用89C51单片机、步进电机驱动模块、数码管显示模块和实时时钟模块。以下是一个简单的代码示例:#include<reg52.h>#include<intrins.h>//定义步进电机驱动模块的引脚sbitIN1=P1^0;sbitIN2=P1^1;sbitIN3=P1^......
  • EPROM 作为存储器的 8 位单片机
    一、基本概述TX-P01I83是以EPROM作为存储器的8位单片机,专为多IO产品的应用而设计,例如遥控器、风扇/灯光控制或是玩具周边等等。采用CMOS制程并同时提供客户低成本、高性能等显着优势。TX-P01I83核心建立在RISC精简指令集架构可以很容易地做编程和控制,共有55条指令......
  • CT107D单片机蜂鸣器和继电器的基础了解和应用
    在LED的基础上,了解到译码器或非门锁存器而在蜂鸣器和继电器的应用也需使用到他们Y5是控制蜂鸣器和继电器的端口,与LED不同的是多了个芯片ULN2003达林顿管:具有非门的功能。从P0口输入到器件的信号会变化1变00变1P06是蜂鸣器P04是继电器由图知蜂鸣器是低电平打开而因为......
  • CT107D单片机的LED的基础了解与应用
    对于该单片机的LED控制,需要了解74HC5138译码器,M74HC573MIR锁存器,74HC02非或门这三个器件上图三个引脚可控制模式分别是i/o口扩展映射i/o口扩展接2,3映射:1,2我们以下所有操作是用i/o口扩展展示74HC5138译码器是一个通过三个输出控制八路互斥的低有效输出的芯片八路互斥:......
  • 51单片机开发
    控制LED模块的亮灭根据原理图可知控制LED模块亮灭的管脚为P2端口P2端口的8个引脚分别对应八个LED灯引脚输出0时,对应的LED灯亮起来,引脚输出1时,对应的LED灯熄灭例如我们要点亮P2.0对应的LED灯,那么我们可以让P2=11111110但是不能直接写二进制,要写成十六进制的,并加上0x或0X前......
  • 51单片机【点阵屏】
    51单片机【点阵屏】​ 我们有一个8*8的点阵屏,里面是64个发光二极管。​ 二极管的阳极我们给它接了74HC595的八个输出引脚,阴极接P00-P07引脚。​ 74HC595的八个引脚控制八个行,P00-P07控制八个列,行为1,列为0对应的那个LED灯会亮,其他的组合不行。​ 如何让74HC595的八个输出引脚......
  • 51 单片机【外部中断、定时器中断、回调函数】
    51单片机【外部中断、定时器中断、回调函数】​ 这里的外部中断类似监听器,时时刻刻监视某引脚的电平变化;这里的定时器中断类似于定时任务,可以定时执行某函数;这里将回调函数和中断结合起来,案例里有点设计模式的味道(忘了哪个了,也可能就是感觉,关于高层不能调用低层的解决),也有点函数......