找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6966|回复: 4
打印 上一主题 下一主题
收起左侧

NRF24L01+2.4G无线模块收发c8051f330单片机程序包含PCB SCH文件

  [复制链接]
跳转到指定楼层
楼主
2.4G无线模块收发程序,包含PCB  SCH文件及c8051f330单片机代码


无线收发原理图


无线收发pcb板
  1. /*********************************************************************************
  2. *说明:本文件为数据机密文件,具体加密方法在下面有介绍。
  3. *版本:V1.1.1
  4. *编写:谢金波    西安电子科技大学
  5. *建立日期:2014.12.6
  6. *修订日期:无
  7. *修订内容:无
  8. *********************************************************************************/
  9. /*数据加密算法为:源数据加上序号->奇偶位分体->序奇先1、序偶先2->字节四位调换
  10. *数据解密算法为:字节四位调换->序奇先1、序偶先2->奇偶位分体->数据减去序号->信息数据*/
  11. #include "password.h"
  12. #define OrderNumber 1
  13. #define DataFirst   2
  14. #define DataSecond  3
  15. unsigned int SendDataArray[4];
  16. unsigned int ReceiveDataArray[4];
  17. unsigned char TxBuf[6]={0,0,0,0,0,0};         
  18. unsigned char RxBuf[6]={0,0,0,0,0,0};
  19. /*调用前将数据放在最后一字节,前三字节为组号,第四字节为序号*/
  20. /****************************************************************************
  21. * 名    称:Timer1_ISR()
  22. * 功    能:用于电机驱动的定时器1中断函数,用于输出pwm波形
  23. * 入口参数:无
  24. * 出口参数:无
  25. * 说    明: 中断时间为文件开头的定义值(初始化为4*100ms)
  26. ****************************************************************************/
  27. void DataEncrypt( void )//加密算法
  28. {
  29.         unsigned int TempData;
  30.         SendDataArray[OrderNumber]=RxBuf[3];
  31.         SendDataArray[DataSecond]=RxBuf[5];
  32.         SendDataArray[DataSecond] += SendDataArray[OrderNumber];//源数据加上序列号
  33.         SendDataArray[DataFirst] = (SendDataArray[DataSecond] & 0xAA);
  34.         SendDataArray[DataSecond] = (SendDataArray[DataSecond] & 0x55);//奇偶分体
  35.         if(SendDataArray[OrderNumber]%2==0)//序号为偶数,先2后1,即数据两个字节调换位置
  36.         {
  37.                 TempData = SendDataArray[DataFirst];
  38.                 SendDataArray[DataFirst] = SendDataArray[DataSecond];
  39.                 SendDataArray[DataSecond] = TempData;
  40.         }
  41.         TempData = SendDataArray[DataFirst];
  42.         SendDataArray[DataFirst] = ((TempData & 0x0F) + (SendDataArray[DataSecond] & 0xF0));//两字节四位混合,即第一字节后四位与第二字节前四位组成第一字节
  43.         SendDataArray[DataSecond] = ((TempData & 0xF0) + (SendDataArray[DataSecond] & 0x0F));//两字节四位混合,即第一字节前四位与第二字节后四位组成第二字节
  44.         RxBuf[4]=SendDataArray[DataFirst];
  45.         RxBuf[5]=SendDataArray[DataSecond];
  46. }
  47. /****************************************************************************
  48. * 名    称:Timer1_ISR()
  49. * 功    能:用于电机驱动的定时器1中断函数,用于输出pwm波形
  50. * 入口参数:无
  51. * 出口参数:无
  52. * 说    明: 中断时间为文件开头的定义值(初始化为4*100ms)
  53. ****************************************************************************/
  54. void DataDecrypt( void )//解密算法
  55. {
  56.         unsigned int TempData;
  57.         SendDataArray[OrderNumber]=RxBuf[3];
  58.         SendDataArray[DataFirst]=RxBuf[4];
  59.         SendDataArray[DataSecond]=RxBuf[5];
  60.         TempData = ReceiveDataArray[DataFirst];
  61.         ReceiveDataArray[DataFirst] = ((TempData & 0x0F)+(ReceiveDataArray[DataSecond] & 0xF0));//混合第一字节重组
  62.         ReceiveDataArray[DataSecond] = ((TempData & 0xF0)+(ReceiveDataArray[DataSecond] & 0x0F));//混合第二字节重组
  63.         if(ReceiveDataArray[OrderNumber]%2==0)//序号为偶数,先2后1,即数据两个字节调换位置
  64.         {
  65.                 TempData = ReceiveDataArray[DataFirst];
  66.                 ReceiveDataArray[DataFirst] = ReceiveDataArray[DataSecond];
  67.                 ReceiveDataArray[DataSecond] = TempData;
  68.         }
  69.         ReceiveDataArray[DataSecond] = (ReceiveDataArray[DataFirst] & 0xAA) + (ReceiveDataArray[DataSecond] & 0x55);//奇偶体合二为一
  70.         ReceiveDataArray[DataSecond] -= ReceiveDataArray[OrderNumber];//减去序号,得到实际数据
  71.         RxBuf[5]=SendDataArray[DataSecond];
  72. }
复制代码

  1. /**************************************************************************************
  2. *说明:小键盘函数文件。本文件包含有键盘的采集函数,缓冲区入栈出栈,键值读取等。利用
  3.            定时器0调用扫描函数,得到相应键值,然后在主循环中可以随时读出键值进行相应操作。
  4.            本程序可以采集按下和松开两种状态的键值,便于应用。
  5. *建立日期:2014.12.6
  6. *修订日期:无
  7. *修订内容:无  
  8. **************************************************************************************/
  9. /**************************************************************************************
  10.                              *****键盘硬件示意图*****
  11.             +-------------+
  12.             | 定时器0中断 |               软件结构
  13.             +-------------+
  14.                    |
  15.             +-------------+   +-------------+   +-------------+
  16. KEY1_IO -->| Key_ScanIO  |   |  KeyBuff[]  |   |Key_GetKey() |
  17. ... ... -->|  键盘扫描   |-->|  键盘缓冲   |-->|             |-->应用程序  
  18. KEY4_IO -->|  函    数   |   |  队列(FIFO) |   |键盘读取函数 |
  19.             +-------------+   +-------------+   +-------------+

  20. 按键IO口硬件连接:
  21.                   c8051f330
  22.                +---------------+         
  23.      +---KEY4--|P0.7           |
  24.      |         |               |
  25.      +---KEY3--|P1.0           |     
  26.      |         |               |
  27.      +---KEY2--|P1.1           |
  28.      |         |               |
  29.      +---KEY1--|P1.2           |
  30.      |         +---------------+
  31.     GND
  32. ***************************************************************************************/   
  33. #include "c8051f330.h"

  34. #define KEYBUFF_SIZE   8    /*键盘缓冲区大小,根据程序需要自行调整*/

  35. sbit KEY4_IO=P0^7;          //KEY1输入IO的定义(P0.7)
  36. sbit KEY3_IO=P1^0;          //KEY2输入IO的定义(P1.0)
  37. sbit KEY2_IO=P1^1;          //KEY3输入IO的定义(P1.1)
  38. sbit KEY1_IO=P1^2;          //KEY4输入IO的定义(P1.2)


  39. unsigned char KeyBuff[KEYBUFF_SIZE]; //定义键盘缓冲队列数组(FIFO)
  40. unsigned char Key_IndexW=0;          //键盘缓冲队列写入指针(头指针)
  41. unsigned char Key_IndexR=0;          //键盘缓冲队列读取指针(尾指针)
  42. unsigned char Key_Count=0;           //键盘缓冲队列内记录的按键次数
  43. unsigned char key_flag=0;

  44. bit P_KEY1=1;               //存放KEY1前一次状态的变量
  45. bit N_KEY1=1;               //存放KEY1当前状态的变量
  46. bit P_KEY2=1;               //存放KEY2前一次状态的变量
  47. bit N_KEY2=1;               //存放KEY2当前状态的变量
  48. bit P_KEY3=1;               //存放KEY3前一次状态的变量
  49. bit N_KEY3=1;               //存放KEY3当前状态的变量
  50. bit P_KEY4=1;               //存放KEY4前一次状态的变量
  51. bit N_KEY4=1;               //存放KEY4当前状态的变量


  52. #define KEY1_ON   0x01
  53. #define KEY2_ON   0x02         /*按下键值宏定义*/
  54. #define KEY3_ON   0x04
  55. #define KEY4_ON   0x08
  56. #define KEY1_OFF  0x03
  57. #define KEY2_OFF  0x05         /*松开键值宏定义*/
  58. #define KEY3_OFF  0x06
  59. #define KEY4_OFF  0x07
  60. #define NOKEY     0x00

  61. #define KEY_ON  0          /*IO口低电平表示按下*/
  62. #define KEY_OFF 1

  63. bit KEY_EA;
  64. #define DISABLE_INT;  KEY_EA=EA;   EA=0; /*关闭中断的宏定义*/
  65. #define RESTORE_INT;  EA=KEY_EA;         /*恢复中断的宏定义*/

  66. /****************************************************************************
  67. * 名    称:Key_InBuff()
  68. * 功    能:将一次键值压入键盘缓冲队列
  69. * 入口参数:Key:被压入缓冲队列的键值
  70. * 出口参数:无
  71. ****************************************************************************/
  72. void Key_InBuff(unsigned char Key)
  73. {
  74.   if(Key_Count>=KEYBUFF_SIZE) return;//若缓冲区已满,放弃本次按键
  75.   DISABLE_INT;
  76.   Key_Count++;                       //按键次数计数增加
  77.   KeyBuff[Key_IndexW] = Key;         //从队列头部追加新的数据
  78.   if (++Key_IndexW >=  KEYBUFF_SIZE) //循环队列,如果队列头指针越界
  79.    {
  80.     Key_IndexW = 0;                  //队列头指针回到数组起始位置
  81.    }
  82.   RESTORE_INT;
  83. }
  84. /****************************************************************************
  85. * 名    称:Key_GetKey()
  86. * 功    能:从键盘缓冲队列内读取一次键值
  87. * 入口参数:无
  88. * 出口参数:若无按键,返回0,否则返回一次按键键值。
  89. * 说    明: 调用一次该函数,会自动删除缓冲队列里一次按键键值。
  90. ****************************************************************************/
  91. unsigned char Key_GetKey()
  92. { unsigned char Key;
  93.   if(Key_Count==0)  return(NOKEY);     //若无按键,返回0
  94.   DISABLE_INT;//队列操作过程中不允许被定时中断执行ScanIO函数,保护全局变量正确
  95.   Key_Count--;                     //按键次数计数减1
  96.   Key=KeyBuff[Key_IndexR];         //从缓冲区尾部读取一个按键值
  97.   if (++Key_IndexR >= KEYBUFF_SIZE)//循环队列,如果队列尾指针越界
  98.      {                             
  99.       Key_IndexR = 0;             //队列尾指针回到数组起始位置
  100.      }
  101.   RESTORE_INT;                    //恢复中断允许
  102.   return Key;  
  103. }
  104. /****************************************************************************
  105. * 名    称:Key_ScanIO()
  106. * 功    能:扫描键盘IO口并判断按键事件
  107. * 入口参数:无
  108. * 出口参数:无,键值压入缓冲队列
  109. * 说    明: 该函数需要每隔1/10秒至1/100秒调用一次。最好放在定时中断内执行。
  110.             如果中断间隔太长,可能丢键;间隔太短不能消除抖动。
  111. ****************************************************************************/
  112. void Key_ScanIO()
  113. {
  114.    P_KEY1=N_KEY1;  //保存KEY1前一次的状态
  115.    N_KEY1=KEY1_IO; //读取KEY1当前的状态
  116.    
  117.    P_KEY2=N_KEY2;  //保存KEY2前一次的状态
  118.    N_KEY2=KEY2_IO; //读取KEY2当前的状态
  119.    
  120.    P_KEY3=N_KEY3;  //保存KEY3前一次的状态
  121.    N_KEY3=KEY3_IO; //读取KEY3当前的状态

  122.    P_KEY4=N_KEY4;  //保存KEY4前一次的状态
  123.    N_KEY4=KEY4_IO; //读取KEY4当前的状态
  124.       
  125. //*********************自锁方式读键盘*********************************
  126.    if((P_KEY1==KEY_OFF)&&(N_KEY1==KEY_ON)&&key_flag==0) {key_flag=1;Key_InBuff(KEY1_ON);}         //KEY1按下
  127.    if((P_KEY1==KEY_ON)&&(N_KEY1==KEY_OFF)&&key_flag==1) {key_flag=0;Key_InBuff(KEY1_OFF);} //KEY1松开
  128.    if((P_KEY2==KEY_OFF)&&(N_KEY2==KEY_ON)&&key_flag==0) {key_flag=2;Key_InBuff(KEY2_ON);}         //KEY2按下
  129.    if((P_KEY2==KEY_ON)&&(N_KEY2==KEY_OFF)&&key_flag==2) {key_flag=0;Key_InBuff(KEY2_OFF);} //KEY2松开
  130.    if((P_KEY3==KEY_OFF)&&(N_KEY3==KEY_ON)&&key_flag==0) {key_flag=3;Key_InBuff(KEY3_ON);}
  131.    if((P_KEY3==KEY_ON)&&(N_KEY3==KEY_OFF)&&key_flag==3) {key_flag=0;Key_InBuff(KEY3_OFF);}  
  132.    if((P_KEY4==KEY_OFF)&&(N_KEY4==KEY_ON)&&key_flag==0) {key_flag=4;Key_InBuff(KEY4_ON);}
  133.    if((P_KEY4==KEY_ON)&&(N_KEY4==KEY_OFF)&&key_flag==4) {key_flag=0;Key_InBuff(KEY4_OFF);}
  134. }



  135. //********************************************************结束**************************************************************
复制代码


所有资料请下载附件:

2.4G无线双向收发系统V5.0.rar

185.74 KB, 下载次数: 146, 下载积分: 黑币 -5

评分

参与人数 2黑币 +65 收起 理由
51hei大小 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:347662 发表于 2018-6-8 15:59 | 只看该作者
下载学习学习
回复

使用道具 举报

板凳
ID:347662 发表于 2018-6-8 16:00 | 只看该作者
多谢分享
回复

使用道具 举报

地板
ID:138119 发表于 2019-8-16 22:06 | 只看该作者
很好的资料,支持一下!
回复

使用道具 举报

5#
ID:359887 发表于 2020-4-30 16:20 | 只看该作者
楼主用的什么画电路图啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表