多功能家庭安全监控系统_第1页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多功能家庭安全监控系统摘要:本作品从系统工程的角度进行设计,利用单片机实现多功能、全方位的家庭安全实时监测。本设计以STC89C52单片机为核心,辅以NRF24L01无线传输模块,DS18B20温度传感器、MQ-2烟雾传感器、ADC0832构成无线传输节点硬件电路;以热释电红外检测模块,对射式红外人员计数以及LCD1602液晶显示等构成主机硬件电路,实现利用单片机的自动控制能力对室内温度、烟雾等进行实时检测及报警功能。关键字:单片机,NRF24L01,DS18B20,MQ-2,ADC0832,热释电,LCD1602方案设计与论证1、无线模块方案一:红外线传输,在进行系统安装时,设备距离红外信号收发器的距离通常比较短,大都在10米内,具有不能穿透障碍物的特性,且应远离其它红外光源(如日光灯,等离子屏等),以避免干扰。方案二:2.4G的工作方式是全双工模式传输,在抗干扰性能上要比红外传输有着绝对的优势。这个优势决定了它的超强抗干扰性以及可达10米以上的传输距离。此外2.4G无线技术还拥有理论上2M的数据传输速率,为以后的应用层提高了可靠的保障。因此选择方案二。2、温度模块方案一:DS18B20为单总线温度传感器,在使用中不需接外围元件,可编程的分辨率为9~12位,可实现高精度测温。方案二:热敏电阻在一些温度范围内线性不好,需要进行冷端补偿或引线补偿;热惯性大,响应时间慢。因此选择方案一。3、烟雾模块方案一:MQ-2烟雾传感器灵敏度高,快速响应恢复,能配合AD进行信号的采集转换。方案二:光电烟雾传感器易受光的影响,须在遮光的条件下检测。因此选择方案一。电路设计NRF24L01是一款新型单片射频收发器件,工作于2.4GHz~2.5GHzISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置(最多可配置六通道同时接收,便于节点的扩展)。NRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。NRF24L01接口电路如图1所示:图1NRF24L01接口电路2、DS18B20接口DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。DS18B20接口电路如图2所示:图2DS18B20的温度检测模块3、MQ-2模块电路MQ-2是一种体电阻控制型的气敏器件,其阻值随被测气体的浓度(成分)而变化。气敏器件又是一种“气——电”传感器件,它将被测气体的浓度(成分)信号转变成相应的电信号。MQ-2引脚结构与常用连接电路图选择MQ-2做为本设计的原因是,MQ-2价格便宜,而且市场采购比较方便,便于使用,使用简单,只需将以上电路图连接好就能对油烟浓度进行检测,输出一个0~5V的模拟信号。从而达到将“气”转换为“电”的目的。MQ-2油烟检测模块电路如图3所示图3MQ-2油烟检测模块4、AD0832电路ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。其引脚功能与引脚图如下:•CS_片选使能,低电平芯片使能。•CH0模拟输入通道0,或作为IN+/-使用。•CH1模拟输入通道1,或作为IN+/-使用。•GND芯片参考0电位(地)。•DI数据信号输入,选择通道控制。•DO数据信号输出,转换数据输出。•CLK芯片时钟输入。•Vcc/REF电源输入及参考电压输入(复用)。本设计中应用电路如图4所示图4ADC0832模数转换5、DS1302时钟电路DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信。其引脚图如下所示本设计中其应用电路如图5所示;图5DS1302电路6、对射式红外38K载波这是一个简单的被动式红外线人员计数器,采用NE555芯片来发射38K的方波信号来驱动红外发射头发出红外线,接收部分采用TSOP1838来接收发射头发出的红外信号。可达到到了6M左右急发送距离。对于上图,要求我们自己确定参数R1、R2和C1。计算时有输出高电平时间为:t1=0.693(R1+R2)C1输出低电平的时间是:t2=0.693(R2)C1所以周期为:T=t1+t2=0.693(R1+2R2)C1频率有:占空比为t1/(t1+t2)。从上面的公式中带入38K的频率就能确定各个参数。为此我们取C1为0.01uF,R1为560,R2取2K的电位器,这是为了排除电阻和电容的制作时的阻差和容差,为此我们可以精确地调到38K。 接收部分是采用一体化接收头1838,其内部电路如下图所示:7、无线接收节点整体电路:8、主机整体电路图:三、部分程序:发送端:#include<reg52.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedcharuint;//****************************************IO端口定义*********************************************sbitCE=P1^2;sbitCSN=P1^5;sbitSCK=P1^1;sbitMOSI=P1^6;sbitMISO=P1^0;sbitIRQ=P1^7;/*****************************************ADC0832端口定义***************************************/sbitCS=P2^2;sbitCLK=P2^1;sbitDI=P2^0;sbitDO=P2^0;unsignedchardat=0x00;//AD值unsignedcharcount=0x00;//定时器计数unsignedcharCH;//通道变量chardis[3];//*****************************************DS1820端口设置****************************************sbitDQ=P3^6;//************************************数码管位选**************************************************sbitled3=P2^7;sbitled2=P2^6;sbitled1=P2^5;sbitled0=P2^4;//***********************************数码管0-9编码***********************************************ucharseg[10]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05};//0~~9段码ucharseg1[10]={0x10,0x73,0x48,0x41,0x23,0x81,0x80,0x53,0x00,0x01};uchardatatemp_data[2]={0x00,0x00};//温度采集数据缓冲区uchardispaly[7];//显示缓冲区//******************************************************************************************uintbdatasta;//NRF24L01状态标志sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;//*************************************NRF24L01**************************************************#defineTX_ADR_WIDTH5//本机地址宽度设置#defineRX_ADR_WIDTH5//接收方地址宽度设置#defineTX_PLOAD_WIDTH20//4字节数据长度#defineRX_PLOAD_WIDTH20//4字节数据长度uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址//*****************************NRF24L01寄存器指令******************************#defineREAD_REG0x00//读寄存器指令#defineWRITE_REG0x20//写寄存器指令#defineRD_RX_PLOAD0x61//读取接收数据指令#defineWR_TX_PLOAD0xA0//写待发数据指令#defineFLUSH_TX0xE1//冲洗发送FIFO指令#defineFLUSH_RX0xE2//冲洗接收FIFO指令#defineREUSE_TX_PL0xE3//定义重复装载数据指令#defineNOP0xFF//保留//****************************SPI(nRF24L01)寄存器地址**********************#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C//频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineRX_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器#defineRX_PW_P00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW_P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置//************************************NRF24L01函数申明**********************************************voidDelay(unsignedints);voidinerDelay_us(unsignedcharn);voidinit_NRF24L01(void);uintSPI_RW(uintuchar);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);voidnRF24L01_TxPacket(unsignedchar*tx_buf);//************************************DS18B20函数申明**********************************************voiddelay1(uinti);voidds_reset(void);voidwrite_byte(ucharvalue);ucharread_byte(void);voidread_temp();voidwork_temp();//*****************************************长延时*****************************************voidDelay(unsignedints){unsignedinti;for(i=0;i<s;i++);for(i=0;i<s;i++);}/******************************************************************************************/*延时函数/******************************************************************************************/voidinerDelay_us(unsignedcharn){for(;n>0;n--)_nop_();}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/voidinit_NRF24L01(void){inerDelay_us(100);CE=0;CSN=1;SCK=0;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);//允许接收地址只有频道0SPI_RW_Reg(WRITE_REG+RF_CH,0);//设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为4字节SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//设置发射速率为1Mkbps,发射功率为最大值0dB}/****************************************************************************************************/*NRF24L01的SPI写时序/****************************************************************************************************/uintSPI_RW(uintuchar){uintbit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++){MOSI=(uchar&0x80);uchar=(uchar<<1);SCK=1;uchar|=MISO;SCK=0;}return(uchar);}/****************************************************************************************************/*NRF24L01的SPI时序/****************************************************************************************************/ucharSPI_Read(ucharreg){ucharreg_val;CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);}/****************************************************************************************************//*NRF24L01读写寄存器函数,/****************************************************************************************************/uintSPI_RW_Reg(ucharreg,ucharvalue){uintstatus;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);}/****************************************************************************************************//*用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars){uintstatus,uchar_ctr;CSN=0;status=SPI_RW(reg);for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr]=SPI_RW(0);CSN=1;return(status);}/*********************************************************************************************************/*用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*********************************************************************************************************/uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){uintstatus,uchar_ctr;CSN=0;//SPI使能status=SPI_RW(reg);for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)//SPI_RW(*pBuf++);CSN=1;//关闭SPIreturn(status);//}/*/****************************************************************************************************//*数据接收配置/****************************************************************************************************voidSetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ收发完成中断响应,16位CRC,主接收CE=1;inerDelay_us(130);}/******************************************************************************************************/*数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf){unsignedcharrevale=0;sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况if(RX_DR)//判断是否接收到数据{CE=0;//SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObufferrevale=1;//读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志returnrevale;}*//***********************************************************************************************************/*发送tx_buf中数据/**********************************************************************************************************/voidnRF24L01_TxPacket(unsignedchar*tx_buf){CE=0;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);}/***********************************************************************************************************/*DS18B20温度传感相关函数/**********************************************************************************************************/voiddelay1(uinti){for(;i>0;i--);}//****************************************************DS1820复位函数***************************************voidds_reset(void){chartemp=1;while(temp){while(temp){DQ=1;_nop_();_nop_();DQ=0;delay1(80);DQ=1;delay1(9);temp=DQ;}delay1(64);temp=~DQ;}DQ=1;}//***********************************************DS1820写函数*********************************************voidwrite_byte(ucharvalue){uchari;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();DQ=value&0x01;delay1(9);value>>=1;}DQ=1;delay1(1);}//****************************************************DS1820读函数*****************************************ucharread_byte(void){uchari;ucharvalue1=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value1>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value1|=0x80;delay1(9);}DQ=1;return(value1);}//****************************************************读取温度**********************************************voidread_temp(){ds_reset();write_byte(0xcc);write_byte(0xbe);temp_data[0]=read_byte();temp_data[1]=read_byte();ds_reset();write_byte(0xcc);write_byte(0x44);}//****************************************************温度处理*********************************************voidwork_temp(){ ucharn=0; if(temp_data[1]>127) { temp_data[1]=(256-temp_data[1]);//负值 temp_data[0]=(256-temp_data[0]); n=1; } dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); dispaly[4]=dis[0]; dispaly[3]=dis[1]; dispaly[2]=dispaly[6]%100/10;//十位 dispaly[1]=dispaly[6]%100%10;//个位 switch(temp_data[0]&0x0f)//小数位 { case0x0f:dispaly[0]=9;break; case0x0e:dispaly[0]=9;break; case0x0d:dispaly[0]=8;break; case0x0c:dispaly[0]=8;break; case0x0b:dispaly[0]=7;break; case0x0a:dispaly[0]=6;break; case0x09:dispaly[0]=6;break; case0x08:dispaly[0]=5;break; case0x07:dispaly[0]=4;break; case0x06:dispaly[0]=4;break; case0x05:dispaly[0]=3;break; case0x04:dispaly[0]=3;break; case0x03:dispaly[0]=2;break; case0x02:dispaly[0]=1;break; case0x01:dispaly[0]=1;break; case0x00:dispaly[0]=1;break; default:break;}}/*****************************AD转换子程序*****************************/unsignedcharadc0832(unsignedcharCH){unsignedchari,test,adval;adval=0x00;test=0x00;CLK=0;//初始化DI=1;_nop_();CS=0;_nop_();CLK=1;_nop_();if(CH==0x00)//通道选择{CLK=0;DI=1;//通道0的第一位_nop_();CLK=1;_nop_();CLK=0;DI=0;//通道0的第二位_nop_();CLK=1;_nop_();}else{CLK=0;DI=1;//通道1的第一位_nop_();CLK=1;_nop_();CLK=0;DI=1;//通道1的第二位_nop_();CLK=1;_nop_();}CLK=0;DI=1;for(i=0;i<8;i++)//读取前8位的值{_nop_();adval<<=1;CLK=1;_nop_();CLK=0;if(DO)adval|=0x01;elseadval|=0x00;}for(i=0;i<8;i++)//读取后8位的值{test>>=1;if(DO)test|=0x80;elsetest|=0x00;_nop_();CLK=1;_nop_();CLK=0;}if(adval==test)//比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉dat=test;_nop_();CS=1;//释放ADC0832DO=1;CLK=1;returndat;}/************************将0-255级换算成0-10的数值*******************************/voidconvdata(unsignedchari){ dis[0]=i/25;//个位 delay1(100);dis[1]=(i%25)*10/25;//小数点后第一位}//****************************************************温度,烟雾显示****************************************************voiddisdignit(){P0=seg[dis[0]];led0=0;delay1(40);led0=1;P0=seg[dispaly[0]];led1=0;delay1(40);led1=1;P0=seg1[dispaly[1]];led2=0;delay1(40);led2=1;P0=seg[dispaly[2]];led3=0;delay1(40);led3=1;}//************************************主函数************************************************************voidmain(void){uchari=0;//ucharTxBuf[4]={0};//4字节发送数据缓冲区init_NRF24L01();//NRF24L01初始化配置ds_reset();CH=0x00;//选择通道//TMOD=0x01;//设置中断//TH0=(65536-50000)/256;//定时器1初值定时50ms//TL0=(65536-50000)%256;//IE=0x82;//TR0=1;write_byte(0xcc);write_byte(0x44);Delay(6000);while(1){if(i==3){i=0;read_temp();work_temp();delay1(500);}i++;dat=adc0832(CH);convdata(dat);//数据转换disdignit();nRF24L01_TxPacket(dispaly);//TransmitTxbufferdataSPI_RW_Reg(WRITE_REG+STATUS,0XFF);}}接收端:#include<reg52.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedcharuint;//****************************************IO端口定义*********************************************sbitlcd=P2^4;sbitlcdrs=P2^0;sbitlcdrw=P2^1;sbitlcden=P2^2;sbitbusy=P0^7;sbitCE=P1^2;sbitCSN=P1^5;sbitSCK=P1^1;sbitMOSI=P1^6;sbitMISO=P1^0;sbitIRQ=P1^7;sbitreddat=P2^0;sbitredsw=P2^1;sbitbell=P2^3;sbitset=P3^6;sbitup=P3^7;sbitdown=P3^4;sbitesc=P3^7;uchartemp[6];ucharrenshu[3];ucharsmoke[6];ucharth[3];ucharsh[3];ucharRxBuf[20]={0};ucharjin,chu,ren;uchari=30,k=50,j='0';//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5#defineRX_ADR_WIDTH5#defineTX_PLOAD_WIDTH20#defineRX_PLOAD_WIDTH20uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//本地地址uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//接收地址//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00//读寄存器指令#defineWRITE_REG0x20//写寄存器指令#defineRD_RX_PLOAD0x61//读取接收数据指令#defineWR_TX_PLOAD0xA0//写待发数据指令#defineFLUSH_TX0xE1//冲洗发送FIFO指令#defineFLUSH_RX0xE2//冲洗接收FIFO指令#defineREUSE_TX_PL0xE3//定义重复装载数据指令#defineNOP0xFF//保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineCONFIG0x00//配置收发状态,CRC校验模式以及收发状态响应方式#defineEN_AA0x01//自动应答功能设置#defineEN_RXADDR0x02//可用信道设置#defineSETUP_AW0x03//收发地址宽度设置#defineSETUP_RETR0x04//自动重发功能设置#defineRF_CH0x05//工作频率设置#defineRF_SETUP0x06//发射速率、功耗功能设置#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送监测功能#defineCD0x09//地址检测#defineRX_ADDR_P00x0A//频道0接收数据地址#defineRX_ADDR_P10x0B//频道1接收数据地址#defineRX_ADDR_P20x0C//频道2接收数据地址#defineRX_ADDR_P30x0D//频道3接收数据地址#defineRX_ADDR_P40x0E//频道4接收数据地址#defineRX_ADDR_P50x0F//频道5接收数据地址#defineTX_ADDR0x10//发送地址寄存器#defineRX_PW_P00x11//接收频道0接收数据长度#defineRX_PW_P10x12//接收频道0接收数据长度#defineRX_PW_P20x13//接收频道0接收数据长度#defineRX_PW_P30x14//接收频道0接收数据长度#defineRX_PW_P40x15//接收频道0接收数据长度#defineRX_PW_P50x16//接收频道0接收数据长度#defineFIFO_STATUS0x17//FIFO栈入栈出状态寄存器设置//**************************************************************************************voidDelay(unsignedints);voidinerDelay_us(unsignedcharn);voidinit_NRF24L01(void);uintSPI_RW(uintuchar);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);voidnRF24L01_TxPacket(unsignedchar*tx_buf);//*****************************************长延时*****************************************voidDelay(unsignedints){ unsignedinti; for(i=0;i<s;i++); for(i=0;i<s;i++);}//******************************************************************************************uintbdatasta;//状态标志sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;/******************************************************************************************/*延时函数/******************************************************************************************/voidinerDelay_us(unsignedcharn){ for(;n>0;n--) _nop_();}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/voidinit_NRF24L01(void){ inerDelay_us(100); CE=0; CSN=1; SCK=0; 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 SPI_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}/****************************************************************************************************//RF24L01的SPI写时序/****************************************************************************************************/uintSPI_RW(uintuchar){ uintbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) { MOSI=(uchar&0x80); uchar=(uchar<<1); SCK=1; uchar|=MISO; SCK=0; } return(uchar);}/****************************************************************************************************//NRF24L01的SPI时序/****************************************************************************************************/ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0; SPI_RW(reg); reg_val=SPI_RW(0); CSN=1; return(reg_val);}/****************************************************************************************************///NRF24L01读写寄存器函数/****************************************************************************************************/uintSPI_RW_Reg(ucharreg,ucharvalue){ uintstatus; CSN=0; status=SPI_RW(reg); SPI_RW(value); CSN=1; return(status);}/****************************************************************************************************///用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars){ uintstatus,uchar_ctr; CSN=0; status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr]=SPI_RW(0); CSN=1; return(status);}/*********************************************************************************************************//用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*********************************************************************************************************/uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ uintstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) SPI_RW(*pBuf++); CSN=1;//关闭SPI return(status);//}/****************************************************************************************************///数据接收配置/****************************************************************************************************/voidSetRX_Mode(void){ CE=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ收发完成中断响应,16位CRC,主接收 CE=1; inerDelay_us(130);}/******************************************************************************************************///数据读取后放如rx_buf接收缓冲区中/******************************************************************************************************/unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf){ unsignedcharrevale=0; sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况 if(RX_DR)//判断是否接收到数据 { CE=0; SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); revale=1;//读取数据完成标志 } SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来其清除中断标志 returnrevale;}/***********************************************************************************************************//发送tx_buf中数据/**********************************************************************************************************/voidnRF24L01_TxPacket(unsignedchar*tx_buf){ CE=0;//StandByI模式 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);}voidlcd_busy(void){P0=0xff;lcdrs=0;lcdrw=1;lcden=1;while(busy==1);lcden=0;}voidwrite_com(ucharcom){ lcd_busy(); lcdrw=0; lcdrs=0; P0=com; Delay(5); lcden=1;Delay(5);lcden=0;}voidwrite_dat(uchardat){ lcd_busy(); lcdrw=0; lcdrs=1; P0=dat; Delay(5); lcden=1; Delay(5); lcden=0;}voidgotoxy(uchary,ucharx){ if(y==1) write_com(0x80|x); if(y==2)write_com(0xc0|x);}voidprintc(uchary,ucharx,uchardat){ gotoxy(y,x); write_dat(dat);}voidprints(uchary,ucharx,uchar*str){ gotoxy(y,x); while(*str!='\0') { write_dat(*str); str++; }}voidinit(){ lcd=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);}voidLOGO(void){prints(1,1,"DigitalVolume");Delay(200);prints(2,4,"loading"); Delay(30000);printc(2,0x0b,'.');Delay(30000);printc(2,0x0c,'.');Delay(30000);printc(2,0x0d,'.');Delay(30000);printc(2,0x0e,'.');Delay(30000);printc(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论