reader.lst
来自「用C语言开发环境编写的nRF2401无线通信程序」· LST 代码 · 共 477 行 · 第 1/2 页
LST
477 行
225 1
226 1 P4=P4|PWR_UP1; //先进入空闲模式
227 1 for(i=0;i<10;i++)
228 1 Delay100();
229 1
230 1 P4=P4|CS1; //进入配置模式
231 1 Delay100();
232 1 //配置寄存器0字节RXEN 设置为0:发送模式
233 1 CLK1=0;
234 1 DATA =0;
235 1 Delay();
236 1
237 1 CLK1=1; // CLK1=1;
238 1 Delay();
239 1
240 1 CLK1=0; //P4=P4&0XFE; //CLK1=0;
241 1 P4=P4&CS0; //CS=0;使配置有效
C51 COMPILER V8.02 READER 08/12/2008 00:06:09 PAGE 5
242 1 P4=P4|CE1;
243 1 Delay100();
244 1 Delay100();
245 1 Delay100();
246 1 }
247
248 void SetRxMode(void)
249 {
250 1 unsigned int i;
251 1 P4=P4&CS0;
252 1 P4=P4&CE0;
253 1 CLK1=0;
254 1 DATA=0;
255 1
256 1 P4=P4|PWR_UP1; //进入空闲模式
257 1 for(i=0;i<10;i++)
258 1 Delay100();
259 1
260 1 P4=P4|CS1; //进入配置模式
261 1 Delay100();
262 1
263 1 CLK1=0;
264 1 DATA =1;
265 1 Delay();
266 1
267 1 CLK1=1; // CLK1=1;
268 1 Delay();
269 1
270 1 CLK1=0; //P4=P4&0XFE; //CLK1=0;
271 1 P4=P4&CS0; //CS=0; 4.3 1111 0111;
272 1 P4=P4|CE1; //CE=1; 4.2 0000 0100 ??è?·??í??ê?
273 1 Delay100();
274 1 Delay100();
275 1
276 1 }
277 //进行Manchester编码
278 void Manchester_fun(unsigned char *TxBuf)
279 {
280 1 unsigned char i,k=0;
281 1 for (i=0;i<8;i++)
282 1 {
283 2 if(TxBuf[i]==1)
284 2 {
285 3 Manchesterbuf[k]=1;
286 3 k++;
287 3 Manchesterbuf[k]=0;
288 3 k++;
289 3 }
290 2 else
291 2 {
292 3 Manchesterbuf[k]=0;
293 3 k++;
294 3 Manchesterbuf[k]=1;
295 3 k++;
296 3 }
297 2 }
298 1 }
299 //接收方通道硬件地址
300 unsigned char TxAddress[]={0xcc,0xcc,0xcc,0xcc};
301 //nRF2401数据发送函数
302 void nRF2401_TxPacket(unsigned char TxBuf[])
303 {
C51 COMPILER V8.02 READER 08/12/2008 00:06:09 PAGE 6
304 1 int i;
305 1 unsigned char variable2;
306 1 Manchester_fun(TxBuf);
307 1 P4=P4|PWR_UP1;
308 1 P4=P4&CS0;
309 1 P4=P4&CE0; //进入空闲模式
310 1 CLK1=0;
311 1 DATA=0;
312 1 Delay();
313 1
314 1 P4=P4|CE1; //进入收发模式
315 1 Delay100();
316 1
317 1 for(i=0;i< (ADDR_W/8);i++) //写入接收地址(按字节对齐)
318 1 {
319 2 variable2=TxAddress[i];
320 2 ByteWrite(variable2);
321 2 }
322 1 for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
323 1 {
324 2 variable2=Manchesterbuf[i];
325 2 ByteWrite(variable2);
326 2 }
327 1 P4=P4&CE0; //CE置低使发送有效
328 1 Delay100();
329 1 Delay100();
330 1
331 1 }
332
333 unsigned int checkconflict_fun(unsigned char *Rxbuf,unsigned char *Readdatabuf)
334 {
335 1 unsigned int i,k;
336 1 for(i=0;i<16;i=i+2)
337 1 {
338 2 if((Rxbuf[i]==1)&&(Rxbuf[i+1]==0))
339 2 {
340 3 *Readdatabuf=1; //收到的数据是下降沿,即为数据1;
341 3 Readdatabuf++;
342 3 k++;
343 3 }
344 2 else if((Rxbuf[i]==0)&&(Rxbuf[i+1]==1))
345 2 {
346 3 *Readdatabuf=0; //收到的数据是上降沿,即为数据0;
347 3 Readdatabuf++;
348 3 k++;
349 3 }
350 2 else
351 2 break;
352 2 }
353 1 return k; //返回碰撞位
354 1 }
355
356
357
358 void main(void)
359 {
360 1 unsigned char Txbuf1[8]={1,1,1,1,1,1,1,1,},Rxbuf[16],Readdatabuf[8];
361 1 unsigned char Txbuf2[8]={0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
362 1 unsigned char Txbuf3[8]={0X0A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,};
363 1 unsigned char Txbuf4[8]={0,1,2,3,4,5,6,7,};
364 1 unsigned char Txbuf5[8]={11,20,30,50,10,41,98,75,};
365 1 unsigned char send_flag=1,recive_flag=0,LED=0X1C;
C51 COMPILER V8.02 READER 08/12/2008 00:06:09 PAGE 7
366 1 unsigned int countbit,k=0,m,n,l;
367 1 unsigned int *p=&countbit;
368 1 unsigned int over_flag=1,conflict_bit;
369 1 unsigned long int i=0;
370 1
371 1 WDTCN=0xde; // 禁止看门狗定时器
372 1 WDTCN=0xad;
373 1 SYSCLK_Init(); //初始化CPU;
374 1 UART0_Init(); //配置串口
375 1 Config2401(); //配置nRF2401;
376 1 while(1)
377 1 {
378 2 i=0;
379 2 while(i<100) //发送阶段
380 2 { SetTxMode( );
381 3 i++;
382 3 P4=P4|CE1;
383 3 nRF2401_TxPacket(Txbuf1);
384 3 P6=P6&LED_ON; //LED灯亮
385 3 }
386 2
387 2 SetRxMode(); //设置为接收模式
388 2 P4=P4|CE1;
389 2 P6=P6|LED_OFF;
390 2 for(i=0;i<600;i++)
391 2 {
392 3 for(k=0;k<6000;k++)
393 3 {
394 4 if((P4&DR1)!=0) //检查是否接收到数据
395 4 {
396 5 P6=P6|LED_ON;
397 5 nrf2401_Rxpack(Rxbuf,p); //接收到数据,读出来
398 5 conflict_bit=checkconflict_fun( Rxbuf,Readdatabuf); //检查是否有碰撞,并返回碰撞位
399 5 if(conflict_bit<8) //碰撞位小于8
400 5 {
401 6 Txbuf1[conflict_bit]=0; //把碰撞位置为0
402 6 }
403 5 else //没有碰撞
404 5 {
405 6 m=0;
406 6 while(m<600)
407 6 { P6=P6|LED_OFF;
408 7 SetTxMode( ); //设置为发送模式
409 7 m++;
410 7 P4=P4|CE1;
411 7 nRF2401_TxPacket(Readdatabuf); //发送接收到的标签号作为确认信息
412 7 P6=P6&LED_ON;
413 7 for(l=0;l<5;l++)
414 7 {
415 8 Delay100();
416 8 }
417 7 }
418 6 for(l=0;l<8;l++) //向串口写读出的标签号
419 6 {
420 7 SBUF0=Readdatabuf[l];
421 7 while(TI0==0);
422 7 TI0=0;
423 7 }
424 6 for(n=0;n<8;n++) //确认了一个标签号后,进行下一次搜索,把发送的数据改为1111 1111
425 6 {
426 7 Txbuf1[n]=1;
427 7 }
C51 COMPILER V8.02 READER 08/12/2008 00:06:09 PAGE 8
428 6 }
429 5 recive_flag=1;
430 5 break; //接收到了数据就跳出接收数据循环
431 5 }
432 4 }
433 3 if(recive_flag==1)
434 3 break; //接收到了数据就跳出接收数据循环
435 3 }
436 2 recive_flag=0;
437 2 }
438 1 }
439
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1212 ----
CONSTANT SIZE = 58 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 103
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?