门禁系统初步
外设
步进电机
#define MA_START GPIO_SetBits(GPIOB, GPIO_Pin_0)
#define MA_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define MB_START GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define MB_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_1)
#define MC_START GPIO_SetBits(GPIOB, GPIO_Pin_10)
#define MC_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_10)
#define MD_START GPIO_SetBits(GPIOB, GPIO_Pin_11)
#define MD_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_11)
void StepperMotor_init(void){
GPIO_InitTypeDef GPIO_InitTypeDefStructure;
GPIO_InitTypeDefStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitTypeDefStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitTypeDefStructure.GPIO_Speed=GPIO_Speed_50MHz;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_Init(GPIOB,&GPIO_InitTypeDefStructure);
}
void MotorCWRun(uint angle,uint drct,uint speed)
{
uint step,nangle;
step=0;
nangle=512*angle/45;//将角度换算成拍数,计算结果自动取整
if(drct==0)
{
while(nangle--)
{
switch(step)//8拍方式驱动,每拍转(5.265/64)度
{
case 0:MA_START;MB_OFF;MC_OFF;MD_OFF;break;
case 1:MA_START;MB_START;MC_OFF;MD_OFF;break;
case 2:MA_OFF;MB_START;MC_OFF;MD_OFF;break;
case 3:MA_OFF;MB_START;MC_START;MD_OFF;break;
case 4:MA_OFF;MB_OFF;MC_START;MD_OFF;break;
case 5:MA_OFF;MB_OFF;MC_START;MD_START;break;
case 6:MA_OFF;MB_OFF;MC_OFF;MD_START;break;
case 7:MA_START;MB_OFF;MC_OFF;MD_START;break;
}
if(step==7)step=0;
else step++;
if(speed>100)speed=100;
Delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
}
}
else
{
while(nangle--)
{
switch(step)
{
case 0:MA_START;MB_OFF;MC_OFF;MD_START;break;
case 1:MA_OFF;MB_OFF;MC_OFF;MD_START;break;
case 2:MA_OFF;MB_OFF;MC_START;MD_START;break;
case 3:MA_OFF;MB_OFF;MC_START;MD_OFF;break;
case 4:MA_OFF;MB_START;MC_START;MD_OFF;break;
case 5:MA_OFF;MB_START;MC_OFF;MD_OFF;break;
case 6:MA_START;MB_START;MC_OFF;MD_OFF;break;
case 7:MA_START;MB_OFF;MC_OFF;MD_OFF;break;
}
if(step==7)step=0;
else step++;
if(speed>100)speed=100;
Delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
}
}
MA_OFF;MB_OFF;MC_OFF;MD_OFF;
}
void MotorCCWRun(uint angle,uint drct,uint speed)
{
uint step,nangle;
step=0;
nangle=512*angle/45;//将角度换算成拍数,计算结果自动取整
if(drct==0)
{
while(nangle--)
{
switch(step)//8拍方式驱动,每拍转(5.265/64)度
{
case 0:MA_START;MB_OFF;MC_OFF;MD_START;break;
case 1:MA_OFF;MB_OFF;MC_OFF;MD_START;break;
case 2:MA_OFF;MB_OFF;MC_START;MD_START;break;
case 3:MA_OFF;MB_OFF;MC_START;MD_OFF;break;
case 4:MA_OFF;MB_START;MC_START;MD_OFF;break;
case 5:MA_OFF;MB_START;MC_OFF;MD_OFF;break;
case 6:MA_START;MB_START;MC_OFF;MD_OFF;break;
case 7:MA_START;MB_OFF;MC_OFF;MD_OFF;break;
}
if(step==7)step=0;
else step++;
if(speed>100)speed=100;
Delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
}
}
else
{
while(nangle--)
{
switch(step)
{
case 0:MA_START;MB_OFF;MC_OFF;MD_OFF;break;
case 1:MA_START;MB_START;MC_OFF;MD_OFF;break;
case 2:MA_OFF;MB_START;MC_OFF;MD_OFF;break;
case 3:MA_OFF;MB_START;MC_START;MD_OFF;break;
case 4:MA_OFF;MB_OFF;MC_START;MD_OFF;break;
case 5:MA_OFF;MB_OFF;MC_START;MD_START;break;
case 6:MA_OFF;MB_OFF;MC_OFF;MD_START;break;
case 7:MA_START;MB_OFF;MC_OFF;MD_START;break;
}
if(step==7)step=0;
else step++;
if(speed>100)speed=100;
Delay_ms(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
}
}
MA_OFF;MB_OFF;MC_OFF;MD_OFF;
}
RFID-RC522
- 复位应答(Request)
- M1卡的通信协议和通信波特率是定义好的,当有卡片进入读卡器的工作范围时,读卡器要以特定的协议与卡片通信,从而确定卡片的卡型。
- 防冲突机制(Anticollision Loop)
- 当有多张卡片进入读写器操作范围时,会从中选择一张卡片进行操作,并返回选中卡片的序列号。
- 选择卡片(Select Tag)
- 选择被选中的卡的序列号,并同时返回卡的容量代码。
- 三次相互确认(3 Pass Authentication)
- 选定要处理的卡片后,读写器就要确定访问的扇区号,并且对扇区密码进行密码校验。在三次互相认证后就可以通过加密流进行通信。每次在选择扇区的时候都要进行扇区的密码校验。
- 对数据块的操作
- 读(Read):读一个块的数据;
- 写(Write):在一个块中写数据;
- 加(Increment):对数据块中的数值进行加值;
- 减(Decrement):对数据块中的数值进行减值;
- 传输(Transfer):将数据寄存器中的内容写入数据块中;
- 中止(Halt):暂停卡片的工作;
门禁系统
int main(void){
char status;
unsigned char snr, buf[16], TagType[2], SelectedSnr[4], DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char MySnr[4]={0xC2,0x0B,0x77,0x1D};
GPIO_ini();
InitializeSystem( );
Buzzer_Init();
Serial_Init();
StepperMotor_init();
OLED_Init();
OLED_Clear();
while (1){
status= PcdRequest(REQ_ALL,TagType); //寻卡
if(!status){
status = PcdAnticoll(SelectedSnr); //防冲撞
if(!status){
status=PcdSelect(SelectedSnr); //选卡
if(!status){
k=0;
snr = 1; //扇区号1
status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块{
LED_ON;
if(!status){
status = PcdRead((snr*4+0), buf); // 读卡,读取1扇区0块数据 到buf[0]-buf[16]
status = PcdWrite((snr*4+0), buf); // 写卡,将buf[0]- buf[16]写入1扇区0块
if(!status){
for(i=0;i<4;i++){
if(SelectedSnr[i]==MySnr[i]){
k++;
}
}
if(k==4){
Serial_SendArray(SelectedSnr,4);
MotorCCWRun(90,0,100);
OLED_Clear();
OLED_ShowString(1,1,"OPEN!");
}
WaitCardOff();
}
}
}
}
}
}
LED_OFF;
Buzzer_NoRun();
}
}
标签:MD,OFF,MC,MB,门禁系统,初步,START,3.2,MA
From: https://www.cnblogs.com/yangbz2003-cn/p/17692141.html