最近学了点C语言,手头上又有很多单片机,想做个门锁,买了舵机,开工。。
测试舵机的。舵机是用PWM的占空比来控制目标位置,很精准,但行程只有180度
舵机+乐高积木做的门锁
热熔胶沾上
皮肤颜色的零件是专门用来滑动的塑料,表面很光滑,几乎没有磨损
几条积木把旋钮扣住
锁住
壳子
这种壳子一般是做移动电源的
画好开孔位置
电键
打孔
方形
装好
热熔胶粘好
LED
共阳
焊线
单片机 12C2052
测试LED
连线
做好了
现在要把程序口和输出口,电源接口接出来
打洞
插针
热熔胶
粘好板子
盒盖
写程序
搞定了。。
今天有时间顺便装上。。
铝箔纸,剪成小段,正极和负极。
做个USB做供电
焊线
外壳
做好了
铝箔纸
用胶纸粘在门框
门上用很厚(大概2mm)的那种白色的双面胶也粘上,和门框的对准
控制器
测试
铝箔纸相当电极,接触就接通5V电源
关上门通电后自动运行锁门程序。
把舵机的线也连上
门背面
锁门
解锁
电路图:
============================下面附上源代码============================
#include<reg51.h>
#define keyboard P1
sbit KEY=P3^2;
sbit Red=P3^3;
sbit Yellow=P3^4;
sbit Green=P3^5;
sbit MOTOR=P3^7;
void delay(unsigned int t)
{
while(t--);
}
void LOCK()
{
unsigned int a,b,c;
a=990;
b=2000-a;
Yellow=0;
for(c=0;c<200;c++)
{
MOTOR=1;
delay(a);
MOTOR=0;
delay(b);
}
MOTOR=1;
Yellow=1;
Red=0;
Green=1;
}
void UNLOCK()
{
unsigned int a,b,c;
a=600;
b=2000-a;
Yellow=0;
for(c=0;c<200;c++)
{
MOTOR=1;
delay(a);
MOTOR=0;
delay(b);
}
MOTOR=1;
Yellow=1;
Green=0;
Red=1;
}
void main()
{
unsigned int a,b,y,z;
unsigned char password[8]={1,2,4,3,6,5,7,8};
unsigned char word[8]="00000000";
for(z=0;z<6;z++)
{
delay(50000);
Red=!Red;
}
while(1)
{
LOCK();
for(y=0;y<8;y++)
{
keyboard=0xff;
while(keyboard==0xff);
switch(keyboard)
{
case(0x7f):a=1;Yellow=0;delay(5000);Yellow=1;break;
case(0xbf):a=2;Yellow=0;delay(5000);Yellow=1;break;
case(0xdf):a=3;Yellow=0;delay(5000);Yellow=1;break;
case(0xef):a=4;Yellow=0;delay(5000);Yellow=1;break;
case(0xf7):a=5;Yellow=0;delay(5000);Yellow=1;break;
case(0xfb):a=6;Yellow=0;delay(5000);Yellow=1;break;
case(0xfd):a=7;Yellow=0;delay(5000);Yellow=1;break;
case(0xfe):a=8;Yellow=0;delay(5000);Yellow=1;break;
}
delay(50000);
word[y]=a;
while(keyboard!=0xff);
}
b=0;
for(y=0;y<8;y++)
{
if(word[y]==password[y])
{
b=b+1;
}
}
if(b==8)
{
UNLOCK();
while(KEY==1);
}
}
}
如果使用过程发现bug,欢迎提出探讨!
THE END
如果大家觉得帖子不错,请点击下方“喜欢”!