无线防丢器设计
目錄
一、方案流程及技術規格書設計
二、系統硬件電路設計
三、軟件編寫及調試
四、系統調試測試與分析
?
前言
為了解決重要物品丟失或遺忘的問題,達到找到丟失或遺忘的重要物品和報警提示,防止重要物品丟失或遺忘的目的,提出一種基于無線技術和51單片機的智能防丟失報警器設計與實現方案。
目前市場上的電子防丟器,大多是采用GPS技術、藍牙技術,系統復雜、價格昂貴。本設計方案采用廉價的51單片機和2.4G無線通信模塊,具有價格低廉、系統簡單、使用方便等特點。
該智能防丟失報警器采用主機和子機方案,在一定較短距離內,主機和子機正常通信,當主機和子機距離較遠時,通信失敗,主機和子機會聲光報警,從而達到物品查找、預防報警的功能,可有效找到重要物品,防止物品被盜,具有重要的市場價值。
?
軟件工具準備
軟件:
電路設計:protel99 se(up主使用版本) 或者其他版本,或者其他電路設計軟件;
單片機開發:Keil5;
調試測試:串口調試助手,邏輯分析儀等;
工具:
電路焊接:電烙鐵,SMT(有條件的);
調試:
萬用表、示波器(基礎入門即可,可以白嫖學校或者公司)USB轉串口工具、仿真器;
一、方案流程及技術規格書設計
方案流程設計
技術規格書設計
主機
1.主機采用SI24L01無線通信模塊收發約定的數據,正常收到子機數據,說明子機在范圍內,沒有收到數據說明子機不在范圍內,聲光報警。
2.采用DS1302時鐘芯片計時,實現記錄丟失時間。
3.LCD顯示狀態,如果有丟失報警,顯示報警時間。
4、正常狀態LED常亮,報警狀態LED閃爍顯示。
5、蜂鳴器實現聲音報警。
6、4個按鍵設置時鐘和取消報警狀態。
子機
1.子機采用SI24L01無線通信模塊收發約定的數據,正常收到主機數據,說明主機在范圍內,沒有收到數據說明主機不在范圍內,聲光報警。
2、正常狀態LED滅,報警狀態LED閃爍顯示。
3、蜂鳴器實現聲音報警。
二、系統硬件電路設計
2.1微處理控制電路
設計采用宏晶公司IAP15F2K61S2單片機芯片。LQFP32封裝,電路圖如圖所示:
圖中VCC為5V供電電壓。C12瓷片電容,起濾波作用,J8是仿真燒錄口。
單片機IO口連接介紹:
P00-P03(29-32腳):按鍵檢測引腳。
P10-P17(1-8腳):LCD數據口。
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電壓,不能和無線模塊直接連接,所以采用電平轉換電路。
?
2.3 主機LCD顯示電路
LCD1602A顯示電路如圖:
R38是電位器,作用是調節顯示對比度。C11是濾波電容。R66是背光限流電阻。
IO口連接介紹:
RS、RW、E(4、5、6腳):LCD讀寫控制腳。
D0-D7(7-14腳):數據線。
2.4主機按鍵電路
? ? ? ?產品設計4個按鍵,沒有按下按鍵,對應IO口是高電平,按鍵按下,對應IO口接地,是低電平。單片機檢測各個按鍵IO口電平,判斷按鍵狀態。電路如圖:
?????????
2.5 ?主機LED電路
LED通過單片機IO口控制,電路如圖。????????
?2.6蜂鳴器驅動電路
? ? ? ?蜂鳴器模擬報警設備。由于IO口驅動能力有限,所以使用三極管放大電路,擴大驅動電流。電路如圖。
?
2.7 主機時鐘電路
? ? ? 時鐘電路采用專用時鐘芯片DS1302,電路如圖:
Y2是32.768時鐘晶振,SCLK、DIO、CE_1302是和單片機通信線。
2.8主機電源電路
? ? ?系統采用外部9V電源適配器供電,9V直流經過DCDC降壓,輸出5V電壓給芯片和其他電路供電。電路如圖。
單片機等3.3V供電采用ASM1117線性穩壓電路,電路如圖。
無線通訊模塊供電需要3.3V,通過3.3V穩壓芯片ASM1117輸出3.3V電壓。電路如圖。
?
2.9子機電路設計
? ? ? ?無線防丟器子機電路和主機電路基本一樣,只是少了液晶顯示模塊、時鐘電路、按鍵電路。電路如圖。
?
三、軟件編寫及調試
3.1主程序設計
主機使用單片機IAP15F2K61S2控制,控制設備有按鍵,液晶顯示1602A,通信模塊Si24L1,時鐘芯片DS1302,LED燈,蜂鳴器。上電對單片機系統和控制設備初始化,正常工作有以下三種模式:
工作模式1:讀取時鐘芯片時間,通過無線模塊發送“110”,接收子機信息正常,LCD顯示正常信息,接收子機信息不正常,LCD顯示報警信息,蜂鳴器鳴響,LED閃爍,顯示報警時間。
工作模式2:長按設置按鍵,通過無線模塊發送“find”,接收子機回復信息正常,停止發送,接收子機回復信息不正常,繼續發送。
工作模式3:設置時間,按設置鍵,進入設置時間,小時閃爍,按上下鍵修改小時,按確認鍵分鐘閃爍,按上下鍵修改,按確認鍵退出。
圖是主程序流程圖。
?
3.2主機無線通訊程序設計
? ? ? ?圖4-2無線通信流程圖,報警模式時,發送“110”給子機,同時接收子機回復,接收正確不報警,接收錯誤報警。查找模式時,發送“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 收發一個字節
***************************************************/
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++ )//一個字節8byte需要循環8次
{
/** 發送 */
if( 0x80 == ( TxByte & 0x80 ))
{
?spi_set_mosi_hight( ); //發送的位為 1 則置高IO引腳
}
else
{
?spi_set_mosi_low( );//發送的位為 0 則置低IO引腳
}
TxByte <<= 1; //數據左移一位,先發送的是最高位
spi_set_clk_high( ); //時鐘線置高
_nop_( );
/** 接收 */
Data <<= 1; //接收數據左移一位,先接收到的是最高位
if( 1 == spi_get_miso( ))
{
??Data |= 0x01; //如果接收時IO引腳為高則認為接收到 1
}
spi_set_clk_low( ); //時鐘線置低
_nop_( );
}
return Data; //返回接收到的字節
}
/*****************************************************
????功能:SPI 收發一個字節
***************************************************/
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 ); //收發數據
ReadBuffer++;
WriteBuffer++; //讀寫地址加1
}
spi_set_nss_high( ); ?//片選拉高
}
3.3 主機?LCD 顯示程序設計
? ? ? ?LCD1602A字符液晶能顯示2行,一行16個ASKII字符,共32個字符,LCD顯示有寫命令指令和寫數據指令。寫狀態指令是設置顯示狀態,比如開顯示,關顯示,設置顯示位置,設置顯示模式等,寫數據指令是把字符對應的編碼寫入數據寄存器,對應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;
}
/*****************************************************
????功能:寫數據
***************************************************/
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); ???
}
/*****************************************************
????功能:光標定位
***************************************************/
void gotoxy(uchar x,uchar y) //x是行數,y是列數
{
?if(x==1)
?{cmd_w(0x80+y);}
?else
?{cmd_w(0xc0+y);}
}
/*****************************************************
????功能:顯示字符
***************************************************/
void dsp_ch(uchar _ch)
{
dat_w(_ch);
}
3.4?主機時鐘驅動程序設計
? ? ? 時鐘芯片DS1302和主機是SPI串行通信,設計采用軟件模擬SPI通信。
DS1302時鐘芯片代碼:
/**********************************************************
?函數功能:發送數據1byte
***********************************************************/
void ?inputbyte(uchar dat)
{
????uchar i;
for ( i=8; i>0; i-- ) //循環8次移位
?????????{
??????????????SCLKoff;
????NOP;
????NOP;
????if(dat&0x01)
?????????????? ????DIOon; //每次傳輸低字節
????else
???? ????DIOoff;
????NOP;
????NOP;
??????????????dat >>= 1; //右移一位
??????????????SCLKon;
????NOP;
????NOP;
????NOP;
????NOP;
?????????}
}
/**********************************************************
?函數功能:讀數據1byte
***********************************************************/
uchar ?outputbyte(void)
{
??????????uchar i;
uchar dat=0;
for ( i=8; i>0; i-- ) //循環8次移位
?????????{ ?
??????dat >>= 1; //右移一位
????NOP;
????NOP;
????SCLKoff;
????NOP;
????NOP;
??????????????if(P32)
????dat|=0X80;
????NOP;
????NOP;
????????????????SCLKon;
????NOP;NOP;NOP;NOP;
?????????}
return(dat);
}
/******************************************************
?函數功能:發送數據到對應地址
**********************************************************/
void write1302 (uchar addr,dat )
{
????CEoff; //CE引腳為低,數據傳送中止
????NOP;
NOP;
????SCLKoff; //清零時鐘總線
????NOP;
NOP;
????CEon; //CE引腳為高,邏輯控制有效
NOP;NOP;NOP;NOP;
????inputbyte(addr); ?//發送地址
????inputbyte(dat);?//發送數據
????CEoff;
}
/**********************************************************
?函數功能:讀取時間
***********************************************************/
?uchar read1302 (uchar addr)
{
????uchar dat,data_buff;
????
CEoff;
????NOP;
NOP;
????SCLKoff;
????NOP;
NOP;
????CEon;
NOP;NOP;NOP;NOP;
????inputbyte(addr); ?//發送地址
????dat=outputbyte();//讀取數據
????SCLKon;
????NOP;
NOP;
????CEoff;
????data_buff=dat;
????data_buff/=16;
????dat=dat%16;
????dat=data_buff*10+dat;
????return (dat);
}
4.5?子機程序設計
? ? ? ?子機程序設計和主機類似,初始化定時器和無線模塊,接收主機信息,接收正確,判斷接收報警信號還是查找信號,如果報警信號,回復正常,如果查找信號,蜂鳴器和LED提示。程序流程圖。
?
四、系統調試測試與分析
4.1電路焊接
???? ? 用電烙鐵將單片機、無線模塊、DS1302時鐘芯片、LED燈、蜂鳴器、液晶顯示及電容、蜂鳴器、按鍵等器件焊接在電路板上,實物如圖所示。
?
4.2系統調試
? ? ? ?通過下載線連接電腦與單片機,將C程序下載到單片機內,上電后,主機子機通信正常,主機LCD顯示正常,LED燈滅,蜂鳴器不響,子機LED燈滅,蜂鳴器不響。如圖:
?
? ? ? ?把子機拿到一定距離后,主機和子機報警,主機顯示報警和報警時間,主機LED快速閃爍,蜂鳴器鳴響。子機LED快速閃爍,蜂鳴器鳴響。如圖:
總結
- 上一篇: gimp练习:Disintegratio
- 下一篇: 各大公司工资详情