无线收发芯片

时间:2024-06-11 00:27:27编辑:分享君

什么是RF射频接收器?

百度百科上有~简称RF射频就是射频电流,它是一种高频交流变化电磁波的简称。每秒变化小于1000次的交流电称为低频电流,大于10000次的称为高频电流,而射频就是这样一种高频电流。  射频技术在无线通信领域具有广泛的、不可替代的作用。  在电子学理论中,电流流过导体,导体周围会形成磁场;交变电流通过导体,导体周围会形成交变的电磁场,称为电磁波。  在电磁波频率低于100khz时,电磁波会被地表吸收,不能形成有效的传输,但电磁波频率高于100khz时,电磁波可以在空气中传播,并经大气层外缘的电离层反射,形成远距离传输能力,我们把具有远距离传输能力的高频电磁波称为射频,英文:Radio Frequency 缩写:RF。编辑本段无线传输  将电信息源(模拟或数字的)用高频电流进行调制(调幅或调频),形成射频信号,经过天线发射到空中;远距离将射频信号接收后进行反调制,还原成电信息源,这一过程称为无线传输。  无线传输发展了近二百年,形成了大量的用户和产品群,但是,由于气候的变化和地表障碍物的影响,不能传输完美的信息。


蓝牙芯片有哪些种类?

蓝牙芯片有很多种类,大致可以分以下几类:无线收发芯片 、射频开关、射频卡芯片、RF 放大器、RF 混频器、RF 检测器、RF 衰减器、RF 双工器、RF耦合器...等等其比较常见的厂牌:TI/德州仪器、NORDIC/北欧半导体...按照一般的用途来分类的话可以简单的分3类:1,语音,音频类SOC,一般用来做音箱,耳机类音讯产品。比如CSR8610,CS8635;2,单纯的数据传输类SOC,一般用来传输近距离,小数据传输(也有人叫透传模块,BLE模块,低功耗模块等等),比如CSR1010,TI的CC2540/2541;可以用来配合传感器来做一些计步器,心率,血压,血氧含量等低功耗个人健康类设备(不能传输,也不带音频解码)。3,语音与数据复合的SOC,可以同时传输语音,音频,数据,比如CSR8670,8675等。还有一种分类方法:按照蓝牙芯片是否固化蓝牙协议来分:1,ROM板,芯片支持的蓝牙协议在出厂时已经固化好了,比如CSR8635的蓝牙协议:■ Bluetooth v4.0 specification support■ A2DP v1.2■ AVRCP v1.4■ HFP v1.6■ HSP v1.2■ DI v1.3就支持以上蓝牙协议,所以8635只能用来做耳机,音箱,通话免提等音频设备。


开关电源中,如何确定芯片所支持的开关频率?

芯片所支持的开关频率要看它的规格书中的资料了,实际工作中频率接近芯片规定的上、下限时通常都无法稳定工作,或者说不够可靠。在设计电源时,选定电源的工作频率要看具体的设计要求,频率低了变压器体积较大,频率高了磁芯体积减小,但开关损耗增大,如果是软开关,频率通常在100K以上,普通的驱动IGBT在20KHz,驱动三极管在40KHz左右,驱动MOSFET的频率50K60K70K80K90K100K都有,一句话,还是得看你的具体要求,否则没法定,不同的输入输出,不同的拓扑变数太多。


蓝牙芯片哪个好

问题一:请问蓝牙的芯片BCM. CSR 和EDR这三种那种好?? 楼主,首先他们的概念不同不要混淆。
建议BCM,第三方驱动比较多。
bcm 和csr是蓝牙芯片厂商的名字,蓝牙适配器主芯片有CSR、博通、台湾创杰、MSI等。
您所说的bcm即是博通Broad。
这个就是蓝牙芯片的品牌,没有多大的区别,但是CSR的东西nokia一直在用它,所以用户貌似很多,是BCM的东西支持软件很多,这几年很多蓝牙方案都是用它。
EDR是一种协议,这个协议时蓝牙2.0协议中的一个补充,支持这个协议的设备上面都会写bluetooth2.0+EDR,不管是BCM还是CSR的。有了这个协议,最大的好处就是可以增加蓝牙的带宽,直接的利用就是传文件快,支持立体声蓝牙功能,还有就是可以驳接两个以上的设备(对于蓝牙耳机来说)
EDR 即Enhanced data rate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,达到了2.1Mbps ,是目前蓝牙技术的三倍。因此除了可获得更稳定的音频流传送的更低的耗电量之外,还可充分利用带宽优势同时连接多个蓝牙设备。

问题二:什么品牌的蓝牙芯片比较好 CSR应该是目前蓝牙芯片最大的供应商吧,太多蓝牙产品都是CSR方案的了。
还有Broad、Conexant等也做一些,不过蓝牙应该和CSR没的拼

问题三:蓝牙4.0 ble 选哪家芯片好 个人推荐TI,市面上有很多家自称是TI的代理商,实际上只有两大家,大联大和新烨,其他都是些小的分销商

问题四:蓝牙芯片有哪些好的推荐 蓝牙芯片用的比较多的是全球顶尖半导体厂商Nordic的,比如经典的蓝牙芯片nrf51822,nrf52832等,天工测控(SKYLAB)的蓝牙模块SKB360、SKB360I、SKB361、SKB362、SKB365等都是基于nrf51822芯片研发,SKB369是基于nrf52832芯片制作,性能稳定可靠。其他一些小牌子的蓝牙芯片,也能用,但是性能没有这么可靠,链接也没有这么稳定,芯片还是选好的。就像缤特力蓝牙耳机为什么这么贵,用过一次你就知道!

问题五:蓝牙芯片设计简单还是复杂? 蓝牙芯片设计不容易,需要将高频/射频的蓝牙模块和ARM核以及低速IO集成在一起,对芯片设计是一个非常大的挑战。而且,对于提供蓝牙芯片的公司而言,还需要提供配套的蓝牙协议栈,demo板,甚至module板,蓝牙dongle等。
感兴趣可以找一下相关的芯片产品,市场上主要生成蓝牙芯片的公司有NXP的Kinetis KW4x、KW3x, TI的CC25xx、26xx,Nordic的nRF51xxx等,上述公司可以提供完整的芯片、SDK、demo、协议栈、开发板、技术支持,其他公司就很难了。

问题六:蓝牙耳机芯片csrbcm和edr这三种哪种好 CSR:信号稳定,功耗小,距离7-10米,价格贵,兼容性强,功能多。
BCM: 信号稳定,功耗中,距离远,价格偏中,兼容性强,功能少。
EDR:信号不稳定,功耗大,距离最远,价格偏低,有电流音,功能少。
综合评价建议选CSR,中高端品牌使用,低频品牌走性价比就可以用EDR。BCM就显得有些鸡肋了。

问题七:博通蓝牙芯片和csr哪个比较好 建议BCM,第三方驱动比较多。
bcm和csr是蓝牙芯片厂商的名字,蓝牙适配器主芯片有CSR、博通、台湾创杰、MSI等。
所说的bcm即是博通Broad。
这个就是蓝牙芯片的品牌,没有多大的区别,但是CSR的东西n好ia一直在用它,所以用户貌似很多,但是BCM的东西支持软件很多,这几年很多蓝牙方案都是用它。
EDR是一种协议,这个协议时蓝牙2.0协议中的一个补充,支持这个协议的设备上面都会写bluetooth2.0+EDR,不管是BCM还是CSR的。
有了这个协议,最大的好处就是可以增加蓝牙的带宽,直接的利用就是传文件快,支持立体声蓝牙功能,还有就是可以驳接两个以上的设备(对于蓝牙耳机来说)
EDR即Enhanceddatarate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,达到了2.1Mbps,是目前蓝牙技术的三倍。
因此除了可获得更稳定的音频流传送的更低的耗电量之外,还可充分利用带宽优势同时连接多个蓝牙设备。

问题八:蓝牙芯片供应商 都有哪些 CSR(英国)
优点:市面上最顶级的蓝牙模块,回放和麦克风音质是目前市面上最优秀的。兼容所有蓝牙设备,ARM核和DSP核,同时有ARM架构和DSP架构。
缺点:价格昂贵,不支持收音插卡等功能。
TI(德州仪器)
优点缺点基本同上,性能表现较优异,但价格较贵。
博通(上海)
优点:价格优势明显,同时支持插卡、收音等功能。
缺点:音质一般。
创杰(台湾)
优点:有良好的音质表现,带语音提示。
缺点:麦克风效果不理想,兼容性一般。
其他还有nordic和dialog等原厂。
现在的蓝牙芯片性能表现上都在一定的水平线,主要取决不同的芯片选型。比如上海博通的蓝牙方案就已经很成熟了,键鼠、防丢器、手环,还有音频蓝牙,数传蓝牙’BLE蓝牙这一块也有大量出货。其中2014年最火的 *** 杆有近一半是博通芯片做的。
博通芯片利益相关,有其他想咨询的可以私聊。

问题九:蓝牙选型是买模块还是买芯片 当然芯片更好了。


目前最顶级的蓝牙芯片

MariSiliconY。马里亚纳Y芯片首次将192kHz / 24bit无损音频无线化,搭载全球首个超高速蓝牙技术,最高带宽可达12Mbps,4倍于传统蓝牙速率,1.5倍于旗舰平台蓝牙速率。马里亚纳MariSiliconY,是OPOO旗下第二颗自研芯片,定位旗舰蓝牙新品SoC,2022年12月14日,在OPPO未来科技大会2022上,马里亚纳MariSiliconY发布。相关信息:马里亚纳Y采用N6RF工艺,相比于目前主流射频芯片采用的16nm工艺,N6RF技术领先2代,帮助射频晶体管能效提升66%,同时减小33%的射频晶体管尺寸。端侧专用NPU能带来每秒5900亿次计算的算力,为用户带来耳机端侧首个声音分离技术,可实现类似空间音频的“万能全景声”。马里亚纳Y还支持动态码率自适应技术,能够自动在80Kbps-10Mbps的超宽区间内灵活调整编解码速率,无论在信号复杂的商场,还是安静的书房,始终提供稳定、不卡顿的音频质量。

nrf24l01无线温度收发程序,系统控制芯片是msp430f149,求完整代码,本人新手在这里先谢谢了!

MSP430 code for nRF2401 ********************************************************************* //你可以参考一下!CPU=MSP430F149 //搜索:智凡单片机。mcuc.com.cn********************************************************************* TX code: #include #define uchar unsigned char #define uint unsigned int uchar InitData[18]; uchar TXData[14]; uchar RXData[2]; uchar temp; uchar ByteCnt; uchar ByteCnt1; uchar BitCnt; uchar BitCnt1; uchar Data1=0xff; uchar tempi; #define PWR BIT0 //P4.0 #define DR1 BIT3 //P4.3 #define CLK1 BIT4 //P4.4 #define DATA BIT5//P4.5 #define CE BIT1 //P4.1 #define CS BIT2 //P4.2 void init_io(); void nRF2401_ON(); void BuildInitWord(); void InitnRF2401(); void DoSPIClock(); void CE_High(); void RXEN_HIGH(); void TXEN_LOW(); void Delay500ns(); void Delay5us(); void Delay202us(); void Delay3ms(); void BuildShockWord(); void ShockBurst(); void ReceiveShock(); void time_set(); void main (void) { uint i; WDTCTL = WDTPW + WDTHOLD; BCSCTL1&=~XT2OFF; BCSCTL2=0x88; //10001000; XT2 as MCLK, 6M do { IFG1&=~OFIFG; //clear OSCFault flag_breathe for(i=0xFF;i>0;i--); //delay wait } while((IFG1&OFIFG)!=0); init_io(); nRF2401_ON(); BuildInitWord(); InitnRF2401(); BuildShockWord(); ShockBurst(); } void init_io(void) {P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4 P4DIR&=~DR1;//P1.1 P4DIR|=CLK1;//P5.6 P4DIR|=CE; //P6.6 P4OUT&=~DATA; P4OUT&=~PWR; P4OUT&=~CS; P4OUT&=~CLK1; P4OUT&=~CE; } void nRF2401_ON(void) {P4OUT|=PWR; } void BuildInitWord(void) {InitData[0]=0x8E;// InitData[1]=0x08;// InitData[2]=0x1C;// InitData[3]=0x10;// 频道 2 数据长度 InitData[4]=0x10;// 频道 1 数据长度,16bit,2byte. InitData[5]=0x00;// 频道 2 地址 InitData[6]=0x1c;// 频道 2 地址 InitData[7]=0xcc;// 频道 2 地址 InitData[8]=0xcc;// 频道 2 地址 InitData[9]=0xcc;// 频道 2 地址 InitData[10]=0x00;//频道 1 地址 InitData[11]=0xcc;//频道 1 地址 InitData[12]=0xcc;//频道 1 地址 InitData[13]=0xcc;//频道 1 地址 InitData[14]=0xcc;//频道 1 地址 InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许 InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm InitData[17]=0x04;//tx } void InitnRF2401(void) { P4OUT|=CS; Delay5us();// for(ByteCnt=0;ByteCnt 0;i--) { for(j = 2000;j > 0;j--); } } void BuildShockWord(void) {TXData[0]=0xcc; TXData[1]=0xcc; TXData[2]=0xcc; TXData[3]=0xcc; TXData[4]=0x01; TXData[5]=0x01; } void ShockBurst(void) { P4OUT|=CE; Delay5us();// for(ByteCnt1=0;ByteCnt1 #define uchar unsigned char #define uint unsigned int uchar InitData[18]; uchar TXData[14]; uchar RXData[2]; uchar temp; uchar ByteCnt; uchar ByteCnt1; uchar BitCnt; uchar BitCnt1; uchar Data1=0xff; uchar tempi; #define PWR BIT0 //P4.0 #define DR1 BIT3 //P4.3 #define CLK1 BIT4 //P4.4 #define DATA BIT5//P4.5 #define CE BIT1 //P4.1 #define CS BIT2 //P4.2 void init_io(); void nRF2401_ON(); void BuildInitWord(); void InitnRF2401(); void DoSPIClock(); void CE_High(); void RXEN_HIGH(); void TXEN_LOW(); void Delay500ns(); void Delay5us(); void Delay202us(); void Delay3ms(); void BuildShockWord(); void ShockBurst(); void ReceiveShock(); void time_set(); void main (void) { uint i; WDTCTL = WDTPW + WDTHOLD; BCSCTL1&=~XT2OFF; BCSCTL2=0x88; //10001000; XT2 as MCLK, 6M do { IFG1&=~OFIFG; //clear OSCFault flag_breathe for(i=0xFF;i>0;i--); //delay wait } while((IFG1&OFIFG)!=0); init_io(); nRF2401_ON(); Delay3ms(); BuildInitWord(); InitnRF2401(); P4OUT|=CE; Delay202us(); while(1) {if(P4IN&DR1) ReceiveShock(); } } void init_io(void) {P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4 P4DIR&=~DR1; P4DIR|=CLK1; P4DIR|=CE; P4OUT&=~DATA; P4OUT&=~PWR; P4OUT&=~CS; P4OUT&=~CLK1; P4OUT&=~CE; } void BuildInitWord(void) {InitData[0]=0x8E;// InitData[1]=0x08;// InitData[2]=0x1C;// InitData[3]=0x50;// 频道 2 数据长度 InitData[4]=0x10;// 频道 1 数据长度,80bit,10byte. InitData[5]=0x00;// 频道 2 地址 InitData[6]=0x1c;// 频道 2 地址 InitData[7]=0xcc;// 频道 2 地址 InitData[8]=0xcc;// 频道 2 地址 InitData[9]=0xcc;// 频道 2 地址 InitData[10]=0x00;//频道 1 地址 InitData[11]=0xcc;//频道 1 地址 InitData[12]=0xcc;//频道 1 地址 InitData[13]=0xcc;//频道 1 地址 InitData[14]=0xcc;//频道 1 地址 InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许 InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm InitData[17]=0x05;//receive } void InitnRF2401(void) { P4OUT|=CS; Delay5us(); for(ByteCnt=0;ByteCnt 0;i--) { for(j = 1000;j > 0;j--); } } void Delay202us(void) {uchar n; uchar m; for(m=0;m7) {i=0; RXData[j]=dat; j++; } P4OUT&=~CLK1; } } ******************************** END *************************************


51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序

/******************************无线温度发送***********************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER 0x00 // 读寄存器
#define W_REGISTER 0x20 // 写寄存器
#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式
#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP 0xFF // 空操作,可以用来读状态寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // “自动应答”功能寄存
#define EN_RX_ADDR 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 // 数据通道1有效数据宽度设置寄存器
#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器
#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器
#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器
#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17 // FIFO状态寄存器
//*********************************************************************************
uchar sta; // 状态变量
#define RX_DR (sta & 0x40) // 接收成功中断标志
#define TX_DS (sta & 0x20) // 发射成功中断标志
#define MAX_RT (sta & 0x10) // 重发溢出中断标志
sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
//sbit key=P1^0;
sbit LED=P0^0;
sbit DQ=P1^6;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
uchar RX_Buffer[RX_DATA_WITDH];
uchar Temp_Value[]={0x00,0x00};
uchar Temp=0;
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK=1;
uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fraction
void _delay_tus(uint x)
{
while(--x);
}
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
/**************************************************/
/*函数功能:DS18B20初始化             */
/*入口参数:无 */
/*出口函数:status */
/**************************************************/
uchar DS18B20_Init(void)
{
uchar status;
DQ=1;
_delay_tus(10);
DQ=0;
_delay_tus(90);
DQ=1;
_delay_tus(8);
status=DQ;
_delay_tus(100);
DQ=1;
return status;
}
/**************************************************/
/*函数功能:从DS18B20读取一字节          */
/*入口参数:无 */
/*出口函数:dat(返回读取到数据) */
/**************************************************/
uchar Read_One_Byte(void)
{
uchar i,dat=0;
DQ=1;
_nop_();
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();_nop_();
if(DQ)
dat|=0x80;
_delay_tus(30);
DQ=1;
}
return dat;
}
/**************************************************/
/*函数功能:向DS18B20写一字节           */
/*入口参数:dat(把dat写入DS18B20) */
/*出口函数:无   */
/**************************************************/
void Write_One_Byte(uchar dat)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
_delay_tus(5);
DQ=1;
dat>>=1;
}
}
/**************************************************/
/*函数功能:从DS18B20读取数据(数据)        */
/*入口参数:无 */
/*出口函数:无    */
/**************************************************/
void Read_Temp(void)
{
uchar ng=0;
if(DS18B20_Init()==1)
DS18B20_IS_OK=0;
else
{
Write_One_Byte(0xcc);
Write_One_Byte(0x44);
DS18B20_Init();
Write_One_Byte(0xcc);
Write_One_Byte(0xbe);
Temp_Value[0]=Read_One_Byte();
Temp_Value[1]=Read_One_Byte();
DS18B20_IS_OK=1;
}
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
/**************************************************/
/*函数功能:从DS18B20读取数据转换成ASCII码写入液晶 */
/*模块         */
/*入口参数:无 */
/*出口函数:无    */
/**************************************************/
/*void Display_Temperature(void)
{
uchar ng=0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
Display_LINE1[13]=0x43;
Display_LINE1[12]=0xdf;
Display_LINE1[11]=Display_Digit[0]+'0';
Display_LINE1[10]='.';
Display_LINE1[9]=Display_Digit[1]+'0';
Display_LINE1[8]=Display_Digit[2]+'0';
Display_LINE1[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)
Display_LINE1[7]=' ';
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';
}
LCD_POS(0);
Show_String(Display_LINE0);
LCD_POS(0x40);
Show_String(Display_LINE1);
}
void main(void)
{
Init_LCD();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
Display_Temperature();
_delay_ms(200);
}
}*/
/*nRF24L01初始化*/
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;//待机模式Ⅰ
CSN=1;
SCK=0;
IRQ=1;
}
/*SPI时序函数*/
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//一字节8位循环8次写入
{
if(byte&0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位?
MOSI=1;//向NRF24L01写1
else //否则写0
MOSI=0;
byte<<=1;//低一位移到最高位
SCK=1;//SCK拉高,写入一位数据,同时读取一位数据
if(MISO)
byte|=0x01;
SCK=0;//SCK拉低
}
return byte;//返回读取一字节
}
/*SPI写寄存器一字节函数*/
/*reg:寄存器地址*/
/*value:一字节(值)*/
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;//返回状态
CSN=0;//SPI片选
status=SPI_RW(reg);//写入寄存器地址,同时读取状态
SPI_RW(value);//写入一字节
CSN=1;//
return status;//返回状态
}
/*SPI*/
uchar SPI_R_byte(uchar reg)
{
uchar reg_value;
CSN=0;//SPI片选
SPI_RW(reg);//写入地址
reg_value=SPI_RW(0);//读取寄存器的值
CSN=1;
return reg_value;//返回读取的值
}
/*SPI读取RXFIFO寄存器数据*/
/*reg:寄存器地址*/
/**Dat_Buffer:用来存读取的数据*/
/*DLen:数据长度*/
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片选
status=SPI_RW(reg);//写入寄存器地址,同时状态
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);//存储数据
}
CSN=1;
return status;
}
/*SPI向TXFIFO寄存器写入数据*/
/*reg:写入寄存器地址*/
/*TX_Dat_Buffer:存放需要发送的数据*/
/*Dlen:数据长度*/
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片选,启动时序
status=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);//发送数据
}
CSN=1;
return status;
}
/*设置发送模式*/
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0;//待机(写寄存器之前一定要进入待机模式或掉电模式)
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/*写寄存器指令+接收节点地址+地址宽度*/
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*为了接收设备应答信号,接收通道0地址与发送地址相同*/
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*写有效数据地址+有效数据+有效数据宽度*/
SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自动应答*/
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自动重发延时250US+86US,重发10次*/
//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);/*(2400+40)MHZ选择射频通道0X40*/
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,发射功率:0DBM,低噪声放大器增益*/
SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*发送模式,上电,16位CRC校验,CRC使能*/
CE=1;//启动发射
_delay_ms(5);/*CE高电平持续时间最少10US以上*/
}
uchar Check_Rec(void)
{
uchar status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
status=1;
}
SPI_W_Reg(W_REGISTER+STATUS,0xff);
return status;
}
/*检测应答信号*/
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);/*读取寄存状态*/
if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/
{
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_TX);
CSN=1;
return 0;
}
else
return 1;
}
void main(void)
{
uchar i;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
nRF24L01_Init();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
{
for(i=0;i<TX_DATA_WITDH-4;i++)//减1是因为最后一位为结束标志
{
LED=~LED;
nRF24L01_Set_TX_Mode(&Display_Digit[i]);
_delay_ms(100);
while(Check_Ack());
//LED=0;
}
}
}
}
/******************************无线温度接收***********************/

#include
#include
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER 0x00 // 读寄存器
#define W_REGISTER 0x20 // 写寄存器
#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式
#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP 0xFF // 空操作,可以用来读状态寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // “自动应答”功能寄存器
#define EN_RX_ADDR 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 // 数据通道1有效数据宽度设置寄存器
#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器
#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器
#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器
#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17 // FIFO状态寄存器
//*********************************************************************************
uchar sta; // 状态变量
#define RX_DR (sta & 0x40) // 接收成功中断标志
#define TX_DS (sta & 0x20) // 发射成功中断标志
#define MAX_RT (sta & 0x10) // 重发溢出中断标志

sbit CE=P1^5; //RX/TX模式选择端
sbit IRQ=P1^0; //可屏蔽中断端
sbit CSN=P1^4; //SPI片选端//就是SS
sbit MOSI=P1^2;//SPI主机输出从机输入端
sbit MISO=P1^1;//SPI主机输出从机输出端
sbit SCK=P1^3;//SPI时钟端
sbit LED=P0^0;
sbit key=P2^0;
sbit LCD_RS=P2^2;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^0;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar RX_Buffer[RX_DATA_WITDH];
uchar code Display_LINE0[]={" FROM NRF24L01:"};
uchar Display_LINE1[]={" TEMP: "};
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
bit LCD_Busy(void)//测忙
{
bit LCD_Status;//返回值变量
LCD_RS=0;//读取状态
LCD_RW=1;
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_Status=(bit)(P3&0x80);
LCD_EN=0;
return LCD_Status;
}
void LCD_Write_Command(uchar cmd)//写指令
{
//while(LCD_Busy());
LCD_RS=0;//
LCD_RW=0;
LCD_EN=0;
_nop_();_nop_();
P3=cmd;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void LCD_Write_Data(uchar dat)//写数据
{
//while(LCD_Busy());//每次写数据操作之前均需要检测忙信号
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P3=dat;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void Init_LCD(void)//液晶初始化
{
_delay_ms(15);//延时15MS
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);//以后每次写指令操作之前均需要检测忙信号
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x01);//清屏
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x38);//设置16*2显示,5*7点阵,8位数据接口
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x0c);//开显示,不显示光标
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x06);//当读或写一个字符后地址指针加一,且光标加一
}
void LCD_POS(uchar pos)//字符显示位置
{
LCD_Write_Command(0x80|pos);
}
void Show_String(uchar *str)//显示字符串
{
while(*str!='\0')
LCD_Write_Data(*str++);
}
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
}
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
MOSI=1;
else
MOSI=0;
byte<<=1;
SCK=1;
if(MISO)
byte|=0x01;
SCK=0;
}
return byte;
}
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return status;
}
uchar SPI_R_byte(uchar reg)
{
uchar status;
CSN=0;
SPI_RW(reg);
status=SPI_RW(0);
CSN=1;
return status;
}
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);
}
CSN=1;
return reg_value;
}
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);
}
CSN=1;
return reg_value;
}
void nRF24L01_Set_RX_Mode(void)
{
CE=0;//待机
//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
SPI_W_Reg(W_REGISTER+EN_AA,0x01);
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
//SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
CE=1;
_delay_ms(5);
}
uchar nRF24L01_RX_Data(void)
{
//uchar i,status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
//P3=RX_Buffer[0];
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_RX);
CSN=1;
return 1;
}
else
return 0;
}
void main(void)
{
uchar i,RX_Temp_Value[RX_DATA_WITDH];//ng;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
Init_LCD();
nRF24L01_Init();
_delay_us(1000);
LCD_POS(0);
Show_String(Display_LINE0);
while(1)
{
nRF24L01_Set_RX_Mode();
//_delay_ms(100);
if(nRF24L01_RX_Data())
{
for(i=0;i<RX_DATA_WITDH;i++)
{
RX_Temp_Value[i]=RX_Buffer[i];
LED=~LED;
}
}
Display_LINE1[7]=RX_Temp_Value[3]+'0';
Display_LINE1[8]=RX_Temp_Value[2]+'0';
Display_LINE1[9]=RX_Temp_Value[1]+'0';
Display_LINE1[10]='.';
Display_LINE1[11]=RX_Temp_Value[0]+'0';
Display_LINE1[12]=0xdf;
Display_LINE1[13]=0x43;
if(RX_Temp_Value[3]==0)
Display_LINE1[7]=' ';
/*if(RX_Temp_Value[2]==0&&RX_Temp_Value[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';*/
LCD_POS(0x40);
Show_String(Display_LINE1);
}
}
已通过测试的,希望能帮助到你!


上一篇:数显卡尺

下一篇:火星车命名