本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
这个程序是我参照网上的例子写的,可是我实际运行时,还是不能成功啊,忘高手指教啊
#include <c8051f020.h> //必要的头文件
#include <intrins.h>
#define uchar unsigned char
#define n_PWR_UP_H ? P5|=(0x01 << 2) ? ? //模式控制
#define n_PWR_UP_L ? P5&=~(0x01 << 2)
#define n_CE_H ? ? ? P5|=(0x01 << 1)
#define n_CE_L ? ? ? P5&=~(0x01 << 1)
#define n_CS_H ? ? ? P5|=(0x01 << 3)
#define n_CS_L ? ? ? P5&=~(0x01 << 3)
#define n_DR1_H ? ? ?P5|=(0x01 << 4) ??
#define n_DR1_L ? ? ?P5&=~(0x01 << 4)
#define n_DR1_X ? ? ?P5&(0x01 << 4)
#define n_CLK1_H ? ? P5|=(0x01 << 5)
#define n_CLK1_L ? ? P5&=~(0x01 << 5)
#define n_DATA_H ? ? P5|=(0x01 << 6)
#define n_DATA_L ? ? P5&=~(0x01 << 6)
#define n_DATA_X ? ? P5&(0x01 << 6)
#define n_LED_H ? ? ? P5|=(0x01 << 0) ? // ?状态指示灯
#define n_LED_L ? ? ? P5&=~(0x01 << 0)
sbit sound = P2^4;
sbit Key1 = P1^3;
sbit Key2 = P1^4;
sbit Key3 = P1^7;
sbit Key4 = P1^6;
sbit Key5 = P1^5;
sbit Key6 = P1^2;?
unsigned char ? key=0; ? ? ? ? ??
unsigned char ? key_press=0;
unsigned char ? delay_key;
unsigned char ? key_bak;
uchar code n_add[4]={0x11,0x11,0x11,0x11};?
uchar ? TXData[10]={0}; ??
uchar ? RXData[10]={0};
uchar nRF2401_flag;
/************************************************************************
* 名称:PORT.c ??
* 功能:配置交叉开关和GPIO端口 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
?void PORT_Init (void)
{
? ? P0MDOUT ? = 0x7D;
? ? P1MDOUT ? = 0x03;
? ? P2MDOUT ? = 0xFF;
? ? P3MDOUT ? = 0xFF;
P74OUT ? ?= 0x81; ? ? ?
? ? XBR0 ? ? ?= 0x24;
XBR1 ? ? ?= 0x24;
XBR2 ? ? ?= 0x40; ? ? ? ? ? ? ? ? ? ??
P7= 0x0f;
P6= 0xff;
P5= 0xff;
P4= 0xff;
}
/************************************************************************
* 名称:SYSCLK.c ??
* 功能:此程序初始化系统时钟使用16MHZ(22.1184MHz)晶体作为时钟源。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
*************************************************************************/
void SYSCLK_Init (void)
{
OSCICN ? ?= 0x17; ? //16MHZ
}
/****************************************************************************
* 名称:speak()
* 功能:蜂鸣函数
****************************************************************************/
void speak(void)
{
sound=0;
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
}
/****************************************************************************
* 名称:read_key()
* 功能:检测键盘,初步判断按键的键值
****************************************************************************/
unsigned char read_key(void)
{
? ? if ? (!Key1)
? ? ? return 1;
else if(!Key2)
? ? ? return 2;
else if(!Key3)
? ? ? return 3;
else if(!Key4)
? ? ? return 4;
? ? else if(!Key5)
? ? ? return 5;
? ? else if(!Key6)
? ? ? ? ? ?return 6;
? ? else
? ? ? return 0;
}
/****************************************************************************
* 名称:scan_key()
* 功能:软件消抖,确定键值,将其存入key中
****************************************************************************/
void scan_key(void)
{ ? unsigned char i;
i=read_key();
switch(key_press)
{
case 0:
if(i)
key_press=1;
delay_key=1;
key_bak=i;
break;
case 1:
if(i==key_bak)
{
if(--delay_key==0)
{
key=i;
key_press=2;
delay_key=1;
speak();
}
}
else
{
key_press=0;
}
break;
case 2:
if(i)
{
delay_key=1;
}
else
{
if(--delay_key==0)
key_press=0;
}
break;
default:
key_press=0;
break;
}
}
/****************************************************************************
* 名称:T0_Init()
* 功能:T0初始化
****************************************************************************/
void T0_Init()
{
CKCON|=0x00; //定时器使用系统时钟的12 分频
TMOD |= 0x01; //定时器模式 ?
TH0 =(65535 - 2203) >> 8; //初值高8位
TL0 =(65535 - 2203) & 0xff; //初值低8位
ET0 = 1; //开定时中断
TR0 = 1; //启动定时器
}
/****************************************************************************
* 名称:T0_isr()
* 功能:T0的中断服务程序
****************************************************************************/
void T0_isr() interrupt 1
{
TH0 =(65535 - 2203) >> 8;//重置初值高8位
TL0 =(65535 - 2203) & 0xff;//重置初值低8位
scan_key();
}
/****************************************************************************
* 名称:T1_Init()
* 功能:T1初始化,大约20ms
****************************************************************************/
void T1_Init(void)
{
CKCON|=0x00; //定时器使用系统时钟的12 分频
TMOD|=0x10; //定时器模式
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
ET1 = 1; //开定时中断
TR1 = 1; //启动定时器
}
/****************************************************************************
* 名称:T1_isr()
* 功能:T1的中断服务程序
*************************************************************/
void T1_isr() interrupt 3
{
?sound=1;
?n_LED_H;
}
/************************************************************************
* 名称:delayus() ??
* 功能:延迟函数,精度us ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
void delayus(uchar i) ? ? ?
{
for(;i!=0;i--)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
}
/************************************************************************
* 名称:delayms() ??
* 功能:延迟函数,精度ms ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
void delayms(uchar i) ? ? ?
{
for(;i!=0;i--)
{
delayus(200);delayus(200);delayus(200);
delayus(200);delayus(200);
}
}
/****************************************************************************
* 名称:send_nrf2401_command()
* 功能:发送命令字节函数
****************************************************************************/
void send_nrf2401_command(uchar Send_command)?
{?
?uchar i;
?for (i=0;i<8;i++)?
? ?{?
if(Send_command&(0x80>>i))
{
n_DATA_H;
}
else
{
n_DATA_L;
}
?delayus(5);
? ? ? n_CLK1_H;
?delayus(5);
? ? ? n_CLK1_L;?
? ?}?
}?
/****************************************************************************
* 名称:nrf2401_Init()
* 功能:nrf2401无线模块初始化
****************************************************************************/
void nrf2401_Init(void)
{ ?
n_CE_L;
n_CS_L;
n_PWR_UP_H;?
delayms(10);
? n_CS_H;
delayms(10); ? ? ?
send_nrf2401_command(0x50); ? //DATA2_W ,Datalength 80bit(10 byte)
send_nrf2401_command(0x50); ? //DATA1_W ,Datalength 80bit(10 byte)
send_nrf2401_command(0x00); ? //通道2的地址
send_nrf2401_command(0x12);
send_nrf2401_command(0x34);
send_nrf2401_command(0x56);
send_nrf2401_command(0x78);
send_nrf2401_command(0x00); ? //通道1的地址
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);
send_nrf2401_command(0x83); ?
send_nrf2401_command(0x68); ?
send_nrf2401_command(0x03); ?
delayms(10);
? n_CS_L;
delayms(10);?
}
/****************************************************************************
* 名称:nRF2401_Mode()
* 功能: 模式切换(0为发送1为接受)
* 入口参数:无
* 出口参数:无
****************************************************************************/
void nRF2401_Mode(uchar i)?
{?
?n_PWR_UP_H;
?n_CE_L;
?_nop_();?
?n_CS_H;?
?delayms(10); ?
?if(i)
? {
?send_nrf2401_command(0x03);
}
?else
? {
? ?send_nrf2401_command(0x02);
? }
?n_CS_L;
?_nop_();
?n_CE_H;
?delayms(10); ?
}
/****************************************************************************
* 名称:nrf2401_RX()
* 功能:无线发送
****************************************************************************/
void nrf2401_TX(void)
{
int i,j;
uchar temp;
n_LED_L;
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
n_CE_H;
delayms(10);
for(i=0;i<4;i++)
{
temp=n_add[i];
for(j=0;j<8;j++)
{
if(temp&0x80)
{
n_DATA_H;
}
else
{
n_DATA_L;
}
delayus(10);
n_CLK1_H;
delayus(10);
n_CLK1_L; |