无线防丢器设计
目錄
一、方案流程及技術(shù)規(guī)格書設(shè)計
二、系統(tǒng)硬件電路設(shè)計
三、軟件編寫及調(diào)試
四、系統(tǒng)調(diào)試測試與分析
?
前言
為了解決重要物品丟失或遺忘的問題,達到找到丟失或遺忘的重要物品和報警提示,防止重要物品丟失或遺忘的目的,提出一種基于無線技術(shù)和51單片機的智能防丟失報警器設(shè)計與實現(xiàn)方案。
目前市場上的電子防丟器,大多是采用GPS技術(shù)、藍(lán)牙技術(shù),系統(tǒng)復(fù)雜、價格昂貴。本設(shè)計方案采用廉價的51單片機和2.4G無線通信模塊,具有價格低廉、系統(tǒng)簡單、使用方便等特點。
該智能防丟失報警器采用主機和子機方案,在一定較短距離內(nèi),主機和子機正常通信,當(dāng)主機和子機距離較遠(yuǎn)時,通信失敗,主機和子機會聲光報警,從而達到物品查找、預(yù)防報警的功能,可有效找到重要物品,防止物品被盜,具有重要的市場價值。
?
軟件工具準(zhǔn)備
軟件:
電路設(shè)計:protel99 se(up主使用版本) 或者其他版本,或者其他電路設(shè)計軟件;
單片機開發(fā):Keil5;
調(diào)試測試:串口調(diào)試助手,邏輯分析儀等;
工具:
電路焊接:電烙鐵,SMT(有條件的);
調(diào)試:
萬用表、示波器(基礎(chǔ)入門即可,可以白嫖學(xué)?;蛘吖?#xff09;USB轉(zhuǎn)串口工具、仿真器;
一、方案流程及技術(shù)規(guī)格書設(shè)計
方案流程設(shè)計
技術(shù)規(guī)格書設(shè)計
主機
1.主機采用SI24L01無線通信模塊收發(fā)約定的數(shù)據(jù),正常收到子機數(shù)據(jù),說明子機在范圍內(nèi),沒有收到數(shù)據(jù)說明子機不在范圍內(nèi),聲光報警。
2.采用DS1302時鐘芯片計時,實現(xiàn)記錄丟失時間。
3.LCD顯示狀態(tài),如果有丟失報警,顯示報警時間。
4、正常狀態(tài)LED常亮,報警狀態(tài)LED閃爍顯示。
5、蜂鳴器實現(xiàn)聲音報警。
6、4個按鍵設(shè)置時鐘和取消報警狀態(tài)。
子機
1.子機采用SI24L01無線通信模塊收發(fā)約定的數(shù)據(jù),正常收到主機數(shù)據(jù),說明主機在范圍內(nèi),沒有收到數(shù)據(jù)說明主機不在范圍內(nèi),聲光報警。
2、正常狀態(tài)LED滅,報警狀態(tài)LED閃爍顯示。
3、蜂鳴器實現(xiàn)聲音報警。
二、系統(tǒng)硬件電路設(shè)計
2.1微處理控制電路
設(shè)計采用宏晶公司IAP15F2K61S2單片機芯片。LQFP32封裝,電路圖如圖所示:
圖中VCC為5V供電電壓。C12瓷片電容,起濾波作用,J8是仿真燒錄口。
單片機IO口連接介紹:
P00-P03(29-32腳):按鍵檢測引腳。
P10-P17(1-8腳):LCD數(shù)據(jù)口。
P20(21腳): CE 無線模塊片選腳。
P21-P24(22-25腳):SPI通訊口,連接無線模塊。
P25-P27(26、27、28腳):RS、RW、E,LCD控制腳。
P30-P31(13、14腳):串口下載口。
P32-P34(15-17腳):DS1302控制腳。
P35(18腳): LED控制腳。
P36(19腳): 無線模塊中斷腳。
P37(20腳): 蜂鳴器控制腳。
2.2 ?主機Si24L1無線模塊電路
無線通訊模塊和單片機采用SPI通訊方式,W_CSN,W_SCK,W_MOSI,W_MISO是SPI通訊口,W_CE是片選信號,W_IRQ是中斷引腳。電路圖如圖所示:
?IAP15F2K61S2單片機輸出是5V電壓,不能和無線模塊直接連接,所以采用電平轉(zhuǎn)換電路。
?
2.3 主機LCD顯示電路
LCD1602A顯示電路如圖:
R38是電位器,作用是調(diào)節(jié)顯示對比度。C11是濾波電容。R66是背光限流電阻。
IO口連接介紹:
RS、RW、E(4、5、6腳):LCD讀寫控制腳。
D0-D7(7-14腳):數(shù)據(jù)線。
2.4主機按鍵電路
? ? ? ?產(chǎn)品設(shè)計4個按鍵,沒有按下按鍵,對應(yīng)IO口是高電平,按鍵按下,對應(yīng)IO口接地,是低電平。單片機檢測各個按鍵IO口電平,判斷按鍵狀態(tài)。電路如圖:
?????????
2.5 ?主機LED電路
LED通過單片機IO口控制,電路如圖。????????
?2.6蜂鳴器驅(qū)動電路
? ? ? ?蜂鳴器模擬報警設(shè)備。由于IO口驅(qū)動能力有限,所以使用三極管放大電路,擴大驅(qū)動電流。電路如圖。
?
2.7 主機時鐘電路
? ? ? 時鐘電路采用專用時鐘芯片DS1302,電路如圖:
Y2是32.768時鐘晶振,SCLK、DIO、CE_1302是和單片機通信線。
2.8主機電源電路
? ? ?系統(tǒng)采用外部9V電源適配器供電,9V直流經(jīng)過DCDC降壓,輸出5V電壓給芯片和其他電路供電。電路如圖。
單片機等3.3V供電采用ASM1117線性穩(wěn)壓電路,電路如圖。
無線通訊模塊供電需要3.3V,通過3.3V穩(wěn)壓芯片ASM1117輸出3.3V電壓。電路如圖。
?
2.9子機電路設(shè)計
? ? ? ?無線防丟器子機電路和主機電路基本一樣,只是少了液晶顯示模塊、時鐘電路、按鍵電路。電路如圖。
?
三、軟件編寫及調(diào)試
3.1主程序設(shè)計
主機使用單片機IAP15F2K61S2控制,控制設(shè)備有按鍵,液晶顯示1602A,通信模塊Si24L1,時鐘芯片DS1302,LED燈,蜂鳴器。上電對單片機系統(tǒng)和控制設(shè)備初始化,正常工作有以下三種模式:
工作模式1:讀取時鐘芯片時間,通過無線模塊發(fā)送“110”,接收子機信息正常,LCD顯示正常信息,接收子機信息不正常,LCD顯示報警信息,蜂鳴器鳴響,LED閃爍,顯示報警時間。
工作模式2:長按設(shè)置按鍵,通過無線模塊發(fā)送“find”,接收子機回復(fù)信息正常,停止發(fā)送,接收子機回復(fù)信息不正常,繼續(xù)發(fā)送。
工作模式3:設(shè)置時間,按設(shè)置鍵,進入設(shè)置時間,小時閃爍,按上下鍵修改小時,按確認(rèn)鍵分鐘閃爍,按上下鍵修改,按確認(rèn)鍵退出。
圖是主程序流程圖。
?
3.2主機無線通訊程序設(shè)計
? ? ? ?圖4-2無線通信流程圖,報警模式時,發(fā)送“110”給子機,同時接收子機回復(fù),接收正確不報警,接收錯誤報警。查找模式時,發(fā)送“find”給子機。
模塊和單片機SPI通信。
SPI通信代碼:
/*****************************************************
????功能:SPI IO口初始化
***************************************************/
void drv_spi_init( void )
{
//引腳配置
//SCK MOSI NSS 配置為推挽輸出
SPI_SCK_PxM0 = IO_OUT_PUT_PP_M0 << SPI_SCK_PIN_BIT;
SPI_SCK_PxM1 = IO_OUT_PUT_PP_M1 << SPI_SCK_PIN_BIT;
SPI_MOSI_PxM0 = IO_OUT_PUT_PP_M0 << SPI_MOSI_PIN_BIT;
SPI_MOSI_PxM1 = IO_OUT_PUT_PP_M1 << SPI_MOSI_PIN_BIT;
SPI_NSS_PxM0 = IO_OUT_PUT_PP_M0 << SPI_NSS_PIN_BIT;
SPI_NSS_PxM1 = IO_OUT_PUT_PP_M1 << SPI_NSS_PIN_BIT;
//MISO 配置為輸入
SPI_MISO_PxM0 = IO_IN_PUT_ONLY_M0 << SPI_MISO_PIN_BIT;
SPI_MISO_PxM1 = IO_IN_PUT_ONLY_M1 << SPI_MISO_PIN_BIT;
//時鐘置低
SPI_SCK = 0;
//MOSI MISO NSS置高
SPI_MOSI = 1;
SPI_MISO = 1;
SPI_NSS = 1;
}
/*****************************************************
????功能:SPI 收發(fā)一個字節(jié)
***************************************************/
uint8_t drv_spi_read_write_byte( uint8_t TxByte )
{
uint8_t i = 0, Data = 0;
spi_set_clk_low( );
for( i = 0; i < 8; i++ )//一個字節(jié)8byte需要循環(huán)8次
{
/** 發(fā)送 */
if( 0x80 == ( TxByte & 0x80 ))
{
?spi_set_mosi_hight( ); //發(fā)送的位為 1 則置高IO引腳
}
else
{
?spi_set_mosi_low( );//發(fā)送的位為 0 則置低IO引腳
}
TxByte <<= 1; //數(shù)據(jù)左移一位,先發(fā)送的是最高位
spi_set_clk_high( ); //時鐘線置高
_nop_( );
/** 接收 */
Data <<= 1; //接收數(shù)據(jù)左移一位,先接收到的是最高位
if( 1 == spi_get_miso( ))
{
??Data |= 0x01; //如果接收時IO引腳為高則認(rèn)為接收到 1
}
spi_set_clk_low( ); //時鐘線置低
_nop_( );
}
return Data; //返回接收到的字節(jié)
}
/*****************************************************
????功能:SPI 收發(fā)一個字節(jié)
***************************************************/
void drv_spi_read_write_string( uint8_t* ReadBuffer, uint8_t* WriteBuffer, uint16_t Length )
{
spi_set_nss_low( ); //片選拉低
while( Length-- )
{
*ReadBuffer = drv_spi_read_write_byte( *WriteBuffer ); //收發(fā)數(shù)據(jù)
ReadBuffer++;
WriteBuffer++; //讀寫地址加1
}
spi_set_nss_high( ); ?//片選拉高
}
3.3 主機?LCD 顯示程序設(shè)計
? ? ? ?LCD1602A字符液晶能顯示2行,一行16個ASKII字符,共32個字符,LCD顯示有寫命令指令和寫數(shù)據(jù)指令。寫狀態(tài)指令是設(shè)置顯示狀態(tài),比如開顯示,關(guān)顯示,設(shè)置顯示位置,設(shè)置顯示模式等,寫數(shù)據(jù)指令是把字符對應(yīng)的編碼寫入數(shù)據(jù)寄存器,對應(yīng)ASKII碼就顯示出來。圖是LCD顯示功能流程圖。
LCD顯示代碼:
/*****************************************************
????功能:IO口定義
***************************************************/
sbit E=P2^7;
sbit RW=P2^6;
sbit RS=P2^5;
?/*****************************************************
????功能:1ms延時
***************************************************/
void delay(uint k)
{
??k=k*125;
??while(k--);
}
/*****************************************************
????功能:寫命令
***************************************************/
void cmd_w(uchar cmd)
{
??RW=0;
??RS=0;
??E=1;
??P1=cmd;
??delay(1);
??E=0;
}
/*****************************************************
????功能:寫數(shù)據(jù)
***************************************************/
void dat_w(uchar dat)
{
??RW=0;
??RS=1;
??E=1;
??P1=dat;
??delay(1);
??E=0;
}
/*****************************************************
????功能:清屏
***************************************************/
void lcd_clear(void)
{
??cmd_w(0x01); ??//清屏
??cmd_w(0x02); ??//清屏回到左上角
}
/*****************************************************
????功能:初始化
***************************************************/
void Lcd1602_init(void)
{
??cmd_w(0x38);
??cmd_w(0x0c);
??cmd_w(0x06);
??cmd_w(0x01);
??cmd_w(0x80); ???
}
/*****************************************************
????功能:光標(biāo)定位
***************************************************/
void gotoxy(uchar x,uchar y) //x是行數(shù),y是列數(shù)
{
?if(x==1)
?{cmd_w(0x80+y);}
?else
?{cmd_w(0xc0+y);}
}
/*****************************************************
????功能:顯示字符
***************************************************/
void dsp_ch(uchar _ch)
{
dat_w(_ch);
}
3.4?主機時鐘驅(qū)動程序設(shè)計
? ? ? 時鐘芯片DS1302和主機是SPI串行通信,設(shè)計采用軟件模擬SPI通信。
DS1302時鐘芯片代碼:
/**********************************************************
?函數(shù)功能:發(fā)送數(shù)據(jù)1byte
***********************************************************/
void ?inputbyte(uchar dat)
{
????uchar i;
for ( i=8; i>0; i-- ) //循環(huán)8次移位
?????????{
??????????????SCLKoff;
????NOP;
????NOP;
????if(dat&0x01)
?????????????? ????DIOon; //每次傳輸?shù)妥止?jié)
????else
???? ????DIOoff;
????NOP;
????NOP;
??????????????dat >>= 1; //右移一位
??????????????SCLKon;
????NOP;
????NOP;
????NOP;
????NOP;
?????????}
}
/**********************************************************
?函數(shù)功能:讀數(shù)據(jù)1byte
***********************************************************/
uchar ?outputbyte(void)
{
??????????uchar i;
uchar dat=0;
for ( i=8; i>0; i-- ) //循環(huán)8次移位
?????????{ ?
??????dat >>= 1; //右移一位
????NOP;
????NOP;
????SCLKoff;
????NOP;
????NOP;
??????????????if(P32)
????dat|=0X80;
????NOP;
????NOP;
????????????????SCLKon;
????NOP;NOP;NOP;NOP;
?????????}
return(dat);
}
/******************************************************
?函數(shù)功能:發(fā)送數(shù)據(jù)到對應(yīng)地址
**********************************************************/
void write1302 (uchar addr,dat )
{
????CEoff; //CE引腳為低,數(shù)據(jù)傳送中止
????NOP;
NOP;
????SCLKoff; //清零時鐘總線
????NOP;
NOP;
????CEon; //CE引腳為高,邏輯控制有效
NOP;NOP;NOP;NOP;
????inputbyte(addr); ?//發(fā)送地址
????inputbyte(dat);?//發(fā)送數(shù)據(jù)
????CEoff;
}
/**********************************************************
?函數(shù)功能:讀取時間
***********************************************************/
?uchar read1302 (uchar addr)
{
????uchar dat,data_buff;
????
CEoff;
????NOP;
NOP;
????SCLKoff;
????NOP;
NOP;
????CEon;
NOP;NOP;NOP;NOP;
????inputbyte(addr); ?//發(fā)送地址
????dat=outputbyte();//讀取數(shù)據(jù)
????SCLKon;
????NOP;
NOP;
????CEoff;
????data_buff=dat;
????data_buff/=16;
????dat=dat%16;
????dat=data_buff*10+dat;
????return (dat);
}
4.5?子機程序設(shè)計
? ? ? ?子機程序設(shè)計和主機類似,初始化定時器和無線模塊,接收主機信息,接收正確,判斷接收報警信號還是查找信號,如果報警信號,回復(fù)正常,如果查找信號,蜂鳴器和LED提示。程序流程圖。
?
四、系統(tǒng)調(diào)試測試與分析
4.1電路焊接
???? ? 用電烙鐵將單片機、無線模塊、DS1302時鐘芯片、LED燈、蜂鳴器、液晶顯示及電容、蜂鳴器、按鍵等器件焊接在電路板上,實物如圖所示。
?
4.2系統(tǒng)調(diào)試
? ? ? ?通過下載線連接電腦與單片機,將C程序下載到單片機內(nèi),上電后,主機子機通信正常,主機LCD顯示正常,LED燈滅,蜂鳴器不響,子機LED燈滅,蜂鳴器不響。如圖:
?
? ? ? ?把子機拿到一定距離后,主機和子機報警,主機顯示報警和報警時間,主機LED快速閃爍,蜂鳴器鳴響。子機LED快速閃爍,蜂鳴器鳴響。如圖:
總結(jié)
- 上一篇: gimp练习:Disintegratio
- 下一篇: 各大公司工资详情