当前位置: 首页 > news >正文

实训项目11基于51单片机的门禁监测系统设计

00 要求

基于51单片机和RFID模块实现门禁的设计。使之具有以下功能:

  1. 能够正常的读卡信息;
  2. 在正常刷卡通过后,可以控制电子锁动作;
  3. 在刷卡失败后,可以产生报警信号;

01 功能分析

读卡后会RFID会自动通过TXD(串口)发送一段数据,调用串口接收即可

02 效果演示

03 硬件部分

LCD硬件电路部分

RFID刷卡器部分


步进电机部分

04 软件部分(核心代码)

  完整工程代码部分,待实训结束后公开

 如果需要技术支持可以加我的QQ交流:

27969203789

RFID刷卡器部分

void shuakaji(long idcard)
{int a = 0;int j=0;if(flag == 1) //读完了数据就处理{for(a=1;a<11;a++){recv_buf_play[a]=recv_buf[a];if( recv_buf[a] >= '0' && recv_buf[a] <= '9'){recv_buf[a] = recv_buf[a] - '0';}else if(recv_buf[a] >= 'A' && recv_buf[a] <= 'F'){recv_buf[a] = recv_buf[a] - 'A' + 10;} //计算出对应的字符的整型数据id = id << 4 | recv_buf[a];}if( id == idcard ){start=1;}else {BUZZ = 0;Delay_ms(500);BUZZ = 1;for(	j=0;j<=12;j++){recv_buf_play[j]=0;}}flag = 0;//清除标志位}
}

步进电机部分

void MotorPlay()
{if(start)//电机驱动{if(speed<10+speed_set)//速度speed++;else{speed=0;if((step<step_set)){step++;if(fang)//方向{switch(cixu){case 0:L2=1;break;case 1:L1=0;break;case 2:L3=1;break;case 3:L2=0;break;case 4:L4=1;break;case 5:L3=0;break;case 6:L1=1;break;case 7:L4=0;}}else{switch(cixu){case 0:L4=1;break;case 1:L1=0;break;case 2:L3=1;break;case 3:L4=0;break;case 4:L2=1;break;case 5:L3=0;break;case 6:L1=1;break;case 7:L2=0;}}if(cixu<7)cixu++;elsecixu=0;}else{step=0;	//停止start=0;}}}
}

LCD部分

#include "lcd1602.h"/* 等待液晶准备好 */
void LcdWaitReady()
{unsigned char sta;LCD1602_DB = 0xFF;LCD1602_RS = 0;LCD1602_RW = 1;do {LCD1602_E = 1;sta = LCD1602_DB; //读取状态字LCD1602_E = 0;}while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{LcdWaitReady();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_E  = 1;LCD1602_E  = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{LcdWaitReady();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_E  = 1;LCD1602_E  = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{unsigned char addr;if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址addr = 0x00 + x;  //第一行字符地址从0x00起始elseaddr = 0x40 + x;  //第二行字符地址从0x40起始LcdWriteCmd(addr | 0x80);  //设置RAM地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针,len-需显示的字符长度 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str, unsigned char len)
{LcdSetCursor(x, y);   //设置起始地址while (len--)         //连续写入len个字符数据{LcdWriteDat(*str++);}
}
/* 初始化1602液晶 */
void InitLcd1602()
{LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口LcdWriteCmd(0x0C);  //显示器开,光标关闭LcdWriteCmd(0x06);  //文字不动,地址自动+1LcdWriteCmd(0x01);  //清屏
}


http://www.mrgr.cn/news/80512.html

相关文章:

  • OpenCV实验篇:识别图片颜色并绘制轮廓
  • 渗透利器-kali工具 (第五章-5) Metasploit漏洞利用模块二
  • 自动驾驶控制与规划——Project 2: 车辆横向控制
  • 智能GitHub Copilot副驾驶®提示和技巧
  • yarn修改缓存位置
  • Leecode刷题C语言之最近的房间
  • Java系统对接企业微信审批项目流程
  • 非完全谵妄的发生率、高风险因素及预防护理概述
  • 【计算机网络】期末考试预习复习|中
  • 【机器学习】以机器学习为翼,翱翔网络安全创新苍穹
  • 【Leetcode 每日一题】3291. 形成目标字符串需要的最少字符串数 I
  • 确保某路径下存在某文件
  • 作业Day5:
  • Mapbox-GL 的源码解读的一般步骤
  • 放大电路3
  • 类OCSP靶场-Kioptrix系列-Kioptrix Level 3
  • Vue.js前端框架教程5:Vue数据拷贝和数组函数
  • 一学就废|Python基础碎片,reduce函数
  • Python毕业设计选题:基于django+vue的宠物服务管理系统
  • 思考:VSCode 的宏观工作原理 快速入门 VSCodium (****)
  • 数字电视标准与分类
  • Kafka部署
  • 解决PyTorch模型推理时显存占用问题的策略与优化
  • 【BUG记录】Apifox 参数传入 + 号变成空格的 BUG
  • C-数据的存储
  • android opencv导入进行编译