历史上的今天
今天是:2024年11月12日(星期二)
2021年11月12日 | STM8单片机+RC522电路原理图+读写卡源代码
2021-11-12 来源:eefocus
基于stm8的ds1302模块千万别把数据写在第3个区,不然卡就锁住了,只能写在第2个区
电路原理图如下:

stm8单片机源码:
/* Includes ------------------------------------------------------------------*/
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "stm8s_clk.h"
#include "intrinsics.h"
#include "stm8s_uart1.h"
#include "uart.h"
#include "rc522.h"
#include "string.h"
#include "IWDG.h"
#include "tim2.h"
#include "1602i2c.h"
void Delay(u32 nCount);
extern u8 RxBuffer[RxBufferSize];
extern u8 UART_RX_NUM;
extern int time2;
extern int tim2test;
extern int tim2test1;
unsigned char CT[2];//卡类型
unsigned char SN[4]; //卡号
unsigned char M1UID[8]={0x2e,0x55,0,0,0,0,0,0};//读卡器向上发送,读到卡后自动发
extern unsigned char controlflag;//接收到控制LED beep指令标志 01表示收到
extern unsigned char sendflag;//发送标志 =1表示还未发送过 =0表示已经发送一次 等待回复 如果超时重新发送
unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};
unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
extern unsigned char receive[8];
u8 read_flag=0;//读卡标志位 1;读到卡 0;还没读到卡
u8 time_flag=0;//超时标志 0;未超时 1:超时
//unsigned char key[6] = {0x19,0x84,0x07,0x15,0x76,0x14};
unsigned char key[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
int sum=0;
//unsigned char key[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
/* Private macro -------------------------------------------------------------*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BufferSize (countof(Tx_Buffer)-1)
/* Private variables ---------------------------------------------------------*/
u8 Tx_Buffer[] = "请刷卡";
u8 Rx_Buffer[BufferSize];
u32 FLASH_ID ;
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void cardNo2String(u8 *cardNo, u8 *str);
/* Private functions ---------------------------------------------------------*/
#define ReadWriteAddr 3 //读写扇区
void SN_UID(void)
{
unsigned int tempUID;
M1UID[2]=SN[0];
M1UID[3]=SN[1];
M1UID[4]=SN[2];
M1UID[5]=SN[3];
tempUID=M1UID[1]+M1UID[2]+M1UID[3]+M1UID[4]+M1UID[5];
M1UID[6]=tempUID&0x00ff;
M1UID[7]=tempUID>>8;
}
void rxfromPIC(void)
{
u8 i;
sum=receive[1]+receive[2]+receive[3]+receive[4]+receive[5];
if((receive[0]==0x7e)&&(receive[1]==0x55)&&(receive[6]==(sum&0x00ff))&&(receive[7]==(sum&0xff00)>>8))
{
read_flag=0;
if(receive[2]==0x01)
{
}
else if(receive[2]!=0x01)
{
}
if(receive[3]==0x01)
{
}
else if(receive[3]!=0x01)
{
}
if(receive[4]==0x01)
{
}
receive[0]=0x7e;
UART1_SendString(receive, 8);
for(i=2;i<8;i++)
{
M1UID[i]=0;
}
tim2test1=0;//启动计时
}
for(i=0;i<8;i++)
{
receive[i]=0;
}
if(tim2test1>5000)//超时全部关闭
{
tim2test1=0;
// GPIO_HIGH(GPIOD, GPIO_PIN_3);
// GPIO_HIGH(GPIOD, GPIO_PIN_7);
// GPIO_LOW(GPIOD, GPIO_PIN_2);
}
}
void main(void)
{
unsigned char status;
/*设置内部时钟16M为主时钟*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
status = memcmp(read,write,16);//清0
InitRc522();//rc522初始化
sendflag=1;
I2C1602_Configuration();
init1602_i2c();
__enable_interrupt();//开启总中断
//////////////
write[0] =1;//
write[1] =3;//
write[2] =2;//
write[3] =6;//
write[4] =7;//
write[5] =7;//
write[6] =6;//
write[7] =0;//
write[8] =2;//
write[9] =8;//
write[10] =5;//
///////////////// 要写入的值,最多16个///////
while(1)
{
status = PcdRequest(PICC_REQALL,CT); // 扫描卡
status= PcdAnticoll(SN);
//防冲撞
rxfromPIC();
if (status==MI_OK)
{
SN_UID();
status = PcdSelect(SN); //选择要操作的卡
if (status==MI_OK)
{
if( MI_OK == PcdAuthState(0x61,ReadWriteAddr,key,SN) ) //验证A密码
{
// status = PcdWrite(2,write);//写入M1卡第2块块数据
status = PcdRead(2,read);//读取M1卡第2块块数据
if(MI_OK == status)
{
zl_i2c(0x80);
sj_i2c(0x30+ read[0]);
sj_i2c(0x30+ read[1]);
sj_i2c(0x30+ read[2]);
sj_i2c(0x30+ read[3]);
sj_i2c(0x30+ read[4]);
sj_i2c(0x30+ read[5]);
sj_i2c(0x30+ read[6]);
sj_i2c(0x30+ read[7]);
sj_i2c(0x30+ read[8]);
sj_i2c(0x30+ read[9]);
sj_i2c(0x30+ read[10]);
}
}
}
}
}
}
void Delay(u32 nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void Hex2String(u8 hex,u8 *str)
{
str[0] = (hex / 100) + '0';
str[1] = (hex % 100 / 10) + '0';
str[2] = (hex % 10) + '0';
}
void cardNo2String(u8 *cardNo, u8 *str)
{
u8 Count = 0;
for(Count = 0; Count < 4; Count++)
{
Hex2String(cardNo[Count], str + Count * 4);
if(Count == 3)
{
str[15] = 'n';
}
else
{
str[Count * 4 + 3] = ':';
}
……………………
史海拾趣
|
c51+mx485芯片+485口通信。C51能够接受到PC通过485发送的命令,但是PC接收不到C51通过485回复的信息。我的PC和C51的485通信通过485转232的。请大家帮忙分析一下。程序用232没有问题。… 查看全部问答> |
|
怎么判断串口接受寄存器目前正有数据,使发送端延迟发送数据,从而实现简单的流量控制? 小弟我现在有一练习,就是在dos平台下,用C语言来实现简单的串口流量控制. 有一个问题是:怎么判断串口接受寄存器目前正有数据,使发送端延迟发送数据,从而实现简单的流量控制?我个人看了串口的几个寄存器都没有这个状态信息的.请各位高 ...… 查看全部问答> |
|
请教各位大侠,我现在想集成一个8位的CAN控制器在APB总线上 CAN控制器的输入输出数据都是8位的,而APB总线的输入输出数据都是32位的。。。 那把这个控制器集成在APB总线上的时候怎么处理比较合理? 高24位补零,好像太浪费了。。。CAN的波特率比 ...… 查看全部问答> |
|
本帖最后由 蓝雨夜 于 2014-12-17 11:20 编辑 SAM R21跑轻量级网软件堆栈DEMO 在Atmel Studio 6.2中有关无线收发测试的 demo没几个,只找到个Peer2Peer先测试下 功能很简单:A串口接收数据,通过无线发送B,同时A串口反送数据 ATEML在程序结构 ...… 查看全部问答> |
|
一个比较大的FPGA项目往往由许多模块组合而成,开发时我们可能要一个一个模块地验证,有时候一个模块可能会有非常多的模块之间的接口信号或者有些大工程会有好几百个引脚,这样FPGA提供的引脚接口就可能不够,而我们在进行单一功能验证时有些引脚可 ...… 查看全部问答> |




