自行车防盗器设计报告 本文关键词:防盗器,自行车,报告,设计
自行车防盗器设计报告 本文简介:大学生电子设计竞赛设计报告题目:自行车防盗器作者:H摘要由于近日来校园内连续出现自行车被盗现象,为了增加同学们的自行车防盗能力,减少同学们的损失,本设计给同学们提供了一个防盗报警器,使同学们的自行车更加安全。本设计主要使用单片机芯片作为控制系统,利用无线遥控控制继电器来实现警报器电路的开与关。当用户
自行车防盗器设计报告 本文内容:
大学生电子设计竞赛设计报告
题目:自行车防盗器
作者:H
摘要
由于近日来校园内连续出现自行车被盗现象,为了增加同学们的自行车防盗能力,减少同学们的损失,本设计给同学们提供了一个防盗报警器,使同学们的自行车更加安全。
本设计主要使用单片机芯片作为控制系统,利用无线遥控控制继电器来实现警报器电路的开与关。当用户不用自行车时,打开电路,当自行车被骑走时,将受到震动,受震的弹簧触片即与地瞬间接触,弹簧触片所连接的IO口此时将收到一个低电平信号,系统在收到信号后,将立刻给蜂鸣器传输一个低电平信号,使其鸣叫,发生警报。
此外,本设计设有按键C,当同学们按下C键时,车子将发生鸣叫,此功能方便同学们在车子附近时,可以检查自己的车子是否还在。或者有时因停放车子太多,找不到车子,可以使用此功能,即可循声找到自己的车子。
本设计构造简单,制作费用低,是同学们车子防盗的廉价好管家。
关键字:自行车
防盗
遥控
单片机
设计与总结报告
1.
设计任务与要求
1.1任务
制作一个自行车的防盗产品。
1.2要求
基本要求
l
系统正常工作后,能禁止他人非法移动车子,或当车子被非法移动时,能够起到警报作用;
l
可以准确判断车子是否被非法移动;
l
报警触发后,不会被停止;
2.理论分析与方案论证
当前校园中,经常出现自行车被盗,仅有一把铁锁的自行车在小偷面前简直有锁如同没有锁,主要是小偷开锁技巧高超,各种锁难以支架。在21世纪,这个电子技术高速发展的时代,利用电子技术来制作一个廉价防盗器非常具有应用价值与必要。
假若使用蜂鸣器作为一个警报器则可防止小偷盗走车辆。然而,这个警报器必须能辨别车辆是否被移动,此问题可以用加速感应器或震动感应器来辨别。而同时警报器要能辨别出此移动是否合法的,这个可以考虑用电路的开与关来辨别,当车主使用车辆时,可以关掉警报器电源,车主需要采取防盗功能时,则把电源接上。若果使用普通开关控制,则虽然车主能使用此开关来控制电路,但小偷亦能使用此开关。然而若果换成遥控开关的话,则遥控器只在车主的手上,也就只有车主能够控制警报器的电源开关了。同时,为防止防盗器被小偷毁坏,可以把警报器装在自行车内部。
2.1
各模块选择与论证
2.1.1芯片的选择
考虑到本设计需要对信号进行分析处理,而储存信息不多,考虑使用256
Byte
On-chip
RAM的STC89C52单片机芯片。
2.1.2遥控模块的选择
有无线遥控或红外遥控的选择,若果选择红外遥控,则外露的接收头易被他人损坏,且接收不方便。故选择无线遥控,无线遥控传输信号方便,任何方向皆可。同时,接收模块可以装在自行车内,不易于被损坏。
考虑到本设计所需按键不多,故在淘宝浏览后,选择了只有四位按键的小七遥控器。
3.1.3移动感应模块的选择
自行车移动时必须能被感应。此感应模块可以考
虑加速感应器,加速感应器如右图。感应器易于制作,
然而,由于材料有限,找不到足够质量的小导体b或
弹性系数足够小的弹簧,故本设计采用了震动感应器,
当发生震动时,a将会左右摇摆,与导体b接触。制作
更为方便,且对材料要求较低,易于制作。
3.1.4警报模块的选择
作为警报器,必须声音锐利,然而,材料有限,暂用普通的蜂鸣器代替。
3.2
结论
通过对各类型元器件的对比,考虑到设计成本和设计精度的要求,在充分保障系统可靠性的前提下,我们选择了成本低廉的元器件,降低了系统硬件投资并减少了软件开发周期,具有可行性。同时,在模块的选择时,考虑了系统升级或者功能的改变带来的资源消耗,我们考虑了冗余部分资源,提高了系统的适应能力。
4.
系统硬件设计
4.1
系统总体设计
材料:继电器、蜂鸣器、12M晶振、USB接口母座、二极管、40口插座、STC89C52单片机、万用板、小弹环、螺丝各一个,22P电容2个,S9012三极管2个,无线发射接收模块1对,漆包线若干。
5.
系统软件设计
本系统采用了STC89C52单片机芯片作为系统控制中心,在软件设计中利用了该单片机控制蜂鸣器与继电器的开与关。
整个程序的编写均由C语言完成,在程序设计中,采用了结构化程序设计方法,使各个模块程序相对独立开来,便于程序代码的维护、移植和升级。同时,这样分离式程序设计,降低了代码的调试难度,缩短了调试周期。在程序设计中,大量使用了宏代换语句,为程序的修改提供了简易的接口,消除了修改中重复查找相同代码的繁琐,提高了效率。
5.1
主程序流程图
蜂鸣器、继电器定时器初始化
初始
遥控接收模块是否收到有效信号
识别信号辨别按下的是哪个键
关闭继电器
开始
开启继电器
蜂鸣器鸣叫一段时间
Y
A
B
C
N
震动感应器是否接通
蜂鸣器响6秒
Y
N
5.2.1遥控接收模块信号程序
在本设计中,遥控接收模块信号的辨别主要通过启动单片机定时器0,以8位重装工作方式每100us扫描一次所收到信号,由于发射模块所发射的信号高低电平的长度是固定的且只有两种。这里选择以低电平时间的长度来确定是1还是0,若果是按键的信号,则必先接收到同位码(即一段固定的长时间的低电平),先辨别是否已接受到同位码,若果是,则记录信号,否的话,则说明不是有效的信号,不作记录。信号一共24位,记录好24位信号后与ABC键的信号作比较,若是A,作执行A键的功能,若是B,作执行B键的功能,若是C,作执行C键的功能。同时,由于遥控繁多,故每个遥控有自己的地址码(可由用户自调),故在收到信号后,还应与地址码对比,以辨别此信号是不是车主遥控所发出的信号。信号的前16位就是地址码,对比信号的地址码与遥控的地址码,若果两者相同,则信用有效;若果不相同,则说明此信号不是车主遥控所发出的信号,此时信号无效。
5.2.2
蜂鸣器程序
蜂鸣器响有两种情况,一,按了C键;二振动感应器接通。蜂鸣器所接的是S9012三极管,属于PNP型,低电平有效。当遥控接收模块接收到C键信号时,则在蜂鸣器IO口输出低电平,调用延迟子程序,让蜂鸣器鸣叫2秒。同样,在振动感应器接通时,感应器IO口则输入低电平,此时也在蜂鸣器IO口输出低电平,调用延迟子程序,让蜂鸣器鸣叫6秒。之所以延长鸣叫时间,是因为振动导致的感应器接通可能仅仅是瞬间的,若不延长鸣叫时间,则鸣叫将会极短,无法起到警报效果。
程序编程见附录1
6.
功能操作演示部分
接通电源后,按A键,则防盗系统开启,当防盗器振动时,警报器发出警报声音。按下B键,防盗系统关闭,防盗器振动时警报电路不工作。在工作状态下按下C键,则警报器鸣叫,车主可根据声音找到自行车的停放位置。
附录1:
/*********蜂鸣器接1.5
遥控接P2.6
指示灯发光二极管接P3.6
继电器接P0.2*********/
#include
#define
uchar
unsigned
char
/*********IO引脚定义**********/
sbit
ykjs=P1^1;
//遥控接收器口
sbit
fmk=P2^4;
//蜂鸣器
sbit
jdq=P0^0;//继电器
sbit
zsd=P3^1;
//指示灯,继电器打开时,灯亮。这样可以知道机器是否处于工作状态
sbit
jsk=P3^4;//接收口
即看加速度感应器是否接通。
接通时为0
void
sm();
/*************变量声明**********/
code
uchar
dzm1=0xaa;
//地址码1
;
code
uchar
dzm2=0xaa;//地址码2
用来验证信号是否从指定遥控器发出
uchar
ddsj=0;
//低电平时间计数
用来计算低电平的时间
uchar
i=0;//每个信号有三个字节,i区分这三个字节。
uchar
ab=0;
//按键
若接收到的是a键,则ab=1,若是b键则=2,从而通过ab的值反应到继电器的开关上。
uchar
xh[3];//信号
用来存信号,共三个字节
uchar
jsgs=0;
//计算个数
计算收到的信号位的个数。满8个则存到下个字节。
uchar
js=0;
bit
ok=0;//标志是否完成接受信息。
若ok=1,则说明接受到了一个信号
则主函数执行动作,辨别是按了哪个键。
bit
twm=0;
//同位码
若接受到同位码
则说明很可能接受到信号。即信号的开始
bit
qjs=0;
//前一时期的接受口状态
用来辨别是否从低电平变为高电平或从高变低,或一直?
/**初始化************/
void
csh(void)
//用来初始化一些值,比如计时器的工作方式
中断等
{
TH0=0x9c;
//
100us中断一次
即扫描一次有没有收到信号
8位重装,每次256,故设初始值156=10011100=0x9,这样每次运行100次,即100us
TMOD|=0x02;;//0010
0为gate
0为C/T,0时为定时功能
10
为8位自动重装定时方式
设置T0为自动装入的8位定时器
ET0=1;
//开T0中断
EA=1;
//开总中断
TR0=1;
//启动T0
}
/***********延迟函数****************/
void
delay
(unsigned
int
t)
//0.001秒
{unsigned
int
x;
while(t)
{
t--;
x=10;
while(x--);
}
}
/*******timer0中断扫描
每100us中断一次*************/
void
timer0()
interrupt
1
//timer0的中断
interrupt
1的1指的是IE的位数
0为外部中断0
1为timer0
2为外部中断1
3为time1
{
sm();
//每100us扫描一次是否有信号,信号为哪个键
}
/**************主程序****************/
void
main()
{
csh();//初始化
while(1)//进入大循环
{
if(ok)//如果完成了一次扫描
{
switch(ab)
//看看扫描到的是哪个键
{
case
1:jdq=0;zsd=1;break;//扫描到键A则开蜂鸣器,由于是PNP,故蜂鸣器低电时,三极管通,同时指示灯亮
case
2:jdq=1;zsd=0;break;//键B则关蜂鸣器
同时关闭指示灯
case
3:fmk=0;delay(3000);fmk=1;break;
}
delay(1000);//关或开继电器后延迟一会
为什么呢?我也不知道
ok=0;/*把ok关掉(即设为0)这样说明本次按键执行结束,
主函数回到if语句,等等ok变1,即等待下次按键扫描。*/
}
fmk=1;//先关蜂鸣器
js=0;//标志
jsk=1;//接受口先为1,即不接负极
if(!jsk)//当它接负极时,即为0
{
js=1;//标志改为1,让蜂鸣器叫
}
if
(js)
{
fmk=0;
delay(15000);//叫的时间延迟
让它叫久些
}
}
}
/***********按键扫描***************************/
void
sm()
{
if(ykjs)//遥控接收口为高电平时
{
if(!qjs)
//如果前一时期接收到的是低电平,说明高电平现在才开始
{
qjs=1;//标志这一时期(即下一时期的前一时期)的电平为高电平67692
if(twm)//如果前面一段低电平不是同位码,则执行如下
{
xh[i]=xh[i]>>1;//令信号记录的第i个字节右移,移出一个0位,如本来11010010,则移后得01101001,这样最高一位为零,可以记录新数字
if((1 //和10000000或,这样之前空出来的最高一位0位将记为1 } else if((8 //则和01111111与,这样原本为0的最高位现在还是0,其余的是1的还是1,零的还是0 } else //若果低电平时间不在两个范围内,则为干扰码,则退出 { twm=0; //退出前先清零同位码 ,由于记录信号的三个字节记录的方式与先前数值无关,故可不清零 return; } jsgs++; if(jsgs%8==0) { i++; } if(jsgs==24) { twm=0; if(xh[0]==dzm1 switch(xh[2]) { case 0x03:ab=1;break; case 0xc0:ab=2;break; case 0x30:ab=3;break; case 0x0c:ab=4;break; } } } } else //未检测到同位码,则检测之前那次低电平是否同位码 { if((100 //将同位码置1,说明接收到了同位码 i=0;//将i置0,下次接收时将从第一个字节开始记怒江 jsgs=0;//计数个数也置0,下次接收将从第1个计起 ddsj=0;//低电时间清零。 } else return; } } } else//接收口为低电平时 { if(qjs)//如果前一时期接收到的是高电平,则说明低电平现在才开始 { qjs=0;//标志这一时期(即下一时期的前一时期)的电平为低电平 ddsj=0;//清零低电平计数(ddjs低电计数) } else//如果之前也是低电平 ddsj++;//低电平时间+1 } }