找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机射频RFID考勤数计数系统设计

[复制链接]
跳转到指定楼层
楼主
51单片机射频RFID考勤上课上班统计设计主要具有如下功能:
本设计由STC89C52单片机电路+RFID模块电路+1602液晶显示电路+按键电路+蜂鸣器报警电路+电源电路组成。
1、系统有3张,分别代表依次是张三、李四、王二。
2、任何一个人刷成功能,1602液晶响应显示,未刷显示空“ ”位置上空的,刷成功后相应位置显示有人。
3、液晶第二行显示刷的人数,即出勤总人数。
4、按下按键表示上课,如果签到人数和总人数不符合,蜂鸣器
具体程序和图见本帖附件
原理图如下所示:

单片机源码如下:
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include<stdio.h>
  3. #include <intrins.h>
  4. #include "delay.h"
  5. #include "rc522.h"
  6. #include "1602.h"

  7. sbit key = P1^1;  //接口定义
  8. sbit buzzer  = P1^0;  //接口定义

  9. /*********/
  10. unsigned char code zsID[4]={0x56,0xe9,0xe0,0x73};        //张三号
  11. unsigned char code lsID[4]={0x8a,0xa7,0xe3,0x73};        //李四号
  12. unsigned char code weID[4]={0xc9,0xad,0x84,0xc3};        //王二号
  13. /*********/

  14. unsigned char UID[5];        //号
  15. unsigned char Temp[4] ; //暂存数组  

  16. unsigned long time_20ms;   //定时计数
  17. char dis0[16];                //液晶显示数组
  18. char dis1[16];
  19. unsigned char zsFlag =' ';//张三 是否到标志
  20. unsigned char lsFlag =' ';//李四 是否到标志
  21. unsigned char weFlag =' ';//王二 是否到标志
  22. unsigned char disFlag =0;        //显示标志
  23. unsigned char manNum=0;                         //人数
  24. bit buzFlag = 0; //蜂鸣器报警标志
  25. void Init_Timer0(void);                 //函数声明
  26. void UART_Init(void);
  27. void uartSendStr(unsigned char *s,unsigned char length);
  28. void uartSendByte(unsigned char dat);

  29. void main (void)
  30. {     
  31.         unsigned char disPlace=0;        //显示位置
  32.         Init_Timer0();        //定时器0初始化
  33.         UART_Init();          //串口初始化

  34.         buzzer = 0; //报警         开
  35.         LCD_Init();           //初始化液晶
  36.         DelayMs(100);          //延时有助于稳定
  37.         LCD_Clear();
  38.         buzzer = 0; //报警         关

  39.         PcdReset();//复位RC522
  40.         PcdAntennaOn();//开启天线发射

  41.         sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印数据        
  42.         LCD_Write_String(0,0,dis0);//显示第二行

  43.         while (1)         //主循环
  44.         {

  45.                  if(PcdRequest(0x52,Temp)==MI_OK)  //检测到号
  46.             {
  47.               if(PcdAnticoll(UID)==MI_OK) //读取号成功
  48.               {
  49.                 uartSendByte(0x00);        //串口发送号
  50.                         uartSendStr(UID,4);
  51.                 uartSendByte(0x00);
  52.                         if((UID[0]==zsID[0])&&(UID[1]==zsID[1]))//张三 到
  53.                         {
  54.                                 if(zsFlag != 0xff)        //第一次刷到该
  55.                                 {                                                        
  56.                                         zsFlag =0xff;           //显示 到
  57.                                         time_20ms = 8;buzzer = 0;          //蜂鸣器短暂鸣叫
  58.                                 }
  59.                         }
  60.                         else if((UID[0]==lsID[0])&&(UID[1]==lsID[1]))//李四 到
  61.                         {
  62.                                 if(lsFlag != 0xff)          //第一次刷到该
  63.                                 {
  64.                                         lsFlag =0xff;          //显示 到
  65.                                         time_20ms = 8;buzzer = 0;         //蜂鸣器短暂鸣叫
  66.                                 }
  67.                         }
  68.                         else if((UID[0]==weID[0])&&(UID[1]==weID[1]))//李四 到
  69.                         {
  70.                                 if(weFlag != 0xff)         //第一次刷到该
  71.                                 {
  72.                                         weFlag =0xff;          //显示 到
  73.                                         time_20ms = 8;buzzer = 0;        //蜂鸣器短暂鸣叫
  74.                                 }
  75.                         }
  76.               }
  77.             }
  78.                 if(disFlag  == 1)
  79.                 {
  80.                         sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印数据        
  81.                         LCD_Write_String(0,0,dis0);//显示第二行
  82.                         manNum=0;                        //清空总人数
  83.                         if(zsFlag==0xff)                //张三到 +1
  84.                         {manNum=manNum+1;}
  85.                         if(lsFlag==0xff)
  86.                         {manNum=manNum+1;}        //李四到 +1
  87.                         if(weFlag==0xff)
  88.                         {manNum=manNum+1;}        //王二到 +1        
  89.                         sprintf(dis1,"ZongRen:%d  ",(int)manNum);//打印数据        
  90.                         LCD_Write_String(0,1,dis1);//显示第二行                                                               
  91.                         disFlag =0;               
  92.                 }

  93.                 if(key == 0) //按键按下
  94.                 {
  95.                         if(manNum != 3)          //人数不够
  96.                         {
  97.                                 buzFlag = 1; //蜂鸣器报警标志
  98.                         }               
  99.                 }

  100.         }
  101. }


  102. void Init_Timer0(void)
  103. {
  104.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  105.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  106.         TL0=(65536-20000)%256;
  107.         EA=1;            //总中断打开
  108.         ET0=1;           //定时器中断打开
  109.         TR0=1;           //定时器开关打开
  110. }

  111. void Timer0_isr(void) interrupt 1
  112. {
  113.         TH0=(65536-20000)/256;                  //重新赋值 20ms
  114.         TL0=(65536-20000)%256;        
  115.         time_20ms++;
  116.         if(time_20ms%10==0)           //定时显示
  117.         {
  118.                 disFlag = 1 ;
  119.                 DelayMs(150);  
  120.                 if(buzFlag == 1) buzzer =!buzzer;//蜂鸣器报警
  121.                 else buzzer = 1;//不报警
  122.         }
  123. }

  124. void UART_Init(void)
  125. {
  126.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  127.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  128.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
  129.         TL1 = TH1;  
  130.     TR1   = 1;                  // TR1:  timer 1 打开                        
  131.     EA    = 1;                  //打开总中断
  132.     ES    = 1;                  //打开串口中断
  133. }


  134. void uartSendByte(unsigned char dat)
  135. {
  136.         unsigned char time_out;
  137.         time_out=0x00;
  138.         SBUF = dat;                          //将数据放入SBUF中
  139.         while((!TI)&&(time_out<100))  //检测是否发送出去
  140.         {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时
  141.         TI = 0;                                                //清除ti标志
  142. }

  143. void uartSendStr(unsigned char *s,unsigned char length)
  144. {
  145.         unsigned char NUM;
  146.         NUM=0x00;
  147.         while(NUM<length)        //发送长度对比
  148.         {
  149.                 uartSendByte(*s);  //放松单字节数据
  150.                 s++;                  //指针++
  151.                 NUM++;                  //下一个++
  152.            }
  153. }

  154. void UART_SER (void) interrupt 4         //串行中断服务程序
  155. {
  156.         if(RI)                        //判断是接收中断产生
  157.         {
  158.                 RI=0;                      //标志位清零
  159.         }
  160.         if(TI)  //如果是发送标志位,清零
  161.         TI=0;

复制代码

原理图: 无
仿真: 无
代码: 开源-考勤.zip (296.13 KB, 下载次数: 11)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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