這想法最初是在09年誕生的,后來百度一下,發現已經有人比我更早地想到,而且已經研發出來,看見以后,我頓時失去了興趣。直到前兩個月,某位朋友被小偷光顧,損失慘重。此刻,我意識到防盜器的重要性,尤其年關將至,鼠輩橫行的時段,所以又重新點燃了我創造的欲望。今晚,花了幾個小時終于制作完成。以下有全套制作教程,包括電路圖和代碼,希望有動手能力的朋友也嘗試一下。同時,由于本人能力有限,設計存在很多缺陷,希望有高人多多指點不足之處,謝謝。
實現功能:當有人進入一定區域內,裝置能自動撥打指定號碼進行呼叫,當區域內的人持續不離開時,裝置能連續呼叫3次,每次2分鐘。例如:我外出時,假如有人進入了我的房間,裝置就能自動撥打我的電話,我的電話就會響起,然后我就會采取相應的措施。
成品圖
1. 原料清單:舊手機一臺(能打電話就行),stc89c52單片機一塊,5v繼電器3個,1n4148二極管3個,1n4007二極管2個,9012三極管 3個 ,8050三極管1個,11.0592晶振1個,20p獨石電容2個,104獨石電容1個,電解電容1000uf、470uf、0.1uf各一個 10uf兩個,LM317三端穩壓1個,200Ω、400Ω、1K電阻各一個。洞洞板一塊,一個外殼(筆者的是路由器的外殼),一張0月租0低消的手機卡,熱釋紅外感應模塊一個。(成本100元以內)
一臺舊手機,外殼已經拆掉
一個路由器的外殼
一張0月租0低消的手機卡
熱釋紅外傳感器
電子元件若干,詳見上面清單。
電路圖,單片機的P0口的前3個腳分別控制3個繼電器,P1^4用來檢測紅外模塊返回的信號。有的手機可用三極管代替繼電器座開關,筆者手上的這臺手機的按鍵設計有點怪,為了穩定起見,所以使用繼電器。J1\J2\J3是手機的 按鍵。
這是LM317三端穩壓電路,輸出3.7v,用來給手機供電。手機長時間直接使用5v會燒壞。另外,要在手機正負極并聯一個1000uf的電容。因為手機接受發射信號的時候電流峰值能達到2A
下面已經焊接完成,再把程序燒寫到單片機中。(程序代碼在最后)
再把它連接到手機的按鍵上。照片中手機按鍵上的三極管不是關鍵,可有可無,初衷是為了檢車手機是否死機的。
在路由器的外殼是哪個打幾個洞,安裝銅柱。
銅柱螺絲若干
安裝了銅柱的外殼
在路由器的蓋子上挖一個洞,把紅外傳感器的透鏡部分外露。然后用熱熔膠粘牢。
大功告成
外表是一個路由器,實際上是一臺防盜器,呵呵。下面附單片機程序:
筆者指定的電話號碼已經保存在手機電話薄的第一個位置,
本例工程文件下載: http://www.zg4o1577.cn/f/gsdeng.rar
代碼如下:
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
uchar callnum;
void delay(uint num) //延時函數
{
uint i,j;
for(i=num;i>0;i--)
for(j=110;j>0;j--);
}
void key1() //按鍵1 手機的返回、電話薄鍵
{
D1 = 0; //按下
delay(500); //按下中
D1 = 1; //松開
delay(500); //不能直接按下一個鍵,所以唯有延時500毫秒
}
void key2() //按鍵2 手機的掛機、關機、開機鍵
{
D2 = 0;
delay(500);
D2 = 1;
delay(500);
}
void key3() //按鍵3 手機的接聽鍵
{
D3 = 0;
delay(500);
D3 = 1;
delay(500);
}
void offon() //開關機
{
D2 = 0;
delay(5000);//按住5秒開機鍵可開關機
D2 = 1;
delay(10000); //等待進入
void call() //呼叫
{
key1(); //重復幾次按返回鍵和掛機鍵,讓未接來電和短信等提示信息消失
key2();
key1();
key2();
key1();
key2();
delay(10000); //延時等待手機提示框消失
key1();
key2();
key1();
key2();
delay(6000); //延時等待手機提示框消失
key1(); //打開電話薄
key3(); //按下呼叫鍵
}
void main()
{
callnum = 0; //變量賦初值
offon();
call(); //響一下手機,提示已經進入監控狀態
delay(60000); //延時4分鐘,紅外模塊需要1分鐘的預啟動時間,人走后需要2分鐘的冷卻時間,為了寬松點,共4分鐘
delay(60000);
delay(60000);
delay(60000);
while(1)
{
if(D4 == 0)
{
call();
delay(60000);//每次呼叫兩分鐘
delay(60000);
callnum++; //每呼叫一次,變量加一
}
if(callnum == 3)
{
while(1); //連續呼叫3次后,就不再呼叫。
}
}
}