无线防丢器设计

目录

一、方案流程及技术规格书设计

二、系统硬件电路设计

三、软件编写及调试

四、系统调试测试与分析

 

前言

为了解决重要物品丢失或遗忘的问题,达到找到丢失或遗忘的重要物品和报警提示,防止重要物品丢失或遗忘的目的,提出一种基于无线技术和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快速闪烁,蜂鸣器鸣响。如图:

<think>好的,用户想了解如何使用51单片机和nRF24L01模块设计无线防丢器的流程以及代码示例。首先,我需要整理一下设计流程,确保覆盖硬件和软件的关键部分。根据提供的引用,特别是引用[2]和[3],系统包含主机和从机,通过无线模块通信,当距离超出安全范围时触发报警。 硬件部分需要确定所需的组件,比如单片机、nRF24L01模块、传感器、显示模块和报警装置。引用[2]提到使用LCD12864、震动传感器、时钟芯片等,但用户可能更关注核心的无线通信和报警功能,所以需要重点介绍nRF24L01的连接和配置。 软件部分需要包括通信协议的设计,比如数据包结构和传输机制。主从机之间的通信需要定期发送检测信号,当主机未收到响应时触发报警。代码示例需要展示nRF24L01的初始化和数据传输,可能涉及SPI通信和中断处理。需要注意51单片机的资源限制,比如内存和处理速度,代码要尽量简洁高效。 用户可能对具体的代码实现感兴趣,比如如何配置nRF24L01的工作模式,如何处理数据接收和超时判断。需要确保示例代码结构清晰,关键部分有注释说明。同时,要提醒用户实际应用中可能需要调整参数,比如超时时间和通信频率。 可能还需要提到测试步骤,比如如何验证通信距离和报警功能是否正常。此外,引用[3]提到安全范围的问题,需要解释如何通过信号强度或简单的超时机制来判断距离是否超出范围,虽然nRF24L01本身不直接测量距离,但可以通过是否接收到信号来间接判断。 最后,生成相关问题时要围绕设计流程、硬件选择、通信优化和功能扩展,帮助用户深入理解可能遇到的挑战和解决方案。</think>### 51单片机和nRF24L01无线防丢器设计流程及代码实现 #### 一、系统设计流程 1. **硬件架构设计** - **主机**:负责接收从机信号并触发报警,包含51单片机、nRF24L01接收模块、蜂鸣器、LED指示灯、LCD显示屏[^2] - **从机**:绑定在被保护物品上,包含51单片机、nRF24L01发送模块、震动传感器(可选),定期发送心跳信号[^3] - 通信距离判定:通过信号强度或超时机制判断主机是否超出安全范围 2. **核心功能模块** - **无线通信模块**:nRF24L01配置为增强型ShockBurst模式,自动应答+自动重传 - **报警触发机制**:主机在$T_{timeout}$时间内未收到从机信号则启动声光报警 - **低功耗设计**:从机采用定时唤醒机制,工作周期可调 3. **开发步骤**: ``` 1. 搭建最小系统电路 2. 配置SPI通信接口 3. 编写nRF24L01驱动 4. 实现主从机通信协议 5. 集成报警模块 6. 系统联调测试 ``` #### 二、关键代码实现(简化版) ```c /************** 从机发送程序 **************/ #include <reg52.h> #include "nRF24L01.h" void main() { nRF24L01_Init(TX_MODE); // 初始化发送模式 while(1) { uint8_t data[2] = {0xAA, 0x55}; // 心跳包数据 nRF24L01_Send(data); // 发送数据 Delay_ms(1000); // 1秒发送间隔 Enter_LowPower(); // 进入低功耗模式 } } /************** 主机接收程序 **************/ bit alarm_flag = 0; uint16_t timeout_counter = 0; void main() { nRF24L01_Init(RX_MODE); while(1) { if(nRF24L01_Receive()) { // 成功接收数据 timeout_counter = 0; alarm_flag = 0; Buzzer_OFF(); } else { if(++timeout_counter > 3000) { // 3秒超时 alarm_flag = 1; Buzzer_ON(); LED_Blink(500); // LED500ms闪烁 } } } } ``` #### 三、nRF24L01配置要点 1. **寄存器配置**: ```c void nRF24L01_Config(void) { Write_Register(CONFIG, 0x0F); // 使能CRC、16位CRC、上电 Write_Register(EN_AA, 0x01); // 使能数据通道0自动应答 Write_Register(EN_RXADDR, 0x01); Write_Register(SETUP_AW, 0x03); // 5字节地址宽度 Write_Register(SETUP_RETR, 0x1A); // 500us重传延时,10次重试 Write_Register(RF_CH, 40); // 工作频道40(2.440GHz) Write_Register(RF_SETUP, 0x07); // 2Mbps速率,0dBm发射功率 } ``` 2. **通信协议设计**: - 数据包结构:`[前导码][地址][有效数据][CRC]` - 有效数据格式:`[设备ID(2B)][状态码(1B)][校验和(1B)]` #### 四、测试验证方法 1. **通信距离测试**: - 使用场强仪测量$P_{RX}$接收功率 - 调整发射功率(寄存器RF_SETUP)优化距离 2. **报警触发测试**: $$ T_{alarm} = T_{interval} \times N_{retry} + T_{margin} $$ 其中$T_{interval}$为发送间隔,$N_{retry}$为最大重传次数,$T_{margin}$为安全余量
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vx cr_8118

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值