基于CC1101与STC89C52无线收发程序(发射程序)

发布者:水墨人生最新更新时间:2015-09-08 来源: eefocus关键字:CC1101  STC89C52  无线收发 手机看文章 扫描二维码
随时随地手机看文章
好像用CC1101的朋友好少,在此也贴上CC1101收发程序吧!这样会减少大家大量时间去调试。不多说了直接上程序了:

#include
#include

#define IOCFG2   0x00
#define IOCFG1  0x01
#define IOCFG0  0x02
#define FIFOTHR  0x03//rx和tx FIFO门限
#define SYNC1  0x04//同步词汇,高字节
#define SYNC0  0x05//同步词汇,低字节
#define PKTLEN  0x06//数据包长度
#define PKTCTRL1 0x07//数据包自动控制
#define PKTCTRL0 0x08//数据包自动控制
#define ADDR  0x09//设备地址
#define CHANNR  0x0a//信道数
#define FSCTRL1  0x0b//频率合成控制器
#define FSCTRL0  0x0c//频率控制词汇,高字节
#define FREQ2  0x0d//频率控制词汇,中间字节
#define FREQ1  0x0e//频率控制词汇,低字节
#define FREQ0  0x0f//调置器配置
#define MDMCFG4  0x10//调置器配置
#define MDMCFG3  0x11//调置器配置
#define MDMCFG2  0x12//调置器配置
#define MDMCFG1  0x13//调置器配置
#define MDMCFG0  0x14//调置器配置
#define DEVIATN  0x15//主通信控制状态机配置
#define MCSM2  0x16//主通信控制状态机配置
#define MCSM1  0x17//主通信控制状态机配置
#define MCSM0  0x18//频率偏移补偿配置
#define FOCCFG  0x19//位同步配置
#define BSCFG  0x1a//AGC控制
#define AGCCTRL2  0x1b//AGC控制
#define AGCCTRL1  0x1c//AGC控制
#define AGCCTRL0  0x1d//高字节时间0暂停
#define WOREVT1  0x1e//低字节时间0暂停
#define WOREVT0  0x1f//电磁波激活控制
#define WORCTRL  0x20//前末端RX配置
#define FREND1  0x21//前末端TX配置
#define FREND0  0x22//频率合成器校准
#define FSCAL3  0x23//频率合成器校准
#define FSCAL2  0x24//频率合成器校准
#define FSCAL1  0x25//频率合成器校准
#define FSCAL0  0x26//RC振荡器配置
#define RCCTRL1  0x27//RC振荡器配置
#define RCCTRL0  0x28//频率合成器校准控制
#define FSTEST  0x29//产品测试
#define PTEST  0x2a//AGC测试
#define AGCTEST  0x2b//不同的测试设置
#define TEST2  0x2c//不同的测试设置
#define TEST1  0x2d//不同的测试设置
#define TEST0  0x2e//

#define SRES  0x30//重启芯片
#define SFSTXON  0x31//开启和校准频率合成器
#define SXOFF  0x32//关闭晶体振荡器
#define SCAL  0x33//校准频率合成器并判断
#define SRX   0x34//启用SRX
#define STX   0x35//空闲状态:启用STX
#define SIDLE  0x36//离开RX/TX,关断频率合成器
#define SAFC  0x37//频率合成器AFC调节
#define SWOR  0x38//自动RX选举序列(电磁波激活)
#define SPWD  0x39//当CSN为高时进入功率降低模式
#define SFRX  0x3a//冲洗RX FIFO缓存
#define SFTX  0x3b//冲洗TX FIFO缓存
#define SWORRST  0x3c//重新设置真实时间时钟
#define SNOP  0x3d//无操作

#define PARTNUM  0x30//CC2550组成部分数目
#define VERSION  0x31//当前版本数
#define FREQEST  0x32//频率偏移估计
#define LQI   0x33//连接质量的解调器估计
#define RSSI  0x34//接收信号强度指示
#define MARCSTATE 0x35//控制状态机状态
#define WORTIME1 0x36//WOR计时器高字节
#define WORTIME0 0x37//WOR计时器低字节
#define PKTSTATUS 0x38//当前GDOx状态和数据包状态
#define VCO_VC_DAC 0x39//PLL校准模块的当前设定
#define TXBYTES  0x3a//TX FIFO中的下溢和比特数
#define RXBYTES  0x3b//RX FIFO中的下溢和比特数
#define PATABLE  0x3e
#define TX_FIFO  0x3f
#define RX_FIFO  0x3f
#define data_len 8

typedef  unsigned int uint;
typedef  unsigned char uchar;

uchar rx_buffer[data_len]={0,0,0,0,0,0,0,0};//rx data
//uchar RX_data[data_len];
uchar code tx_buffer[data_len]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//tx data
uchar data_length=0;
uchar code P_Config[]={0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0};//功率配置

sbit CSN=P2^1;
sbit SCLK=P2^7;
sbit SI=P2^2;
sbit SO=P2^0;
sbit GDO0=P2^6;

sbit key=P2^5;

sbit LED=P0^0;
//sbit LED1=P0^6;

void CC1101_Init(void);
void CC1101_RESET(void);
void POWER_UP_RESET(void);
uchar SPI_WR_Byte(uchar value);
void SPI_Write_Byte(uchar addr,uchar value);
uchar SPI_Read_Byte(uchar addr);
void SPI_Write_Strobe(uchar strobe);
void SPI_Write_Burst(uchar addr,uchar *buffer,uchar count);
void SPI_Read_Burst(uchar addr,uchar *buffer,uchar count);
void SPI_Write_Packet(uchar *TX_Buffer,uchar size);
uchar SPI_Read_Packet(uchar *RX_Buffer,uchar length);
void CC1101_Set_TX(void);
void CC1101_Set_RX(void);
void Write_Config(void);

void delay_ms(uint x)
{
 uint i;
 while(x--)for(i=0;i<120;i++);
}

void delay_us(uint x)
{
 do {
        _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
    } while (--x);
}
//------------------------------------------------/
//函数功能:通过SPI写读一字节                     /
//输入参数:value                                 /
//输出参数:B_value                               /
//-----------------------------------------------/
uchar SPI_WR_Byte(uchar value)
{
 uchar i,B_value=0;
 SCLK=0;
 for(i=0;i<8;i++)
 {
  if(value&0x80)
   SI=1;
  else
   SI=0;
  value<<=1;
  SCLK=1;
  _nop_();_nop_();
  B_value<<=1;
  if(SO)
   B_value|=0x01;
  SCLK=0;
  _nop_();_nop_();
 }
 return B_value;
}
//-------------------------------------------------/
//函数功能:重置CC1101                            /
//输入参数:无                                    /
//输出参数:无                                 /
//----------------------------------------------/
void CC1101_RESET(void)
{
 SPI_Write_Strobe(SIDLE);
 CSN=0;
 while(SO);
 SPI_WR_Byte(SRES);
 while(SO);
 CSN=1;
}
//-----------------------------------------------/
//函数功能:CC1101上电重置                      /
//输入参数:无                                   /
//输出参数:无                                 /
//--------------------------------------------/
void POWER_UP_RESET(void)
{
 
 CSN=1;
 delay_us(1);
 CSN=0;
 delay_us(1);
 CSN=1;
 delay_us(41);
 CC1101_RESET();
}[page]

//-----------------------------------------------/
//函数功能:CC1101初始化                         /
//输入参数:无                                  /
//输出参数:无                                  /
//--------------------------------------------/
void CC1101_Init(void)
{
 CSN=0;
 SCLK=0;
 CSN=1;
 delay_ms(10);
 POWER_UP_RESET();
 Write_Config();
 SPI_Write_Burst(PATABLE,P_Config,8);
 SPI_Write_Strobe(SCAL);
 SPI_Write_Strobe(SIDLE);
 SPI_Write_Strobe(SFTX);
// for(i=0;i<100;i++)
//  SPI_Write_Strobe(SNOP);
// SPI_Write_Strobe(SIDLE);
// SPI_Write_Strobe(SRX);
}
//-----------------------------------------------/
//函数功能:SPI写命令                           /
//输入参数:Strobe                              /
//输出参数:无                                  /
//---------------------------------------------/
void SPI_Write_Strobe(uchar strobe)
{
 CSN=0;
 while(SO);
 SPI_WR_Byte(strobe);
 CSN=1;
}

uchar SPI_Read_Byte(uchar addr)
{
 uchar value;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0x80);
 value=SPI_WR_Byte(0);
 CSN=1;
 return value;
}
void SPI_Write_Byte(uchar addr,uchar value)
{
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr);
 SPI_WR_Byte(value);
 CSN=1;
}

void SPI_Write_Burst(uchar addr,uchar *buffer,uchar count)
{
 uchar i;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0x40);
 for(i=0;i  {
  SPI_WR_Byte(buffer[i]);
  delay_us(10);
 }
 CSN=1;
}

void SPI_Read_Burst(uchar addr,uchar *buffer,uchar count)
{
 uchar i;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0xc0);
 for(i=0;i   buffer[i]=SPI_WR_Byte(0);
 CSN=1;
}

uchar SPI_Read_Status(uchar addr)
{
 uchar value;
 CSN=0;
 while(SO);
 SPI_WR_Byte(addr|0xc0);//
 value=SPI_WR_Byte(0);
 CSN=1;
 return value;
}

void SPI_Write_Packet(uchar *TX_Buffer,uchar size)
{
// uchar j;
 
 SPI_Write_Byte(TX_FIFO,size);
 SPI_Write_Burst(TX_FIFO,TX_Buffer,size);
 SPI_Write_Strobe(STX);
 while(!GDO0);
 LED=1;
 while(GDO0);
 LED=0;
 SPI_Write_Strobe(SIDLE);
 SPI_Write_Strobe(SFTX);
 
}

void Write_Config(void)
{
    SPI_Write_Byte(IOCFG2,   0x0b);//

    SPI_Write_Byte(IOCFG0,   0x06);//

 SPI_Write_Byte(FIFOTHR,  0x07);//
// SPI_Write_Byte(SYNC1,  0xd3);//
// SPI_Write_Byte(SYNC0,  0x91);//
 SPI_Write_Byte(PKTLEN,   0xff);//
    SPI_Write_Byte(PKTCTRL1, 0x04);//
    SPI_Write_Byte(PKTCTRL0, 0x05);//
// SPI_Write_Byte(ADDR,  0x01);//
// SPI_Write_Byte(CHANNR,   0x00);//
 SPI_Write_Byte(FSCTRL1,  0x06);//
    SPI_Write_Byte(FSCTRL0,  0x00);//
    SPI_Write_Byte(FREQ2,    0x10);//
    SPI_Write_Byte(FREQ1,    0xb0);//
    SPI_Write_Byte(FREQ0,    0x71);//
    SPI_Write_Byte(MDMCFG4,  0x2d);//
    SPI_Write_Byte(MDMCFG3,  0x3b);//
    SPI_Write_Byte(MDMCFG2,  0x71);//
    SPI_Write_Byte(MDMCFG1,  0xa2);//
    SPI_Write_Byte(MDMCFG0,  0xf8);//
 SPI_Write_Byte(DEVIATN,  0x15);//
// SPI_Write_Byte(MCSM2 ,   0x07);//
 SPI_Write_Byte(MCSM1 ,   0x30);//
    SPI_Write_Byte(MCSM0 ,   0x18);//

    SPI_Write_Byte(FOCCFG,   0x16);//
    SPI_Write_Byte(BSCFG,    0x6c);//
 SPI_Write_Byte(AGCCTRL2, 0x03);//
// SPI_Write_Byte(AGCCTRL1, 0x00);//
    SPI_Write_Byte(AGCCTRL0, 0x91);//
// SPI_Write_Byte(WOREVT1 , 0x87);//
// SPI_Write_Byte(WOREVT0 , 0x6b);//
// SPI_Write_Byte(WORCTRL,  0xf8);//
    SPI_Write_Byte(FREND1,   0x56);//
    SPI_Write_Byte(FREND0,   0x10);//
    
    
    
    SPI_Write_Byte(FSCAL3,   0xe9);//
 SPI_Write_Byte(FSCAL2,   0x0a);//
// SPI_Write_Byte(FSCAL1,   0x00);//
    SPI_Write_Byte(FSCAL0,   0x1f);//
// SPI_Write_Byte(RCCTRL1 , 0x41);//
// SPI_Write_Byte(RCCTRL0 , 0x00);//
    SPI_Write_Byte(FSTEST,   0x59);//
// SPI_Write_Byte(PTEST ,   0x7f);//
    SPI_Write_Byte(TEST2,    0x81);//
    SPI_Write_Byte(TEST1,    0x35);//
    SPI_Write_Byte(TEST0,    0x09);//

   
}

uchar SPI_Read_Packet(uchar *RX_Buffer,uchar length)
{
 uchar status[2];
 uchar size=0; 
 SPI_Write_Strobe(SRX);
 delay_ms(1);
 if(SPI_Read_Status(RXBYTES)==0) return 0;
 while(GDO0)
 {
  SPI_Write_Strobe(SIDLE);
  return 0;
 }
 size=SPI_Read_Byte(RX_FIFO);
 
 if(size==length)
 {
  SPI_Read_Burst(RX_FIFO,RX_Buffer,size);
  SPI_Read_Burst(RX_FIFO,status,2);
  SPI_Write_Strobe(SFRX);
  return(status[1]&0x80);
 }
 else
 {
  SPI_Write_Strobe(SIDLE);
  SPI_Write_Strobe(SFRX);
  return 0;
 }

}

void main(void)
{
 CC1101_Init();
 delay_ms(100);
 while(1)
 {
  SPI_Write_Packet(tx_buffer,sizeof(tx_buffer));
 }
}

关键字:CC1101  STC89C52  无线收发 引用地址:基于CC1101与STC89C52无线收发程序(发射程序)

上一篇:基于CC1101与STC89C52无线收发程序(接收程序)
下一篇:A7105(2.4G)与STC89C52单片机无线收发程序(接收程序)

推荐阅读最新更新时间:2024-03-16 14:30

433MHz模块stm8、cc1101
前一段时间画了一个CC1101收发小板子,但是一直没有成功,最后发现把27nH的电感焊接成了27uH,最终导致失败. 现在更换之后可以覆盖我们公司所有的角落,已经够用了. 原理图:http://download.csdn.net/detail/cp1300/7496509 下面是STM8程序 CC1101.C /* * 文件名: CC1101.c * 功能: STM8 CC1101驱动函数 * 作者: cp1300@139.com * 创建时间: 2013-12-06 14:35 * 最后修改时间:2013-12-06 * 详细: 433MHZ收发芯片驱动 */ #i
[单片机]
433MHz模块stm8、<font color='red'>cc1101</font>
基于nRF905模块和C8051F单片机的无线收发系统设计
  前言   在闭环钻井系统中,要求实时地把井下的信息传递到地面,以实施人工监控。通常情况下该任务由MWD中泥浆压力脉冲发生器来完成。当使用井下动力钻具组合时,近钻头传感器和MWD被动力钻具隔开。传感器无法用线缆与MWD连接,因此要把传感器的信息传送给MWD只能通过无线通信的方法。   本文设计了由C8051F0606单片机和nRF905无线射频器收发组成的一种无线数据传输系统的方案。该系统由发射和接收模块组成,发射模块主要将要发送的数据经单片机处理后,通过nRF905发送出去;在接收模块中,nRF905则将数据正确接收后通过上位机界面显示出来,从而实现短距离井下的无线通信。   无线收发系统硬件设计   nRF905模
[单片机]
一种分布式节能测控网络的设计
  引言   CC1101是TI公司生产的一种单片、低成本的UHF频段无线收发器,基于IEEE 802.15.4标准开发,主要应用领域为低功耗无线测控。芯片具有无线电唤醒(WOR)、数据包处理、数据缓冲、突发数据传输、清晰信道*估、链接质量指示等功能,内部的参数寄存器和数据传输FIFO可通过SPI接口控制,所需的周边器件很少,使用简单。受限于发射功率和天线结构,CC1101的视距传输距离一般在400~800 m范围内,超出此距离范围则必须由中继设备对无线信号进行放大、转发。本文设计的一种分布式无线测控系统通过局域网对中继设备进行互连,大大降低了系统的无线通信协议复杂性,同时达到了使用无线通信时伴随的低功耗设计要求,具备很强的实
[单片机]
一种分布式节能测控网络的设计
8051单片机(STC89C52)稳定显示某两位数字
#include STC89C5xRC.H void delay() { int i, j; for(i = 0; i 15; i++) for(j = 0; j 15; j++) ; } void disp_digit() { int d = 60;//要显示的数字 unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; while(1) { //显示个位数 P2 = 0;// P2 = 0 - (P24, P23, P22) = (0, 0, 0) - 右数第一个数
[单片机]
8051单片机(<font color='red'>STC89C52</font>)稳定显示某两位数字
一种简单实用的STC89C52RC编程器设计方案
 1 引言 STC(宏晶科技)公司推出的STC 89C/S 51XX/52XX 等系列单片机,具有价格便宜、无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等优点,其指令代码完全兼容传统8051 单片机,片内资源非常丰富,且均内置可反复擦写的Flash 存储器,并提供了ISP(In-System Programming)编程模式。STC89C52RC 作为STC 89C/S51XX/52XX 系列单品机的一个典型代表,其特征主要有,8K 字节可编程闪烁存储器、1000 次写/ 擦循环寿命、10 年的数据保留时间、三级程序存储器锁定、512 内部RAM、32 可编程I/O 线、两个16 位定时器/ 计数器、5 个中断源、可编程串
[电源管理]
一种简单实用的<font color='red'>STC89C52</font>RC编程器设计方案
51单片机入门模板(STC89C52RC)
该模板适用于51单片机入门,比较易于理解,包含定时器和串口的操作。 可以在定时器T0中断服务函数和主循环中实现主要功能,在UART中断服务函数(T1定时器)中实现简单的串口通信接收命令的功能。 注:本模板STC89C52RC单片机使用11.0592MHz的晶振,若使用12MHz晶振可修改定时器相关位置 STC89C52RC原理图 模板及分析 1.主要结构 #include reg52.h unsigned char T0RH = 0; //T0重载值高字节 unsigned char T0RL = 0; //T0重载值低字节 unsigned char RxdByte = 0; //串口接收到的字节
[单片机]
51单片机入门模板(<font color='red'>STC89C52</font>RC)
基于SI4432的高性能无线收发应用平台设计
近些年来,随着集成电路技术的发展,ISM频段单芯片的无线数据通信IC的性能日益提高,短距离无线应用领域也在不断地扩大,其中包括消费电子、工业控制、安防、自动抄表等诸多领域。数据的无线收发在无线产品设计中占有很大的比重。为缩短产品设计周期以及提高产品的稳定性,使产品设计工程师在设计过程中只需关注系统应用的设计,而将数据收发交付一种成熟稳定的收发系统来完成。为此,本文设计了一种基于SI4432+STM32F103的高性能无线收发平台。 1 STM32F103和SI4432芯片简介  STM32系列是采用ARM CortexTM-M3 内核的闪存微控制器,所有功能都具有业界最优的功耗水平。在结合了高性能(最高72 MHz频率)、低功耗(
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved