找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于nrf241e1与单片机的门禁系统设计

[复制链接]
跳转到指定楼层
楼主
本设计通过人体红外检测和振动模块检测来检测,是否有人砸门,通过nrf211e1模块实现无线传输,蜂鸣器报警。这是发射端程序。




单片机源码:
  1. /*********************************************************************
  2. 功能:
  3.         RFID TARGET发射程序
  4. 说明:
  5.         本程序采用定时2秒发射ID一次,发射完毕进入低功耗模式,低功耗电流3uA
  6.         ID长度为6 byte
  7. **********************************************************************/


  8. #include <Nordic\reg24le1.h>
  9. #include <stdint.h>
  10. #include "API.h"
  11. #include <intrins.h>

  12. #define        PIN32
  13. #ifdef         PIN32

  14. sbit S2  = P1^0;                                       //人体红外感应
  15. sbit S1  = P1^2;                                       // 震动模块


  16. sbit Ring = P0^1;                               // 1/0=灭/亮

  17. #define p0dir        0xf0
  18. #define p1dir        0xff
  19. #define p0con        0x23
  20. #define p1con        0x33
  21. #endif


  22. #define INTERRUPT_RFIRQ        9
  23. #define INTERRUPT_TICK         13  

  24. #define TX_ADR_WIDTH    5                                           // RF收发地址共5 bytes
  25. #define TX_PLOAD_WIDTH  20                                          // 数据包长度为20 bytes

  26. uint8_t const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x56,0x78,0x90,0x12}; // 定义RF收发地址

  27. uint8_t data id_buf[TX_PLOAD_WIDTH]={0x01, 0x02, 0x03, 0x04, 0x05};

  28. uint8_t bdata sta;
  29. sbit        RX_DR        =sta^6;
  30. sbit        TX_DS        =sta^5;
  31. sbit        MAX_RT        =sta^4;
  32. uint8_t ZD_flag=0,RSD_flag=0;

  33. /**************************************************
  34. 功能:延时
  35. **************************************************/
  36. void delay(uint16_t x)
  37. {
  38.     uint16_t i,j;
  39.     i=0;
  40.     for(i=0;i<x;i++)
  41.     {
  42.        j=108;
  43.            ;
  44.        while(j--);
  45.     }
  46. }
  47. void delayus(uint16_t x)
  48. {
  49.     uint16_t i;
  50.     i=0;
  51.     for(i=0;i<x;i++)
  52.     {
  53.        _nop_();
  54.     }
  55. }
  56. /**************************************************
  57. 功能:硬件SPI读写
  58. **************************************************/
  59. uint8_t SPI_RW(uint8_t value)
  60. {
  61.   SPIRDAT = value;
  62.                                                                                                 
  63.   while(!(SPIRSTAT & 0x02));                                          // 等待SPI传输完成

  64.   return SPIRDAT;                                                     // 返回读出值
  65. }
  66. /**************************************************
  67. 功能:写RF寄存器,读RF状态值
  68. **************************************************/
  69. uint8_t SPI_RW_Reg(uint8_t reg, uint8_t value)
  70. {
  71.         uint8_t status;

  72.           RFCSN = 0;                           
  73.           status = SPI_RW(reg);                                              // 选择RF寄存器
  74.           SPI_RW(value);                                                     // 写入数据
  75.           RFCSN = 1;                           

  76.           return(status);                                                    // 返回RF状态值
  77. }
  78. /**************************************************
  79. 功能:读RF寄存器
  80. **************************************************/
  81. uint8_t SPI_Read(uint8_t reg)
  82. {
  83.         uint8_t reg_val;

  84.           RFCSN = 0;                                       
  85.           SPI_RW(reg);                                                    // 选择RF寄存器
  86.           reg_val = SPI_RW(0);                                            // 读出数据
  87.           RFCSN = 1;                                       

  88.           return(reg_val);                                                // 返回RF状态值
  89. }
  90. /**************************************************
  91. 功能:把缓冲区的多字节数据写到RF寄存器
  92. **************************************************/
  93. uint8_t SPI_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
  94. {
  95.         uint8_t status,byte_ctr;

  96.           RFCSN = 0;                                   
  97.           status = SPI_RW(reg);                                            // 选择RF寄存器
  98.           for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 连接写入数据
  99.             SPI_RW(*pBuf++);
  100.           RFCSN = 1;                                         
  101.           return(status);                                                  // 返回RF状态值
  102. }
  103. /**************************************************
  104. 功能:设置为掉电模式
  105. **************************************************/
  106. void PD_Mode(void)
  107. {
  108.           RFCE=0;
  109.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0c);           // PWR_UP=0
  110. }
  111. /**************************************************
  112. 功能:设置为发射模式
  113. **************************************************/
  114. void TX_Mode(void)
  115. {
  116.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                             // 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
  117.         id_buf[0] =  0x00;
  118.         id_buf[1] =  0x01;
  119.         id_buf[2] =  0x02;
  120.         //id_buf[3] =  0x03;
  121.         //id_buf[4] =  0x04;
  122.         id_buf[5] =  0x05;
  123.         id_buf[6] =  0x06;
  124.         id_buf[7] =  0x07;
  125.         id_buf[8] =  0x08;
  126.         id_buf[9] =  0x09;
  127.   SPI_Write_Buf(WR_TX_PLOAD, id_buf, TX_PLOAD_WIDTH); // 写数据到FIFO
  128.         RFCE=1;                                                                                                // 启动发射
  129.         delay(10);                                                                                        // 发射脉冲
  130.         RFCE=0;                                                                                                
  131. }
  132. /**************************************************
  133. 功能:RF初始化
  134. **************************************************/
  135. void rf_init(void)
  136. {
  137.           RFCE = 0;                                                   // RF关闭
  138.           RFCKEN = 1;                                                 // 启动RF时钟
  139.           RF = 1;                                                     // 允许RF中断

  140.         delay(1000);

  141.           SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);            // 设置发射地址长度
  142.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);         // 设置接收地址长度

  143.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                              // 启动自动应答功能
  144.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                          // PIPE0接收数据
  145.           SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);                         // 自动重传10次
  146.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);                                // RF频率2440MHz
  147.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);                           // 发射功率0dBm, 传输速率2Mbps,
  148.           SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);         // PIPE0 接收数据包长度                        
  149. }
  150. /**************************************************
  151. 功能:RF中断服务程序
  152. **************************************************/
  153. void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
  154. {
  155.         sta=SPI_Read(STATUS);                                                                // 读出状态值
  156.         SPI_RW_Reg(WRITE_REG+STATUS,0x70);                                        // 清除所有中断标志
  157. }

  158. /**************************************************
  159. 功能:RTC2初始化
  160. **************************************************/
  161. void rtc2_init(void)
  162. {
  163.         CLKLFCTRL=0x01;                                                                                   // 使用RC 32KHz时钟
  164.         RTC2CMP0=0xff;                                                                                // 定时2秒
  165.         RTC2CMP1=0xff;
  166.         RTC2CON=0x06;                                                                                // 比较模式
  167.         WUIRQ=1;                                                                                        // 允许TICK中断
  168. }
  169. /**************************************************
  170. 功能:启动RTC2
  171. **************************************************/
  172. void rtc2_on(void)
  173. {
  174.         RTC2CON |=0x01;                                                                        
  175. }
  176. /**************************************************
  177. 功能:关闭RTC2
  178. **************************************************/
  179. void rtc2_off(void)
  180. {                                                                                                                  
  181.         RTC2CON &=~0x01;                                                                           
  182. }
  183. /**************************************************
  184. 功能:RTC2中断服务程序
  185. **************************************************/
  186. void RTC2_IRQ(void) interrupt INTERRUPT_TICK
  187. {
  188.         ;                                                                                          
  189. }                                             
  190. /**************************************************
  191. 功能:I/O口初始化
  192. **************************************************/
  193. void io_init(void)
  194. {
  195.           P0DIR = p0dir;                                                                   // 设定I/O口输入输出
  196.           P1DIR = p1dir;                                       
  197.     P0CON = p0con;
  198.           P1CON = p1con;
  199.         
  200. }  
  201. void buzz()
  202. {
  203.      Ring = 1;
  204.         delay(1000);
  205.                 Ring = 0;
  206.         delay(1000);
  207. }
  208. void buzz1()
  209. {
  210.     Ring = 1;
  211.         delay(1000);
  212.                  Ring = 0;
  213.         delay(50);
  214. }
  215. void launch(void)
  216. {                if(ZD_flag==1&&RSD_flag==1)
  217.                 {
  218.                         id_buf[3] =  0x11;
  219.             id_buf[4] =  0xff;
  220.                
  221.                 }
  222.                 else if(RSD_flag==0&&ZD_flag==1)
  223.                 {
  224.                         id_buf[3] =  0x33;
  225.             id_buf[4] =  0x44;
  226.                 }
  227.                 else
  228.     {
  229.                         id_buf[3] =  0x00;
  230.             id_buf[4] =  0x00;
  231.                 }
  232. }

  233. void control(void)
  234. {        int8_t y;
  235.         
  236.                  if(RSD_flag==0&&ZD_flag==1)
  237.                                 {
  238.                                         for(y=10;y>0;y--)
  239.                                         {
  240.                                           buzz();
  241.                                         }                                                
  242.                                 }
  243.                         else if(RSD_flag==1&&ZD_flag==1)
  244.                                 {
  245.                                 for(y=20;y>0;y--)
  246.                                         {
  247.                                     buzz1();
  248.                                         }               
  249.                                                         
  250.                                 }
  251.                                 else Ring=0;
  252.                                 
  253. }
  254. unsigned char keyscan(void)
  255. {
  256. unsigned char flag=0,num=0;

  257. if(S1==1)
  258.         {        
  259.                 delay(5);
  260.                 if(S1==1)
  261.                 {
  262.                
  263.                         ZD_flag=1;
  264.                
  265.                 }
  266.                
  267.         }
  268.         else ZD_flag=0;
  269.         if(S2==1)
  270.         {
  271.                 delay(5);
  272.                 if(S2==1)
  273.                 {
  274.                         RSD_flag=1;
  275.                 }
  276.                
  277. }
  278.         else RSD_flag=0;
  279.         return 0;
  280. }

  281. /**************************************************
  282. 功能:主程序
  283. **************************************************/
  284. void main(void)
  285. {
  286.         io_init();                                                                        // I/O口初始化
  287.         rf_init();                                                                        // RF初始化                           
  288.           EA=1;                                       // 允许中断         
  289.         rtc2_init();
  290.                                                                                                 // RTC2初始化
  291.         while(1)
  292.         {
  293.                
  294.                 keyscan();
  295.                
  296.                 rtc2_off();                                                                   // 关RTC2
  297.                 launch();
  298.                 TX_Mode();                                                                // 发射数据
  299.                 while (!(TX_DS|MAX_RT));                                // 等待发射结束
  300.                 control();
  301.                 sta = 0;
  302.                 PD_Mode();                                                                // 关RF
  303.                 rtc2_on();                                                                // 开RTC2
  304.                 PWRDWN = 0x04;                                                        // 进入低功耗模式,等待RTC2唤醒
  305.                 delay(100);
  306.                
  307.         }
  308. }                                             


复制代码
具体使用看附件
全部资料51hei下载地址:
门禁程序.rar (10.73 MB, 下载次数: 26)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:81961 发表于 2018-5-4 09:21 | 只看该作者
自己给自己顶一个
回复

使用道具 举报

板凳
ID:585943 发表于 2019-7-17 18:14 | 只看该作者
为什么都回复不了啊,觉得这个程序是真的不错,顶一下楼主。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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