久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6283|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av播放 | 国产精品久久久久久久久久久免费看 | 成人欧美一区二区三区 | 中文字幕第一页在线 | 在线亚洲欧美 | 国产免费xxx | 久久久久国产精品午夜一区 | 一级黄色影片在线观看 | 亚洲欧美高清 | 日韩一级电影免费观看 | 欧美亚洲另类丝袜综合网动图 | 91精品国产乱码久久久久久 | 伊人久操| 精品国产一区二区三区性色 | 天天拍天天操 | 国产精品视频www | 欧美一区二区网站 | 亚洲看片网站 | 午夜视频免费网站 | www国产亚洲精品久久网站 | 久久久一二三 | 成人免费网视频 | 精品美女视频在免费观看 | 国产精品日韩欧美一区二区三区 | avtt国产| 精品国产青草久久久久96 | 久久av一区二区 | 欧美精品一二区 | 国产成人精品一区二区三 | 亚洲国产高清免费 | aa级毛片毛片免费观看久 | 国产精品久久久久久久久免费桃花 | 一级毛片在线播放 | 亚洲欧美日韩久久久 | 日韩在线视频免费观看 | 国产欧美一区二区在线观看 | h小视频| 成人自拍视频网站 | 国产一级淫片a直接免费看 免费a网站 | 欧美在线视频观看 | 久久久久久久久久影视 |