找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6290|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于rc522的一點(diǎn)問(wèn)題,為什么只有卡片在rc522感應(yīng)距離之內(nèi)才能 進(jìn)入T0中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:348627 發(fā)表于 2018-7-26 13:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
小白代碼大神勿噴 。為什么只有卡片在rc522感應(yīng)距離之內(nèi)才能 進(jìn)入T0中斷     注釋?zhuān)嚎ㄆ袘?yīng)正常,代碼中的中斷只為檢測(cè)是否進(jìn)入效果。
下面附上代碼


  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卡的某一塊寫(xiě)為如下格式,則該塊為錢(qián)包,可接收扣款和充值命令
  15. //4字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
  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("卡的類(lèi)型:");
  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.   ////////以下為超級(jí)終端打印出的內(nèi)容////////////////////////
  68.   printf("卡序列號(hào):"); //超級(jí)終端顯示,
  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);//驗(yàn)證卡片密碼
  79.   if (status != MI_OK) {
  80.    continue;
  81.   }
  82.   status = PcdWrite(1, data1);//寫(xiě)塊
  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("卡序列號(hào):"); //超級(jí)終端顯示,
  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);//驗(yàn)證卡片密碼
  115.    if (status != MI_OK) {
  116.     printf("密碼驗(yàn)證失敗\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("卡讀塊:"); //超級(jí)終端顯示,
  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. //系統(tǒng)初始化
  159. /////////////////////////////////////////////////////////////////////
  160. void InitializeSystem() {
  161. P0 = 0xFF;
  162. P1 = 0xFF;
  163. P2 = 0xFF;
  164. P3 = 0xFF;
  165. TMOD=0x21;     //設(shè)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;      //開(kāi)啟定時(shí)器
  174. TI=1;     //發(fā)送標(biāo)志位
  175. EA=1;       //開(kāi)啟總中斷
  176. ES = 1;    //允許串口中斷
  177. RI = 1;    //接收標(biāo)志位
  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. }   
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
lgjdqm + 8 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:348627 發(fā)表于 2018-7-26 14:39 | 只看該作者
抱歉 上面的代碼是第一次寫(xiě)的 錯(cuò)誤很多。。下面附上現(xiàn)在的代碼。。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:348627 發(fā)表于 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卡的某一塊寫(xiě)為如下格式,則該塊為錢(qián)包,可接收扣款和充值命令
//4字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
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("卡的類(lèi)型:");
                for(i=0; i<2; i++) {
                        temp=g_ucTempbuf[i];
                        printf("%X",temp);

                }

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


                ////////以下為超級(jí)終端打印出的內(nèi)容////////////////////////

                printf("卡序列號(hào):");        //超級(jí)終端顯示,
                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);//驗(yàn)證卡片密碼
                if (status != MI_OK) {
                        continue;
                }

                status = PcdWrite(1, data1);//寫(xiě)塊
                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("卡序列號(hào):");        //超級(jí)終端顯示,
                        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);//驗(yàn)證卡片密碼
                        if (status != MI_OK) {
                                printf("密碼驗(yàn)證失敗\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("卡讀塊:");        //超級(jí)終端顯示,
                        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;
       
                }

               
               
        }
}


/////////////////////////////////////////////////////////////////////
//系統(tǒng)初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem() {

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

        TMOD=0x21;                   //設(shè)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;                           //開(kāi)啟定時(shí)器
        TI=1;                                //發(fā)送標(biāo)志位
        EA=1;                                   //開(kāi)啟總中斷
       
//        ES = 1;                                //允許串口中斷
//        RI = 1;                                //接收標(biāo)志位
}

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;
        }
}
*/


回復(fù)

使用道具 舉報(bào)

地板
ID:379466 發(fā)表于 2018-7-26 15:42 | 只看該作者
你只要開(kāi)了中斷EA = 1;開(kāi)啟T0中斷ET0 = 1;開(kāi)啟T0 TR0 = 1;裝上初值都可以進(jìn)入中斷,除非你的程序跑飛了。
回復(fù)

使用道具 舉報(bào)

5#
ID:348627 發(fā)表于 2018-7-27 11:40 | 只看該作者
jadqin 發(fā)表于 2018-7-26 15:42
你只要開(kāi)了中斷EA = 1;開(kāi)啟T0中斷ET0 = 1;開(kāi)啟T0 TR0 = 1;裝上初值都可以進(jìn)入中斷,除非你的程序跑飛了。

昨天自己找到問(wèn)題,就是不能讓循環(huán)感應(yīng)磁卡。。。加上一個(gè)限制條件就能進(jìn)入中斷了!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表