打印
[其他ST产品]

STM32与RC522简单公交卡系统的设计

[复制链接]
954|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
系统的结构框图

使用特权

评论回复
评论
花间一壶酒sd 2022-12-28 23:44 回复TA
———————————————— 版权声明:本文为CSDN博主「物联网小菜鸟一枚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_69428059/article/details/124455787 
沙发
花间一壶酒sd|  楼主 | 2022-12-27 16:40 | 只看该作者
目前所用到的硬件有RC522,STM32和矩阵键盘,实物图如下:

使用特权

评论回复
板凳
花间一壶酒sd|  楼主 | 2022-12-27 16:41 | 只看该作者
引脚连接以及相关接口设计

使用特权

评论回复
地板
花间一壶酒sd|  楼主 | 2022-12-27 16:45 | 只看该作者
RC522相关的引脚在我上一篇博客已经说过,请大家点开本博客开头的链接查看,4x4的矩阵键盘相关行我们用到的引脚是PF8,9,10,11,相关列用到的引脚是PF12,13,14,15。

使用特权

评论回复
5
花间一壶酒sd|  楼主 | 2022-12-27 16:46 | 只看该作者
按键相关代码如下:

按键初始化函数
void Matrix_ssKey_Pin_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;//行按键
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOF,&GPIO_InitStructure);
       
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;//列按键
        GPIO_Init(GPIOF,&GPIO_InitStructure);
}

使用特权

评论回复
6
花间一壶酒sd|  楼主 | 2022-12-27 16:46 | 只看该作者
按键扫描函数
int Matrix_Key_Scan(void)
{
        u8 temp = 0;
        int key_val = -1;
       
        GPIO_ResetBits(GPIOF,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);                       
        delay_us(10);

        temp=(GPIO_ReadInputData(GPIOF) >> 8)&0xff;       
       
        if (temp == 0xf0)
        {
                        delay_ms(50);
                        GPIO_ResetBits(GPIOF,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);                       
                        delay_us(10);
                        temp=(GPIO_ReadInputData(GPIOF) >> 8)&0xff;       
               
                        if (temp != 0xf0)
                        {
                                GPIO_Write(GPIOF,0);
                                delay_ms(5);
                                GPIO_Write(GPIOF,(uint16_t)(0xFE << 8));
                               
                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                {
                                                delay_ms(20);

                                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                                {
                                                                temp=((GPIO_ReadInputData(GPIOF) >> 8) & 0XFE);               
                                                                switch(temp)
                                                                {
                                                                                case 0xEE:  key_val = 1;   break;
                                                                                case 0xDE:  key_val = 2;   break;
                                                                                case 0xBE:  key_val = 3;   break;
                                                                                case 0x7E:  key_val = 4;   break;
                                                                                default:    key_val = -1;   break;
                                                                }
                                                }
                                }
                               
                                GPIO_Write(GPIOF,0);
                                delay_ms(5);
                                GPIO_Write(GPIOF,(uint16_t)(0xFD << 8));
                               
                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0)!= 0XF0)
                                {
                                                delay_ms(20);

                                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                                {
                                                                temp=((GPIO_ReadInputData(GPIOF) >> 8) & 0XFD);
                                                                switch(temp)
                                                                {
                                                                                case 0xED:  key_val = 5;   break;
                                                                                case 0xDD:  key_val = 6;   break;
                                                                                case 0xBD:  key_val = 7;   break;
                                                                                case 0x7D:  key_val = 8;   break;
                                                                                default:    key_val = -1;   break;
                                                                }
                                                }
                                }

                                GPIO_Write(GPIOF,0);
                                delay_ms(5);
                                GPIO_Write(GPIOF,(uint16_t)(0xFB << 8));
                               
                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                {
                                                delay_ms(20);

                                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                                {
                                                                temp=((GPIO_ReadInputData(GPIOF) >> 8) & 0XFB);
                                                                switch(temp)
                                                                {
                                                                                case 0xEB:  key_val = 9;   break;
                                                                                case 0xDB:  key_val = 10;   break;
                                                                                case 0xBB:  key_val = 11;   break;
                                                                                case 0x7B:  key_val = 12;   break;
                                                                                default:    key_val = -1;   break;
                                                                }
                                                }
                                }

                                GPIO_Write(GPIOF,0);
                                delay_ms(5);
                                GPIO_Write(GPIOF,(uint16_t)(0xF7 << 8));
                               
                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) !=0XF0)
                                {
                                                delay_ms(20);

                                                if(((GPIO_ReadInputData(GPIOF) >> 8) & 0XF0) != 0XF0)
                                                {
                                                                temp=((GPIO_ReadInputData(GPIOF) >> 8) & 0XF7);
                                                                switch(temp)
                                                                {
                                                                                case 0xE7:  key_val = 13;   break;
                                                                                case 0xD7:  key_val = 14;   break;
                                                                                case 0xB7:  key_val = 15;   break;
                                                                                case 0x77:  key_val = 16;   break;
                                                                                default:    key_val = -1;   break;
                                                                }
                                                }
                                        }
                                }
                        }
       
        return key_val;

}

使用特权

评论回复
7
花间一壶酒sd|  楼主 | 2022-12-28 23:33 | 只看该作者
软件流程图

使用特权

评论回复
8
花间一壶酒sd|  楼主 | 2022-12-28 23:34 | 只看该作者

使用特权

评论回复
9
花间一壶酒sd|  楼主 | 2022-12-28 23:34 | 只看该作者

使用特权

评论回复
10
花间一壶酒sd|  楼主 | 2022-12-28 23:35 | 只看该作者

使用特权

评论回复
11
花间一壶酒sd|  楼主 | 2022-12-28 23:36 | 只看该作者
调试过程
我最开始设计的功能是将卡号先写好定义在数组里面,可是这样的话就没有了发卡的功能,于是我就想到设置一个空数组,读卡的时候把卡号存进这个数组里面去。随后,我在设置个人信息的功能时遇到了麻烦,我按下一个按键之后,不需要按后面三个按键他就自动跟第一个按键一样了,于是我在代码里找原因,发现原来每一次输入按键的时候都需要重新扫描,否则按键会停留在上一次的值。

使用特权

评论回复
12
花间一壶酒sd|  楼主 | 2022-12-28 23:37 | 只看该作者
在发卡和个人信息绑定设置完成后,我又要设置挂失和解除挂失功能。这个时候我又用到了一个临时数组,用来临时存放卡号。

使用特权

评论回复
13
花间一壶酒sd|  楼主 | 2022-12-28 23:37 | 只看该作者

使用特权

评论回复
14
花间一壶酒sd|  楼主 | 2022-12-28 23:38 | 只看该作者
当输入的个人信息和相应的卡匹配时,就将卡号存放在临时数组里面。

使用特权

评论回复
15
花间一壶酒sd|  楼主 | 2022-12-28 23:39 | 只看该作者

使用特权

评论回复
16
花间一壶酒sd|  楼主 | 2022-12-28 23:40 | 只看该作者
起初我只考虑了输入正确的情况,没有考虑到输入的信息错误的情况,于是我又小改了一下函数,把if改成了else if 最后如果输入的个人信息都不匹配,则打印出密码错误。

使用特权

评论回复
17
花间一壶酒sd|  楼主 | 2022-12-28 23:40 | 只看该作者
在设计卡的扣款的功能的时候,由于要扣款小数位,最开始我没有想到很好的方法怎么去设置小数位。然后我突然想到一个办法,就是用数据的第十位作为小数位,比如数据100,则实际金额为10.0。根据这个想法,我修改了代码。

使用特权

评论回复
18
花间一壶酒sd|  楼主 | 2022-12-28 23:42 | 只看该作者
将数值块的数据除以10再强制转换为double类型,这样就实现了小数的功能了。不过这样做的坏处就是整体可用金额少了十倍。

使用特权

评论回复
19
花间一壶酒sd|  楼主 | 2022-12-28 23:44 | 只看该作者
在我本来以为功能都设计的差不多的时候,我又发现了另一个问题,那就是挂失和解除挂失功能的模块,我原先把这块函数写在了读卡成功之后。实际功能为不刷卡时无法进入挂失和解除挂失模式的函数,这与实际情况不符合,我就是因为卡掉了才要进入挂失,你现在要我刷卡,我拿什么刷?于是我就把这块函数写在了读卡之前,这样,即使不刷卡,也能进入卡的挂失和解除挂失功能,更加符合实际情况。

使用特权

评论回复
20
花间一壶酒sd|  楼主 | 2022-12-28 23:45 | 只看该作者
相关代码
挂失代码
if(WK_UP==1)//进入挂失和解除挂失模式
        {
                printf("\r\n进入挂失和解除挂失模式\r\n");
                printf("\r\n按下S1进入挂失模式,按下S2进入解除挂失模式\r\n");
                while(1)
                {
                        key_val = Matrix_Key_Scan();
                        if(key_val > 0 && key_val < 17)
                        {
                                if(key_val==1)//进入挂失模式
                                {
                                        printf("\r\n 进入挂失模式\r\n");
                                        printf("\r\n 请输入4位个人信息\r\n");
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//¸个人信息第一位
                                                {
                                                        if(key_val==1)card_3[0]=1;
                                                        if(key_val==2)card_3[0]=2;
                                                        if(key_val==3)card_3[0]=3;
                                                        if(key_val==4)card_3[0]=4;
                                                        if(key_val==5)card_3[0]=5;
                                                        if(key_val==6)card_3[0]=6;
                                                        if(key_val==7)card_3[0]=7;
                                                        if(key_val==8)card_3[0]=8;
                                                        if(key_val==9)card_3[0]=9;
                                                        if(key_val==10)card_3[0]=0;
                                                        printf("\r\n %d \r\n",card_3[0]);
                                                        if(card_3[0]==0|card_3[0]==1|card_3[0]==2|card_3[0]==3|card_3[0]==4|card_3[0]==5|card_3[0]==6|card_3[0]==7|card_3[0]==8|card_3[0]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第二位
                                                {
                                                        if(key_val==1)card_3[1]=1;
                                                        if(key_val==2)card_3[1]=2;
                                                        if(key_val==3)card_3[1]=3;
                                                        if(key_val==4)card_3[1]=4;
                                                        if(key_val==5)card_3[1]=5;
                                                        if(key_val==6)card_3[1]=6;
                                                        if(key_val==7)card_3[1]=7;
                                                        if(key_val==8)card_3[1]=8;
                                                        if(key_val==9)card_3[1]=9;
                                                        if(key_val==10)card_3[1]=0;
                                                        printf("\r\n %d \r\n",card_3[1]);
                                                        if(card_3[1]==0|card_3[1]==1|card_3[1]==2|card_3[1]==3|card_3[1]==4|card_3[1]==5|card_3[1]==6|card_3[1]==7|card_3[1]==8|card_3[1]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第三位
                                                {
                                                        if(key_val==1)card_3[2]=1;
                                                        if(key_val==2)card_3[2]=2;
                                                        if(key_val==3)card_3[2]=3;
                                                        if(key_val==4)card_3[2]=4;
                                                        if(key_val==5)card_3[2]=5;
                                                        if(key_val==6)card_3[2]=6;
                                                        if(key_val==7)card_3[2]=7;
                                                        if(key_val==8)card_3[2]=8;
                                                        if(key_val==9)card_3[2]=9;
                                                        if(key_val==10)card_3[2]=0;
                                                        printf("\r\n %d \r\n",card_3[2]);
                                                        if(card_3[2]==0|card_3[2]==1|card_3[2]==2|card_3[2]==3|card_3[2]==4|card_3[2]==5|card_3[2]==6|card_3[2]==7|card_3[2]==8|card_3[2]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第四位
                                                {
                                                        if(key_val==1)card_3[3]=1;
                                                        if(key_val==2)card_3[3]=2;
                                                        if(key_val==3)card_3[3]=3;
                                                        if(key_val==4)card_3[3]=4;
                                                        if(key_val==5)card_3[3]=5;
                                                        if(key_val==6)card_3[3]=6;
                                                        if(key_val==7)card_3[3]=7;
                                                        if(key_val==8)card_3[3]=8;
                                                        if(key_val==9)card_3[3]=9;
                                                        if(key_val==10)card_3[3]=0;
                                                        printf("\r\n %d \r\n",card_3[3]);
                                                        if(card_3[3]==0|card_3[3]==1|card_3[3]==2|card_3[3]==3|card_3[3]==4|card_3[3]==5|card_3[3]==6|card_3[3]==7|card_3[3]==8|card_3[3]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                       
                                        if(((card_3[0]==card[4])&&(card_3[1]==card[5])&&(card_3[2]==card[6])&&(card_3[3]==card[7])))//如果为普通卡的信息
                                                {//创建一个临时数组来临时保存普通卡的卡号,然后将该卡卡号初始化为0
                                                        card_4[0]=card[0];card[0]=0;
                                                        card_4[1]=card[1];card[1]=0;
                                                        card_4[2]=card[2];card[2]=0;
                                                        card_4[3]=card[3];card[3]=0;
                                                        printf("\r\n 普通卡挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else if(((card_3[0]==card[12])&&(card_3[1]==card[13])&&(card_3[2]==card[14])&&(card_3[3]==card[15])))//如果为学生卡的信息
                                                {//创建一个临时数组来临时保存学生卡的卡号,然后将该卡卡号初始化为0
                                                        card_5[0]=card[8];card[8]=0;
                                                        card_5[1]=card[9];card[9]=0;
                                                        card_5[2]=card[10];card[10]=0;
                                                        card_5[3]=card[11];card[11]=0;
                                                        printf("\r\n 学生卡挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else if(((card_3[0]==card[20])&&(card_3[1]==card[21])&&(card_3[2]==card[22])&&(card_3[3]==card[23])))//如果为老年卡的信息
                                                {//创建一个临时数组来临时保存老年卡的卡号,然后将该卡卡号初始化为0
                                                        card_6[0]=card[16];card[16]=0;
                                                        card_6[1]=card[17];card[17]=0;
                                                        card_6[2]=card[18];card[18]=0;
                                                        card_6[3]=card[19];card[19]=0;
                                                        printf("\r\n 老年卡挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else
                                                {
                                                        printf("\r\n 该信息未绑定公交卡\r\n ");
                                                }
                                }
                        }
                        key_val = Matrix_Key_Scan();
                        if(key_val > 0 && key_val < 17)
                        {
                                if(key_val==2)//进入解除挂失模式
                                {
                                                        printf("\r\n 进入解除挂失模式\r\n");
                                                        printf("\r\n 请输入4为个人信息\r\n");
                                                        while(1)
                                                        {
                                                                key_val = Matrix_Key_Scan();
                                                                if(key_val > 0 && key_val < 17)//个人信息第一位
                                                                {
                                                                        if(key_val==1)card_3[0]=1;
                                                                        if(key_val==2)card_3[0]=2;
                                                                        if(key_val==3)card_3[0]=3;
                                                                        if(key_val==4)card_3[0]=4;
                                                                        if(key_val==5)card_3[0]=5;
                                                                        if(key_val==6)card_3[0]=6;
                                                                        if(key_val==7)card_3[0]=7;
                                                                        if(key_val==8)card_3[0]=8;
                                                                        if(key_val==9)card_3[0]=9;
                                                                        if(key_val==10)card_3[0]=0;
                                                                        printf("\r\n %d \r\n",card_3[0]);
                                                                        if(card_3[0]==0|card_3[0]==1|card_3[0]==2|card_3[0]==3|card_3[0]==4|card_3[0]==5|card_3[0]==6|card_3[0]==7|card_3[0]==8|card_3[0]==9)break;
                                                       
                                                                }
                                                        }
                                                        delay_ms(10000);
                                                       
                                                       
                                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第二位
                                                {
                                                        if(key_val==1)card_3[1]=1;
                                                        if(key_val==2)card_3[1]=2;
                                                        if(key_val==3)card_3[1]=3;
                                                        if(key_val==4)card_3[1]=4;
                                                        if(key_val==5)card_3[1]=5;
                                                        if(key_val==6)card_3[1]=6;
                                                        if(key_val==7)card_3[1]=7;
                                                        if(key_val==8)card_3[1]=8;
                                                        if(key_val==9)card_3[1]=9;
                                                        if(key_val==10)card_3[1]=0;
                                                        printf("\r\n %d \r\n",card_3[1]);
                                                        if(card_3[1]==0|card_3[1]==1|card_3[1]==2|card_3[1]==3|card_3[1]==4|card_3[1]==5|card_3[1]==6|card_3[1]==7|card_3[1]==8|card_3[1]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第三位
                                                {
                                                        if(key_val==1)card_3[2]=1;
                                                        if(key_val==2)card_3[2]=2;
                                                        if(key_val==3)card_3[2]=3;
                                                        if(key_val==4)card_3[2]=4;
                                                        if(key_val==5)card_3[2]=5;
                                                        if(key_val==6)card_3[2]=6;
                                                        if(key_val==7)card_3[2]=7;
                                                        if(key_val==8)card_3[2]=8;
                                                        if(key_val==9)card_3[2]=9;
                                                        if(key_val==10)card_3[2]=0;
                                                        printf("\r\n %d \r\n",card_3[2]);
                                                        if(card_3[2]==0|card_3[2]==1|card_3[2]==2|card_3[2]==3|card_3[2]==4|card_3[2]==5|card_3[2]==6|card_3[2]==7|card_3[2]==8|card_3[2]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        while(1)
                                        {
                                                key_val = Matrix_Key_Scan();
                                                if(key_val > 0 && key_val < 17)//个人信息第四位
                                                {
                                                        if(key_val==1)card_3[3]=1;
                                                        if(key_val==2)card_3[3]=2;
                                                        if(key_val==3)card_3[3]=3;
                                                        if(key_val==4)card_3[3]=4;
                                                        if(key_val==5)card_3[3]=5;
                                                        if(key_val==6)card_3[3]=6;
                                                        if(key_val==7)card_3[3]=7;
                                                        if(key_val==8)card_3[3]=8;
                                                        if(key_val==9)card_3[3]=9;
                                                        if(key_val==10)card_3[3]=0;
                                                        printf("\r\n %d \r\n",card_3[3]);
                                                        if(card_3[3]==0|card_3[3]==1|card_3[3]==2|card_3[3]==3|card_3[3]==4|card_3[3]==5|card_3[3]==6|card_3[3]==7|card_3[3]==8|card_3[3]==9)break;
                                                       
                                                }
                                        }
                                        delay_ms(10000);
                                       
                                       
                                        if(((card_3[0]==card[4])&&(card_3[1]==card[5])&&(card_3[2]==card[6])&&(card_3[3]==card[7])))//如果为普通卡的个人信息
                                                {//将挂失时临时保存的普通卡重新定义
                                                        card[0]=card_4[0];
                                                        card[1]=card_4[1];
                                                        card[2]=card_4[2];
                                                        card[3]=card_4[3];
                                                        printf("\r\n 普通卡解除挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else if(((card_3[0]==card[12])&&(card_3[1]==card[13])&&(card_3[2]==card[14])&&(card_3[3]==card[15])))//如果为学生卡的个人信息
                                                {//将挂失时临时保存的学生卡重新定义
                                                        card[8]=card_5[0];
                                                        card[9]=card_5[1];
                                                        card[10]=card_5[2];
                                                        card[11]=card_5[3];
                                                        printf("\r\n 学生卡解除挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else if(((card_3[0]==card[20])&&(card_3[1]==card[21])&&(card_3[2]==card[22])&&(card_3[3]==card[23])))//如果为老年卡的个人信息
                                                {//将挂失时临时保存的老年卡重新定义
                                                        card[16]=card_6[0];
                                                        card[17]=card_6[1];
                                                        card[18]=card_6[2];
                                                        card[19]=card_6[3];
                                                        printf("\r\n 老年卡解除挂失成功\r\n");
                                                        printf("\r\n 按下S16退出\r\n");
                                                }
                                                else
                                                {
                                                        printf("\r\n 该个人信息未绑定公交卡\r\n ");
                                                }
                                }
                        }
                                key_val = Matrix_Key_Scan();
                        if(key_val > 0 && key_val < 17)
                        {
                                if(key_val==16)//按下S16退出挂失和解除挂失功能
                                {
                                        printf("\r\n 退出挂失和解除挂失功能\r\n");
                                        break;
                                }
                        }
                       
                }
        }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1144

帖子

2

粉丝