3.2 门禁系统初步

发布时间 2023-09-10 22:36:45作者: 狴泽犴

门禁系统初步

外设

步进电机

image-20230910211653751

#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();
	}
}

_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=5727779459273215649&skey=@crypt_c72b263e_a24a3a3ed78b00b9a7f0d018d80e6a0d&mmweb_appid=wx_webfilehelper联想截图_20230910215726