有源RFID的电子标签卡程序,使用24LE1的MCU+射频来实现,低功耗的有源电子标签
源程序如下:
- #include <reg24le1.h>
- #include <stdint.h>
- #include <API.h>
- #include <nvdata.h>
- #include <radio.h>
- #include <system.h>
- //#include <uart.h>
- uint8_t data rx_buf[RX_PLOAD_WIDTH] = {0};
- uint8_t data tx_buf[TX_PLOAD_WIDTH] = {0x00,0x00,0x00,0xEB};
- uint8_t radio_status = 0;
- uint8_t bdata sta; //IRQ中断后,判断是接收中断、发送中断和重发最大中断。
- sbit RX_DR =sta^6;
- sbit TX_DS =sta^5;
- sbit MAX_RT =sta^4;
- uint8_t flag = 0,flag1 = 0; //定时器计数标志变量
- uint8_t pck_length = 0; //RF数据包长度
- uint8_t cmd = 0; //卡号异或结果
- uint8_t xdata packet[6] = {0}; //串口发送数据包
- uint8_t xdata packet1[4] = {0}; //串口发送心跳包
- /**************************************************
- 功能:主程序
- **************************************************/
- void main(void)
- {
- mcu_init(); //系统时钟
- //uart_init(); // 串口初始化
- io_init(); // I/O口初始化
- //timer1_init(); // 定时器初始化
- rf_init(); // RF初始化
- //RX_Mode(); // 进入接收模式
- TX_Mode(); // 进入发送模式
- EA=1; // 允许中断
- while(1)
- {
- watchdog_init();
- //=====================PWRDWN节电模式=====================
- RTC2CON |= 0x01; //RTC2配置开启
- PWRDWN = 0x04; //enter "pwr_dwn"=0x04,register retention寄存器保留
- RTC2CON &=~ 0x01; //RTC2配置关闭
- //LED1 = ~LED1;
- //LED2 = ~LED2;
- //ALM = ~ALM; //蜂鸣器
-
- tx_buf[0] = ((tx_buf[1] ^ tx_buf[2] ^ tx_buf[3]) & 0x7f);
-
- if(VotageStatusCheck())
- tx_buf[1] |= 0x80;//置位电量不足标志
- else
- tx_buf[1] &=~ 0x80;
- //数据发射
- SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
- CE_PULSE(); //CE置高至少10us,CE置低
- radio_status = 0xff;
- while(radio_status==0xff); // Wait until radio ready
- //数据发射完成
- }
- }
- /**************************************************
- 功能:RF中断服务程序
- **************************************************/
- void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
- {
- sta=SPI_Read(STATUS); // 读出状态值
- if(RX_DR)
- {
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// 读出FIFO的数据
- SPI_RW_Reg(FLUSH_RX,0); // 清除RX的FIFO
- radio_status = 6;
- }
-
- if(TX_DS)
- {
- RFCE = 0;
- radio_status = 5;
- }
- if(MAX_RT)
- {
- radio_status = 4;
- }
- SPI_RW_Reg(WRITE_REG+STATUS,0x70); // 清除所有中断标志
- }
- ////////////////////////////////////////////////////////////////////////
- void TimeSvr(void) interrupt INTERRUPT_TF1
- {
- TR1 = 0; //进入后先关闭定时器,执行完再打开
- TH1 = 0x97;
- TL1 = 0xD5; //20mS f=16M/12
- flag ++;
-
- if(flag >=50)
- {
- flag = 0;
- //watchdog_init(); //喂狗
- }
- TR1 = 1;
- }
- void ri0_interrupt(void) interrupt INTERRUPT_RI0
- {
- if (RI0 == 1)
- {
- RI0 = 0;
- /*
- S0BUF = hal_flash_byte_read(HAL_DATA_NV_ADDRESS32);
- while (!TI0); // 等待发送完成
- TI0=0; // 清发送完成标志
- */
- }
- /*
- else if (TI0 == 1)
- {
- TI0 = 0;
- }
- */
- }
复制代码
所有资料51hei提供下载:
24LE1_2.4GCard.zip
(70.01 KB, 下载次数: 46)
|