// SPICLK P02, RF905-SCK
// SPIMISO P03,RF905-MISO
// SPIMOSI P04,RF905-MOSI
// P20,RF905-CSN
// P37,RF905-TX_EN
// P33,RF905-TRX_CE
// P34,RF905-PWR_UP
// P23,RF905-CD
// P24,RF905-AM
// P20,RF905-DR
// P13,L
// P12,R
#include "c8051f340.h"
#define SYSCLK 12000000
#define SPI_CLOCK 100000
#define WC 0x00 // 写配置寄存器
#define RC 0x10 // 读配置寄存器
#define WTP 0x20 // 向TX-Payload寄存器写入发送有效数据
#define RTP 0x21 // 从TX-Payload寄存器读取发送有效数据
#define WTA 0x22 // 向TX-Address寄存器写入发送地址
#define RTA 0x23 // 从TX-Address寄存器读取发送地址
#define RRP 0x24 // 从RX-Payload寄存器读取接收到的有效数据
void Port_Init(void); // 端口初始化
void Timer0_Init (void); // Timer0 初始化
void delay_50us(unsigned long N50us);
void OSCIN_init(void);
void Volt_measure(void);
void SPI0_Init(void);
void SpiWrite(unsigned char byte);
unsigned char SpiRead(void);
void Config905(void);
void TxPacket(void);
void RxPacket(void);
void SetTxMode(void);
void SetRxMode(void);
typedef struct RFConfig
{
unsigned char n;
unsigned char buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
xdata unsigned long Volt1_value=0;
xdata unsigned long Volt2_value=0;
xdata unsigned long Time_flag=0;
xdata unsigned char TxBuf[32]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20};
xdata unsigned char RxBuf[32];
unsigned char bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
bit SPI_BUSY;
//sbit MOSI=P0^2;
//sbit MISO=P0^1;
//sbit SCK=P0^0;
sbit CSN=P2^0;
sbit TRX_CE=P2^1;
sbit TX_EN=P2^2;
sbit PWR_UP=P2^3;
sbit DR=P1^0;
sbit AM=P1^1;
sbit CD=P1^2;
sbit key_TX=P1^3;
main()
{
unsigned long coeff1=0;
unsigned char coeff2=0;
unsigned char k;
PCA0MD &= ~0x40; // 请看门狗
OSCIN_init();
Port_Init();
Timer0_Init();
SPI0_Init();
// XBR1 = 0x40;
EA=1;
// ESPI0=1;
//================NRF905初始化
CSN=1; // Spi禁止
// SCK=0; // Spi clock line初始化高
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=1; // set radio in Tx mode
//================
Config905();
CSN=0;
SpiWrite(RC); // 准备读取接收到的数据
for (k=0;k<10;k++)
{
RxBuf[k]=SpiRead(); // 通过SPI接口从905芯片读取数据
}
CSN=1;
SetTxMode();
TxPacket();
SetRxMode();
RxPacket();
// TxBuf[0]=0;
while(1)
{
Volt_measure();
coeff1=Volt1_value/50;
if(coeff1>20)
coeff1=20;
coeff2=coeff1;
if(coeff2!=TxBuf[0])
{
TxBuf[0]=coeff1;
TxPacket();
}
}
}
//--------------------------------------------------------
//
//--------------------------------------------------------
void Port_Init(void)
{
XBR0 = 0x02; // Enable SPI
XBR1 = 0x40; // Enable crossbar
// P0MDOUT |= 0x10; // Set TX pin to push-pull
P2MDOUT |= 0x00; // enable LED as a push-pull output
P1MDIN &= ~0x30; // set P1.5 as an analog input
}
//--------------------------------------------------------
//
//--------------------------------------------------------
void OSCIN_init(void)
{
OSCICN=0x83;
OSCICL=0x00;
}
//--------------------------------------------------------
//
//--------------------------------------------------------
void Timer0_Init(void)
{
TH0 = 0xff; // Init Timer0 High register
TL0 = 0xce; // Init Timer0 Low register
TMOD = 0x01; // Timer0 in 16-bit mode
CKCON = 0x00; // Timer0 uses a 1:48 prescaler
ET0 = 1; // Timer0 interrupt enabled
TCON = 0x10; // Timer0 ON
}
//--------------------------------------------------------
//
//--------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0x00; // ADC0 disabled, 查询方式,
// conversion triggered on TMR2 overflow
REF0CN = 0x03; // Enable on-chip VREF and buffer
AMX0P = 0x06; // ADC0 positive input = P1.1
AMX0N = 0x1F; // ADC0 negative input = GND
// i.e., single ended mode
ADC0CF = ((SYSCLK/3000000)-1)<<3; // set SAR clock to 3MHz
ADC0CF |= 0x00; // right-justify results
AD0EN = 1; // enable ADC0
}
//-----------------------------------------------------------------------------
// SPI0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configures SPI0 to use 4-wire Single Master mode. The SPI timing is
// configured for Mode 0,0 (data centered on first edge of clock phase and
// SCK line low in idle state).
//
//-----------------------------------------------------------------------------
void SPI0_Init()
{
SPI0CFG = 0x60; // Enable the SPI as a Master
// CKPHA = '0', CKPOL = '0'
SPI0CN = 0x01; // 3-wire Single Master, SPI enabled
// SPI clock frequency equation from the datasheet
SPI0CKR = (SYSCLK/(2*SPI_CLOCK))-1;
// ESPI0 = 1; // Enable SPI interrupts
}
//--------------------------------------------------------
//
//--------------------------------------------------------
void Timer0_ISR (void) interrupt 1
{
TH0 = 0xff; // Reinit Timer0 High register
TL0 = 0xce; // Reinit Timer0 Low register
Time_flag++;
}
//--------------------------------------------------------
void delay_50us(unsigned long N50us)
{
unsigned long i=0;
Timer0_Init();
Time_flag=0;
while(Time_flag<N50us);
ET0=0;
Time_flag=0;
}
//-----------------------------------------------------------------------------
//测试电压
//-----------------------------------------------------------------------------
void Volt_measure(void)
{
unsigned char i=0;
unsigned char j=0;
unsigned long a[7]=0;
unsigned long Temp=0;
ADC0_Init ();
Volt1_value=0;
AD0BUSY=1;
while(AD0INT==0);
AD0INT=0;
Volt1_value=ADC0H;
Volt1_value<<=8;
Volt1_value|=ADC0L;
/* for(j=0;j<7;j++)
{
Volt1_value=0;
AD0BUSY=1;
// for(i=0;i<250;i++);
while(AD0INT==0);
AD0INT=0;
Volt1_value=ADC0H;
Volt1_value<<=8;
Volt1_value|=ADC0L;
a[j]=Volt1_value;
}
for(i=0;i<6;i++)
for(j=i+1;j<7;j++)
{
if(a[i]>a[j])
{
Temp=a[i];
a[i]=a[j];
a[j]=Temp;
}
else ;
}
Volt1_value=0;
for(j=1;j<6;j++)
{
Volt1_value+=a[j];
}
Volt1_value/=5;*/
}
//---------------------------------------------------------------
//<SPI写操作 代码>
//---------------------------------------------------------------
void SpiWrite(unsigned char byte)
{
unsigned char i;
DATA_BUF=byte; // Put function's parameter into a bdata variable
/* for (i=0;i<8;i++) // Setup byte circulation bits
{
if (flag) // Put DATA_BUF.7 on data line
MOSI=1;
else
MOSI=0;
SCK=1; // Set clock line high
DATA_BUF=DATA_BUF<<1; // Shift DATA_BUF
SCK=0; // Set clock line low
}
*/
//CSN=0;
//SPI_BUSY=1;
SPIF=0;
SPI0DAT=byte;
while (!SPIF);
//CSN=1;
}
//-----------------
没有合适的资源?快使用搜索试试~ 我知道了~
基于单片机C8051F340和RF905的无线遥控传输程序,本程序是控制航模电调的遥控发射程序
共16个文件
bak:4个
uvproj:1个
uvopt:1个
0 下载量 4 浏览量
2024-10-08
16:51:11
上传
评论
收藏 77KB ZIP 举报
温馨提示
基于单片机C8051F340和RF905的无线遥控传输程序,本程序是控制航模电调的遥控发射程序,通过调节可变电阻器旋钮,改变电阻器上的电压,C8051F340测试到电压的改变,然后改变发送给航模电调的数据,从而修改电调的PWM值,改变电机的转速。 通过C8051F340的SPI口,向RF905发送数据; 通过C8051F340的AD口,测试电阻器上的电压值; main() { unsigned long coeff1=0; unsigned char coeff2=0; unsigned char k; PCA0MD &= ~0x40; // 请看门狗 OSCIN_init(); Port_Init(); Timer0_Init(); SPI0_Init(); // XBR1 = 0x40; EA=1; // ESPI0=1; //================NRF905初始化 CSN=1; // Spi禁止 // SCK=0;
资源推荐
资源详情
资源评论
收起资源包目录
340 遥控器.zip (16个子文件)
340 遥控器
Remot 340.uvopt 5KB
Remot 340.lnp 50B
Remot 340.plg 170B
Remot 340.opt.bak 1KB
__Previews
Remot 340.cPreview 60KB
Remot 340.M51 18KB
Remot 340.LST 20KB
c8051F340.h 16KB
Remot 340_Opt.Bak 1KB
Remot 340.Uv2.bak 2KB
Remot 340.OBJ 16KB
Remot 340 15KB
Remot 340.uvproj 14KB
Remot 340.c 11KB
Remot 340_Uv2.Bak 2KB
Remot 340.uvgui.HUAWEI 89KB
共 16 条
- 1
资源评论
xll_007
- 粉丝: 484
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于javaswing的可视化学生信息管理系统
- 车辆、人检测14-TFRecord数据集合集.rar
- 车辆、人员、标志检测26-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 一款完全免费的屏幕水印工具
- 基于PLC的空调控制原理图
- 基于VUE的短视频推荐系统
- Windows环境下Hadoop安装配置与端口管理指南
- 起重机和汽车检测17-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- XAMPP 是一个免费且易于安装的Apache发行版
- 汽车软件需求开发与管理-从需求分析到实现的全流程解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功