找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5971|回复: 4
收起左侧

关于rc522的一点问题,为什么只有卡片在rc522感应距离之内才能 进入T0中断

[复制链接]
ID:348627 发表于 2018-7-26 13:10 | 显示全部楼层 |阅读模式
小白代码大神勿喷 。为什么只有卡片在rc522感应距离之内才能 进入T0中断     注释:卡片感应正常,代码中的中断只为检测是否进入效果。
下面附上代码


  1. #include <reg52.h>
  2. #include  <STDIO.H>
  3. #include <string.h>
  4. #include "main.h"
  5. #include "mfrc522.h"
  6. sbit wela=P2^7;
  7. sbit dula=P2^6;
  8. unsigned char num;
  9. unsigned char code table[]={
  10. 0x3f,0x06,0x5b,0x4f,0x66,
  11. 0x6d,0x7d,0x07,0x7f,0x6f,0x77,
  12. 0x7c,0x39,0x5e,0x79,0x71};
  13. unsigned char code data1[16] = {0x12,0x34,0x56,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};
  14. //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
  15. //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  16. unsigned char code data2[4]  = {0,0,0,0x01};
  17. unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

  18. unsigned char g_ucTempbuf[20];
  19. void Delay1000ms()  //@11.0592MHz
  20. {
  21. unsigned char i,j,k;
  22. i = 8;
  23. j = 1;
  24. k = 243;
  25. do{
  26.   do{
  27.    while (--k);
  28.   } while (--j);
  29. } while (--i);
  30. }
  31. void display(unsigned char num)
  32. {
  33.                 dula=1;
  34.     P0=table[num];
  35.     dula=0;
  36.     wela=1;
  37.     P0=0xfe;
  38.     wela=0;
  39. }
  40. void main( )
  41. {
  42. unsigned char status,i;
  43. unsigned int temp;
  44. InitializeSystem( );
  45. PcdReset();
  46. PcdAntennaOff();
  47. PcdAntennaOn();

  48. while(1)
  49. {
  50.   status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
  51.   if (status != MI_OK) {
  52.    InitializeSystem( );
  53.    PcdReset();
  54.    PcdAntennaOff();
  55.    PcdAntennaOn();
  56.    continue;
  57.   }
  58.   printf("卡的类型:");
  59.   for(i=0; i<2; i++) {
  60.    temp=g_ucTempbuf[i];
  61.    printf("%X",temp);
  62.   }
  63.   status = PcdAnticoll(g_ucTempbuf);//防冲撞
  64.   if (status != MI_OK) {
  65.    continue;
  66.   }

  67.   ////////以下为超级终端打印出的内容////////////////////////
  68.   printf("卡序列号:"); //超级终端显示,
  69.   for(i=0; i<4; i++) {
  70.    temp=g_ucTempbuf[i];
  71.    printf("%X",temp);
  72.   }
  73.   ///////////////////////////////////////////////////////////
  74.   status = PcdSelect(g_ucTempbuf);//选定卡片
  75.   if (status != MI_OK) {
  76.    continue;
  77.   }
  78.   status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
  79.   if (status != MI_OK) {
  80.    continue;
  81.   }
  82.   status = PcdWrite(1, data1);//写块
  83.   if (status != MI_OK) {
  84.    continue;
  85.   }
  86.   while(1)
  87.   {
  88.       display(num);   
  89.    status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
  90.    
  91.    if (status != MI_OK) {
  92.     InitializeSystem( );
  93.     PcdReset();
  94.     PcdAntennaOff();
  95.     PcdAntennaOn();
  96.     continue;
  97.    }
  98.    status = PcdAnticoll(g_ucTempbuf);//防冲撞
  99.    if (status != MI_OK) {
  100.     printf("防冲撞失败\n");
  101.     continue;
  102.    }
  103.    printf("卡序列号:"); //超级终端显示,
  104.    for(i=0; i<4; i++) {
  105.     temp=g_ucTempbuf[i];
  106.     printf("%X",temp);
  107.    }
  108.    printf("\n");
  109.    status = PcdSelect(g_ucTempbuf);//选定卡片
  110.    if (status != MI_OK) {
  111.     printf("选卡失败\n");
  112.     continue;
  113.    }
  114.    status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
  115.    if (status != MI_OK) {
  116.     printf("密码验证失败\n");
  117.     continue;
  118.    }

  119.    status = PcdValue(PICC_DECREMENT,1,data2);//扣款
  120.    if (status != MI_OK) {
  121.     printf("扣款失败\n");
  122.     continue;
  123.    }
  124.    status = PcdBakValue(1, 2);//块备份
  125.    if (status != MI_OK) {
  126.     printf("块备份失败\n");
  127.     continue;
  128.    }
  129.    status = PcdRead(2, g_ucTempbuf);//读块
  130.    if (status != MI_OK) {
  131.     printf("读块失败\n");
  132.     continue;
  133.    }
  134.    printf("卡读块:"); //超级终端显示,
  135.    for(i=0; i<16; i++) {
  136.     temp=g_ucTempbuf[i];
  137.     printf("%X",temp);
  138.    }
  139.    printf("\n");
  140.    
  141.    if(PcdHalt() != MI_OK){
  142.     printf("休眠卡片失败\n");
  143.    }
  144.    
  145.         Delay1000ms();
  146.       
  147.    
  148.        num+=2;
  149.   
  150.    
  151.       
  152.   }
  153.   
  154.   
  155. }
  156. }

  157. /////////////////////////////////////////////////////////////////////
  158. //系统初始化
  159. /////////////////////////////////////////////////////////////////////
  160. void InitializeSystem() {
  161. P0 = 0xFF;
  162. P1 = 0xFF;
  163. P2 = 0xFF;
  164. P3 = 0xFF;
  165. TMOD=0x21;     //设T0为方式1,
  166. SCON=0x50;
  167. TH1=0xF4;          //波特率为2400bps
  168. TL1=0xF4;
  169. TH0=(65536-50000)/256;
  170. TL0=(65536-50000)%256;;
  171. TR0=1;            
  172. ET0=1;             //允许T0中断
  173. TR1=1;      //开启定时器
  174. TI=1;     //发送标志位
  175. EA=1;       //开启总中断
  176. ES = 1;    //允许串口中断
  177. RI = 1;    //接收标志位
  178. }

  179. void timer0() interrupt 1
  180. {
  181.          

  182.    TH0=(65536-50000)/256;
  183.     TL0=(65536-50000)%256;
  184.            if(num>=6)
  185.          num=1;
  186. }   
复制代码


评分

参与人数 1黑币 +8 收起 理由
lgjdqm + 8 赞一个!

查看全部评分

回复

使用道具 举报

ID:348627 发表于 2018-7-26 14:39 | 显示全部楼层
抱歉 上面的代码是第一次写的 错误很多。。下面附上现在的代码。。。。
回复

使用道具 举报

ID:348627 发表于 2018-7-26 14:41 | 显示全部楼层
#include <reg52.h>
#include  <STDIO.H>
#include <string.h>
#include "main.h"
#include "mfrc522.h"
sbit dula=P2^6;
sbit wela=P2^7;
int num,num1,flag;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71};
unsigned char code data1[16] = {0x12,0x34,0x56,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char code data2[4]  = {0,0,0,0x01};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};


unsigned char g_ucTempbuf[20];


void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 8;
        j = 1;
        k = 243;
        do{
                do{
                        while (--k);
                } while (--j);
        } while (--i);
}

void display(unsigned char num)
{
                       dula=1;
                                P0=table[num];
                                dula=0;

                                wela=1;
                                P0=0xfe;
                                wela=0;

}


void main( ) {
        unsigned char status,i;
        unsigned int temp;
        InitializeSystem( );
        PcdReset();
        PcdAntennaOff();
        PcdAntennaOn();
        while (1)
        {
                 
                status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
                if (status != MI_OK) {
                        InitializeSystem( );
                        PcdReset();
                        PcdAntennaOff();
                        PcdAntennaOn();
                        continue;
                }

                printf("卡的类型:");
                for(i=0; i<2; i++) {
                        temp=g_ucTempbuf[i];
                        printf("%X",temp);

                }

                status = PcdAnticoll(g_ucTempbuf);//防冲撞
                if (status != MI_OK) {
                        continue;
                }


                ////////以下为超级终端打印出的内容////////////////////////

                printf("卡序列号:");        //超级终端显示,
                for(i=0; i<4; i++) {
                        temp=g_ucTempbuf[i];
                        printf("%X",temp);

                }

                ///////////////////////////////////////////////////////////

                status = PcdSelect(g_ucTempbuf);//选定卡片
                if (status != MI_OK) {
                        continue;
                }

                status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
                if (status != MI_OK) {
                        continue;
                }

                status = PcdWrite(1, data1);//写块
                if (status != MI_OK) {
                        continue;
                }

                while(1) {
                         display(num);
                        status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
                       
                        if (status != MI_OK) {
                                InitializeSystem( );
                                PcdReset();
                                PcdAntennaOff();
                                PcdAntennaOn();
                                continue;
                        }
                        status = PcdAnticoll(g_ucTempbuf);//防冲撞
                        if (status != MI_OK) {
                                printf("防冲撞失败\n");
                                continue;
                        }
                        printf("卡序列号:");        //超级终端显示,
                        for(i=0; i<4; i++) {
                                temp=g_ucTempbuf[i];
                                printf("%X",temp);

                        }
                        printf("\n");
                        status = PcdSelect(g_ucTempbuf);//选定卡片
                        if (status != MI_OK) {
                                printf("选卡失败\n");
                                continue;
                        }

                        status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
                        if (status != MI_OK) {
                                printf("密码验证失败\n");
                                continue;
                        }


                        status = PcdValue(PICC_DECREMENT,1,data2);//扣款
                        if (status != MI_OK) {
                                printf("扣款失败\n");
                                continue;
                        }

                        status = PcdBakValue(1, 2);//块备份
                        if (status != MI_OK) {
                                printf("块备份失败\n");
                                continue;
                        }

                        status = PcdRead(2, g_ucTempbuf);//读块
                        if (status != MI_OK) {
                                printf("读块失败\n");
                                continue;
                        }
                        printf("卡读块:");        //超级终端显示,
                        for(i=0; i<16; i++) {
                                temp=g_ucTempbuf[i];
                                printf("%X",temp);

                        }
                        printf("\n");
                       
                        if(PcdHalt() != MI_OK){
                                printf("休眠卡片失败\n");
                        }
                       
                         Delay1000ms();
                     num=num+3;
                     flag=1;
       
                }

               
               
        }
}


/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem() {

        P0 = 0xFF;
        P1 = 0xFF;
        P2 = 0xFF;
        P3 = 0xFF;

        TMOD=0x21;                   //设T0为方式1,GATE=1;
        SCON=0x50;
        TH1=0xF4;          //波特率为2400bps
        TL1=0xF4;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        ET0=1;             //允许T0中断
        TR1=1;                           //开启定时器
        TI=1;                                //发送标志位
        EA=1;                                   //开启总中断
       
//        ES = 1;                                //允许串口中断
//        RI = 1;                                //接收标志位
}

void timer0() interrupt 1
{       
         
       
          TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        if(flag==1)
  {       
       
           num1++;
     if(num1==20)
           {  
          
                     num1=0;
              num=num-1;
         if(num<=0)
           num=9;
                                                               
                               
                                }
                        }
}  



















/*
void Uart(void) interrupt 4
{
        if(RI)
        {
                if(SBUF == 0)
                        printf("接收到\n");
                RI = 0;
        }
}
*/


回复

使用道具 举报

ID:379466 发表于 2018-7-26 15:42 | 显示全部楼层
你只要开了中断EA = 1;开启T0中断ET0 = 1;开启T0 TR0 = 1;装上初值都可以进入中断,除非你的程序跑飞了。
回复

使用道具 举报

ID:348627 发表于 2018-7-27 11:40 | 显示全部楼层
jadqin 发表于 2018-7-26 15:42
你只要开了中断EA = 1;开启T0中断ET0 = 1;开启T0 TR0 = 1;装上初值都可以进入中断,除非你的程序跑飞了。

昨天自己找到问题,就是不能让循环感应磁卡。。。加上一个限制条件就能进入中断了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表