找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机nRF24L01无线传感模块接收和发送程序

[复制链接]
跳转到指定楼层
楼主
基于51单片机的nRF24L01无线传感模块的接收个发送的程序。



单片机源程序如下:
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS = P0^2;   //定义端口
  6. sbit RW = P0^1;
  7. sbit EN = P0^0;
  8. sbit DQ = P0^3; //定义总线的I/O管脚
  9. bit crrent;
  10. uint value;   
  11. uchar data disdat[6];
  12. uchar data setdat[4];   
  13. #define TX_ADR_WIDTH    5  
  14. #define TX_PLOAD_WIDTH  2  
  15. uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};  
  16. uchar rx_buf[TX_PLOAD_WIDTH];
  17. uchar tx_buf[TX_PLOAD_WIDTH];
  18. uchar distance_data[2];
  19. uchar flag;
  20. sbit CE=P2^5;               
  21. sbit CSN=P2^0;               
  22. sbit SCK=P2^4;                 
  23. sbit MOSI=P2^1;               
  24. sbit MISO=P2^3;               
  25. sbit IRQ=P2^2;        
  26. uchar  bdata sta;
  27. sbit RX_DR =sta^6;  
  28. sbit TX_DS =sta^5;  
  29. sbit MAX_RT =sta^4;

  30. unsigned char time;
  31. #define READ_REG        0x00   
  32. #define WRITE_REG       0x20  
  33. #define RD_RX_PLOAD     0x61   
  34. #define WR_TX_PLOAD     0xA0   
  35. #define FLUSH_TX        0xE1
  36. #define FLUSH_RX        0xE2  
  37. #define REUSE_TX_PL     0xE3   
  38. #define NOP             0xFF   
  39. #define CONFIG          0x00  
  40. #define EN_AA           0x01  
  41. #define EN_RXADDR       0x02  
  42. #define SETUP_AW        0x03  
  43. #define SETUP_RETR      0x04
  44. #define RF_CH           0x05  
  45.   #define RF_SETUP        0x06  
  46. #define STATUS          0x07  
  47. #define OBSERVE_TX      0x08
  48.   #define CD              0x09  
  49. #define RX_ADDR_P0      0x0A  
  50. #define RX_ADDR_P1      0x0B
  51. #define RX_ADDR_P2      0x0C  
  52. #define RX_ADDR_P3      0x0D  
  53. #define RX_ADDR_P4      0x0E  
  54. #define RX_ADDR_P5      0x0F
  55. #define TX_ADDR         0x10  
  56.   #define RX_PW_P0        0x11  
  57. #define RX_PW_P1        0x12  
  58. #define RX_PW_P2        0x13
  59. #define RX_PW_P3        0x14
  60. #define RX_PW_P4        0x15  
  61. #define RX_PW_P5        0x16  
  62. #define FIFO_STATUS     0x17
  63. void init_io(void)
  64. {
  65. CE=0;  
  66.   CSN=1;
  67.    SCK=0;  
  68. }  
  69. void delay_ms(unsigned int x)
  70. {   
  71.   unsigned int i,j;   
  72.   for(i=0;i<x;i++)   
  73. {        
  74.    j=108;     
  75.    while(j--);   
  76. }
  77. }
  78. uchar SPI_RW(uchar byte)
  79. {  
  80. uchar bit_ctr;     
  81. for(bit_ctr=0;bit_ctr<8;bit_ctr++)      
  82.   {   
  83.   MOSI = (byte&0x80);        
  84. byte = (byte<<1);        
  85. SCK = 1;
  86. byte|=MISO;  
  87. SCK=0;  
  88. }     
  89. return(byte);   
  90. }  
  91. uchar SPI_RW_Reg(uchar reg, uchar value)
  92. {
  93. uchar status;  
  94.    CSN = 0;   
  95. status = SPI_RW(reg);
  96. SPI_RW(value);
  97. CSN = 1;  
  98.   return(status);  
  99. }  
  100. uchar SPI_Read(uchar reg)
  101. {
  102. uchar reg_val;
  103. CSN = 0;  
  104.   SPI_RW(reg);
  105.   reg_val = SPI_RW(0);
  106. CSN = 1;  
  107.    return(reg_val);  
  108.   }
  109. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  110. {
  111.         uchar status,byte_ctr;
  112.           CSN = 0;                                    
  113.           status = SPI_RW(reg);                       
  114.           for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  115.             pBuf[byte_ctr] = SPI_RW(0);   
  116.           CSN = 1;                           
  117.           return(status);
  118. }        
  119. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
  120. {
  121. uchar status,byte_ctr;   
  122.   CSN = 0;   
  123. status = SPI_RW(reg);
  124. for(byte_ctr=0;
  125. byte_ctr<bytes; byte_ctr++)
  126. SPI_RW(*pBuf++);
  127. CSN = 1;
  128. return(status);
  129. }  
  130. void TX_Mode(void)
  131. {  
  132. CE=0;  
  133. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
  134. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  
  135. SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);  
  136. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);        
  137. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
  138. SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);     
  139. SPI_RW_Reg(WRITE_REG + RF_CH,40);            
  140. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);        
  141. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     
  142. CE=1;
  143. }  
  144. void checkflag()
  145. {  
  146. sta=SPI_Read(STATUS);     
  147. if(RX_DR)           
  148. {
  149. SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);  
  150.         flag=1;         
  151.   }     
  152. if(MAX_RT)   
  153.     {
  154. SPI_RW_Reg(FLUSH_TX,0);   
  155.         }
  156.   SPI_RW_Reg(WRITE_REG+STATUS,sta);  
  157. }
  158. void SendByte(unsigned char dat);
  159. void zf_1602(unsigned char x,unsigned char y,unsigned dat);
  160. void Delay4us() //延时4us
  161. {
  162. ;
  163. }
  164. void Delay(unsigned char j)  //一个循环15us
  165. {
  166. unsigned char i;
  167. while(j--)
  168. {
  169.   i = 5;
  170.   while (--i);
  171. }
  172. }
  173. bit d18b20_qs() //18b20 起始
  174. {

  175. DQ = 1; //DQ复位
  176. Delay4us();
  177. DQ = 0; //拉低总线
  178. Delay(35);
  179. DQ = 1;
  180. Delay(2);
  181. crrent= DQ;
  182. Delay(2);
  183. return crrent; //返回数值
  184. }
  185. void d18b20_x(unsigned char dat) //写 8 位 数 据
  186. {
  187. unsigned char i;
  188. for(i=0;i<8;i++)
  189. {
  190.   DQ = 0; //拉低总线
  191.   DQ = dat & 0x01;
  192.   Delay(3); //延时45us
  193.   DQ = 1;
  194.   dat >>= 1; //数据右移一位
  195. }
  196. }
  197. unsigned char d18b20_d() //读 8 位 数 据
  198. {
  199. unsigned char i,dat=0;
  200. for(i=0;i<8;i++) //8位计数器
  201. {
  202.   DQ = 0; //拉低总线
  203.   dat >>= 1; //数据右移一位
  204.   DQ = 1;
  205.   if(DQ)
  206.    dat |= 0x80;
  207.   Delay(4);
  208. }
  209. return dat; //返回读取到数据数据
  210. }
  211. unsigned int wd() //读取温度函数
  212. {
  213. unsigned char i = 0; //低8位数据
  214. unsigned char j = 0; //高8位数据
  215. unsigned int k = 0;
  216. d18b20_qs();
  217. d18b20_x(0xCC);
  218. d18b20_x(0x44);
  219. Delay(200);   

  220. d18b20_qs();
  221. d18b20_x(0xCC);
  222. d18b20_x(0xBE);
  223. i = d18b20_d();
  224. j = d18b20_d();
  225. distance_data[0]=j;
  226. distance_data[1]=i;
  227. k = j;  
  228. k <<= 8;
  229. k = k + i;
  230. return k; //返回读取到的16位数据
  231. }
  232. void zh(unsigned int i)  
  233. {
  234. unsigned char x,z;
  235. x = i & 0x0f; //取出小数
  236. i >>=4;
  237. switch(x) //小数位转换
  238. {
  239.   case 0: z=0;break;
  240.   case 1: z=1;break;
  241.   case 2: z=1;break;
  242.   case 3: z=2;break;
  243.   case 4: z=3;break;
  244.   case 5: z=3;break;
  245.   case 6: z=4;break;
  246.   case 7: z=4;break;
  247.   case 8: z=5;break;
  248.   case 9: z=6;break;
  249.   case 10: z=6;break;
  250.   case 11: z=7;break;
  251.   case 12: z=8;break;
  252.   case 13: z=8;break;
  253.   case 14: z=9;break;
  254.   case 15: z=9;break;
  255. }
  256. z = z +48; //转换成ascii码
  257. zf_1602(8,1,z); //写入1602缓存
  258. z = i & 0xff; //取出整数
  259. x = z/10; //取出十位
  260. x= x+48;
  261. zf_1602(5,1,x);
  262. x = z%10;
  263. x= x+48;
  264. zf_1602(6,1,x);
  265. }
  266. void Delayus(unsigned char t)
  267. {  
  268. while(--t);
  269. }
  270. void Delayms(unsigned char t)
  271. {
  272.    
  273. while(t--)
  274. {
  275.      //大致延时1mS
  276.      Delayus(245);
  277.   Delayus(245);
  278. }
  279. }
  280. bit m_1602() //判断1602是否忙
  281. {
  282. P1 = 0xFF;
  283. RS = 0;
  284. RW = 1;
  285. EN = 0;
  286. _nop_();
  287. EN = 1;
  288. return (bit)(P1 & 0x80);
  289. }
  290. void x_1602(bit i,unsigned char j) //参数一是写(0、写指令 1、写数据),参数二是写入的8位数据
  291. {
  292. while(m_1602())
  293. {
  294.   _nop_();
  295.   _nop_();
  296.   _nop_();
  297.   _nop_();
  298.   _nop_();
  299. }
  300. RS = i;
  301. RW = 0;
  302. EN = 1;
  303. P1 = j;
  304. _nop_();
  305. EN = 0; //产生下降沿
  306. }
  307. void qp_1602() //清屏函数
  308. {
  309. x_1602(0,0x01); //第一个参数是:写入的类型(0、写指令 1、写数据),第一个参数是:写入的数据
  310. Delayms(5);
  311. }
  312. //显示字符
  313. void zf_1602(unsigned char x,unsigned char y,unsigned dat) //参数一是显示的列,参数二是显示的行,参数三是显示的数据
  314. {
  315. if(y==0)
  316. {
  317.   x_1602(0,(0x80+x)); //第一行
  318. }
  319. else
  320. {
  321.   x_1602(0,(0xc0+x)); //第二行
  322. }
  323. x_1602(1,dat); //写入数据
  324. }
  325. void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat)
  326. {
  327. if(y==0)
  328. {
  329.   x_1602(0,(0x80+x));
  330. }
  331. else
  332. {
  333.   x_1602(0,(0xc0+x));
  334. }
  335. while(*dat) //&:取地址 *:取值
  336. {
  337.   x_1602(1,*dat);
  338.   dat ++;
  339. }
  340. }
  341. void csh_1602()  //初始化1602
  342. {
  343. x_1602(0,0x38);
  344. Delayms(5);
  345. x_1602(0,0x38);
  346. Delayms(5);
  347. x_1602(0,0x38);
  348. Delayms(5);
  349. x_1602(0,0x38);
  350. x_1602(0,0x08);
  351. x_1602(0,0x01);
  352. x_1602(0,0x06);
  353. Delayms(5);
  354. x_1602(0,0x0c);  
  355. }
  356. void Lcd_User_Chr(void) // 1602 自定义字符(摄氏度的小点)    自定义字符
  357. {
  358. x_1602(0,0x48); //"01 001 000"  第1行地址
  359. x_1602(1,0x03); //"XXX 00001" 第1行数据
  360. x_1602(0,0x49); //"01 001 001"  第2行地址
  361. x_1602(1,0x03); //"XXX 11011" 第2行数据
  362. x_1602(0,0x4a); //"01 001 010"  第3行地址
  363. x_1602(1,0x00); //"XXX 11101" 第3行数据
  364. x_1602(0,0x4b); //"01 001 011"  第4行地址
  365. x_1602(1,0x00); //"XXX 11001" 第4行数据
  366. x_1602(0,0x4c); //"01 001 100"  第5行地址
  367. x_1602(1,0x00); //"XXX 11101" 第5行数据
  368. x_1602(0,0x4d); //"01 001 101"  第6行地址
  369. ……………………

  370. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
无线收发代码.rar (5 KB, 下载次数: 48)






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

使用道具 举报

沙发
ID:184706 发表于 2019-1-23 15:32 | 只看该作者
好棒啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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