📄 main.lst
字号:
172 1 SPI_Write_Buf(WR_TX_PLOAD, id_buf, TX_PLOAD_WIDTH); // 写数据到FIFO
173 1 RFCE=1; // 启动发射
174 1 delay(10); // 发射脉冲
175 1 RFCE=0;
176 1 }
177
178 /**************************************************
179 功能:设置为接收模式
C51 COMPILER V9.00 MAIN 08/21/2012 17:44:01 PAGE 4
180 **************************************************/
181 void RX_Mode(void)
182 {
183 1 RFCE=0;
184 1 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
185 1 RFCE = 1; // 启动接收模式
186 1 }
187
188 /**************************************************
189 功能:RF初始化
190 **************************************************/
191 void rf_init(void)
192 {
193 1 RFCE = 0; // RF关闭
194 1 RFCKEN = 1; // 启动RF时钟
195 1 RF = 1; // 允许RF中断
196 1
197 1 delay(1000);
198 1
199 1 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 设置发射地址长度
200 1 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 设置接收地址长度
201 1
202 1 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 启动自动应答功能
203 1 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // PIPE0接收数据
204 1 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 自动重传10次
205 1 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // RF频率2440MHz
206 1 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); // 发射功率0dBm, 传输速率2Mbps,
207 1 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // PIPE0 接收数据包长度
208 1 }
209 /**************************************************
210 功能:RF中断服务程序
211 **************************************************/
212 void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
213 {
214 1 sta=SPI_Read(STATUS); // 读出状态值
215 1 if(RX_DR)
216 1 {
217 2 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 读出FIFO的数据
218 2 SPI_RW_Reg(FLUSH_RX,0); // 清除RX的FIFO
219 2 }
220 1 SPI_RW_Reg(WRITE_REG+STATUS,0x70); // 清除所有中断标志
221 1 }
222
223 /**************************************************
224 功能:RTC2初始化
225 **************************************************/
226 void rtc2_init(void)
227 {
228 1 CLKLFCTRL=0x01; // 使用RC 32KHz时钟
229 1 RTC2CMP0=0xff; // 定时2秒
230 1 RTC2CMP1=0xff;
231 1 RTC2CON=0x06; // 比较模式
232 1 WUIRQ=1; // 允许TICK中断
233 1 }
234 /**************************************************
235 功能:启动RTC2
236 **************************************************/
237 void rtc2_on(void)
238 {
239 1 RTC2CON |=0x01;
240 1 }
241 /**************************************************
C51 COMPILER V9.00 MAIN 08/21/2012 17:44:01 PAGE 5
242 功能:关闭RTC2
243 **************************************************/
244 void rtc2_off(void)
245 {
246 1 RTC2CON &=~0x01;
247 1 }
248 /**************************************************
249 功能:RTC2中断服务程序
250 **************************************************/
251 void RTC2_IRQ(void) interrupt INTERRUPT_TICK
252 {
253 1 LED2=!LED2;
254 1 }
255 /**************************************************
256 功能:串口初始化子程序
257 说明:波特率19.2K,使用内部波特率发生器
258 **************************************************/
259 void uart_init(void)
260 {
261 1 ES0 = 0; // 关UART0中断
262 1 REN0 = 1; // 允许接收
263 1 SM0 = 0; // 串口模式1,8bit可变波特率
264 1 SM1 = 1;
265 1 PCON |= 0x80; // SMOD = 1 ,PCON=1001000
266 1 ADCON |= 0x80; // 选择内部波特率发生器,ADCON=10000000;
267 1
268 1 S0RELL = 0xe6; // 波特率19.2K(十进制998=十六进制0x03e6)
269 1 S0RELH = 0x03;
270 1 TI0 = 0; // 清发送完成标志
271 1 S0BUF=0x99; // 送初值
272 1 }
273 /**************************************************
274 功能:I/O口初始化
275 **************************************************/
276 void io_init(void)
277 {
278 1 P0DIR = p0dir; // 设定I/O口输入输出
279 1 P1DIR = p1dir;
280 1
281 1 LED1=LED2=LED3=0; // 灯全亮
282 1 delay(1000);
283 1 LED1=LED2=LED3=1; // 灯全灭
284 1 }
285 /**************************************************
286 功能:主程序
287 **************************************************/
288 void main(void)
289 {
290 1 io_init(); // I/O口初始化
291 1 rf_init(); // RF初始化
292 1 EA=1; // 允许中断
293 1 rtc2_init(); // RTC2初始化
294 1
295 1 while(1)
296 1 {
297 2 rtc2_off(); // 关RTC2
298 2 TX_Mode(); // 发射数据
299 2 while (!(TX_DS|MAX_RT)); // 等待发射结束
300 2 sta = 0;
301 2 PD_Mode(); // 关RF
302 2 rtc2_on(); // 开RTC2
303 2 PWRDWN = 0x04; // 进入低功耗模式,等待RTC2唤醒
C51 COMPILER V9.00 MAIN 08/21/2012 17:44:01 PAGE 6
304 2 delay(10); // I/O口初始化
305 2 uart_init(); // 串口初始化
306 2 rf_init(); // RF初始化
307 2 RX_Mode();
308 2 delay(1000000000);
309 2 if(!RX_DR)
310 2 {
311 3 io_init(); // I/O口初始化
312 3 rf_init(); // RF初始化
313 3 EA=1; // 允许中断
314 3 rtc2_init(); // RTC2初始化
315 3 rtc2_off(); // 关RTC2
316 3 TX_Mode(); // 发射数据
317 3 while (!(TX_DS|MAX_RT)); // 等待发射结束
318 3 sta = 0;
319 3 PD_Mode(); // 关RF
320 3 rtc2_on(); // 开RTC2
321 3 PWRDWN = 0x04; // 进入低功耗模式,等待RTC2唤醒
322 3
323 3 }
324 2 else
325 2 {while(RX_DR);}
326 2 LED2=0;
327 2 delay(100000);
328 2 LED2=1;
329 2
330 2 }
331 1 }
332
333
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 583 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 47 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -