摘要
1 STM32的概述
1.1 STM32F10系列
1.2 STM32F10x重要参数
1.3 STM32架构的优势
2 无线收发器NRF24L01的介绍
2.1性能参数
2.2原理图
2.3引脚定义
3程序设计
3.1发送模块程序设计
3.2接受模块程序设计
4原理图设计
4.1发送模块原理图
4.2接受模块原理图
4.3总设计原理图
5
参考文献
摘要:
忘性比记性好的你是不是会经常钥匙不知道丢到了哪里?
爱丢三落四的老婆是不是经常让你帮忙找钥匙找到心烦?……
找呀找~找呀找!钥匙不见了,可能是家门钥匙、办公室钥匙、抽屉钥匙……为什么钥匙总不见?钥匙寻找器一定会帮到你的大忙,这款外观设计雅致, 在钥匙那里安装一个无线接收器(射频),在搜寻器那里安装发射器(射频),如果接收器接收到信号就,蜂鸣器开始工作。这样就可以找到钥匙。解决找不到钥匙的烦恼。使用简单,随时可找到钥匙,再也不用为找不到钥匙而发愁了。当然,除了钥匙你也可使用在任何生活物品上,一按就找到。
关键词:钥匙 搜寻器 蜂鸣器
1 STM32的概述
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
1.1 STM32F10系列
简介
ARM公司的高性能”Cortex-M3”内核
1.25DMips/MHz,而ARM7TDMI只有0.95DMips/MHz
一流的外设
1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度
低功耗
在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA
最大的集成度
复位电路、低电压检测、调压器、精确的RC振荡器等
简单的结构和易用的工具
1.2 STM32F10x重要参数
2V-3.6V供电
容忍5V的I/O管脚
优异的安全时钟模式
带唤醒功能的低功耗模式
内部RC振荡器
内嵌复位电路
工作温度范围:
-40°C至+85°C或105°C
1.3 STM32架构的优势
除新增的功能强化型外设接口外,STM32互连系列还提供与其它STM32微控制器相同的标准接口,这种外设共用性提升了整个产品家族的应用灵活性,使开发人员可以在多个设计中重复使用同一个软件。新STM32的标准外设包括10个定时器、两个12位1-Msample/s 模数转换器 (交错模式下2-Msample/s)、两个12位数模转换器、两个I2C接口、五个USART接口和三个SPI端口。新产品外设共有12条DMA通道,还有一个CRC计算单元,像其它STM32微控制器一样,支持96位唯一标识码。
2 无线收发器NRF24L01的介绍
nRF24L01是由NORDIC[1]生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI 接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。
极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。
2.1性能参数
◆ 小体积,QFN20 4x4mm封装
◆ 宽电压工作范围,1.9V~3.6V,输入引脚可承受5V电压输入
◆ 工作温度范围,-40℃~+80℃
◆ 工作频率范围,2.400GHz~2.525GHz
◆ 发射功率可选择为0dBm、-6dBm、-12dBm和-18dBm
◆ 数据传输速率支持1Mbps、2Mbps[2]
◆ 低功耗设计,接收时工作电流12.3mA,0dBm功率发射时11.3mA,掉电模式时仅为900nA
◆ 126个通讯通道,6个数据通道,满足多点通讯和调频需要
◆ 增强型“ShockBurst”工作模式,硬件的CRC校验和点对多点的地址控制
◆ 数据包每次可传输1~32Byte的数据
◆ 4线SPI通讯端口,通讯速率最高可达8Mbps,适合与各种MCU连接,编程简单
◆ 可通过软件设置工作频率、通讯地址、传输速率和数据包长度
◆ MCU可通过IRQ引脚快判断是否完成数据接收和数据发送
2.2原理图
电路原理
nRF24L01原理图
2.3引脚定义
nRF24L01引脚定义
3.程序设计
发送的程序
#include "stm32f10x.h"
#include "stm32_eval.h"
#include "delay.h"
#include "NRF24L01.h"
#include "spi.h"
#include "stdio.h"
//管脚PB7,PB8的初始化函数
void GPIO_KEY_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//发送信号函数,向接收端发送信号S,接收不成功则显示"请确认接收端是否正常"
u8 send_data(u8 data)
{
TX_Mode();//将射频模块NRF24L01设置为发送模式;
delay_ms(500);//延迟以等待接收设备有足够时间转换成接收模式
printf("\\n\\r正在发送数据(数字化): ");
if(NRF24L01_TxPacket(data)==TX_OK) //进行发送
{
delay_ms(500);
return 1;
}
else //若发送不成功,显示”请确认接收端是否正常“
{
printf("\\n\\r请确认接收端是否正常");
delay_ms(500);
return 0;
}
}
//主函数
int main(void)
{
GPIO_KEY_Config();//初始化管脚PB7;
NRF24L01_Init(); //初始化射频模块NRF24L01;
while(NRF24L01_Check())//对射频模块进行检测,若射频模块NRF24L01线路连接出错,则显示"nRF24L01检测出错!请确认nRF24L01的连接!"
{
printf("nRF24L01检测出错!请确认nRF24L01的连接! \\n\\r");
delay_ms(1000);
}
//进入死循环,不断查询按键是否被按下,若按下则发送信息's'给接收端;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
{
send_data('o');
delay_ms(100);
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8))
{
send_data('s');
delay_ms(100);
}
}
return 0;
}
接收的程序
#include "stm32f10x.h"
#include "stm32_eval.h"
#include "delay.h"
#include "NRF24L01.h"
#include "spi.h"
#include "stdio.h"
//蜂鸣器的初始化函数
void BEEP_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*使能蜂鸣器使用的GPIO时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*初始化蜂鸣器使用的GPIO管脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//主函数
int main(void)
{
u8 receive_data; //定义初始化接收数据变量;
BEEP_config();//初始化蜂鸣器
NRF24L01_Init(); //初始化射频模块NRF24L01
while(NRF24L01_Check())//对射频模块进行检测,若射频模块NRF24L01线路连接出错,则显示"nRF24L01检测出错!请确认nRF24L01的连接!"
{
printf("nRF24L01检测出错!请确认nRF24L01的连接! \\n\\r");
delay_ms(1000);
}
//进入死循环,不断查询按键是否接收到数据,若接收到,则根据信息来令蜂鸣器开启或者关闭;
while(1)
{
RX_Mode(); //将射频模块NRF24L01设置为接收模式,随时接收来自发送端的信息
delay_ms(500);
if(NRF24L01_RxPacket(receive_data)==0)//一旦接收到信息,则打印信息:"接收到数据".
{
printf("\\n\\r接收到数据");
if(receive_data=='o') //若接收到信息‘o’,则开启蜂鸣器
{
GPIO_SetBits(GPIOA, GPIO_Pin_12); /*开启蜂鸣器*/
}
if(receive_data=='s') //若接收到信息‘s’,则关闭蜂鸣器
{
GPIO_ResetBits(GPIOA, GPIO_Pin_12); /*关闭蜂鸣器*/
}
}
}
return 0;
}
4.原理图设计
发送模块原理图(上)
接收模块原理图(上)
总设计原理图(上)
参考文献
[1] 邵贝贝.单片机嵌入式应用的在线开发方法.北京:清华大学出版社,2004年
[2] 王兆安,黄俊.电力电子技术(第四版).机械工业出版社,2000年7月
[3] 胡汉才.单片机原理与接口技术.北京:清华大学出版社,1996年
[4] 李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社,1994年下载本文