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.实物展示
温馨提示:这模块需要一直供电,我外联了两根很长的导线来连接排插。