用LT8920-做2.4G的电路原理图如下:
单片机源程序如下:
- /**********************************
- *LT89XX测试DEMO
- *硬件平台:YBDZ_ERF_DEMO测试实验板
- *测试描述:两块测试实验板分别搭载一个LT89XX无线模块
- 当按其中任意一个测试板的按键例如KEY1,那么该测试板会通过无线模块将键值发送出去,另一测试板收到键值数据后,
- 点亮对应的LED(KEY1对应LED1KEY2对应LED2)并且返回应答信号,
- 发送板在收到接收板返回的应答信号后会点亮该板上和按键对应的LED,这样表示通信成功。
- 备注:点亮的LED延时3秒后熄灭,测试需要两块测试板烧写同样的程序,不管按下那块板上的按键,效果都是一样的,不区分发射板和接收板,测试程序中包含发射,接收,按键扫描,和LED驱动。
- *MCU:STC15W408AS
- *时钟:6MHZ
- *出处:一步电子工作室
- ***********************************/
- #include <intrins.h>
- #include "LT89XX_DRV.h"
- #include "Key_Drive.h"
- #include "STC_NEW_8051.H"
- #define TX_DAT1 0x01 //发送数据1
- #define TX_DAT2 0x02 //发送数据2
- #define INT_RX 0x03 //初始化接收模式
- #define RX_MOD 0x00 //常规接收模式
- sbit LED1= P5^4;
- sbit LED2= P5^5;
-
- #define LED1_ON() LED1=0
- #define LED2_ON() LED2=0
- #define LED1_OFF() LED1=1
- #define LED2_OFF() LED2=1
- unsigned char RBUF[32];
- extern unsigned char time_5ms_flag;
- void main(void)
- {
- //uchar tx_lcd_flag = 0;
- unsigned char index = 0; //channel indicator
- unsigned char highReg = 0;
- unsigned char lowReg = 0;
- unsigned char keyvalue = 0; //key return value
- unsigned char index_state = INT_RX; //working manner index is initiated.
- unsigned char i,j;
- unsigned short count;
- // Init_Timer(); //初始化定时器和延时器
- Delay_ms(10);
- LT8900_Init();
- #ifdef LT8910
- //8910设置成62.5kbps Reg44 地址上配置 1000H, Reg45 配置 0552H, 是 62.5Kbps
- SPI_WriteReg(44, 0x10, 0x00);
- SPI_WriteReg(45, 0x05, 0x52);
- #endif
- //-----------------
- //读出寄存器的值检查硬件读写时序是否正确
- SPI_ReadReg(40);
- if (RegH==0x44 && RegL==0x02)
- {
- LED1_ON();
- LED2_ON();
- Delay_ms(200);
- LED1_OFF();
- LED2_OFF();
- }
- //-----------------
- count=0;
- //-----------------
- while (1)
- {
- if(time_5ms_flag)
- {
- Get_KeyValue(&keyvalue); //cost 50us
- time_5ms_flag=FALSE;
-
- if(count<600)
- count++;
- if(count==600)
- {
- LED2_OFF();
- LED1_OFF();
- }
- }
- switch(keyvalue)
- {
- case (KEY1|KEY_PRESS):
- index_state=TX_DAT1;
- break;
- case (KEY2|KEY_PRESS):
- index_state=TX_DAT2;
- break;
- default : break;
- }
- switch(index_state)
- {
- case INT_RX:
- //设置成数据接收模式
- SPI_WriteReg(52, 0x80, 0x80);
- SPI_WriteReg(7, 0x00, 0x80 + 0x20);
- index_state=RX_MOD;
- break;
-
- case RX_MOD:
- //检查是否接收到数据
- if(PKT == 1)
- {
- i=0;
- SPI_ReadReg(50);
- j=RegH;//读取包长度
- while(i<j)
- {
- //读取数据
- SPI_ReadReg(50);
- RBUF[i++]=RegH;
- RBUF[i++]=RegL;
- if(i==32)
- break;
- }
- //一旦发生错误,寄存器 Reg48 bit15 位 CRC_ERROR 将被自动置 1,在下次开始 RX 或 TX 时它将被清除。
- //Test CRC
- SPI_ReadReg(48);
- if((RegH&0x80)==0)
- {
- //判断数据点亮灯
- if(RBUF[0]==1)
- {
- LED1_ON();
- count=0;
- }
- else if(RBUF[0]==2)
- {
- LED2_ON();
- count=0;
- }
- }
- //再次初始化为接收模式
- index_state=INT_RX;
- //LED1_OFF();
- }
- break;
- case TX_DAT1:
- //将数据发送出去
- SPI_WriteReg(52, 0x80, 0x80);
- //i=0;
- //写入长度 长度包含长度字节本身
- SPI_WriteReg(50, 2,0);
- //写入数据
- SPI_WriteReg(50, 1,0);
- //开始发送
- SPI_WriteReg(7, 0x01, 0x20);
- while (PKT== 0); //等待发送完成
- //判断是否收到对方自动应答信号,REG52<13:8>应为0
- SPI_ReadReg(52);
- if((RegH& 0x3F)==0)//如果收到应答信号点亮本地对应的LED
- {
- LED1_ON();
- count=0;
- }
- //发送完成初始化为接收模式
- index_state=INT_RX;
- break;
- case TX_DAT2:
- //将数据发送出去
- SPI_WriteReg(52, 0x80, 0x80);
- i=0;
- //写入长度 长度包含长度字节本身
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
XY-WAB基于51单片机的程序与原理图.rar
(71.77 KB, 下载次数: 409)
|