目录
功能介绍
本设计利用51单片机结合NRF24L01无线模块进行设计,防丢器分为两个部分,分为从机和主机,即发射模块和接收模块,从机放在怕被丢失的物件上,而主机则携带在主人身上,可以实现两大功能:
- 超出两个模块的通信距离会报警,及时通知主机,防止从机丢失;
- 在两个模块的通信范围内,从机不知道在哪,主机可以发起寻找。
原理图
发送模块原理图
接收模块原理图
原理图发送模块与接受模块差异点是接收模块少一个按键,其他都一样,都有单片机最小系统,指示灯电路,蜂鸣器电路,无线模块,串口电路。如需详细资料可私信作者或加微信biyezhan007
PCB
发送模块
接收模块
实物图
元器件清单
- 单片机底座*2
- 单片机*2
- 晶振*2
- 瓷片电容*4
- 电阻*4
- 电解电容*2
- 四脚按键*3
- 电源座*2
- LED灯*4
- DIP8底座*2
- NRF24L01模块*2
- 蜂鸣器*2
- 三极管*2
源代码
//发送端main.c
#include "nRF24L01.h" //包含头文件
#include "def.h" //包含头文件
void Delay_1(unsigned int s) //延时函数
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
void delay(unsigned int z) //延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void) //主函数
{
unsigned int flag; //定义变量
unsigned char t =0,flag_1;
unsigned char TxBuf[20]={0}; // 数据暂存数组
unsigned char RxBuf[20]={0};
a: init_io() ; //初始化
flag_1=0;
flag=0; //变量清零
TxBuf[0]='c'; //发送数据c
while(1) //进入循环
{
//SetRX_Mode();
if(KEY1 ==0 ) //按下按键
{
TxBuf[0]=0;
TxBuf[1]=1; //发送01
}
else //按键没有按下
{
TxBuf[0]=1;
TxBuf[1]=1; //发送11
}
nRF24L01_TxPacket(TxBuf); // 发送缓冲区数据
SetRX_Mode(); //发送完数据后设置成接收模式
if(nRF24L01_RxPacket(RxBuf)) //如果接收缓冲区有数据
{
nRF24L01_TxPacket(TxBuf); // 发送缓冲区数据
flag=0;
flag_1=0; //变量清零
}
else //接收缓冲区无数据,也就是没有接收到数据
{
flag++; //计时变量加
if(flag>=80) //加到80
flag_1=1; //变量置1
delay(5); //计时分辨率是5ms,计80次就是80*5=400ms
}
if(flag_1) //如果变量为1,计时400ms,开启报警
for(t=0;t<20;t++) //for循环控制灯和蜂鸣器报警
{
LED2=~LED2;
LED1=~LED1; //取反,达到闪烁的效果
delay(80); //延时80ms
if(t==19) //t加到19时
{
goto a; //回到while前面的a:
flag_1=0;
flag=0;
}
}
}
}
//接收端main.c
#include "reg52.h"
#include "nRF24L01.h"
#include "def.h"
#include "delay.h" //包含头文件
uchar count_1,count_2,count_3,count,miao,fen,fen_1,fen_2,fen_3,flag_1,flag_2,flag_3; //定义全局变量
void Delay_1(unsigned int s) //延时函数
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
void delay(unsigned int z) //延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void) //主函数
{
unsigned int flag,f=1000; //定义变量
unsigned char t ,flag_1;
unsigned char TxBuf[20]={0}; //缓冲区数据清零
unsigned char RxBuf[20]={0};
init_io() ; //初始化
while(1) //进入循环
{
TxBuf[0] = 0;
TxBuf[1] = 1; //发送数据01
SetRX_Mode(); //设置接收模式
if(nRF24L01_RxPacket(RxBuf)) //如果接收缓冲区有数据
{
nRF24L01_TxPacket(TxBuf); //发送缓冲区数据
if( RxBuf[0]==0&&RxBuf[1]==1) //如果接收的数据是01
{
for(t=0;t<10;t++) //控制灯和震动工作闪烁
{
LED1=~LED1;
LED2=~LED2; //取反
delay(50); //延时
}
}
RxBuf[0]= 0;
RxBuf[1] = 0x00; //接收缓冲区数据清零
flag=0;
flag_1=0; //变量清零
}
else //接收缓冲区无数据
{
flag++; //计时开始
if(flag==200) //计时到1秒(200*5ms)
{
flag_1=1; //变量置1
}
delay(5); //5ms延时
}
if(flag_1) //如果超时没有接收数据,就开启报警
for(t=0;t<10;t++) //for循环启动报警
{
LED2=~LED2; //闪烁报警
delay(50); //延时
if(t==9) //闪烁一个周期
{
flag_1=0; //变量清零,返回后再次判断是否有信号,如无信号,继续报警
flag=0;
}
}
}
}
本文介绍了在设计的过程的关键点,供大家参考学习,如果有错误或者不明白的可以直接私信作者,或者添加微信biyezhan007。