📄 rf2401_demo.lst
字号:
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 1
C51 COMPILER V8.12, COMPILATION OF MODULE RF2401_DEMO
OBJECT MODULE PLACED IN rf2401_demo.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE rf2401_demo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /////////////////////////////////////////////////////////////////////
2 // Desc: Demo App for RF2401 Module
3 // Vender: http://www.newmsg.com
4 // Date: 2007-3-12
5 // Update 2007-9-8
6 ////////////////////////////////////////////////////////////////////
7
8 #include <reg51.h>
9 #include <string.h>
10 #include <stdio.h>
11
12
13 // 常量定义
14 #define uchar unsigned char
15 #define uint unsigned int
16
17
18 #define BYTE_BIT0 0x01
19 #define BYTE_BIT1 0x02
20 #define BYTE_BIT2 0x04
21 #define BYTE_BIT3 0x08
22 #define BYTE_BIT4 0x10
23 #define BYTE_BIT5 0x20
24 #define BYTE_BIT6 0x40
25 #define BYTE_BIT7 0x80
26
27
28
29 // <RF2401_Pins 对应引脚> , 具体细节请参考相关电路图 NewMsg_RFDemo2401.SchDoc(用PortelDXP打开)
30 sbit PWR_UP = P1^6;
31 sbit CE = P1^2;
32 // sbit DR2 = P3^5; //暂时没有用到
33 // sbit CLK2 = P3^4;
34 // sbit OUT2 = P3^3;
35 sbit CS = P1^1;
36 sbit DR1 = P1^0;
37 sbit CLK1 = P3^7;
38 sbit DATA = P3^3;
39
40 sbit LED0 = P3^4;
41 sbit LED1 = P3^5;
42 sbit KEY0 = P3^0;
43 sbit KEY1 = P3^1;
44
45
46
47 /*
48 *************************************************************
49 * RF2401 Configuration *
50 * 保存2401的配置信息 *
51 *************************************************************
52 */
53 /*=====<RF-Configuration-Register 配置信息>=====*/
54 //芯片测试用,无需修改
55 #define TEST_2 0x8E //MSB D143~D136
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 2
56 #define TEST_1 0x08 // D135~D128
57 #define TEST_0 0x1C // D127~D120
58
59 /* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 ! 单个数据包的大小必须小于32字节(256位) */
60 #define DATA2_W 0x10 //2字节 //频道2 数据长度(单位:Bit)
61 //#define DATA1_W 0xE0 //28字节 //频道1 数据长度(单位:Bit)
62 #define DATA1_W 0x10 //2字节 //频道1 数据长度(单位:Bit)
63 // 0xE0 = 224
64 //16bit Address + 224bit(28byte)Data + 16bit CRC = 256bit
65
66 /* 注意:2401忽略ADDR中超过ADDR_W设定宽度的那些位,同时地址不能全部设置为0 */
67 //频道2 接收地址(当前模块地址)
68 #define ADDR2_4 0x00
69 #define ADDR2_3 0x1c
70 #define ADDR2_2 0xcc
71 #define ADDR2_1 0xcc
72 #define ADDR2_0 0xcc
73 //频道1 接收地址
74 #define ADDR1_4 0x00
75 #define ADDR1_3 0xcc
76 #define ADDR1_2 0xcc
77 #define ADDR1_1 0xcc
78 #define ADDR1_0 0xcc
79
80 #define ADDR_W 0x10 //2字节 //接收地址宽度(单位:Bit)
81 #define CRC_L 0x1 //CRC模式 0:8位 1:16
82 #define CRC_EN 0x1 //CRC校验启用
83
84 #define RX2_EN 0x0 //双频道功能启用
85 #define CM 0x1 //0:Direct mode 1:ShockBurst mode
86 #define RFDR_SB 0x0 //0:250kbps 1:1Mbps
87 #define XO_F 0x3 //16M //nRF2401晶振频率
88 #define RF_PWR 0x3 //信号发射功率
89
90 #define RF_CH 0x2 //Channel RF 频率
91 #define RXEN 0x0//DEF_RXEN //0:Tx 1:Rx
92 //程序会重新设置此项参数
93
94 //-----------------------------------------------------------
95
96
97
98 //<将设置信息组合成每个字节的数据信息,此区域无需修改>
99 #define RFConfig_Byte0 TEST_2
100 #define RFConfig_Byte1 TEST_1
101 #define RFConfig_Byte2 TEST_0
102 #define RFConfig_Byte3 DATA2_W
103 #define RFConfig_Byte4 DATA1_W
104 #define RFConfig_Byte5 ADDR2_4
105 #define RFConfig_Byte6 ADDR2_3
106 #define RFConfig_Byte7 ADDR2_2
107 #define RFConfig_Byte8 ADDR2_1
108 #define RFConfig_Byte9 ADDR2_0
109 #define RFConfig_Byte10 ADDR1_4
110 #define RFConfig_Byte11 ADDR1_3
111 #define RFConfig_Byte12 ADDR1_2
112 #define RFConfig_Byte13 ADDR1_1
113 #define RFConfig_Byte14 ADDR1_0
114 #define RFConfig_Byte15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
115 #define RFConfig_Byte16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
116 #define RFConfig_Byte17 (RF_CH<<1 | RXEN)
117
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 3
118 //------------------------------------------------------------
119
120
121 //通过宏定义将18字节的寄存器参数按照各个功能分解,以便于参数的调整
122
123
124 unsigned char code nRF2401_Conf[18] ={
125 RFConfig_Byte0,
126 RFConfig_Byte1,
127 RFConfig_Byte2,
128 RFConfig_Byte3,
129 RFConfig_Byte4,
130 RFConfig_Byte5,
131 RFConfig_Byte6,
132 RFConfig_Byte7,
133 RFConfig_Byte8,
134 RFConfig_Byte9,
135 RFConfig_Byte10,
136 RFConfig_Byte11,
137 RFConfig_Byte12,
138 RFConfig_Byte13,
139 RFConfig_Byte14,
140 RFConfig_Byte15,
141 RFConfig_Byte16,
142 RFConfig_Byte17
143 };
144
145 //------------------------------------------------------------
146
147 /*
148 *************************************************************
149 * nRF2401 Tx/Rx functions *
150 *
151 * void Delay100(void);
152 * void Config2401(void); //配置2401,写入初始化设置
153 * void SetTxMode(void); //设置为发送模式
154 * void SetRxMode(void); //设置为接收模式
155 * void nRF2401_TxPacket(unsigned char TxBuf[]);
156 * //发送TxBuf[]内的数据 长度由 DATA1_W 决定
157 * unsigned char nRF2401_RxPacket(unsigned char *RxBuf);
158 * //检查是否有数据需要接受 如果有,则保存至RxBuf[]
159 * //返回值 0:没有接收到数据 1:接收到数据
160 *************************************************************
161 */
162
163 //16M晶振 600us左右
164 void Delay100(void)
165 {
166 1 unsigned int i;
167 1 for(i=0;i<100;i++);
168 1 }
169 /* 串行口初始化 */
170
171 void init_serial( void )
172
173 {
174 1
175 1 SCON = 0x50; //串行工作方式1, 8位异步通信方式
176 1
177 1 TMOD |= 0x20; //定时器1, 方式 2, 8位自动重装
178 1
179 1 PCON |= 0x80; //SMOD=1,表示数据传输率加倍
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 4
180 1
181 1 TH1 = 0xF4; //数据传输率:4800 fosc=11.0592MHz
182 1
183 1 IE |= 0x90; //允许串行中断
184 1
185 1 TR1 = 1; //启动定时器1
186 1
187 1 }
188
189 /* 向串口发送一个字符 */
190
191 void send_char( unsigned char x)
192
193 {
194 1
195 1 SBUF=x;
196 1
197 1 while (TI== 0 );
198 1
199 1 TI= 0;
200 1
201 1 }
202
203 /* 向串口发送一个字符串,string_length为该字符串长度 */
204
205 void send_string( unsigned char *s, unsigned int string_length)
206
207 {
208 1
209 1 unsigned int i= 0;
210 1
211 1 do
212 1
213 1 {
214 2
215 2 send_char(*(s + i)); //向串口发送一个字符
216 2
217 2 i++;
218 2
219 2 }
220 1
221 1 while ( i<string_length);
222 1
223 1 }
224
225 /* 串口接收中断函数 */
226
227 void serial () interrupt 4 using 3
228
229 {
230 1
231 1 if (RI)
232 1
233 1 {
234 2
235 2 unsigned char x;
236 2
237 2 RI = 0;
238 2
239 2 x=SBUF;
240 2 //接收字符
241 2
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 5
242 2 /*
243 2 if ( x> 127 )
244 2
245 2 {
246 2
247 2 counter= 0;
248 2
249 2 inbuf[counter]=x;
250 2
251 2 checksum= x- 128;
252 2
253 2 }
254 2
255 2 else
256 2
257 2 {
258 2
259 2 counter++;
260 2
261 2 inbuf[counter]=x;
262 2
263 2 checksum ^= x;
264 2
265 2 if ((counter==(length- 1)) && (!checksum))
266 2
267 2 {
268 2
269 2 flag= 1; //如果串口接收的数据达到length个,且校验没错,
270 2
271 2 //就置位取数标志
272 2
273 2 }
274 2
275 2 }
276 2 */
277 2
278 2 }
279 1
280 1 }
281
282
283
284
285
286
287
288 void Delay(uchar n)
289 {
290 1 uint i;
291 1 while(n--)
292 1 for(i=0;i<80;i++);
293 1 }
294
295
296 bdata unsigned char DATA_BUF;
297 #define DATA7 ((DATA_BUF & BYTE_BIT7) != 0)
298 #define DATA0 ((DATA_BUF & BYTE_BIT0) != 0)
299
300 /**********************************************************
301 * 2401数据传输接口
302 * 详细内容参见2401手册<Configuration mode timing>章节
303 **********************************************************/
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 6
304 unsigned char Spi_ByteRead(void)
305 {
306 1 unsigned char i = 0;
307 1 for (i=0; i<8; i++)
308 1 {
309 2 DATA_BUF = DATA_BUF << 1;
310 2 CLK1 = 1;
311 2 DATA = 1; //设置为输入状态
312 2 if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -