本帖最后由 ubun16.04 于 2020-8-12 19:45 编辑
主要参考这个网址:
http://www.51hei.com/bbs/dpj-93114-1.html
他的程序帮了很大的忙,在他寻卡的基础上完成了注册,判断函数,并做出了一定的修改
为了方便演示,做了一个简短的视频方便示意,等过了审核发上来
视频:
https://www.bilibili.com/video/BV14Z4y1M7Ja?from=search&seid=2775894499705602722
下面是主程序代码,库函数和上面网址的一样
- /*
- 测试成功
- 但是这里的串口中断实在是不会调了
- 把串口中断部分直接修改在函数中,即CALL_isr_UART();这一段被我隐藏了,串口中断函数interrupt4直接删除
- 可以实现卡片的寻卡,识别,注册功能,注销功能暂未设置
- */
- #include<reg52.h>
- #include<main.h>
- #include<mfrc522.h>
- //主要用于strcmp函数的操作
- #include <stdio.h>
- #include <string.h>
- unsigned char UID[5],Temp[4]; //任意寻卡的卡号
- unsigned char UID_set[5],Temp_set[4]; //注册锁定后的卡号
- unsigned char i=0; //按钮(注册)计数
- unsigned char j; //用于卡号和类型锁定
- unsigned char k=0; //按钮(验证)计数
- unsigned char suc[]={"you succeed\r\n"};
- unsigned char fail[]={"you lost\r\n"};
- sbit key=P2^0; //注册
- sbit key_judge=P2^2; //验证
- sbit led=P3^4; //数卡错误响应灯
- void feeb(){ //寻卡成功响应函数
- ff=0;
- delay_10ms(1);
- ff=1;
- delay_10ms(1);
- }
- void feeb_fail(){ //刷卡错误响应函数
- led=0;
- delay_10ms(1);
- led=1;
- delay_10ms(1);
- }
- //这个延时函数其实并不是特别重要,但是delay_10ms这个函数我看不懂,可能汇编???
- void delay_10ms2(unsigned char x) //误差 0us
- {
- unsigned char a,b,c;
- for(c=x;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- /*
- 串口发送函数
- */
- //向串口发送字符
- void Putc_to_SerialPort(unsigned char c)
- {
- SBUF=c;
- while(TI==0);
- TI=0;
- }
- //向串口发送字符串
- void Puts_to_SerialPort(unsigned char *s)
- {
- while(*s!='\0')
- {
- Putc_to_SerialPort(*s);
- s++;
- delay_10ms2(1);
- }
- }
- //只处理一次卡片的读取
- void Auto_Reader(void){
- //while(1)
- {
- if(PcdRequest(0x52,Temp)==MI_OK){ //寻卡,成功后Temp数组为卡类型
-
- if(PcdAnticoll(UID)==MI_OK){ //防冲突,UID数组数据为卡序列号
-
- //串口发送
- //CALL_isr_UART(); //开串口中断将UID数组前四个字节上传到串口调试助手
- Puts_to_SerialPort(UID);
- feeb(); //调用蜂鸣器提示
- i++; //开关计数+1自动归零
- }
- }else ff = 0;//寻卡失败
-
- //锁定卡号类型
- for(j=0;j<3;j++){
- Temp_set[j]=Temp[j];
- }
- //锁定卡号
- for(j=0;j<4;j++){
- UID_set[j]=UID[j];
- }
-
- }
-
- }
- //判断新卡和已经注册过的卡是否一致,返回0或1
- unsigned char judge(unsigned char *string1, unsigned char *string2){
- if(strcmp(string1, string2) == 0)
- return 0;
- else return 1;
- }
- //卡片判断函数,针对0或1进行判断并输出相应动作
- void Auto_judge(void){
- //while(1)
- {
- if(PcdRequest(0x52,Temp)==MI_OK&&!judge(Temp_set,Temp)){ //寻卡,成功后Temp数组为卡类型
- if(PcdAnticoll(UID)==MI_OK&&!judge(UID_set,UID)){ //防冲突,UID数组数据为卡序列号
- Puts_to_SerialPort("you succeed...\r\n"); //串口发送成功消息
- Puts_to_SerialPort(UID);
- //CALL_isr_UART(); //开串口中断将UID数组前四个字节上传到串口调试助手
- feeb(); //调用蜂鸣器提示
- k++; //开关计数+1自动归零
- }
- }
- else if(PcdRequest(0x52,Temp)==MI_OK&&judge(Temp_set,Temp))
- {
- Puts_to_SerialPort("type wrong...\r\n"); //串口发送失败消息
- feeb_fail();
-
- k++; //开关计数+1自动归零
- }
- else if(PcdAnticoll(UID)==MI_OK&&judge(UID_set,UID))
- {
- Puts_to_SerialPort("ID wrong...\r\n"); //串口发送失败消息
- feeb_fail();
-
- k++; //开关计数+1自动归零
- }
- else ff = 0;//寻卡失败
- }
-
- }
- //初始化
- void InitializeSystem(){
-
- PcdReset();
- PcdAntennaOff();
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- SCON=0X50; //设置为工作方式1
- TMOD=0X21; //设置计数器工作方式2
- PCON=0X00; //波特率加倍
- TH1=0Xfd; //计数器初始值设置,注意波特率是4800的
- TL1=0Xfd;
- REN = 1;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1;
- ff = 1;
- TI=0;
- }
- void main( ){
- InitializeSystem( );
- while(1)
- {
- if(key==0)
- {
- Puts_to_SerialPort("Receiving From 8051 key...\r\n");
- i++;
- feeb();
- feeb();
- }
- if(key_judge==0)
- {
- Puts_to_SerialPort("Receiving From 8051 key_judge...\r\n");
- k++;
- feeb();
- feeb();
- }
- //按下key寻卡注册,如果没有卡放上去,那么一直在内部循环,也可以设定时间,如果超时跳出循环
- while(i%2==1){Auto_Reader();}
- //按下key_judge进行判断,如果没有卡放上去,那么一直在内部循环,也可以设定时间,如果超时跳出循环
- while(k%2==1){Auto_judge();}
-
- }
- }
复制代码
|