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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2553|回復: 6
打印 上一主題 下一主題
收起左側

stc15w408as和rfid-rc522如何進行刷卡 求思路

[復制鏈接]
跳轉到指定樓層
樓主
80黑幣
各位大佬 最近在做個刷卡功能的單片機,用的時stc15w408as,然后根據rc-522給的51單片機代碼,改了下管腳定義,但是在上位機上卻尋不到卡,有沒有大佬能幫我看下怎么改才能正常工作

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

使用道具 舉報

沙發
ID:708209 發表于 2020-4-5 17:38 | 只看該作者
這是我的代碼
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"       
#include <string.h>
//M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
//4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
unsigned char code data2[4]  = {0x12,0,0,0};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];   
unsigned char idata MLastSelectedSnr[4];
unsigned char idata RevBuffer[30];  
unsigned char data SerBuffer[20];
bit CmdValid;                           

void iccardcode()
{             
          unsigned char cmd;
        unsigned char status;
       
        cmd = RevBuffer[0];
        switch(cmd)
        {
                case 1:     // Halt the card     //終止卡的操作
                        status= PcdHalt();;                       
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;
                        break;                       
                case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
                                // 尋卡,防沖突,選擇卡    返回卡類型(2 bytes)+ 卡系列號(4 bytes)
                        status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
                        if(status!=0)
                        {
                                status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
                                if(status!=0)                               
                                {
                                        RevBuffer[0]=1;       
                                        RevBuffer[1]=status;
                                        break;
                                }
                        }  
                        RevBuffer[0]=3;       
                        RevBuffer[1]=status;
                        break;
                       
                case 3:                         // 防沖突 讀卡的系列號 MLastSelectedSnr
                        status = PcdAnticoll(&RevBuffer[2]);
                        if(status!=0)
                        {
                                RevBuffer[0]=1;       
                                RevBuffer[1]=status;
                                break;
                        }
                        memcpy(MLastSelectedSnr,&RevBuffer[2],4);
                        RevBuffer[0]=5;
                        RevBuffer[1]=status;
                        break;       
                case 4:                                    // 選擇卡 Select Card
                        status=PcdSelect(MLastSelectedSnr);
                        if(status!=MI_OK)
                        {
                                RevBuffer[0]=1;       
                                RevBuffer[1]=status;
                                break;
                        }
                        RevBuffer[0]=3;
                        RevBuffer[1]=status;                       
                        break;
                case 5:            // Key loading into the MF RC500's EEPROM
            status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校驗卡密碼
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;                                                       
                case 6:
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;                               
                case 7:     
                    RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;
                case 8:     // Read the mifare card
                            // 讀卡
                        status=PcdRead(RevBuffer[1],&RevBuffer[2]);
                        if(status==0)
                        {RevBuffer[0]=17;}
                        else
                        {RevBuffer[0]=1;}
                        RevBuffer[1]=status;                       
                        break;
                case 9:     // Write the mifare card
                            // 寫卡  下載密碼
                        status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;
                case 10:
            PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
                        RevBuffer[0]=1;       
                        RevBuffer[1]=status;
                        break;
                case 12:    // 參數設置
                    PcdBakValue(RevBuffer[1], RevBuffer[2]);
                        RevBuffer[0]=1;        //contact
                        RevBuffer[1]=0;
                        break;               
        }






        }
/////////////////////////////////////////////////////////////////////
//系統初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;



        ET2 = 0;        
        T2CON = 0x04;               
    PCON = 0x80;               
    SCON = 0x70;                 
    TMOD = 0x21;        //TMOD = 0x22;

        TH1   = BAUD_9600;
        TL1   = TH1;
        TR1   = 1;             // 波特率發生器

        TH0 = 0x60;
    TL0 = 0x60;
    TR0 = 0;
   
    ET0=0;
        ET1=0;
        EA=1;
        EX0=1;
        IT0 = 1;       
        TR2=0;
        ES = 1;   
        CmdValid=0;

     LED_GREEN = 1;
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();  
         M500PcdConfigISOType( 'A' );
     LED_GREEN = 0;
         delay_10ms(10);       
     LED_GREEN = 1;
         delay_10ms(10);
     LED_GREEN = 0;
}

/////////////////////////////////////////////////////////////////////
//用T2做延時子程序
/////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////
// 接收和發送中斷
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
    unsigned char len, i;
          unsigned int j=0;
         
          if(RI)
        {               
                len=SBUF;
                RI=0;       
                for(i=0;i<len;i++)
                {
                        while(!RI)
                        {
                                j++;
                                if(j>1000)
                                {
                                    break;
                                }
                        }
                        if(j<1000)
                        {
                                RevBuffer[i]=SBUF;
                                RI=0;
                                j=0;
                        }
                        else
                        {
                            break;
                        }
                }
                if(i==len)
                {
                        REN=0;
                        CmdValid=1;
                }
        }
        else if(!RI && TI)
        {
                TI=0;
                len=RevBuffer[0];
                for(i=0;i<len+1;i++)
                {
                        SBUF=RevBuffer[i];
                        while(!TI);
                        TI=0;                       
                }
                REN=1;
        }
}



  void main( )
{   
    unsigned char baud;
     InitializeSystem( );
    while (1)
    {       
            if (CmdValid)
            {
                    CmdValid = FALSE;
                    if(RevBuffer[0]==11)            //為了加快相應速度 測試風鳴器
                    {
                            RevBuffer[2]=RevBuffer[1];
                              RevBuffer[0]=1;         //contact
                            RevBuffer[1]=0;
                            CALL_isr_UART();               
                LED_GREEN = 1;
                            delay_10ms(RevBuffer[2]);
                LED_GREEN = 0;
                    }
                    else if(RevBuffer[0]==13)   //設置通訊波特率
                    {
                            switch(RevBuffer[1])
                            {
                                    case 0:
                                            baud=BAUD_9600;
                                            break;
                                    case 1:
                                            baud=BAUD_14400;
                                            break;
                                    case 2:
                                            baud=BAUD_19200;
                                            break;
                                    case 3:
                                            baud=BAUD_28800;
                                            break;
                                    case 4:
                                            baud=BAUD_38400;
                                            break;
                                    case 5:
                                            baud=BAUD_57600;
                                            break;
                                    case 6:
                                            baud=BAUD_115200;
                                            break;
                                    default:
                                            baud=BAUD_9600;
                                            break;
                            }                               
                            RevBuffer[0]=1;                //contact
                            RevBuffer[1]=0;
                            CALL_isr_UART();
                            delay_10ms(5);                       
                            TR1   = 0;
                            TH1   = baud;
                            TL1   = TH1;
                            delay_10ms(2);
                            TR1   = TRUE;
                    }

                       else
                    {
                    iccardcode();
                            CALL_isr_UART();
                    }



         }
         }
}

回復

使用道具 舉報

板凳
ID:708209 發表于 2020-4-5 17:38 | 只看該作者
本帖最后由 陳慢慢 于 2020-4-5 17:49 編輯

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;

/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;


/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;


sfr P5    =   0xC8;   
sbit P54  =   P5^4;
sbit P55  =   P5^5;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX       =   P1^1; // 8052 only
sbit T2         =   P1^0; // 8052 only
            
/*  T2CON  */
sbit TF2        =   T2CON^7;
sbit EXF2       =   T2CON^6;
sbit RCLK       =   T2CON^5;
sbit TCLK       =   T2CON^4;
sbit EXEN2      =   T2CON^3;
sbit TR2        =   T2CON^2;
sbit C_T2       =   T2CON^1;
sbit CP_RL2     =   T2CON^0;

//sbit SPEAKER    =   P1^6;
//sbit RC500RST   =   P3^3;

sfr16   RCAP2LH =   0xCA;
sfr16   T2LH    =   0xCC;
回復

使用道具 舉報

地板
ID:708209 發表于 2020-4-5 17:39 | 只看該作者
//////////////////////////////////
//端口定義
/////////////////////////////////////////////////////////////////////
//MFRC522
sbit     MF522_RST  =    P5^4;                   //RC500片選
sbit     MF522_NSS  =    P1^2;
sbit     MF522_SCK  =    P1^5;
sbit     MF522_SI   =    P1^3;
sbit     MF522_SO   =    P1^4;
//指示燈
//指示燈
sbit     LED_GREEN  =    P1^5;     
/////////////////////////////////////////////////////////////////////
//函數原型
/////////////////////////////////////////////////////////////////////
void InitializeSystem();                                   
#define BAUD_115200             256 - (OSC_FREQ/192L)/115200L   // 255
#define BAUD_57600              256 - (OSC_FREQ/192L)/57600L    // 254
#define BAUD_38400              256 - (OSC_FREQ/192L)/38400L    // 253
#define BAUD_28800              256 - (OSC_FREQ/192L)/28800L    // 252
#define BAUD_19200              256 - (OSC_FREQ/192L)/19200L    // 250
#define BAUD_14400              256 - (OSC_FREQ/192L)/14400L    // 248
#define BAUD_9600               256 - (OSC_FREQ/192L)/9600L     // 244                                   
#define OSC_FREQ                22118400L
//#define  OSC_FREQ        7372800L
#define OSC_FREQ          22118400L
#define  RCAP2_50us      65536L - OSC_FREQ/40417L
#define  RCAP2_1ms       65536L - OSC_FREQ/2000L
#define  RCAP2_10ms      65536L - OSC_FREQ/1200L
#define  TIME0_500us     65536L - OSC_FREQ/8000L
#define  TIME0_10ms      65536L - OSC_FREQ/200





#define CALL_isr_UART()         TI = 1
#define TRUE 1
#define FALSE 0
回復

使用道具 舉報

5#
ID:338503 發表于 2024-12-28 17:06 | 只看該作者
stc15w408as單片機的IO需要先設置工作模式,就是PxM0和PxM1要作相應設置才可以。
回復

使用道具 舉報

6#
ID:338503 發表于 2024-12-30 07:31 | 只看該作者

回復

使用道具 舉報

7#
ID:338503 發表于 2024-12-30 07:44 | 只看該作者
例如可以這樣設置:P1M0 = 0x2C; P1M1=0x10; // P1.2  P1.3   P1.5為推挽輸出模式  P1.4為高阻輸入
       
P5M0 |= 0x10;  P5M1 &= ~0x10; /0001 0000設置P5.4 為推挽輸出模式
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美a在线| 国产三区在线观看视频 | 日韩黄色免费 | 精品99久久久久久 | 日本成人中文字幕在线观看 | 欧美一区不卡 | 麻豆av免费观看 | 日韩成人免费视频 | 日韩视频一区二区三区 | 免费黄色网址视频 | 天天综合久久 | 91精品国产综合久久国产大片 | 国产精品免费在线 | 天天综合永久入口 | 一区二区三区不卡视频 | 91久久精品国产免费一区 | 成av在线 | 天天宗合网| 国产一二三视频在线观看 | 国产精品久久一区二区三区 | 成年人的视频免费观看 | 亚洲一区二区三区久久 | 欧美性影院 | 国产欧美日韩精品一区二区三区 | www.国产.com| 手机av在线 | 精品自拍视频在线观看 | 91美女视频 | 久久av一区 | 免费在线视频一区二区 | 日本福利视频免费观看 | 日韩一二三区视频 | 97国产爽爽爽久久久 | 午夜天堂精品久久久久 | 欧美一区二区三区免费在线观看 | 国产精品一区二 | 男人的天堂久久 | 久久久精品在线 | 操操操操操 | 亚洲欧美中文日韩在线v日本 | 精品一区二区久久久久久久网站 |