基于51单片机的无线数据收发系统设计(带电路图和代码)
基于51单片机的无线数据收发系统设计(带电路图和代码)
1 引言伴随着短距离、低功率无线数据传输技术的成熟,无线数据传输被越来越多地应用到新的领域。
与有线通信方式相比,无线通信以其不需铺设明线,使用便捷等一系列优点,在现代通信领域占重要地位。
但以往的无线产品存在范围和方向上的局限。
例如,一些无线产品在使用时,无法将信息反馈给控制者;还有一些无线产品不能很好地显示参数或状态信息,如果能在系统中增加一块小型液晶显示电路,产品不仅能向用户显示其状态或状态的改变,而且可以大大降低成本。
正如人们所发现的,只要建立双向无线通信-双工通信并且选择成本低的收发芯片,就会出现许多新应用。
本次设计主要是利用无线收发电路,加上单片机控制与液晶显示制成一套完整的数据收发系统。
考虑到目前市场上的一些需求,设计的主要要求是方案成本低,体积小,低功耗,集成度高,尽量无需调外部元件,传输时间短,接口简单。
nRF401是国外最新推出的单片无线收发一体芯片,它在一个20脚的芯片中包括了高频发射、高频接收、PLL合成、FSK调制、多频道切换等功能,并且外围元件少,便于设计生产,功耗极低,集成度高,是目前集成度较高的无线数传产品,它为低速率低成本的无线技术提出了解决方案。
2 无线数据收发系统2.1 系统组成无线数据传输系统有点对点,点对多点和多点对多点三种。
本系统由于实际应用的需要,接收器和数据终端之间的数据传输通过nRF401进行,构成点对点无线数据传输系统。
整个系统中,两数据终端之间的无线通信采用433MHz的频段作为载波频率,收发通过串口通信。
无线数据收发系统可以分为无线收发控制电路、单片机控制电路、显示电路和按键电路四部分组成,系统原理如图2-1所示:图2-1 无线数据收发系统原理图2.2 实现过程当我们需要发送数据时,使用按键来输入所需发送的信息。
按键与单片机AT89S52的P3.2-P3.5口相接,单片机的 P1.0口控制信息的发送与接收,并且TXD 端与收发器输入端相连,通过TXD将数据传入收发器,收发器接收到数据后,通过FSK调制,将信号发送出去;接收端的收发器通过解调,将载波信号转换为数字信号,完成信息传输过程;收发器的输出端通过RXD端将数字信号输入到单片机;单片机将数据传送到显示器,这样就完成了一次数据发送与接收并显示的过程。
基于 51 单片机的无线数据收发系统设计
基于 51 单片机的无线数据收发系统设计摘要:系统使用 51 单片机通过NRF24L01 模块远程传输数据,接收端通过NRF24L01 模块接收无线数据。
处理后由液晶进行数据显示,可根据需要设置声音提示。
系统接收与发送端模块均单片机、无线发送模块/ 接收、显示、声音提示模块。
关键词:51 单片机;NRF24L01;液晶显示;无线通讯1硬件设计1.1系统组成该系统将数据经过控制器由无线发送模块进行远距离发送,再通过接收端进行无线数据接收。
接收的数据经控制器处理后由液晶显示器显示,并根据需要可以实现一定的声音提示。
1.2无线收发模块本设计使用无线通讯技术实现数据的传送,能够实现此功能的硬件电路模块总类较多。
为符合设计需求,采用以NRF24L01 为核心的无线通讯模块。
该方案可以使系统具有低成本,低功耗,体积小等特点。
NRF24L01 无线模块出至 NORDIC 公司。
其工作频段在 2.4G— 5GHz,该模块正常工作电压为 1.9V—3.6V,内部具有 FSK 调制功能,集成了 NORDIC 公司自创的增强短脉冲协议。
该模块最多可实现 1 对 6 的数据发送与接收。
其每秒最高可传输两兆比特,能够实现地址检验及循环冗余检验。
若使用 SPI 接口,其每秒最高可传输八兆比特,多达 128 个可选工作频道,将该芯片的最小系统集成后,构成NRF24L01 无线通信模块。
1、引脚功能此模块有 6 个数据传输和控制引脚,采用 SPI 传输方式,实现全双工串口通讯,其中 CE脚为芯片模式控制线,工作情况下,CE 端协配合寄存器来决定模块的工作状态。
当4 脚电平为低时,模块开始工作。
数据写入的控制时钟由第 5 脚输入,数据写入与输出分别为 6、7 脚,中断信号放在了第 8 脚。
2、电器特性NRF24L01 采用全球广泛使用的 2.4Ghz 频率,传输速率可达 2Mbps,一次数据传输宽度可达 32 字节,其传输距离空旷地带可达2000M 此模块增强版空旷地带传输距离可达 5000M—6000M, 因内部具有 6 个数据通道,可实现 1 对 6 数据发送,还可实现 6 对 1 数据接收,其工作电压为 1.9V-3.6V,当没有数据传输时可进入低功耗模式运行,微控制器对其控制时可对数据控制引脚输入 5V 电平信号,可实现 GFSK 调制。
红外无线数据传输系统的设计与实现-毕业论文
摘要红外无线数据传输系统是一种利用红外线作为传输媒介的无线数据传输方式,它相对于无线电数据通信具有功耗低、价格便宜、低电磁干扰、高保密性等优点,目前发展迅猛,尤其是在近距离无线数据通信中得到广泛的运用.本文主要介绍基于51单片机的红外无线数据传输系统的原理.在硬件设计原理的介绍中,主要分析了系统中NE555数据调制电路、红外发射电路、红外接收电路、DS18B20温度传感器电路、单片机外围电路以及声光报警电路。
在系统软件设计的介绍中,我们主要分析单片机串口通信协议、控制温度传感器采集数据、对数据的编解码;而液晶显示部分软件则是为了具有更好的人机交互界面。
通过调试后,本系统基本达到预期要求,1、正确实现双机通信功能,在2400波特率下通信距离达到7米左右;2、具有在超时通信不畅的情况下进行报警提示功能;3、具有自动搜寻一帧数据起始位的功能,这样可以有效防止外界的干扰;4、通过串口可以与PC机实现正确通信,可以作为计算机的红外无线终端,完成数据的上传和下放.因此本系统具有广阔的实用价值。
关键词:AT89S52单片机;数据采集;红外通信;调制解调;串口通信AbstractInfrared wireless data transmission system is a wireless data transfer method that uses infrared as a transmission medium, Compared with the radio data communication,it has many advantages in power consumption, Production costs,electromagnetic interference,and the confidentiality. At present,this technology is developing rapidly,In particular, It is widely used in short—range wireless data communications,In this paper,we are introduced infrared wireless data transmission system’s theory that based on the single—chip microcomputer 51. In the hardware design principle introduction,We mainly analysis the system's data modulation circuit of NE555, infrared transmitter,IR receiver circuit, DS18B20 temperature sensor circuit,microcontroller peripheral circuits, as well as sound and light alarm circuit。
51单片机的nRF905无线发射接收程序
基于51单片机的nRF905无线发射接收程序无线发射程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//*******************定义命令字**********************#define WC 0x00 // Write configuration register command#define RC 0x10 // Read configuration register command#define WTP 0x20 // Write TX Payload command#define RTP 0x21 // Read TX Payload command#define WTA 0x22 // Write TX Address command#define RTA 0x23//*******************管脚配置*********sbit MOSI=P1^6;sbit CSN=P1^7;sbit SCK=P1^0;sbit MISO=P1^1;sbit TRX_CE=P1^2;sbit TXEN=P1^3;sbit PWR=P1^4;sbit DR=P1^5;uchar Txbuf[4]={0x03,0x04,0x05,0x06};uchar Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};//------------------------------------------------void delay(uint x){uint i;for(i=0;i<x;i++){_nop_();}}//------------------------------------------------void Spiwrite(uchar dat){uchar i=8;while(i--){delay(10);SCK=0;MOSI=(bit)(dat&0x80);dat<<=1;delay(10);SCK=1;delay(10);SCK=0;}SCK=0;}//------------------------------------------------void Txpacket(void){TXEN=1;TRX_CE=1;CSN=0;Spiwrite(0x22);Spiwrite(0xe7);Spiwrite(0xe7);Spiwrite(0xe7);Spiwrite(0xe7);CSN=1;_nop_();_nop_();CSN=0;Spiwrite(0x20);Spiwrite(Txbuf[0]);Spiwrite(Txbuf[1]);Spiwrite(Txbuf[2]);Spiwrite(Txbuf[3]);CSN=1;_nop_();_nop_();delay(50);while(!DR);TRX_CE=0;}//--------------------------------------------------void ini_system(void){uchar i;CSN=1;SCK=0;PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E TRX_CE=0; // 1 | 0 | 0 | SPI ProgrammingTXEN=0;_nop_();CSN=0;Spiwrite(0x00);for(i=0;i<10;i++){Spiwrite(Rfconfig[i]);}CSN=1;}//-------------------------------------------------void setmode(){PWR=1; // PWR_UP TRX_CE TXEN MODE TRX_CE=1; // 1 1 1 SHOCKBURST TX TXEN=1;delay(1000); //time must be >=650us}//-----------------------------------------------------void main(){ini_system();while(1){setmode();Txpacket();P2=~P2;}}无线接收程序:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define WC 0x00#define RC 0x10#define WTP 0x20#define RTP 0x21#define WTA 0x22#define RTA 0x23#define RRP 0x24sbit TXEN=P1^7;sbit TRX_CE=P3^0;sbit PWR=P1^6;sbit MISO=P1^0;sbit MOSI=P1^3;sbit SCK=P1^1;sbit CSN=P1^2;sbit DR=P1^4;sbit CD=P1^5;sbit we=P3^7;sbit de=P3^6;unsigned int Rxbuf[4]={0};unsigned char Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde}; void display(uint e,uint f,uint g,uint h);void delay(uint x){uint i;for(i=0;i<x;i++){_nop_();}}void Dela(uint a){uint b,c;for(b=a;b>0;b--)for(c=110;c>0;c--);}void Spiwrite(uchar dat){uchar i=8;while(i--){delay(10);SCK=0;MOSI=(bit)(dat&0x80);dat<<=1;delay(10);SCK=1;delay(10);SCK=0;}SCK=0;}unsigned char Spiread(void) {uchar i=8;uchar ddat;while(i--){ddat<<=1;SCK=0;_nop_();_nop_();ddat|=MISO;SCK=1;_nop_();_nop_();}SCK=0;return ddat;}void Rxpacket(void){unsigned char j=0;TRX_CE=0;PWR=1;CSN=0;_nop_();Spiwrite(RRP);for(j=0;j<4;j++){Rxbuf[j]=Spiread();}CSN=1;TRX_CE=1;while(!DR);}void ini_system(void){uchar i;CSN=1;SCK=0;PWR=1; // PWR_UP | TRX_CE |TXEN | M O D ETRX_CE=0; // 1 | 0 | 0 | SPI ProgrammingTXEN=0;_nop_();CSN=0;_nop_();Spiwrite(WC);for(i=0;i<10;i++){Spiwrite(Rfconfig[i]);}CSN=1;}void setmode(){PWR=1; // PWR_UP TRX_CE TXEN MODE TRX_CE=1; // 1 1 0 SHOCKBURST RX TXEN=0;delay(300); //time must be >=650us}void display(uint e,uint f,uint g,uint h){uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};we=1;P0=0xfe;we=0;de=1;P0=table[e];de=0;Dela(5);we=1;P0=0xfd;we=0;de=1;P0=table[f];de=0;Dela(5);we=1;P0=0xfb;we=0;de=1;P0=table[g];de=0;Dela(5);we=1;P0=0xf7;we=0;de=1;P0=table[h];de=0;Dela(5);}void main(){ini_system();setmode();while(1){Rxpacket();P2=~P2;display(Rxbuf[0],Rxbuf[1],Rxbuf[2],Rxbuf[3]);}}。
C51单片机利用ESP8266配置WIFI,发送温度数据的源码
C51单片机利用ESP8266配置WIFI,发送温度数据的源码使用DS18B20,ESP8266,实现WIFI传输温度,底层部分代码。
其中WIFI是作为服务器,上位机作为客户端。
单片机源程序如下:/***********************程序名:wifi_3.c功能:单片机与手机通信,实现温度信息的传输编程人: baxlumen************************/#include "reg52.h"#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longtypedef unsigned int u16;typedef unsigned char u8;sbit DSPORT=P3^7;sbit moto=P1^1;sbit CLK = P3^6; //时钟sbit DIN = P3^4; //输入sbit CS = P3^5; //片选#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;u16 sun; //光照int temp;int sdata; //温度int xiaoshu1;int xiaoshu2;float tp;uchar DisplayData[]={0,0,0,0,0,0,0,0};/*****************定义程序中所需要的延时********************/void Delay1ms(uint y){uint x;for( ; y>0; y--){for(x=110; x>0; x--);}}void delay(u16 i){while(i--);}void delay1ms(){unsigned char i;for(i=124;i>0;i--); //延时124*8+10=1002us}/************************************************************** ****************** 函数名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输入 : c* 输出 : 无* 说名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
基于51单片机驱动SI4432无线模块收发C语言程序
基于51单片机驱动SI4432无线模块收发C语言程序#include <reg52.h>#include <ABSACC.h>#include <intrins.h>#include <stdio.h>//----------------------------------RF4432配置口定义--------------------------------------- //sbit RF4432_PAC=P2^4; //收发模式切换控制端sbit RF4432_SDO=P3^5; //SPI数据输出sbit RF4432_SDI=P3^4; //SPI数据输入sbit RF4432_SCLK=P3^7; //SPI时钟输入端口sbit RF4432_SEL=P3^3; //SPI片选sbit RF4432_IRQ=P3^2; //SI4432工作状态指示端口sbit KEY=P3^6; //BLT53A上电控制端sbit LED_GREEN=P2^1;sbit P15=P1^5;//-------------------------射频芯片相关定义--------------------------------------------#define RF4432_TxRxBuf_Len 32 //定义RF4432数据包长度char RF4432_TxRxBuf[RF4432_TxRxBuf_Len];unsigned char Packet[30]={9,20,30,21,15,58,56,69,25,23,12,25,56,22,23,24};//Transmit packet unsigned char Length=4;unsigned char Data_Buf[10];unsigned char Data_Len;typedef enum _RF_ENUM{RF_OK = 0x00, //function response parametersRF_ERROR_TIMING = 0x01,RF_ERROR_PARAMETER = 0x02,RF_PACKET_RECEIVED = 0x03,RF_NO_PACKET = 0x04,RF_CRC_ERROR = 0x05,} RF_ENUM;//----------------------------RF4432 配置寄存器地址-------------------------------- #define DEVICE_TYPE 0x00#define EVICE_VERSION 0x01 //版本号#define DEVICE_STATUS 0x02 //设备状态#define INTERRUPT_STATUS_1 0x03#define INTERRUPT_STATUS_2 0x04#define INTERRUPT_ENABLE_1 0x05#define INTERRUPT_ENABLE_2 0x06#define OPERATING_FUNCTION_CONTROL_1 0x07 //工作模式和功能控制1#define OPERATING_FUNCTION_CONTROL_2 0x08 //工作模式和功能控制2#define CRYSTAL_OSCILLATOR_LOAD_CAPACITANCE 0x09 //晶振负载电容设置#define MICROCONTROLLER_OUTPUT_CLOCK 0x0A#define GPIO0_CONFIGURATION 0x0B //GPIO0功能设置寄存器见英文文档第105页#define GPIO1_CONFIGURATION 0x0C#define GPIO2_CONFIGURATION 0x0D#define IO_PORT_CONFIGURATION 0x0E#define ADC_CONFIGURATION 0x0F#define ADC_SENSOR_AMPLIFIER_OFFSET 0x10#define ADC_VALUE 0x11#define TEMPERATURE_SENSOR_CONTROL 0x12 //温度传感器校准#define TEMPERATURE_VALUE_OFFSET 0x13#define WAKE_UP_TIMER_PERIOD_1 0x14#define WAKE_UP_TIMER_PERIOD_2 0x15#define WAKE_UP_TIMER_PERIOD_3 0x16#define WAKE_UP_TIMER_VALUE_1 0x17#define WAKE_UP_TIMER_VALUE_2 0x18#define LOW_DUTY_CYCLE_MODE_DURATION 0x19#define LOW_BATTERY_DETECTOR_THRESHOLD 0x1A //低压检测阈值寄存器#define BATTERY_VOLTAGE_LEVEL 0x1B#define IF_FILTER_BANDWIDTH 0x1C //中频滤波器带宽寄存器#define AFC_LOOP_GEARSHIFT_OVERRIDE 0x1D#define AFC_TIMING_CONTROL 0x1E#define CLOCK_RECOVERY_GEARSHIFT_OVERRIDE 0x1F#define CLOCK_RECOVERY_OVERSAMPLING_RATIO 0x20#define CLOCK_RECOVERY_OFFSET_2 0x21#define CLOCK_RECOVERY_OFFSET_1 0x22#define CLOCK_RECOVERY_OFFSET_0 0x23#define CLOCK_RECOVERY_TIMING_LOOP_GAIN_1 0x24#define CLOCK_RECOVERY_TIMING_LOOP_GAIN_0 0x25#define RECEIVED_SIGNAL_STRENGTH_INDICATOR 0x26#define RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR 0x27#define ANTENNA_DIVERSITY_REGISTER_1 0x28#define ANTENNA_DIVERSITY_REGISTER_2 0x29#define DATA_ACCESS_CONTROL 0x30#define EZMAC_STATUS 0x31#define HEADER_CONTROL_1 0x32 //Header 起始码设置#define HEADER_CONTROL_2 0x33#define PREAMBLE_LENGTH 0x34 //前导码长度#define PREAMBLE_DETECTION_CONTROL 0x35 //前导码检测设置#define SYNC_WORD_3 0x36 //同步字节#define SYNC_WORD_2 0x37#define SYNC_WORD_1 0x38#define SYNC_WORD_0 0x39#define TRANSMIT_HEADER_3 0x3A#define TRANSMIT_HEADER_2 0x3B#define TRANSMIT_HEADER_1 0x3C#define TRANSMIT_HEADER_0 0x3D#define TRANSMIT_PACKET_LENGTH 0x3E //发送数据包长度,详细请看P125页#define CHECK_HEADER_3 0x3F#define CHECK_HEADER_2 0x40#define CHECK_HEADER_1 0x41#define CHECK_HEADER_0 0x42#define HEADER_ENABLE_3 0x43#define HEADER_ENABLE_2 0x44#define HEADER_ENABLE_1 0x45#define HEADER_ENABLE_0 0x46#define RECEIVED_HEADER_3 0x47#define RECEIVED_HEADER_2 0x48#define RECEIVED_HEADER_1 0x49#define RECEIVED_HEADER_0 0x4A#define RECEIVED_PACKET_LENGTH 0x4B //接收数据包长度,详细请看P134页#define ANALOG_TEST_BUS 0x50#define DIGITAL_TEST_BUS_ENSCTEST_ 0x51#define TX_RAMP_CONTROL 0x52#define PLL_TUNE_TIME 0x53 //锁相环切换时间#define CALIBRATION_CONTROL 0x55#define MODEM_TEST 0x56#define CHARGEPUMP_TEST 0x57#define CHARGEPUMP_CURRENT_TRIMMING_OVERRIDE 0x58#define DIVIDER_CURRENT_TRIMMING 0x59#define VCO_CURRENT_TRIMMING 0x5A#define VCO_CALIBRATION_OVERRIDE 0x5B#define SYNTHESIZER_TEST 0x5C#define BLOCK_ENABLE_OVERRIDE_1 0x5D#define BLOCK_ENABLE_OVERRIDE_2 0x5E#define BLOCK_ENABLE_OVERRIDE_3 0x5F#define CHANNEL_FILTER_COEFFICIENT_ADDRESS 0x60#define CHANNEL_FILTER_COEFFICIENT_VALUE 0x61#define CRYSTAL_OSCILLATOR_CONTROL_TEST 0x62#define RC_OSCILLATOR_COARSE_CALIBRATION_OVERRIDE 0x63#define RC_OSCILLATOR_FINE_CALIBRATION_OVERRIDE 0x64#define LDO_CONTROL_OVERRIDE_ENSPOR 0x65#define LDO_LEVEL_SETTING 0x66 #define DELTASIGMA_ADC_TUNING_1 0x67#define DELTASIGMA_ADC_TUNING_2 0x68#define AGC_OVERRIDE_1 0x69 #define AGC_OVERRIDE_2 0x6A#define GFSK_FIR_FILTER_COEFFICIENT_ADDRESS 0x6B#define GFSK_FIR_FILTER_COEFFICIENT_VALUE 0x6C#define TX_POWER 0x6D //发射功率设置,详细请见P153#define TX_DATA_RATE_1 0x6E //数据发送波特率设置寄存器1#define TX_DATA_RATE_0 0x6F //数据发送波特率设置寄存器0#define MODULATION_MODE_CONTROL_1 0x70 //调制方式控制,详细请见P155#define MODULATION_MODE_CONTROL_2 0x71#define FREQUENCY_DEVIATION 0x72#define FREQUENCY_OFFSET_1 0x73#define FREQUENCY_OFFSET_2 0x74#define FREQUENCY_BAND_SELECT 0x75 //频段选择,详细请见P157#define NOMINAL_CARRIER_FREQUENCY_1 0x76 //基准载波频率#define NOMINAL_CARRIER_FREQUENCY_0 0x77#define FREQUENCY_HOPPING_CHANNEL_SELECT 0x79 //跳频频道选择,详细请见P158#define FREQUENCY_HOPPING_STEP_SIZE 0x7A //跳频频道间隔#define TX_FIFO_CONTROL_1 0x7C#define TX_FIFO_CONTROL_2 0x7D#define RX_FIFO_CONTROL 0x7E#define FIFO_ACCESS 0x7F //FIFO读写方式设置,//-------------------------------RF4432控制指令--------------------------------------------- #define RR 0x00#define WR 0x80//------------------------------------------------延时------------------------------void delay_10us(char n){int i;while(n--)for(i=0;i<5;i++);}void delay_ms(int num){int x,y;for(y=0;y<num;y++){for(x = 0;x < 500;x)x++;}}//------------------------------------SPI单字节读取函数------------------------------------- unsigned char SPI_Read(void){unsigned char i,rxdata;rxdata = 0x00;for (i = 0;i < 8;i++){rxdata = rxdata<<1;RF4432_SCLK=1;RF4432_SDO=1;if (RF4432_SDO==1) //读取最高位,保存至最末尾,通过左移位完成整个字节 {rxdata |= 0x01;}else{rxdata &= ~0x01;}delay_10us(2);RF4432_SCLK=0;delay_10us(2);}return rxdata;}//--------------------------SPI单字节写入函数----------------------------------------------void SPI_Write(unsigned char txdata){unsigned char i;for (i = 0;i < 8;i++){if (txdata&0x80) //总是发送最高位{RF4432_SDI=1;}else{RF4432_SDI=0;}RF4432_SCLK=1;txdata = txdata<<1;RF4432_SCLK=0;}}//---------------------RF4432寄存器读取函数--------------------------------------------------- void RF4432_ReadReg(unsigned char addr, unsigned char *RegisterData){RF4432_SEL=0;SPI_Write(addr|RR);*RegisterData = SPI_Read();RF4432_SEL=1;}//----------------RF4432寄存器写入函数---------------------------------------------------------- void RF4432_WriteReg(unsigned char addr, unsigned char value){RF4432_SEL=0;SPI_Write(addr|WR);SPI_Write(value);RF4432_SEL=1;}//-----------------------RF4432寄存器读取函数---------------------------------------------void RF4432_ReadBurestReg(unsigned char addr,unsigned char *p,unsigned char count){unsigned char i;RF4432_SEL=0;SPI_Write(addr|RR);for(i=0;i<count;i++){p[i] = SPI_Read();}RF4432_SEL=1;}//---------------------------------RF4432射频芯片初始化函数------------------------------------ void RF4432_Init(void){unsigned char RegisterData;//unsigned int i,j;delay_ms(20);delay_ms(20);delay_ms(20);delay_ms(20);delay_ms(20);delay_ms(20);RF4432_ReadReg(0x03,&RegisterData);//read the Interrupt Status1 registerRF4432_ReadReg(0x04,&RegisterData);//read the Interrupt Status2 register//SW resetRF4432_WriteReg(0x07, 0x80);//write 0x80 to the Operating & Function Control1 register//wait for chip ready interrupt from the radio (while the nIRQ pin is high)while(RF4432_IRQ);//read interrupt status registers to clear the interrupt flags and release NIRQ pinRF4432_ReadReg(0x03, &RegisterData);RF4432_ReadReg(0x04, &RegisterData);/*set the physical parameters*///set the center frequency to 434 MHzRF4432_WriteReg(0x75, 0x57); //write 0x75 to the Frequency Band Select registerRF4432_WriteReg(0x76, 0x19); //write 0xBB to the Nominal Carrier Frequency1 registerRF4432_WriteReg(0x77, 0x00); //write 0x80 to the Nominal Carrier Frequency0 register//set the desired TX data rate (9.6kbps)RF4432_WriteReg(0x6E, 0x13); //write 0x4E to the TXDataRate 1 registerRF4432_WriteReg(0x6F, 0xA9); //write 0xA5 to the TXDataRate 0 registerRF4432_WriteReg(0x70, 0x2C); //write 0x2C to the Modulation Mode Control 1 registerRF4432_WriteReg(0x58, 0x80); //VCO//set the TX power to MAXRF4432_WriteReg(0x6D, 0x1F); //write 0x1F to the TX Power register/*set the modem parameters according to the exel calculator(parameters: 4.8 kbps, deviation: 50 kHz, channel filter BW: 102.2 kHz*/RF4432_WriteReg(0x1C, 0xAD);//write 0x1E to the IF Filter Bandwidth registerRF4432_WriteReg(0x20, 0xE2);//write 0xD0 to the Clock Recovery Oversampling Ratio registerRF4432_WriteReg(0x21, 0x80);//write 0x00 to the Clock Recovery Offset 2 registerRF4432_WriteReg(0x22, 0x1A);//write 0x9D to the Clock Recovery Offset 1 registerRF4432_WriteReg(0x23, 0x37);//write 0x49 to the Clock Recovery Offset 0 registerRF4432_WriteReg(0x24, 0x00);//write 0x00 to the Clock Recovery Timing Loop Gain 1 registerRF4432_WriteReg(0x25, 0x04);//write 0x24 to the Clock Recovery Timing Loop Gain 0 registerRF4432_WriteReg(0x1D, 0x44);//enable afcRF4432_WriteReg(0x1E, 0x0A);RF4432_WriteReg(0x2A, 0x2C);RF4432_WriteReg(0x1F, 0x03);RF4432_WriteReg(0x69, 0x60);//write 0x40 to the AFC Loop Gearshift Override registerRF4432_WriteReg(0x72, 0x70);//write 0x48 to the Frequency Deviation register//set the preamble length to 10bytes if the antenna diversity is used and set to 5bytes if notRF4432_WriteReg(0x34, 0xCF); //write 0x0C to the Preamble Length register//set preamble detection threshold to 20bitsRF4432_WriteReg(0x35, 0x20); //write 0x2A to the Preamble Detection Control register//Disable header bytes; set variable packet length (the length of the payload is defined by the //received packet length field of the packet); set the synch word to two bytes longRF4432_WriteReg(0x33, 0x02); //write 0x02 to the Header Control2 register//Set the sync word pattern to 0x2DD4RF4432_WriteReg(0x36, 0x2D); //write 0x2D to the Sync Word 3 registerRF4432_WriteReg(0x37, 0xD4); //write 0xD4 to the Sync Word 2 register//enable the TX & RX packet handler and CRC-16 (IBM) checkRF4432_WriteReg(0x30, 0x8D); //write 0x8D to the Data Access Control register//Disable the receive header filtersRF4432_WriteReg(0x32, 0x00 ); //write 0x00 to the Header Control1 register//enable FIFO mode and GFSK modulationRF4432_WriteReg(0x71, 0x2B); //write 0x63 to the Modulation Mode Control 2 register/*set the GPIO's according the testcard type*/RF4432_WriteReg(0x0B, 0x0A); //write 0x12 to the GPIO0 Configuration(set the TX state)RF4432_WriteReg(0x0C, 0x0A); //write 0x15 to the GPIO1 Configuration(set the RX state)//set the AGCRF4432_WriteReg(0x69, 0x35); //write 0x0B to the AGC Override 2 register//set ADC reference voltage to 0.9VRF4432_WriteReg(0x68, 0x07); //write 0x04 to the Deltasigma ADC Tuning 2 register//set Crystal Oscillator Load Capacitance registerRF4432_WriteReg(0x09, 0x7F); //write 0xD7 to the Crystal Oscillator Load Capacitance registerRF4432_WriteReg(0x73,0x00);RF4432_WriteReg(0x74,0x00);//TxFIFOReset();RF4432_WriteReg(0x08, 0x01);RF4432_WriteReg(0x08, 0x00);//RxFIFOReset();RF4432_WriteReg(0x08, 0x02);RF4432_WriteReg(0x08, 0x00);}//-------------------------RF4432设置接收模式函数------------------------------------------ void RF4432_SetRxMode(void){unsigned char RegisterData;RF4432_WriteReg(0x0E, 0x02);//Rx_EN;//enable the packet valid interruptRF4432_WriteReg(0x05, 0xFF);RF4432_WriteReg(0x06, 0x00);RF4432_ReadReg(0x03, &RegisterData);RF4432_ReadReg(0x04, &RegisterData);//enable receiver chainRF4432_WriteReg(0x07, 0x05);}//---------------------------RF4432数据包接收函数------------------------------------------- unsigned char RF4432_RxPacket(void){unsigned char temp;RF4432_IRQ=1;if(!RF4432_IRQ){RF4432_ReadReg(INTERRUPT_STATUS_1,&temp);if(temp&0x02){return 1;}}return 0;}void RFIdle(void){unsigned char RegisterData;RF4432_WriteReg(0x07, 0x01);//diasble all ITsRF4432_WriteReg(0x05, 0x00);RF4432_WriteReg(0x06, 0x00);RF4432_ReadReg(0x03, &RegisterData);RF4432_ReadReg(0x04, &RegisterData);}void RFTransmit(unsigned char * packet, unsigned char length){unsigned char temp;unsigned char RegisterData;RF4432_WriteReg(0x0E, 0x01);//Tx_EN;RF4432_WriteReg(0x3e, length);for(temp=0;temp<length;temp++){RF4432_WriteReg(0x7f,packet[temp]);} //enable the wanted ITsRF4432_WriteReg(0x05, 0x04);RF4432_WriteReg(0x06, 0x00);RF4432_ReadReg(0x03, &RegisterData);RF4432_ReadReg(0x04, &RegisterData);//enable transmitterRF4432_WriteReg(0x07, 0x09);while(RF4432_IRQ);//while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)); RF4432_ReadReg(0x03, &RegisterData);RF4432_ReadReg(0x04, &RegisterData);}RF_ENUM RFPacketReceived(unsigned char * packet, unsigned char * length) {unsigned char i;unsigned char RegisterData;if( RF4432_IRQ == 0 ){RF4432_ReadReg(0x03,&RegisterData);if( (RegisterData & 0x01) == 0x01 )//CRC error{RF4432_SetRxMode();return RF_CRC_ERROR;}if( (RegisterData & 0x02) == 0x02 )//packet received{//read bufferRF4432_ReadReg(0x4b,length);for(i=0;i<*length;i++){RF4432_ReadReg(0x7f,packet++);}RF4432_SetRxMode();return RF_PACKET_RECEIVED;}}return RF_NO_PACKET;}void StartUART( void ){SCON = 0x50;TMOD = 0x20;TH1 = 0XF4;TL1 = 0XF4;TR1 = 1; //允许定时器1工作}//串口发送数void R_S_Byte(unsigned char R_Byte){SBUF = R_Byte;while( TI == 0 ); //查询法 TI = 0;}main(){//unsigned char i;KEY=1;LED_GREEN=0;StartUART();RF4432_Init();delay_ms(10);RF4432_SetRxMode();//RF4432设置接收模式函数P15=1;while(1){RF4432_WriteReg(0x0E, 0x02);//Rx_EN;LED_GREEN=1;//灯亮RFTransmit(Packet,Length);//发送数据RFIdle();//进入空闲模式delay_ms(10);RF4432_SetRxMode();//RF4432设置接收模式函数while(RFPacketReceived(Data_Buf,&Data_Len) != RF_PACKET_RECEIVED);//waiting for receivingRFIdle();RF4432_ReadReg(0x26,&Data_Buf[1]);LED_GREEN=0;delay_ms(200);delay_ms(200);/*RF4432_SetRxMode();LED_GREEN=0;//=========================================================================================================== =if(RF4432_RxPacket()) //判断是否接收到数据{LED_GREEN=1;RF4432_ReadBurestReg(FIFO_ACCESS,RF4432_TxRxBuf,RF4432_TxRxBuf_Len);for(i=0;i<32;i++){R_S_Byte(RF4432_TxRxBuf[i]);}RF4432_SetRxMode();}*/ }}。
基于51单片机WiFi智能小车制作
基于51单片机WiFi智能小车制作基于51单片机WiFi智能小车制作一、基本原理51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块(路由器)以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC 或手机端发送来的相关信号并分析转换成TTL 电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。
二、购买所需材料了解51单片机WiFi智能小车基本原理后,需要购买所需材料进行制作。
下面列出所需制作材料:序号材料备注图例6 小车底盘7 摄像头 根据固件支持摄像头购买8 电源根据自己需要购买种类9 杜邦线及小配件制作所需工具:序号工具名备注图例称1 电烙铁一套 包括松香焊锡2 螺丝刀 平口、十字等3 微型电钻 可以自制4手工刀5 剪刀6 万用表7 热熔胶枪或快干胶8US B下载器三、开始制作1、制作流程开始制作前,我们首先需要看购买路由器的型号,笔者采用的是703n 路由器,所以需要引出ttl 线。
总体步骤为:路由器引TTL 线→路由器刷OpenWrt 固件→制作51单片机最小系统→下载下位机程序到51单片机→安装上位机程序至PC 或手机→测试上、下位机通信→组装→调试完成。
2、路由器引ttl线首先打开703n路由器,按照下图标示位置焊接ttl线。
注意:1、焊接的时候要小心焊接,焊好后微拉下查看松紧2、焊接最好采用软线焊接,防止意外整块拉掉焊点3、焊好后一定用胶固定,最好采用热熔胶下图为引好ttl线样子3 刷OpenWrt固件何为OpenWrt固件,OpenWrt可以被描述为一个嵌入式的Linux 发行版,(主流路由器固件有dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的,静态的系统。
基于51单片机和CC1101的无线温度监控系统设计
基于51单片机和CC1101无线温度监控系统设计前言目前,科学技术的发展日新月异,单片机等大规模集成电路的进步与发展,温度监控技术的应用越来越广泛。
在传统微机化的温度监控系统中,均是以有线方式来实现温度监控。
传统的温度监控系统,其突出的问题是由于有线通信,线缆传输连线麻烦,需要特制接口,颇为不便,且实用性不强,成本高,造成系统的普及性降低,同时也带来了制作繁琐,外围电路复杂的缺点。
近年来,随着各种单片机及无线收发芯片的出现与推广,使得基于CC1101的无线温度监控系统的实现成为可能。
温度是工业、农业生产中常见的和最基本的参数之一,在生产过程中常需对温度进行检测和监控,采用微型机进行温度检测、数字显示、信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用。
伴随工业科技、农业科技的发展,温度测量需求越来越多,也越来越重要。
但是在一些特定环境温度监测环境范围大,测点距离远,布线很不方便。
这时就要采用无线方式对温度数据进行采集。
利用无线技术实现数据传输比使用传统的有线电缆有不可比拟的优点,如可移动性、方便灵活性等多方面都更能满足人们的实际需要。
实现无线数据传输的方法多种多样,使用高频无线电技术、激光技术、红外技术等等均能满足无线传输要求。
本设计是以宏晶科技推出的STC89C52RC单片机作为控制核心,提出以DS18B20的单线分布式温度采集与控制系统,通过CC1101无线收发模块收发信息。
监控点将接收到主控点的信息后,经过一些处理,然后相应的监控点将采集并发送数据给主控点。
主控点通过串口将收到的温度信息回馈到上位机(PC机),从而远程实现对整个系统的检测与控制。
一.总体方案设计温度监控系统有着共同的特点:测量点多、环境复杂、布线分散、现场离监控室远等。
若采用一般温度传感器采集温度信号,则需要设计信号调理电路、A/D 转换及相应的接口电路,才能把传感器输出的模拟信号转换成数字信号送到计算机去处理。
PT2262PT2272无线收发讲解
PT2262-PT2272无线收发讲解51单片机综合学习系统之无线遥控模块应用篇《电子制作》2008年6月站长原创,如需引用请注明出处大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了数字温度传感器DS18B20的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习无线电遥控的基本原理与应用实例。
先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
图1 51单片机综合学习系统上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、200米无线遥控器,无线接收板,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
PT2262/PT2272无线模块工作原理PT2262/2272是台湾普城公司生产的一种CMOS工艺制造的低功耗低价位通用编/解码电路,是目前在无线通讯电路中作地址编码识别最常用的芯片之一。
PT2262/2272最多可有12位(A0-A11)三态(悬空,接高电平,接低电平)地址设定管脚,任意组合可提供531441个地址码。
PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚(Dout)串行输出,可用于无线遥控发射电路。
PT2262和PT2272的引脚排列见图2。
对于编码器PT2262,A0~A5共6根线为地址线,而A6~A11共6根线可以作为地址线,也可以作为数据线,这要取决于所配合使用的解码器。
若解码器没有数据线,则A6~A11作为地址线使用,这种情况下,A0~A11共12根地址线,每线都可以设置成“1”、“O”、“开路”三种状态之一,因此共有编码数312=531441种;但若配对使用的解码器的A6~A11是数据线,例如PT2272,那么这时PT2262的A6~A11也作为数据线用,并只可设置为“1”和“0”两种状态之一,而地址线只剩下A0~A5共6根,编码数降为36=729种。
RDA5820和51单片机制作的FM数字收音机源代码及电路原理图
* 晶振:8M*/#include <reg52.h>#include <string.h>#define ChannelCount 50 //最多支持多少个台,因为常驻内存,多了RAM放不下#define uchar unsigned char#define uint unsigned inttypedef struct{uchar Freq;uchar Rssi;}ChannelInfo;sbit SDA = P2^0;sbit SCL = P2^1;sbit key1 = P3^4;sbit key2 = P2^7;sbit key3 = P2^6;sbit key4 = P2^5; // P3^7;sbit LcdEn = P3^4;sbit LcdRs = P3^5;uchar Channel = 0;uchar FreqTune = 0;const uint MinFreq = 870; //起始频率* 100KHzconst uint MaxFreq = 1080; //最高频率* 100KHzconst uchar FmAddr = 0×22; //FM模块IIC 地址const uchar EpAddr = 0xA0; //24C02 EPPRom 的地址uchar RSSI = 0; //信号强度uchar ChannelTune[ChannelCount];uchar code LevlChar[5][8] ={{0x1F,0×11,0x0A,0×04,0×04,0×04,0×04,0×04},{0×00,0×00,0×00,0×00,0×00,0×00,0×06,0x1E},{0×00,0×00,0×00,0×00,0×06,0x1E,0x1E,0x1E}, //显示型号强度的自定义字符{0×00,0×00,0×06,0x1E,0x1E,0x1E,0x1E,0x1E},{0×06,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E}};uchar vol = 0×8; //音量0~0xFuchar Func = 0×0; //当前功能号bit AutoScan = 0; //标记当前是不是在自动搜台bit Mute = 0; //标记是否被静音uchar KeyNumber = 0;void OpenIIC();void CloseIIC();void IICWrite(uchar uaddr, uchar romaddr, uint rdata,bit _i6b);void IICWriteByte( uchar byte );uint IICRead(uchar uaddr, uchar romaddr,bit _i6b);uchar IICReadByte(bit next);void FM_SetFreq();void FM_SetVolume();uint FM_ReadReg(uchar regAddr); //读取FM模块的寄存器void FM_WriteReg(uchar regAddr,uint dat); //写FM模块的寄存器uchar FM_GetRSSI(); //获取当前的信号强大void Delay(uint c);bit KeyScan();void BeginScan();void Lcd_DispNumber(uint number);void Lcd_Init();void Lcd_Comm(uchar cmd);void Lcd_Data(uchar dat);void Lcd_String(char* dat);void Lcd_DispRssi();void Lcd_DispFreq();void Lcd_Refresh();void Lcd_DispDiscript();void Eprom_LoadInitData();uint Eprom_Read(uchar addr,bit _16bit);void Eprom_Write(uchar addr,uint dat,bit _16bit);void main(){P3 = 0xff;P2 = 0xff;Delay(10000); //延时,等待外部FM模块的启动Eprom_LoadInitData(); //从EppRom 加载频道音量等信息 FM_WriteReg(2,0xd281); //启动FM模块FM_SetVolume(); //设置启动音量FM_SetFreq(); //设置默认频道的频率Lcd_Init();Lcd_Refresh();while(1){if( KeyScan()){Lcd_Refresh();}}}void Eprom_LoadInitData(){uint result = 0;int i=0;result =Eprom_Read(0,0);if(result>0){ vol = (uchar)result –1;}result =Eprom_Read(1,0);Channel = (uchar)result;for(i=0;i<ChannelCount;i++){result =Eprom_Read(i * 2 + 2,1);ChannelTune[i] = result;}FreqTune = ChannelTune[Channel];}void Eprom_Write(uchar addr,uint dat,bit _16bit) {IICWrite(EpAddr,addr,dat,_16bit);}uint Eprom_Read(uchar addr,bit _16bit){return IICRead(EpAddr,addr,_16bit);}uint FM_ReadReg(uchar regAddr){return IICRead(FmAddr,regAddr,1);}void FM_WriteReg(uchar regAddr,uint dat) {IICWrite(FmAddr,regAddr,dat,1);}void FM_SetFreq(){FM_WriteReg(3,(FreqTune<<6) | 0×10);}void FM_SetVolume(){uint reg2H;if(vol>0){if(Mute){reg2H = FM_ReadReg(2);reg2H |= 0×4000;FM_WriteReg(2,reg2H);}FM_WriteReg(5,vol);}else{Mute = 1;reg2H = FM_ReadReg(2);reg2H &= 0xBFFF;FM_WriteReg(2,reg2H);}Eprom_Write(0,vol+1,0);}void Lcd_Init(){uchar CGRamAddr = 0×40;int i,j;LcdEn = 0;Lcd_Comm(0×38);Lcd_Comm(0x0c);Lcd_Comm(0×06);Lcd_Comm(0×01);for(j=0;j<5;j++){Lcd_Comm(CGRamAddr + 8 * j); //建立自定义字符(显示信号强度的) for(i=0;i<8;i++){Lcd_Data(LevlChar[j][i]);Delay(510);}}}void Lcd_Comm(uchar cmd){LcdRs =0;P0 = cmd;Delay(50);LcdEn = 1;Delay(50);LcdEn = 0;}void Lcd_Data(uchar dat){LcdRs = 1;P0 = dat;LcdEn = 1;Delay(50);LcdEn = 0;}void Lcd_String(char* dat){char *p;int j, i=strlen(dat);for(j=0;j<i;j++){p=dat + j;Lcd_Data(*p);}}void Lcd_DispRssi(){int i;Lcd_Comm(0×80);for(i=0;i<5;i++){Lcd_Data(‘‘);}RSSI = FM_GetRSSI();Lcd_Comm(0×80);Lcd_Data(0×00);if(RSSI>=1) Lcd_Data(0×01);if(RSSI>=2) Lcd_Data(0×02);if(RSSI>=3) Lcd_Data(0×03);if(RSSI>=4) Lcd_Data(0×04);}void Lcd_DispFreq(){uint curFreq = MinFreq + FreqTune;int i;Lcd_Comm(0×85);for(i=5;i<16;i++){Lcd_Data(‘‘);}Lcd_Comm(0×80+6);if(curFreq>=1000)Lcd_Data(48 +curFreq /1000 % 10); Lcd_Data(48 +curFreq /100 % 10);Lcd_Data(48 +curFreq /10 % 10);Lcd_Data(‘.’);Lcd_Data(48 + curFreq % 10);Lcd_Data(‘M’);Lcd_Data(‘H’);Lcd_Data(‘Z’);}void Lcd_DispDiscript(){int i;Lcd_Comm(0×80+0×40);for(i=0;i<15;i++){Lcd_Data(‘‘);}Lcd_Comm(0×80+0×40);switch(Func){case 0:Lcd_String(“Channel:”);Lcd_DispNumber(Channel+1);break;case 1:Lcd_String(“Volume:”);Lcd_DispNumber(vol);break;case 2:Lcd_String(“Tune”);break;case 3:Lcd_String(“Auto Scan”);}}void Lcd_Refresh(){Lcd_DispRssi();Lcd_DispFreq();Lcd_DispDiscript();}void Lcd_DispNumber(uint number){int i=0,len;char str[6]={‘\0′,’\0′,’\0′,’\0′,’\0′,’\0′}; char temp;dostr[i++] = ’0′+ (number % 10); number /= 10;}while(number) ;len = strlen(str);for(i=0;i<len/2;i++){temp = str[i];str[i] = str[len-i-1];str[len-i-1] = temp;}Lcd_String(str);}bit KeyScan(){bit keyRel = 0; //按键释放检测char value=0;int i;uint temp;if(AutoScan) return 0;if(KeyNumber==0){if(key3==0){Delay(50);if(key3==0){KeyNumber =3;}}if(key4==0){Delay(50);if(key4==0){KeyNumber=4;}}if(key2==0){Delay(50);if(key2==0)KeyNumber=2;}}return 0;}else{switch(KeyNumber){case 1:if(key1==1)keyRel = 1; break;case 2:if(key2==1)keyRel = 1; break;case 3:if(key3==1)keyRel = 1; break;case 4:if(key4==1)keyRel = 1; break;}if(keyRel){switch(KeyNumber){case 2:Func++;if(Func>3) Func = 0;break;case 3:value = -1;break;case 4:value = 1;break;}if(KeyNumber>2){if(Func==0){if((value > 0 && Channel<ChannelCount) || (value<0 && Channel > 0)) {Channel+=value;FreqTune= ChannelTune[Channel];FM_SetFreq();Eprom_Write(1,Channel, 0);}else if(Func==1){if((value > 0 && vol<0xF) || (value<0 && vol > 0)){vol+=value;FM_SetVolume();}}else if(Func==2){if((value > 0 && FreqTune<0xd2) || (value<0 && FreqTune > 0)) {FreqTune+=value;ChannelTune[Channel] = FreqTune;FM_SetFreq();Eprom_Write(Channel * 2 + 2 ,FreqTune,1);}}else if(Func==3) //开始自动扫描{AutoScan = 1;BeginScan();AutoScan = 0;Channel = 0;FreqTune = ChannelTune[0];Func = 0;FM_SetFreq();//覆盖EppRom中的所有的频道for(i=0;i<ChannelCount;i++){temp = ChannelTune[i];Eprom_Write(i * 2+2,temp,1);}Eprom_Write(0×01,0,0); //重置EPPROM中的频道号为0}}KeyNumber=0;}return keyRel;}}//全自动搜索void BeginScan(){uint state;int i=0,count=0;bit cmp = 0;uint seekth = 0×8; //灵敏度0~127,默认为8 灵敏度越低越可能搜索到假台,高了可能一些信号弱一点的频道被跳过。
基于51单片机的多机通信系统设计
单片机多机通信系统一、引言随着单片机技术的不断发展,单片机的应用已经从单机向多机互联化方向发展。
单片机在实时数据采集和数据处理方面,有着成本低、能满足一般要求、开发周期短等优点,其在智能家居、计算机的网络通信与数据传输、工业控制自动化等方面有着广泛的应用。
本系统是面向智能家居应用而设计的。
在初期,采用红外无线通信方式,其传输距离短,适于一般家庭应用,且成本相对较低;待方案成熟、成本允许,可以改用GSM无线通信方式。
二、系统原理及方案设计1 、系统框架介绍本系统为基于51单片机的多机红外无线通信系统,由三个51单片机模块组成。
其中一个作为主机(即上位机),负责接收来自从机1(即下位机)采集的数据信息,以及向从机2(即下位机)发送控制信息。
从机1是数据采集模块,采集温度、光强等室内数据,并将其发送给主机。
主机经分析处理,作出相应判断,并给从机2发送控制信息,使由从机2控制的电机作出相应反应,调节室内环境状况。
系统总体框图如下图1所示,图2为红外收发模块简图:图1 系统总体框图图2 红外收发模块简图2 、多机通信原理介绍在多机通信系统中,要保证主机与从机间可靠的通信,必须要让通信接口具有识别功能,51单片机串行口控制寄存器SCON中的控制位SM2正是为了满足这一要求而设置的。
当串行口以方式2或方式3工作时,发送或接收的每一帧信息都是11位的,其中除了包含SBUF 寄存器传送的8位数据之外,还包含一个可编程的第9位数据TB8或RB8。
主机可以通过对TB8赋予1或0,来区别发送的是数据帧还是地址帧。
根据串行口接收有效条件可知,若从机的SCON控制位SM2为1,则当接收的是地址帧时,接收数据将被装入SBUF并将RI标志置1,向CPU发送中断请求;若接收的是数据帧时,则不会产生中断标志,信息将被丢弃。
若从机的SCON控制位SM2为0,则无论主机发送的是地址帧还是数据帧,接收数据都会被装入SBUF并置1标志位RI,向CPU发出中断请求。
基于单片机的数据采集和无线数据传输系统设计
基于单片机的数据采集和无线数据传输系统设计一、本文概述随着信息技术的快速发展和物联网的广泛应用,数据采集和无线数据传输在各个领域都发挥着越来越重要的作用。
基于单片机的数据采集和无线数据传输系统设计,以其低成本、高效率、易扩展等特点,受到了广泛关注和应用。
本文旨在探讨基于单片机的数据采集和无线数据传输系统的设计原理、实现方法以及在实际应用中的优势与挑战。
本文将首先介绍系统的整体架构,包括数据采集模块、单片机处理模块和无线数据传输模块的设计。
然后,详细阐述各个模块的工作原理和实现技术,包括传感器选型、数据采集电路设计、单片机选型与编程、无线传输协议选择以及数据传输的稳定性与可靠性保障等。
本文还将分析该系统设计在实际应用中的性能表现,如数据传输速度、传输距离、功耗等,并通过具体案例展示其在环境监测、智能家居、工业自动化等领域的应用效果。
文章将总结该系统设计的优点与不足,并对未来发展方向进行展望,以期为相关领域的研究和实践提供有益的参考和启示。
二、单片机基础知识单片机(Microcontroller Unit,MCU)是一种集成电路芯片,它采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上,构成一个小而完善的微型计算机系统。
单片机具有体积小、功耗低、控制功能强、扩展灵活、抗干扰能力强、性价比高等一系列优点,因此在工业控制、智能仪表、汽车电子、通信设备、家用电器、航空航天等许多领域得到了广泛应用。
单片机按照其内部结构可以分为多种类型,例如8051系列、AVR 系列、PIC系列、ARM系列等。
每种类型的单片机都有其独特的指令集、架构和外设接口,因此在使用时需要了解其具体的特性和编程方法。
在数据采集和无线数据传输系统设计中,单片机通常作为核心控制器,负责数据的采集、处理、存储和传输。
通过编程,单片机可以控制外设进行数据采集,如使用ADC(模数转换器)将模拟信号转换为数字信号,或者使用传感器接口读取传感器的输出值。
基于单片机的无线红外防盗报警电路的设计(含程序 原理图 pcb图)
目录1 前言 (1)1.1 无线红外防盗报警电路的发展状况 (1)1.2 无线红外防盗报警器的分类及其介绍 (1)1.3 无线红外报警器工作的原理 (1)1.4 设计无线红外防盗报警器的内容和意义 (1)2 总体方案设计 (3)2.1 方案比较 (3)2.2 方案论证 (4)2.3 方案选择 (4)3 单元模块设计 (5)3.1 各单元模块功能介绍及电路设计 (5)3.2 电路参数的计算及元器件的选择 (13)3.3 特殊器件的介绍 (15)3.4 各单元模块的联接 (21)4 软件设计 (23)4.1 软件设计原理及设计所用工具 (23)4.2 软件结构图 (23)5 系统调试 (27)5.1硬件调试 (27)5.2 系统综合调试 (28)5.3 软件调试 (28)6 系统功能和指标参数 (29)6.1 系统功能的实现 (29)6.2 指标参数 (29)7 结论 (30)8 总结与体会 (31)9 参考文献 (32)附录1:发射部分原理图 (33)附录2:接收部分原理图 (34)附录3:发射部分PCB图 (35)附录4:程序源代码 (36)附录5:实物图 (40)1 前言1.1 无线红外防盗报警电路的发展状况红外防盗报警器的发展主要是基于传感器之下,所以首先要谈谈红外传感器的发展状况。
而传感器技术是21世纪人们在高科技发展方面争夺的一个制高点,各发达国家都将有传感器技术视为现代高新技术发展的关键。
从20世纪80年代起,日本就将传感器技术列为优先发展的高新科技之首,美国等西方国家也将此技术列为国家科技和国防技术发展的重点,而在中国传感器的发展也取得了飞速的发展。
从而基于传感器技术的防盗报警系统也得到了高速发展。
热释电红外传感器是一种非常有应用潜力的传感器,他能检测人或某些动物发射的红外线并转化成电信号输出。
近几年来,伴随这集成电路技术的飞速发展,以及该传感器的特性的深入研究,相关的专用集成电路的处理技术也迅速发展。
基于单片机的无线收发系统设计
基于单片机的无线收发系统设计无线收发系统是指通过无线电波实现信息的传递与接收的一种通讯系统。
它将从传感器或者其他设备中获取的信号转化为电信号,然后通过射频信号进行传输与接收。
在实际的无线收发系统设计中,基于单片机的无线收发系统已经成为广泛应用的一种方案。
下文将从硬件和软件两方面介绍基于单片机的无线收发系统的设计思路。
一、硬件设计基于单片机的无线收发系统包括发送端和接收端两个部分。
其中发送端主要是将电信号转化为射频信号进行传输,而接收端则是将射频信号转化为电信号进行处理。
1、发射模块设计发射模块设计中最核心的是无线电频率,因此需要选择合适的发射模块芯片。
首先需要选择一款可控制衰减的功率放大器,以便根据实际需求对其进行合适的调节。
其次需要选择一款有较多输出功率档位的变频器。
最后需要进行天线设计,根据不同场景选择不同类型的天线。
(如:旋转天线,贴片天线,板载蜂窝天线等)2、接收模块设计接收模块设计中最重要的是接收机芯片。
可以选择具有数字解调功能的芯片,以便将接收到的射频信号转换为数字信号。
通过功率放大器增益的设计,可以使信号幅度调整到最佳值,然后输出给单片机进行处理。
二、软件设计软件设计中需要编写相应的代码程序,对模块控制进行设置,并实现数据的传递。
1、发射模块控制在发射模块控制中,主要是对功率放大器与变频器进行控制。
可以利用单片机的PWM功能模拟模拟电压输出,并实现对变频器的频率和功率的调节。
同时还需要设计相应的信号调制方案,以使数据正确地传输。
2、接收模块控制在接收模块控制中,主要是对解调芯片和功率放大器进行控制,并将解调后的信号数据传输给单片机进行处理。
可以利用单片机的外部中断功能实现接收到数据的中断处理,并利用单片机的USART串口功能实现数据的传输。
综上,基于单片机的无线收发系统的设计需要考虑硬件和软件两个方面。
在硬件设计中需要选择合适的发射与接收模块,并进行天线设计。
在软件设计中需要编写相应的代码程序,实现模块控制与数据传输。
基于WIFI模块和单片机的无线数据传输(附代码)
目录第一章阶段任务第二章基于WIFI模块的无线数据传输的原理1.1 时钟模块1.2 最小单片机系统的原理1.3 温度传感器DS18B201.4 串口1.5 WIFI模块第三章基于WIFI模块的无线数据传输的实现2.1 WIFI模块设置2.2 串口部分设置2.3 调试与运行过程第四章程序与框图第五章小结第二章基于WIFI模块的无线数据传输的原理1.1时钟DS1302模块:电路原理图:DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O 串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
读写时序说明:DS1302是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
数据读写时序如图1.2单片机最小系统的原理:说明复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)单片机:一片AT89S51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行.1.3温度传感器DS18B20的原理(连接到单片机最小系统,并将温度发送给WIFI模块):3.1.1 DS18B20性能特点(1) 独特的单线接口方式,只需一个接口引脚即可通信;(2) 每一个DS18B20都有一个唯一的64位ROM 序列码; (3) 在使用中不需要任何外围元件;(4) 可用数据线供电,电压范围:+3.0V-+5.5 V ;(5) 测温范围:-55℃ -+125℃,在-10℃-+85℃范围内精度为+0.5℃,分辨率为0.0625℃; (6) 通过编程可实现9-12位的数字读数方式。
基于单片机控制的WIFI无线传输模块设计
基于单片机控制的WIFI无线传输模块设计WIFI无线传输模块是一种可以实现无线通信的装置,通过无线网络与其他设备进行数据传输。
在基于单片机控制的设计方案中,我们可以利用单片机来实现对WIFI模块的控制和数据处理。
首先,我们需要选择合适的WIFI模块。
常见的WIFI模块有ESP8266、ESP32等,这些模块都具备较强的无线通信能力和低功耗特性。
我们可以根据项目需求选择合适的模块。
接下来,我们需要将WIFI模块与单片机进行连接。
一般情况下,WIFI模块通过串口与单片机进行通信。
我们可以通过将单片机的TX引脚连接到WIFI模块的RX引脚,并将单片机的RX引脚连接到WIFI模块的TX引脚,实现双向通信。
在单片机程序的设计中,我们需要编写相应的驱动程序来控制WIFI模块。
首先,我们需要初始化WIFI模块的串口通信设置,如波特率、数据位、停止位等。
然后,我们可以通过向WIFI模块发送特定的AT指令来进行控制和配置。
例如,可以通过AT指令连接到WIFI网络、获取本地IP地址、发送数据等。
在驱动程序中,我们还可以定义一些函数来简化AT指令的发送和接收,使控制更加方便。
另外,在设计中我们需要注意WIFI模块的电源供应。
一般情况下,WIFI模块需要3.3V的电压供应,而单片机输出的IO信号一般为5V。
因此,我们需要使用逻辑电平转换器将单片机的IO信号转换为3.3V,以兼容WIFI模块的工作电压。
在实际应用中,我们可以根据项目需求设计不同的功能。
例如,我们可以设计一个远程控制系统,通过WIFI无线传输模块将用户的控制指令发送到被控制的设备上。
我们可以通过配置WIFI模块为TCP服务器,在单片机程序中监听特定的端口,接收来自用户的控制指令,并执行相应的操作。
总结起来,基于单片机控制的WIFI无线传输模块设计涉及到WIFI模块的选择、与单片机的连接、驱动程序编写、逻辑电平转换等方面。
通过合理的设计和编程,可以实现WIFI模块与单片机的无线通信和数据传输。
无线发射接收系统设计与实现
无线发射接收系统设计与实现1、引言对于环境信息采集是很普遍的,但是将采集的信息如何传输就是关键,传统的系统都是用有线的方法,不仅要铺设线路,而且不方便,可移植性差。
随着无线技术的不断发展,无线在各个领域中的应用也不断增加,通过嵌入式系统,用无线的方式实现数据的采集和传输是最好的解决方法,不仅简化了实施的难度,而且成本相对较低。
本文主要是以C51单片机为控制核心,用无线接收发射装置来实现环境数据采集系统。
2、系统目的设计并制作一个无线环境监测模拟装置,实现对周边温度和光照信息的探测。
该装置由1个监测终端和不多于255个探测节点组成(实际制作2个)。
监测终端和探测节点均含一套无线收发电路,要求具有无线传输数据功能,收发共用一个天线。
探测节点有编号预置功能,编码预置范围为00000001B~11111111B。
探测节点能够探测其环境温度和光照信息。
温度测量范围为0℃~100℃,绝对误差小于2℃;光照信息仅要求测量光的有无。
探测节点采用三节1.5V干电池串联,单电源供电。
监测终端用外接单电源供电。
探测节点分布示意图如图1所示。
监测终端可以分别与各探测节点直接通信,并能显示当前能够通信的探测节点编号及其探测到的环境温度和光照信息。
每个探测节点增加信息的转发功能,节点转发功能示意图如图2所示。
即探测节点B的探测信息,能自动通过探测节点A转发,以增加监测终端与节点B之间的探测距离D+D1。
该转发功能应自动识别完成,无需手动设置,且探测节点A、B可以互换位置。
3、方案设计与论证3.1、方案设计方案一:采用at89s52单片机,无线发射采用使用LC振荡器,无线接收采用超外差电路,硅光片,DS18B20,8位拨码开关。
方案二:采用at89s52单片机,无线发射采用使用声表器件,无线接收采用超再生电路,硅光片,DS18B20,8位拨码开关。
3.2、方案论证:(1)无线发射电路选择早期的发射机较多使用LC振荡器,频率漂移较为严重。
基于51单片机的WIFI无线控制系统设计与实现
基于51单片机的WIFI无线控制系统设计与实现发表时间:2018-10-08T15:36:52.577Z 来源:《新材料.新装饰》2018年5月下作者:赵金永[导读] 随着移动技术的不断发展,整个世界在走向移动化。
现阶段,通信技术正面临一场深刻的变革,传统的有线网络已不能满足日益增长的通信需要。
无线通信技术越来越受到关注,人们需要一种不受约束的通信技术,能够随时随地的获取信息。
随着互联网越来越深入的走进人们的生活,用户对能够随时随地上网的需求越来越迫切,WIFI 无线通信技术也得到了迅速发展。
本文研究了51单片机的WIFI无线控制系统。
(广州沣雷交通科技股份有限公司,广州市 510000)摘要:随着移动技术的不断发展,整个世界在走向移动化。
现阶段,通信技术正面临一场深刻的变革,传统的有线网络已不能满足日益增长的通信需要。
无线通信技术越来越受到关注,人们需要一种不受约束的通信技术,能够随时随地的获取信息。
随着互联网越来越深入的走进人们的生活,用户对能够随时随地上网的需求越来越迫切,WIFI 无线通信技术也得到了迅速发展。
本文研究了51单片机的WIFI无线控制系统。
WiFi(Wireless Fidelity)是无线局域网(WLAN)技术——IEEE 802.11系列标准的商用名称。
IEEE 802.11系列标准主要包括IEEE802.11a/b/g/n 5种。
WIFI是由AP ( Access Point)和无线网卡组成的无线网络。
AP一般称为网络桥接器或接入点, 它是当作传统的有线局域网络与无线局域网络之间的桥梁, 因此任何一台装有无线网卡的PC均可透过AP去分享有线局域网络甚至广域网络的资源。
WIFI主要技术优点是无线接入、高速传输以及传输距离远其中, 802.11n 可以将WLAN的传输速率由目前802.11a及802.11g提供的54Mbps,提高到300Mbps甚至高达600Mbps。
在开放性区域通讯距离可达305m,在封闭性区域通讯距离76 ~ 122m,方便与现有的有线以太网整合,组网的成本更低。
PT2262-PT2272无线收发讲解
51单片机综合学习系统之无线遥控模块应用篇《电子制作》2008年6月站长原创,如需引用请注明出处大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了数字温度传感器DS18B20的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习无线电遥控的基本原理与应用实例。
先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
图1 51单片机综合学习系统上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、200米无线遥控器,无线接收板,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
PT2262/PT2272无线模块工作原理PT2262/2272是台湾普城公司生产的一种CMOS工艺制造的低功耗低价位通用编/解码电路,是目前在无线通讯电路中作地址编码识别最常用的芯片之一。
PT2262/2272最多可有12位(A0-A11)三态(悬空,接高电平,接低电平)地址设定管脚,任意组合可提供531441个地址码。
PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚(Dout)串行输出,可用于无线遥控发射电路。
PT2262和PT2272的引脚排列见图2。
对于编码器PT2262,A0~A5共6根线为地址线,而A6~A11共6根线可以作为地址线,也可以作为数据线,这要取决于所配合使用的解码器。
若解码器没有数据线,则A6~A11作为地址线使用,这种情况下,A0~A11共12根地址线,每线都可以设置成“1”、“O”、“开路”三种状态之一,因此共有编码数312=531441种;但若配对使用的解码器的A6~A11是数据线,例如PT2272,那么这时PT2262的A6~A11也作为数据线用,并只可设置为“1”和“0”两种状态之一,而地址线只剩下A0~A5共6根,编码数降为36=729种。
无线模块NRF24L01基于C51单片机-双向通讯C语言程序(中文详解)
#include <reg52.h>#include <intrins.h>/******************************************************************************** *******//* NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片/*得到,NC 管脚可以接可以不接,暂时没用途。
本程序应用于51或者52单片机,是两个模块进行通讯/*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模/*块1的LED2 和模块2的LED4,发过来也对应。
/******************************************************************************** *******/typedef unsigned char uchar;typedef unsigned char uint;/************************************NRF24L01端口定义***********************************/sbit NC =P2^0; //没用,不接也可sbit MISO =P2^5; //数字输出(从 SPI 数据输出脚)sbit MOSI =P2^4; //数字输入(从 SPI 数据输入脚)sbit SCK =P1^7; //数字输入(SPI 时钟)sbit CE =P2^1; //数字输入(RX 或 TX 模式选择)sbit CSN =P2^2; //数字输入(SPI片选信号)sbit IRQ =P2^6; //数字输入(可屏蔽中断)/************************************按键***********************************************/sbit KEY1=P3^3;//按键S1sbit KEY2=P3^2;//按键S2/************************************数码管位选******************************************/sbit led1=P1^0; //LED0sbit led2=P1^1; //LED1sbit led3 =P1^2; //LED2sbit led4 =P1^3; //LED3sbit led5 =P1^4; //LED4/*********************************************NRF24L01*************************** ********/#define TX_ADR_WIDTH 5 // 5 uints TX address width 发送地址宽度#define RX_ADR_WIDTH 5 // 5 uints RX address width 接收地址宽度#define TX_PLOAD_WIDTH 20 // 20 uints TX payload 有效载荷装载货物#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址/***************************************NRF24L01寄存器指令*******************************/#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留/*************************************SPI(nRF24L01)寄存器地址***********************/#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/*************************************函数声明****************************************/void Delay(unsigned int s); //大延时void inerDelay_us(unsigned char n); //小延时void init_NRF24L01(void); //NRF24L01 初始化uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节uchar SPI_Read(uchar reg); //从reg寄存器读一字节void SetRX_Mode(void); //数据接收配置uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes 个字节,通常用来读取接收通道数据或接收/发送地址uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中void nRF24L01_TxPacket(unsigned char * tx_buf); //发送 tx_buf中数据/*****************************************长延时*****************************************/void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}/******************************************************************************** **********/uint bdata sta; //状态标志sbit RX_DR =sta^6; //RX_DR 为 sta 的第六位sbit TX_DS =sta^5; //TX_DS 为 sta 的第五位sbit MAX_RT =sta^4; //MAX_RT 为 sta 的第四位/******************************************************************************** **********//*延时函数/******************************************************************************** **********/void inerDelay_us(unsigned char n) //延时,us 级{for(;n>0;n--)_nop_();}/******************************************************************************** ********//*NRF24L01初始化/******************************************************************************** *******/void init_NRF24L01(void){inerDelay_us(100);CE=0; // 芯片使能CSN=1; // 禁止 SPISCK=0; // SPI时钟置低SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/******************************************************************************** ********************//*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/******************************************************************************** ********************/uint SPI_RW(uint dat){uint i;for(i=0;i<8;i++) // 循环8次{MOSI = (dat & 0x80); // dat的最高位输出到MOSI MSB to MOSIdat = (dat << 1); // 从右向左进一位shift next bit into MSB..SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据Set SCK high..dat |= MISO; //读MISO到 dat 最低位 capture current MISO bitSCK = 0; // SCK置低..then set SCK low again}return(dat); //返回读出的一字节 return read dat}/******************************************************************************** ********************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序-----------从reg寄存器读一字节/******************************************************************************** ********************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; //CSN置低,开始传输数据CSN low, initialize SPI communication...SPI_RW(reg); //选择寄存器 Select register to read from..reg_val = SPI_RW(0); //然后从该寄存器读数据 ..then read registervalueCSN = 1; //CSN拉高,结束数据传输CSN high, terminate SPI communicationreturn(reg_val); //返回寄存器数据 return register value}/******************************************************************************** ********************//*功能:NRF24L01读写寄存器函数/*描述:写数据value到reg寄存器/******************************************************************************** ********************/uint SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据CSN low, init SPI transactionstatus = SPI_RW(reg); // 选择寄存器,同时返回状态字 select registerSPI_RW(value); // 然后写数据到该寄存器 ..and write value to it..CSN = 1; // CSN拉高,结束数据传输CSN high againreturn(status); // 返回状态寄存器 returnnRF24L01 status uchar}/******************************************************************************** ********************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/******************************************************************************** ********************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据 Set CSN low, init SPI tranactionstatus = SPI_RW(reg); //选择寄存器,同时返回状态字 Select register to write to and read status ucharfor(i=0;i<uchars;i++)pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器return nRF24L01 status uchar}/******************************************************************************** *************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/******************************************************************************** *************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据status = SPI_RW(reg); //选择寄存器,同时返回状态字inerDelay_us(10);for(i=0; i<uchars; i++)SPI_RW(*pBuf++); //逐个字节写入nRF24L01CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器}/******************************************************************************** ********************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/******************************************************************************** ********************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式CE = 1; // 拉高CE启动接收设备inerDelay_us(130);}/******************************************************************************** **********************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放入rx_buf接收缓冲区中/******************************************************************************** **********************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}/******************************************************************************** ***************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/******************************************************************************** **************************/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}/************************************主函数************************************************************/void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; // 要发送的数组unsigned char RxBuf[20]={0}; // 接收的数据数组init_NRF24L01() ; //模块初始化led1=1;led2=1;led3 =1;led4 =1; //led 灯关闭Delay(1000);while(1){if(KEY1 ==0 ) //按键 1 按下{TxBuf[1] = 1 ; //赋值tf = 1 ;led1=0; //本地led 灯闪烁Delay(200);led1=1;Delay(200);}if(KEY2 ==0 ) //按键 2 按下{TxBuf[2] =1 ; //赋值tf = 1 ;led2=0; //本地led 灯闪烁Delay(200);led2=1;Delay(200);}if (tf==1) //有键按下{nRF24L01_TxPacket(TxBuf); //发送数据 Transmit Tx buffer dataTxBuf[1] = 0x00; //清零TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode(); //设置成接受模式RxBuf[1] = 0x00; //接收的数组相应位清零RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf); //接收数据if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led3=RxBuf[0];}if( RxBuf[2]==1){led4=RxBuf[4];}Delay(3000); //old is '1000'}RxBuf[1] = 0x00; //清零RxBuf[2] = 0x00;led3=1; //关灯led4=1;}}本程序存在的问题:反应不够灵敏,当在按键1和按键2之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 引言伴随着短距离、低功率无线数据传输技术的成熟,无线数据传输被越来越多地应用到新的领域。
与有线通信方式相比,无线通信以其不需铺设明线,使用便捷等一系列优点,在现代通信领域占重要地位。
但以往的无线产品存在范围和方向上的局限。
例如,一些无线产品在使用时,无法将信息反馈给控制者;还有一些无线产品不能很好地显示参数或状态信息,如果能在系统中增加一块小型液晶显示电路,产品不仅能向用户显示其状态或状态的改变,而且可以大大降低成本。
正如人们所发现的,只要建立双向无线通信-双工通信并且选择成本低的收发芯片,就会出现许多新应用。
本次设计主要是利用无线收发电路,加上单片机控制与液晶显示制成一套完整的数据收发系统。
考虑到目前市场上的一些需求,设计的主要要求是方案成本低,体积小,低功耗,集成度高,尽量无需调外部元件,传输时间短,接口简单。
nRF401是国外最新推出的单片无线收发一体芯片,它在一个20脚的芯片中包括了高频发射、高频接收、PLL合成、FSK调制、多频道切换等功能,并且外围元件少,便于设计生产,功耗极低,集成度高,是目前集成度较高的无线数传产品,它为低速率低成本的无线技术提出了解决方案。
2 无线数据收发系统2.1 系统组成无线数据传输系统有点对点,点对多点和多点对多点三种。
本系统由于实际应用的需要,接收器和数据终端之间的数据传输通过nRF401进行,构成点对点无线数据传输系统。
整个系统中,两数据终端之间的无线通信采用433MHz的频段作为载波频率,收发通过串口通信。
无线数据收发系统可以分为无线收发控制电路、单片机控制电路、显示电路和按键电路四部分组成,系统原理如图2-1所示:图2-1 无线数据收发系统原理图2.2 实现过程当我们需要发送数据时,使用按键来输入所需发送的信息。
按键与单片机AT89S52的P3.2-P3.5口相接,单片机的 P1.0口控制信息的发送与接收,并且TXD 端与收发器输入端相连,通过TXD将数据传入收发器,收发器接收到数据后,通过FSK调制,将信号发送出去;接收端的收发器通过解调,将载波信号转换为数字信号,完成信息传输过程;收发器的输出端通过RXD端将数字信号输入到单片机;单片机将数据传送到显示器,这样就完成了一次数据发送与接收并显示的过程。
本系统采用的是半双工传送方式。
所谓半双工就是通信的双方均具有发送和接收信息的能力,信道也具有双向传输性能,但是,通信的任何一方都不能同时既发送信息又接收信息,即在指定的时刻,只能沿某一个方向传送信息。
所以上述实现过程只介绍了由一方传送到另一方的过程,而相反方向与其原理相同。
无线数据收发系统的电路图见附录3。
3 收发部分原理与设计nRF401是一种基于短程无线通信技术的芯片。
收发部分采用nRF401芯片,其引脚DIN与单片机的TXD相连,需要发射的数字信号通过DIN输入;引脚DOUT与单片机的RXD相连,解调出来的信号经过DOUT输出进入单片机。
3.1 无线收发芯片nRF401介绍[1]3.1.1 主要引脚功能图3-1 nRF401引脚图(1) 9脚及10脚分别是DIN输入数字信号和DOUT输出数字信号均为标准的逻辑电平信号,需要发射的数字信号通过DIN输入,解调出来的信号经过DOUT输出。
(2) 12脚为通道选择,FREQ =“0”为通道#1(433.92MHz),FREQ =“1”为通道#2(434.33MHz)。
(3) 18脚为电源开关,PWR_UP =“1”为工作模式,PWR_UP =“0”为待机模式。
(4) 19脚TXEN:高电平允许发送数据,低电平允许接收数据。
(5) ANT1、ANT2:天线接入端。
3.1.2 内部结构与工作原理nRF401无线收发芯片的结构框图如图3-2所示:芯片内包含有发射功率放大器(PA)、低噪声接收放大器(LNA),晶体振荡器(OSC),锁相环(PLL),压控振荡器(VCO),混频器(MIXER)等电路[2]。
图3-2 内部结构方框图在接收模式中,RF输入信号被低噪声放大器(LNA)放大,经由混频器(MIXER)变换,这个被变换的信号在送入解调器(DEM)之前被放大和滤波,经解调器解调,解调后的数字信号在DOUT端输出。
在发射模式中,压控振荡器(VCO)的输出信号是直接送入到功率放大器(PA),DIN端输入的数字信号被频移键控后馈送到功率放大器输出。
由于采用了晶体振荡器和PLL合成技术,频率稳定性极好。
3.1.3 特点nRF401是一个单片RF收发芯片,工作频率为国际通用的数传频率433MHz;具有FSK调制和解调能力,抗干扰能力强,特别适合工业控制应用;采用PLL频率合成技术,频率稳定性好;最大发射功率达+10dBm,数据速率可达20kb/s;具有2个信号通道,适合需要多信道工作的特殊场合;工作电压在+3~5V之间,最低工作电压为2.7V;它还提供进一步降低电流消耗的待机模式,接收待机状态仅为8μA;仅需外接一个晶体和几个阻容、电感元件,即可构成一个完整的射频收发器。
nRF401接收机使用频移键控(FSK)调制方式,改善了噪声环境下的系统性能。
与幅移键控(ASK)方式相比,这种方式的通信范围更广,特别是在附近有类似设备工作的场合。
3.2 FSK调制[3]本系统中的nRF401是具备FSK调制的无线收发芯片。
所谓FSK调制,就是频移键控,又称数字频率调制,是数字通信调制方式的一种,由于其方法简单、易于实现、抗噪声和抗衰落性能较强以及解调不须恢复本地载波等优点而在现代数字通信系统的低、中速数据传输中得到广泛得应用。
3.2.1 产生原理频率键控法就是利用矩形脉冲序列控制的开关电路,对于两个不同的独立频率源进行选通。
它有两个独立的振荡器,数字基带信号控制开关,选择不同频率的高频振荡信号实现FSK调制。
图3-3为频率键控法原理框图。
1010信号FS K 21f 2f 1f 2f 调频器模拟)(FSK 2t e )(t s 振荡器)(二进信息NRZ 倒相振荡器门相加门2f 1f )(b )(a )(FSK 2t e图3-3 频率键控法原理框图以二进制数字频率调制为例,当数字信号为“1”时,正脉冲是控制门 1 接通,门 2 断开,输出频率 f1 ;数字信号为“0”时,门 1 断开,门 2 接通,输出频率 f2 。
如果产生 f1,f2 的两个震荡器是互相独立的,则输出 2FSK 信号的相位是不连续的。
震荡器的频率 f1,f2 可以直接是所需的载频,也可以是低频范围通过混频、倍频方式搬移到载频范围。
3.2.2 FSK 信号波形图已调信号的时域表达式为()⎩⎨⎧="0"cos "1"cos 212t A t A t e FSK ωω图3-4 2FSK 信号的波形3.3 时序参数nRF401有3种工作模式:接收模式(RX )、发射模式(TX )和等待模式(Standby )。
工作模式可由2个引脚设定,分别是TXEN 和PWR_UP 。
因此通过单片机控制nRF401的工作模式,使其在接收、发射、等待任一种状态之间转换。
(1) TXRX 之间的切换当从RX →TX 模式时,数据输入脚(DIN )必须保持为高至少1ms 才能发送数据,时序如图3-5(a )。
当从TX →RX 模式时,数据输出脚(DOUT )至少3ms 以后有数据输出,如图3-5(b )。
(3.1)图3-5 TX 与RX 转换的时序图(2) Standby →RX 、Standby →TX 的切换从待机模式到接收模式,当PWR_UP 输入设成1时,经过t SR 时间后,DOUT 脚输出数据才有效。
对nRF401来说,t SR 最长的时间是3ms ,如图(a )。
从待机模式到发射模式,所需稳定的最大时间是t ST ,如(b )。
图3-6 Standby →RX 、Standby →TX 的时序图(3) Power Up →TX 、Power Up →RX 的切换从上电到发射模式过程中,为了避免开机时产生干扰和辐射,在上电过程中TXEN 的输入脚必须保持为低,以便于频率合成器进入稳定工作状态。
当由上电进入发射模式时,TXEN 必须保持1ms 以后才可以往DIN 发送数据。
从上电到接收模式过程中,芯片将不会接收数据,DOUT 也不会有数据输出,直到电压稳定达到2.7V 以上,并且至少保持5ms 。
0 Std. by to TXStd. by to RX VDD VDD PWR-UP PWR-UPT XENT XEN DOUTDIN ms ms2 4 2 0 42 0 DOUTTXEN PWR-UP VDD TX to RX ms 4 2 0 DINTXEN PWR-UP VDD RX to TX RX to TX 4(a)ms(b)(a)(b)TXEN图3-7 Power Up →TX 、Power Up →RX 时序图3.4 应用电路设计3.4.1 电路组成nRF401无线收发芯片的应用电路[5],如图3-8所示:22pFC122pFC2820pFC315nFC4 2.2uFC522nFC61nFC7100pFC8100pF C9 3.3pFC105.6pFC114MX11M R14.7KR222KR318KR4DN DOUTTXEN PWR_UPFREQ+3VXC11VDD 2VCC 3FILT14VCO15VCO26VSS 7VDD 8DIN 9DOUT 10RF_PWR11FREQ 12VDD 13VSS 14ANT215ANT116VSS 17PWR_UP18TXEN 19XC220nRF401U1JQ4*图3-8 nRF401的433Mhz 应用电路 (1) 输入输出当nRF401是接收模式时,ANT1和ANT2引脚端提供射频输入到低噪声放大器(LNA );当nRF401为发射模式时,从功率放大器提供射频输出到天线。
(2) PLL 环路滤波器PLL 环路滤波器,是一个单端二阶滤波器,滤波器元件参数值:C3=820pF ,C4=15nF ,R2=4.7k(3) VCO 电感芯片的VCO 电路需要外接一个VCO 电感,这个电感是非常关键的,需要一个高质量的片式电感,Q 值大于45,最大误差2%。
VDD=0 to RXVDD=0 to TXVDD PWR-UPT XENT XEN DOUT (b)ms64 20 ms 42 0 (a)DINT XENT XEN PWR-UPVDD(4) 晶振电路晶体振荡器需要外接晶振,晶振的特性要求是:并联谐振频率f=4MHz ,并联等效电容C 0<5pF ,晶振等效串联电阻R ESR <150Ω,全部负载电容,包括印制板电容C L <14pF 。