找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8817|回复: 3
收起左侧

基于单片机的RC522智能门锁pcb文件+源码+原理图

[复制链接]
ID:268105 发表于 2018-1-5 15:25 | 显示全部楼层 |阅读模式
基于单片机的智能门锁
0.jpg

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.jpg 0.jpg

单片机源程序如下:
  1. #include "lpcreg.h"
  2. #include "main.h"
  3. #include "mfrc522.h"
  4. #include   <STDIO.H>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. unsigned char g_ucTempbuf[4];   
  8. unsigned long int numble =0;
  9. unsigned char mima=0;   

  10. #define GPIO_KEY P2
  11. unsigned int KeyValue = 0;
  12. void Delay10ms(void);   //误差 0us
  13. void KeyDown(void);     
  14. void mimachuli();

  15. /********新写入*****************/
  16. sfr AUXR  = 0x8e;               //辅助寄存器
  17. sfr P_SW1   = 0xA2;             //外设功能切换寄存器1
  18. sbit beer =P1^2;
  19. sbit key_jdq = P0^5;
  20. sbit open_key = P1^4;        //按键开关
  21. unsigned char car_ID[4];
  22. void beersystem();
  23. void ID();
  24. void openroom();
  25. void beersystem2();
  26. unsigned char renti_flag = 1;
  27. void colseromm_beep();
  28. void Delay10ms(void) ;  //误差 0us
  29. void key_jiance();
  30. unsigned int j=0;
  31. void UartInit(void)        ;        //115200bps@11.0592MHz
  32. void SendData(unsigned char ch);
  33. void SendString(char *h);



  34. void main( )
  35. {   
  36.         unsigned char status,num;
  37.         UartInit();                //115200bps@11.0592MHz
  38.         beer = 1;
  39.         key_jdq =0;
  40.         beer = 1;
  41.         key_jdq =0;
  42.     PcdReset();
  43.     PcdAntennaOff();
  44.     PcdAntennaOn();  
  45.     open_key = 1 ;//不开门
  46.         open_key = 1 ;//不开门
  47.         while ( 1 )                //等待刷卡
  48.     {             
  49.         key_jiance();  //按键检测  
  50.         status = PcdRequest(PICC_REQALL, g_ucTempbuf);
  51.         status = PcdAnticoll(g_ucTempbuf);
  52.         if (status != MI_OK)
  53.         {   
  54.                                 key_jiance();  //按键检测
  55.                  KeyValue =20;
  56.                      KeyDown();
  57.                         switch(KeyValue)          //密码10086
  58.                         {
  59.                                 case(3):mima =1;mimachuli();        beer =0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();beer =1;KeyValue=20;        break;
  60.                                 case(2):mima =2;mimachuli();        beer =0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();beer =1;KeyValue=20;        break;
  61.                                 case(1):mima =3;mimachuli();        beer =0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();beer =1;KeyValue=20;        break;
  62.                                 case(0):
  63.                                                         if(numble == 12313)                //15973
  64.                                                         {
  65.                                                            //开门
  66.                                                                    numble= 0;
  67.                                                                    openroom();       
  68.                                                                 numble= 0;
  69.                                                         }
  70.                                                         else
  71.                                                         {
  72.                                                                 numble= 0;       
  73.                                                                 beer =0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();beer =1;
  74.                                                                 Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();
  75.                                                                 beer =0; Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();beer =1;
  76.                                                         }

  77.                                  KeyValue=20;        break;
  78.                                  default: break;
  79.                         }

  80.                 continue;
  81.         }
  82. /********************刷卡后跳到这里来*************************/                
  83.         for(num=0;num<4;num++)
  84.         {
  85.                 car_ID[num]=g_ucTempbuf[num];          //循环四次把g_ucTempbuf[num]给
  86.            }       
  87.         SendData(car_ID[0]);
  88.         SendData(car_ID[1]);
  89.         SendData(car_ID[2]);
  90.         SendData(car_ID[3]);
  91. /**********允许刷的卡******************************************/
  92.           if                       
  93.                    (car_ID[0]==0x73&&car_ID[1]==0x34&&car_ID[2]==0x34&&car_ID[3]==0xd9         ||                          //1
  94.                 car_ID[0]==0xa6&&car_ID[1]==0x54&&car_ID[2]==0x34&&car_ID[3]==0xd9         ||                          //A6 54 34 D9
  95.                 car_ID[0]==0x30&&car_ID[1]==0x7b&&car_ID[2]==0xdf&&car_ID[3]==0xa9         ||                          //30 7B DF A9
  96.                 car_ID[0]==0xec&&car_ID[1]==0x60&&car_ID[2]==0xdf&&car_ID[3]==0xa9         ||                          //EC 60 DF A9
  97.                 car_ID[0]==0xdd&&car_ID[1]==0xc6&&car_ID[2]==0xde&&car_ID[3]==0xa9         ||                          //DD C6 DE A9
  98.                 car_ID[0]==0x06&&car_ID[1]==0xb2&&car_ID[2]==0xdf&&car_ID[3]==0xa9         ||                          //06 B2 DF A9
  99.                 car_ID[0]==0x63&&car_ID[1]==0x10&&car_ID[2]==0xdf&&car_ID[3]==0xa9         ||                          //63 10 DF A9
  100.                 car_ID[0]==0x68&&car_ID[1]==0x4e&&car_ID[2]==0x34&&car_ID[3]==0xd9         ||                          //68 4E 34 D9
  101.                 car_ID[0]==0x03&&car_ID[1]==0xdd&&car_ID[2]==0xde&&car_ID[3]==0xa9         ||                     //03 DD DE A9
  102.                 car_ID[0]==0xad&&car_ID[1]==0xdb&&car_ID[2]==0xde&&car_ID[3]==0xa9         ||                   //AD DB DE A9
  103.                 car_ID[0]==0x86&&car_ID[1]==0x85&&car_ID[2]==0xdf&&car_ID[3]==0xa9         ||                          //86 85 DF A9
  104.                 car_ID[0]==0x24&&car_ID[1]==0xfc&&car_ID[2]==0x35&&car_ID[3]==0xd9                           //24 FC 35 D9

  105.                   )
  106.                                                                                                                                        
  107.                 {      
  108.                            openroom();       

  109.                 }
  110.         else
  111.         {       
  112.         car_ID[0]=0;

  113.         }

  114.     }
  115.        
  116. }
  117. void beersystem()
  118. {
  119.           unsigned char ii =0;
  120.            beer=0;
  121.        for(ii=0;ii<60;ii++)          
  122.                    {
  123.                             Delay10ms();   
  124.                    }
  125.          beer=1;
  126.        for(ii=0;ii<10;ii++)                   //5S后
  127.                    {
  128.                             Delay10ms();                  
  129.                    }
  130.         beer=0;
  131.       for(ii=0;ii<20;ii++)                   //5S后
  132.                    {
  133.                             Delay10ms();                  
  134.                    }
  135.         beer=1;
  136. }
  137. void beersystem2()
  138. {
  139.           unsigned char ii =0;
  140.            beer=0;
  141.        for(ii=0;ii<20;ii++)          
  142.                    {
  143.                             Delay10ms();   
  144.                    }
  145.          beer=1;
  146.        for(ii=0;ii<20;ii++)                   //5S后
  147.                    {
  148.                             Delay10ms();                  
  149.                    }
  150.         beer=0;
  151.       for(ii=0;ii<20;ii++)                   //5S后
  152.                    {
  153.                             Delay10ms();                  
  154.                    }
  155.         beer=1;
  156. }

  157. void Delay10ms(void)   //误差 0us
  158. {
  159.         unsigned char i, j;
  160.         i = 108;
  161.         j = 145;
  162.         do
  163.         {
  164.                 while (--j);
  165.         } while (--i);

  166. }
  167. void openroom()
  168. {               
  169.                    key_jdq=1;              //继电器打开        ,开门
  170.                    beersystem();          //蜂鸣器响                        
  171.                    for(j=0;j<300;j++)          //5S后
  172.                    {
  173.                             Delay10ms();                  
  174.                    }
  175.                    key_jdq=0;              //继电器关闭,关门
  176. }


  177. void key_jiance()
  178. {
  179.         if(open_key == 0)
  180.         {

  181.                             Delay10ms();  Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();
  182.                             Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms(); Delay10ms();
  183.                   
  184.                          if(open_key == 0)
  185.                         {
  186.                                   openroom();
  187.                                
  188.                            }
  189.        
  190.         }
  191. }

  192. void UartInit(void)                //115200bps@11.0592MHz
  193. {
  194.         SCON = 0x50;                //8位数据,可变波特率
  195.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  196.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  197.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  198.         TL1 = 0xE0;                //设定定时初值
  199.         TH1 = 0xFE;                //设定定时初值
  200.         ET1 = 0;                //禁止定时器1中断
  201.         TR1 = 1;                //启动定时器1
  202. }

  203. /*----------------------------
  204. 发送串口数据1
  205. ----------------------------*/
  206. void SendData(unsigned char ch)
  207. {
  208.     SBUF = ch;                 //写数据到UART数据寄存器
  209.                 while(TI == 0);
  210.                 TI = 0;
  211. }
  212. /*----------------------------
  213. 发送字符串
  214. ----------------------------*/
  215. void SendString(char *h)
  216. {
  217.     while (*h)                  //检测字符串结束标志
  218.     {
  219.         SendData(*h++);         //发送当前字符
  220.     }
  221. }

  222. /*******************************************************************************
  223. * 函 数 名         : KeyDown
  224. * 函数功能                   : 检测有按键按下并读取键值
  225. * 输    入         : 无
  226. * 输    出         : 无
  227. *******************************************************************************/
  228. void KeyDown(void)
  229. {
  230.         char a=0;
  231.         GPIO_KEY=0x0f;
  232.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  233.         {
  234.                 Delay10ms();//延时10ms进行消抖
  235.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  236.                 {
  237.                         //测试列
  238. ……………………

  239. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
事务部门禁PCB.rar (1.89 MB, 下载次数: 111)

评分

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

查看全部评分

回复

使用道具 举报

ID:327955 发表于 2018-11-27 15:08 | 显示全部楼层
大神,你这个MFRC522有休眠吗
回复

使用道具 举报

ID:354798 发表于 2019-6-3 19:32 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:616942 发表于 2019-11-24 17:31 | 显示全部楼层
楼主能发到我邮箱吗?能让我学习学习吗
1712450498@qq.com
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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