本設計通過人體紅外檢測和振動模塊檢測來檢測,是否有人砸門,通過nrf211e1模塊實現無線傳輸,蜂鳴器報警。這是發射端程序。
22222.jpg (5.22 MB, 下載次數: 82)
下載附件
2018-5-4 09:20 上傳
11111.jpg (4.32 MB, 下載次數: 69)
下載附件
2018-5-4 09:20 上傳
0.png (41.37 KB, 下載次數: 69)
下載附件
2018-5-4 17:50 上傳
單片機源碼:
- /*********************************************************************
- 功能:
- RFID TARGET發射程序
- 說明:
- 本程序采用定時2秒發射ID一次,發射完畢進入低功耗模式,低功耗電流3uA
- ID長度為6 byte
- **********************************************************************/
- #include <Nordic\reg24le1.h>
- #include <stdint.h>
- #include "API.h"
- #include <intrins.h>
- #define PIN32
- #ifdef PIN32
- sbit S2 = P1^0; //人體紅外感應
- sbit S1 = P1^2; // 震動模塊
- sbit Ring = P0^1; // 1/0=滅/亮
- #define p0dir 0xf0
- #define p1dir 0xff
- #define p0con 0x23
- #define p1con 0x33
- #endif
- #define INTERRUPT_RFIRQ 9
- #define INTERRUPT_TICK 13
- #define TX_ADR_WIDTH 5 // RF收發地址共5 bytes
- #define TX_PLOAD_WIDTH 20 // 數據包長度為20 bytes
- uint8_t const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x56,0x78,0x90,0x12}; // 定義RF收發地址
- uint8_t data id_buf[TX_PLOAD_WIDTH]={0x01, 0x02, 0x03, 0x04, 0x05};
- uint8_t bdata sta;
- sbit RX_DR =sta^6;
- sbit TX_DS =sta^5;
- sbit MAX_RT =sta^4;
- uint8_t ZD_flag=0,RSD_flag=0;
- /**************************************************
- 功能:延時
- **************************************************/
- void delay(uint16_t x)
- {
- uint16_t i,j;
- i=0;
- for(i=0;i<x;i++)
- {
- j=108;
- ;
- while(j--);
- }
- }
- void delayus(uint16_t x)
- {
- uint16_t i;
- i=0;
- for(i=0;i<x;i++)
- {
- _nop_();
- }
- }
- /**************************************************
- 功能:硬件SPI讀寫
- **************************************************/
- uint8_t SPI_RW(uint8_t value)
- {
- SPIRDAT = value;
-
- while(!(SPIRSTAT & 0x02)); // 等待SPI傳輸完成
- return SPIRDAT; // 返回讀出值
- }
- /**************************************************
- 功能:寫RF寄存器,讀RF狀態值
- **************************************************/
- uint8_t SPI_RW_Reg(uint8_t reg, uint8_t value)
- {
- uint8_t status;
- RFCSN = 0;
- status = SPI_RW(reg); // 選擇RF寄存器
- SPI_RW(value); // 寫入數據
- RFCSN = 1;
- return(status); // 返回RF狀態值
- }
- /**************************************************
- 功能:讀RF寄存器
- **************************************************/
- uint8_t SPI_Read(uint8_t reg)
- {
- uint8_t reg_val;
- RFCSN = 0;
- SPI_RW(reg); // 選擇RF寄存器
- reg_val = SPI_RW(0); // 讀出數據
- RFCSN = 1;
- return(reg_val); // 返回RF狀態值
- }
- /**************************************************
- 功能:把緩沖區的多字節數據寫到RF寄存器
- **************************************************/
- uint8_t SPI_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
- {
- uint8_t status,byte_ctr;
- RFCSN = 0;
- status = SPI_RW(reg); // 選擇RF寄存器
- for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 連接寫入數據
- SPI_RW(*pBuf++);
- RFCSN = 1;
- return(status); // 返回RF狀態值
- }
- /**************************************************
- 功能:設置為掉電模式
- **************************************************/
- void PD_Mode(void)
- {
- RFCE=0;
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0c); // PWR_UP=0
- }
- /**************************************************
- 功能:設置為發射模式
- **************************************************/
- void TX_Mode(void)
- {
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // 上電, CRC為2 bytes,接收模式,允許RX_DR產生中斷
- id_buf[0] = 0x00;
- id_buf[1] = 0x01;
- id_buf[2] = 0x02;
- //id_buf[3] = 0x03;
- //id_buf[4] = 0x04;
- id_buf[5] = 0x05;
- id_buf[6] = 0x06;
- id_buf[7] = 0x07;
- id_buf[8] = 0x08;
- id_buf[9] = 0x09;
- SPI_Write_Buf(WR_TX_PLOAD, id_buf, TX_PLOAD_WIDTH); // 寫數據到FIFO
- RFCE=1; // 啟動發射
- delay(10); // 發射脈沖
- RFCE=0;
- }
- /**************************************************
- 功能:RF初始化
- **************************************************/
- void rf_init(void)
- {
- RFCE = 0; // RF關閉
- RFCKEN = 1; // 啟動RF時鐘
- RF = 1; // 允許RF中斷
- delay(1000);
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 設置發射地址長度
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 設置接收地址長度
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 啟動自動應答功能
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // PIPE0接收數據
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 自動重傳10次
- SPI_RW_Reg(WRITE_REG + RF_CH, 40); // RF頻率2440MHz
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); // 發射功率0dBm, 傳輸速率2Mbps,
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // PIPE0 接收數據包長度
- }
- /**************************************************
- 功能:RF中斷服務程序
- **************************************************/
- void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
- {
- sta=SPI_Read(STATUS); // 讀出狀態值
- SPI_RW_Reg(WRITE_REG+STATUS,0x70); // 清除所有中斷標志
- }
- /**************************************************
- 功能:RTC2初始化
- **************************************************/
- void rtc2_init(void)
- {
- CLKLFCTRL=0x01; // 使用RC 32KHz時鐘
- RTC2CMP0=0xff; // 定時2秒
- RTC2CMP1=0xff;
- RTC2CON=0x06; // 比較模式
- WUIRQ=1; // 允許TICK中斷
- }
- /**************************************************
- 功能:啟動RTC2
- **************************************************/
- void rtc2_on(void)
- {
- RTC2CON |=0x01;
- }
- /**************************************************
- 功能:關閉RTC2
- **************************************************/
- void rtc2_off(void)
- {
- RTC2CON &=~0x01;
- }
- /**************************************************
- 功能:RTC2中斷服務程序
- **************************************************/
- void RTC2_IRQ(void) interrupt INTERRUPT_TICK
- {
- ;
- }
- /**************************************************
- 功能:I/O口初始化
- **************************************************/
- void io_init(void)
- {
- P0DIR = p0dir; // 設定I/O口輸入輸出
- P1DIR = p1dir;
- P0CON = p0con;
- P1CON = p1con;
-
- }
- void buzz()
- {
- Ring = 1;
- delay(1000);
- Ring = 0;
- delay(1000);
- }
- void buzz1()
- {
- Ring = 1;
- delay(1000);
- Ring = 0;
- delay(50);
- }
- void launch(void)
- { if(ZD_flag==1&&RSD_flag==1)
- {
- id_buf[3] = 0x11;
- id_buf[4] = 0xff;
-
- }
- else if(RSD_flag==0&&ZD_flag==1)
- {
- id_buf[3] = 0x33;
- id_buf[4] = 0x44;
- }
- else
- {
- id_buf[3] = 0x00;
- id_buf[4] = 0x00;
- }
- }
- void control(void)
- { int8_t y;
-
- if(RSD_flag==0&&ZD_flag==1)
- {
- for(y=10;y>0;y--)
- {
- buzz();
- }
- }
- else if(RSD_flag==1&&ZD_flag==1)
- {
- for(y=20;y>0;y--)
- {
- buzz1();
- }
-
- }
- else Ring=0;
-
- }
- unsigned char keyscan(void)
- {
- unsigned char flag=0,num=0;
-
- if(S1==1)
- {
- delay(5);
- if(S1==1)
- {
-
- ZD_flag=1;
-
- }
-
- }
- else ZD_flag=0;
- if(S2==1)
- {
- delay(5);
- if(S2==1)
- {
- RSD_flag=1;
- }
-
- }
- else RSD_flag=0;
- return 0;
- }
- /**************************************************
- 功能:主程序
- **************************************************/
- void main(void)
- {
- io_init(); // I/O口初始化
- rf_init(); // RF初始化
- EA=1; // 允許中斷
- rtc2_init();
- // RTC2初始化
- while(1)
- {
-
- keyscan();
-
- rtc2_off(); // 關RTC2
- launch();
- TX_Mode(); // 發射數據
- while (!(TX_DS|MAX_RT)); // 等待發射結束
- control();
- sta = 0;
- PD_Mode(); // 關RF
- rtc2_on(); // 開RTC2
- PWRDWN = 0x04; // 進入低功耗模式,等待RTC2喚醒
- delay(100);
-
- }
- }
復制代碼 具體使用看附件
全部資料51hei下載地址:
門禁程序.rar
(10.73 MB, 下載次數: 26)
2018-5-4 09:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|