大学生宿舍密码锁设计—基于51单片机

1.环境搭建

软件: Keil uVision5

硬件:51单片机系列最小系统板(我用的是STC12c60S2)、USB转ttl串口、SG90舵机、矩阵键盘。

其它:热熔胶枪、杜邦线若干、纸片若干、绳子若干。

2.SG90舵机的使用

舵机接线:

 舵机通常要一个20ms左右的时基脉冲,脉冲的高电平部分通常在0.5ms-2.5ms范围内,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系:

                                  0.5ms--------------0度;50

                                 1.0ms------------45度;100

                                 1.5ms------------90度;150

                                 2.0ms-----------135度;200

                                 2.5ms-----------180度;250

舵机使用:

通过操控信号线的高低电平来控制舵机的转动角度

       

 注意事项:

舵机的力度与通过的电流有很大关系,通常需要6V或以上的电流才能驱动宿舍门锁的开关。

3.连接宿舍门锁 

让舵机带动宿舍的门锁是我认为难度最大的部分。

我宿舍的门锁:

我用一个盖子粘在锁头上,用绳子连接瓶盖和舵机。由于电流不够大,舵机只能锁芯拉动一点点。所以我把纸片填充了锁盖,让锁芯刚好能卡住锁盖。

并额外在锁上用一根绳子拉紧盖子防止开门时锁芯回拉把舵机弄坏。

               

 4.程序编写

 由于我的键盘接线是有问题的,所以IO口的连接与平时的连接不一样。

#include <reg52.h>           //低电平驱动

sbit  LED    =P2^0;
sbit  buzz   =P2^1;
sbit SEV_PWM = P1^4;          //设定PWM输出端口


unsigned char count = 0;
unsigned char SEV_conut =8;
unsigned char KeyNum;
unsigned int number=0; 
unsigned int Password;  //两个变量的互换

/*定时器T0初始化*/
void Com_Init()           
{
    TMOD &= 0x00;
    TMOD |= 0x01; //定时器T0设置成方式1
    TH0 = 0xff;   //定时常数 0.1ms 晶振为11.0592MHz
    TL0 = 0xa4;
    ET0 = 1;      
    TR0 = 1; 
	EA=1; 
}
//按键IO口初始化
void MatrixKeyInit()
{	
	P01=1;
    P02=1;
    P03=1;
	P04=1;
	P05=1;
	P06=1;
    P07=1;
}

/*T0中断初始化*/
void Time0_Init() interrupt 1 
{
	TR0 = 0; 
	TH0 = 0xff;                  //重装时间常数 0.1ms
	TL0 = 0xa4;
	if(count <= SEV_conut)      //5==0° 10==90°
	{ 
		SEV_PWM = 1; 
	}
	else 
	{ 
		SEV_PWM = 0; 
	}
	count++;
	if (count >= 200)          //T = 20ms清零
	{ 
		count = 0; 
	}
	TR0 = 1;                  //开启T0
}
//延时函数
void Delay(unsigned int xms)
{
		unsigned int i,j;
		for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

//按键输入密码     
unsigned char MatrixKey()
{
    unsigned char KeyNember=0000;
    MatrixKeyInit();
	P05=0;
	if(P03==0){Delay(20);while(P03==0);KeyNember=1;}
	if(P01==0){Delay(20);while(P01==0);KeyNember=4;}
	if(P02==0){Delay(20);while(P02==0);KeyNember=7;}
    if(P04==0){Delay(20);while(P04==0);KeyNember=11;}
	
	MatrixKeyInit();
	P07=0;
	if(P03==0){Delay(20);while(P03==0);KeyNember=2;}
	if(P01==0){Delay(20);while(P01==0);KeyNember=5;}
	if(P02==0){Delay(20);while(P02==0);KeyNember=8;}
    if(P04==0){Delay(20);while(P04==0);KeyNember=10;}
    
	MatrixKeyInit();        
	P06=0;                  
	if(P03==0){Delay(20);while(P03==0);KeyNember=3;}
	if(P01==0){Delay(20);while(P01==0);KeyNember=6;}
	if(P02==0){Delay(20);while(P02==0);KeyNember=9;}
    if(P04==0){Delay(20);while(P04==0);KeyNember=12;}
    
	return KeyNember;
}
                  

void main()
{ 
   Com_Init();
	while(1)
	{
         // P10=0;
	  KeyNum=MatrixKey();    //每按下一次按键,程序都会运行一次
	  if(KeyNum!=0)
	   {
	      if(KeyNum<=10)
		{
			if(number<4)
			{
				Password=Password*10;    //密码左移一位
				Password+=KeyNum%10;   //
				number++;
			}			
		}
		 if(KeyNum==11)    //11是确认按键
		{
			if(Password==1234567890)            //密码是1234567890
        	{
			  Password=0;                   //将之前输入的密码清空
			  number=0;
              P10=0;
              SEV_conut =20;               //5代表0.5ms    驱动舵机 
			  count=0;
//            buzz=0;                      //蜂鸣器启动
              Delay(1000000000);
              SEV_conut =5;                //舵机复原
              P10=1;
			}
			else
			{               
	    	 Password=0;                 //将之前输入的密码清空
			 number=0;
             P11=0;
             Delay(10);
             P11=1;
			}
	   }
     }
       
   }
}

5.实物展示

                

温馨提示:这模块需要一直供电,我外联了两根很长的导线来连接排插。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值