本设计由STC89C52单片机电路+WIFI_ESP8266模块+RFID_RC522模块+ISD1820语音模块电路+LED指示灯电路+电源电路组成。
1、有2张卡,分别在系统中设定为:zhangsan、lisi。另外再增加一张空卡。
2、如果有卡刷到,则将卡对应的人名通过wifi模块上传到电脑。如果检测到未标记的空卡,则将卡号上传。
3、如果刷卡通过,则语音播报:刷卡通过。同时,绿灯亮3秒,然后绿灯灭。
4、如果刷卡不通过,则语音播报:禁止入内。同时,红灯亮3秒,然后红灯灭。
5、语音内容可以自行录制。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include <intrins.h>
#include "delay.h"
#include "rc522.h"
/*********/
unsigned char code zsID[4]={0xF7,0xD0,0x70,0x8b}; //张三卡号
unsigned char code lsID[4]={0x25,0xED,0x45,0xBE}; //李四卡号
/*********/
sbit yuyin1 = P1^0;//通过语音控制引脚
sbit yuyin2 = P1^1;//不通过语音控制引脚
sbit ledgre = P1^2;//不通过语音控制引脚
sbit ledred = P1^3;//不通过语音控制引脚
unsigned char UID[5]; //卡号
unsigned char Temp[4] ; //暂存数组
unsigned long time_20ms; //定时计数
char dis0[16]; //液晶显示数组
char dis1[16];
unsigned char reReadLater = 0;//防止重复上报
unsigned int leddisCount = 300; //刷卡指示灯指示
unsigned char i;
void Init_Timer0(void); //函数声明
void UART_Init(void);
void uartSendStr(unsigned char *s,unsigned char length);
void uartSendByte(unsigned char dat);
void cardDeal(void);
void main (void)
{
unsigned char disPlace=0; //显示位置
Init_Timer0(); //定时器0初始化
UART_Init(); //串口初始化
PcdReset();//复位RC522
PcdAntennaOn();//开启天线发射
ledgre = 0;//打开绿灯
ledred = 0; //打开红灯
for(i=0;i<40;i++)
{DelayMs(100);}
uartSendStr("AT+CIPMUX=1\r\n",13); //打开多连接
for(i=0;i<10;i++)
{DelayMs(100);}
ledgre = 1;//关闭绿灯
ledred = 1; //关闭红灯
while (1) //主循环
{
if(PcdRequest(0x52,Temp)==MI_OK) //检测到卡号
{
if(PcdAnticoll(UID)==MI_OK) //读取卡号成功
{
if(reReadLater == 0) //防止重复刷卡
{
cardDeal(); //卡号处理
leddisCount = 200 ;//延时处理灯
if((UID[0]==zsID[0])&&(UID[1]==zsID[1]))//张三 到
{
uartSendStr("AT+CIPSEND=0,34\r\n",17); //发送4位数据
yuyin1 = 0; // 播报通过语音
for(i=0;i<2;i++) //延时
{DelayMs(100);}
ledgre = 0;//打开绿灯
ledred = 1; //关闭红灯
}
else if((UID[0]==lsID[0])&&(UID[1]==lsID[1]))//李四 到
{
uartSendStr("AT+CIPSEND=0,30\r\n",17); //发送4位数据
yuyin1 = 0; // 播报通过语音
for(i=0;i<2;i++) //短暂延时
{DelayMs(100);}
yuyin1 = 1; // 关闭 播报通过语音
uartSendStr("Name:LiSi CardID:",17); //发送人名
}
else
{
uartSendStr("AT+CIPSEND=0,32\r\n",17); //发送4位数据
yuyin2 = 0; // 播报未通过语音
for(i=0;i<2;i++) //短暂延时
{DelayMs(100);}
yuyin2 = 1; // 关闭 播报未通过语音
uartSendStr("Name:Unknow CardID:",19); //发送人名
uartSendStr(dis1,11); //发送卡号
uartSendStr("\r\n ",3); //回车
for(i=0;i<2;i++) //延时
{DelayMs(100);}
ledgre = 1;//关闭绿灯
ledred = 0; //打开红灯
}
reReadLater = 50; //防止重复读取卡号延时
}
}
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(reReadLater>0) //读取时间防止重复读
{
reReadLater--;
}
if(leddisCount>0) //打开灯时间处理
{leddisCount--;}
else
{
ledgre = 1;//关闭绿灯
ledred = 1; //关闭红灯
}
}
资料下载地址