PTR8000发送接收驱动程序。只需在主程序中只需做小小的改动就可以
源代码在线查看: s.lst
C51 COMPILER V6.12 S 08/10/2008 11:52:12 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE S
OBJECT MODULE PLACED IN .\s.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\s.c DEBUG OBJECTEXTEND
stmt level source
1 //接收
2 /*************火箭发射点火系统***************************/
3 #include "reg52.h"
4 void mode1(void);
5 void mode2(void);
6 void mode3(void);
7 void mode4(void);
8 void mode5(void);
9 void Config905(void); //对PTR8000进行配置
10 unsigned int a[8],b[8];
11 unsigned int flag=0;
12 int i,t;
13
14 sbit SCK = P2^5;
15 sbit MISO= P2^7;
16 sbit MOSI= P2^6;
17 sbit DR = P2^1; //数据就绪输出
18 sbit CSN = P2^4; //SPI使能
19 sbit PWR = P2^2; //Power Down 模式
20 sbit TX_EN= P2^3; //'1'发射模式 '0'接收模式
21 sbit TRX_CE=P2^0; //使能发射/接收模式
22
23 /**********************************/
24 //延时大约为1S左右
25 //以0.1S为单位计时
26 //即 定时时间 time=t*0.1 S
27 /*********************************/
28 void delay()
29 {
30 1 int i,j;
31 1 //for(k=0;k 32 1 for(i=0;i 33 1 for(j=0;j 34 1 }
35 /********************************/
36 //任意延时
37 /*******************************/
38 void Delay(int x)
39 {
40 1 unsigned int i;
41 1 for(i=0;i 42 1 }
43 /*******十进制数转二进制数*************************/
44 void fun2(int n)
45 {
46 1 unsigned int i,t=n;
47 1 for(i=0;i 48 1 {
49 2 a[i]=t%2;
50 2 t/=2;
51 2 }
52 1 }
53 /********************************/
54 //函数名:int fun22(int n)
55 //功能:计算2的n 次方
C51 COMPILER V6.12 S 08/10/2008 11:52:12 PAGE 2
56 /********************************/
57 int fun22(int n)
58 {
59 1 unsigned int i;
60 1 int f=1;
61 1 for(i=0;i 62 1 f*=2;
63 1 return f;
64 1 }
65 /**********将高位和低位进行交换*********************/
66 int fun21(void)
67 {
68 1 unsigned int i,t;
69 1 int s=0;
70 1 for(i=0;i 71 1 {
72 2 t=b[i]; //高低位进行交换
73 2 b[i]=b[7-i];
74 2 b[7-i]=t; // 在PTR800发送时先发高位,再发低位
75 2 }
76 1 for(i=0;i 77 1 s+=(b[i]*fun22(i)); //将二进制数转为十进制数
78 1 return s;
79 1 }
80
81 /*************************************/
82 void SpiWrite(int c) //SPI写 将单片机中数据写到ptr8000中
83 {
84 1 unsigned int i=8;
85 1 fun2(c); //将c转换为二进制数
86 1 for(i=0;i 87 1 {
88 2 Delay(10);
89 2 SCK=0;
90 2 MOSI=a[7-i]; //从高位到低位写
91 2 Delay(10);
92 2 SCK=1; ///sck给一个上升沿发送一位数据
93 2 Delay(10); //延时83us
94 2 SCK=0;
95 2 }
96 1 SCK=0;
97 1 }
98 /**************************************/
99 int SpiRead(void) //SPI读 从外部ptr8000中读入单片机
100 {
101 1 unsigned int i=8;
102 1 int ddata=0;
103 1 for(i=0;i 104 1 {
105 2
106 2 SCK=1 ;
107 2 if(MISO) b[i]=1;
108 2 else b[i]=0;
109 2
110 2 SCK=0;
111 2 Delay(20);
112 2 }
113 1 SCK=0;
114 1 Delay(20);
115 1 ddata=fun21(); //data十进制数
116 1 return ddata;
117 1 }
C51 COMPILER V6.12 S 08/10/2008 11:52:12 PAGE 3
118 /*******接收子程序********************************/
119 int PtrRead() //PTR8000读
120 {
121 1 int key;
122 1 Config905();
123 1
124 1 PWR=1;
125 1 TX_EN=0;
126 1 TRX_CE=1; //接收
127 1
128 1 while(!DR) ; //等待接收
129 1
130 1 while(DR) //接收数据准备就绪
131 1 {
132 2 PWR=1; //进入待机模式
133 2 TRX_CE=0;
134 2 TX_EN=0;
135 2 CSN=0; //片选
136 2 SpiWrite(0x24); //写读rx(接收)有效数据(配置)
137 2 {
138 3 key=SpiRead();
139 3 Delay(20);
140 3 }
141 2 CSN=1;
142 2 Delay(20);
143 2 return key;
144 2 }
145 1 }
146 /**********************************/
147 void Config905(void) //配置nRF905
148 { CSN=1;
149 1 SCK=0;
150 1 PWR=1;
151 1 TRX_CE=0;
152 1 TX_EN=0;
153 1 Delay(2);
154 1 CSN=0;
155 1 SpiWrite( 0x00); //配置命令//
156 1 SpiWrite( 0x4C); //CH_NO,配置频段在430MHZ 4c
157 1 SpiWrite( 0x0C); //输出功率为10db,不重发,节电为正常模式 0c
158 1 SpiWrite( 0x44); //地址宽度设置,为4字节
159 1 SpiWrite( 0x01);
160 1 SpiWrite( 0x01); //接收发送有效数据长度为1字节
161 1 SpiWrite( 0x19); //接收地址 4字节
162 1 SpiWrite( 0x85);
163 1 SpiWrite( 0x06);
164 1 SpiWrite( 0x27);
165 1 SpiWrite( 0x58); //16位CRC校验,CRC充许,16M晶振
166 1 CSN=1;
167 1 }
168 /***********************************/
169 void TxPacket(int ddata) //数据包发送
170 {
171 1 int x=ddata;
172 1 PWR=1; //待机和SPI编程模式
173 1 TRX_CE=0;
174 1 TX_EN=1;
175 1 CSN=0;
176 1 SpiWrite(0x22); //写发送地址,后面跟4字节地址//
177 1 SpiWrite(0x19); //0x19
178 1 SpiWrite(0x85); //0x85
179 1 SpiWrite(0x06); //0x06
C51 COMPILER V6.12 S 08/10/2008 11:52:12 PAGE 4
180 1 SpiWrite(0x27); //0x27
181 1 CSN=1;
182 1 Delay(20); //延时1/6ms
183 1 CSN=0;
184 1 SpiWrite(0x20); //写发送数据命令,后面跟一字节数据//
185 1 SpiWrite(x); //发送到数据
186 1 CSN=1;
187 1 Delay(20);
188 1 TRX_CE=1; //使能发射模式//
189 1 Delay(255); //等带发送完成//延时2ms
190 1 TRX_CE=0;
191 1 }
192 /*******主函数******************************/
193 void main()
194 {int key,i=0;
195 1 P1=0xff; //P1口初始化
196 1 Config905();
197 1
198 1 while(1)
199 1 {key=PtrRead();
200 2 if(key==1)
201 2 {P1=0x0f;
202 3 Delay(40000);
203 3 P1=0xff;
204 3
205 3 //while(1) //一直循环查询
206 3 for(i=0;i 207 3 TxPacket(2);
208 3 }
209 2 key=0;
210 2 // key=PtrRead();
211 2 }
212 1 }
213
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 702 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 38 16
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)