⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用PICC开发的RC500的完整C源程序。单片机用PIC16f73。
💻 C
字号:
#define uchar unsigned char
#define uint unsigned int

#include "pic.h"
#include "string.h"
#include "inc\define.h"
#include "inc\rc500.h"
interrupt intserv(void);
void delay();
void char_to_hex();

void WriteRC(unsigned char Address, unsigned char value);    //通用寄存器写命令,先指定页,再对地址写数据
char ReadRC(unsigned char Address);                            //通用寄存器读命令,先指定页,再对地址读数据
void PutRC500(unsigned char address,unsigned char dat3);     // Write one byte to the reader IC address space
char GetRC500(unsigned char address);
char RC500Config(void);
char RC500OutSelect(unsigned char type);
char Mf500PiccRequest(unsigned char req_code, unsigned char *atq);
char RC500GetSnr(unsigned char* snr);
char Mf500PiccAnticoll (unsigned char bcnt,unsigned char *snr);
char PcdRfReset(unsigned char ms);
// char PcdReset(void);
void PcdSetTmo(unsigned int tmoLength);
char PcdSingleResponseCmd(unsigned char cmd);

// char Mf500PcdSetDefaultAttrib(void);
// char Mf500PcdLoadKeyE2(unsigned char key_type,unsigned char sector,unsigned char *uncoded_keys);




char Mf500PiccCommonRequest(unsigned char req_code, unsigned char *atq);

//
char Mf500PiccCascAnticoll (unsigned char select_code,unsigned char bcnt,unsigned char *snr);
//
char Mf500PiccSelect(unsigned char *snr, unsigned char *sak);
//
char Mf500PiccCascSelect(unsigned char select_code, unsigned char *snr, unsigned char *sak);
// char Mf500PiccAuthKey(unsigned char auth_mode,unsigned char *snr,unsigned char *keys,  unsigned char sector);
//
// char Mf500PiccRead(unsigned char addr,unsigned char *data1);    //从相应卡块读 16 字节
// char Mf500PiccWrite(unsigned char addr,unsigned char *data1);   //向相应卡块写 16 字节
// char Mf500PiccHalt(void);
//
// char Mf500PiccAuthState(unsigned char auth_mode,unsigned char *snr,unsigned char sector);
//
// char Mf500PiccAuth(unsigned char key_type,unsigned char key_addr,unsigned char block);
// ;
// char Mf500PiccAuthE2(unsigned char auth_mode,unsigned char *snr,unsigned char key_sector,unsigned char block);
//
// char M500PiccValue(unsigned char dd_mode,unsigned char addr,unsigned long value);
//
// char M500PiccRestore(unsigned char addr);
//
// char M500PiccTransfer(unsigned char trans_addr);
//
// char Mf500HostCodeKey(unsigned char *uncoded, unsigned char *coded);
//
// void Mf500E2LoadKey(unsigned char *key,unsigned char addr);
// void Mf500E2ReloadKey(unsigned char addr);
char PcdReadE2(unsigned short startaddr,unsigned char length,unsigned char* data);
char PcdWriteE2(unsigned short startaddr,unsigned char length,unsigned char* data);
//
void SetBitMask(unsigned char reg,unsigned char mask);
void ClearBitMask(unsigned char reg,unsigned char mask);
void FlushFIFO(void);
// char ExchangeByteStream(unsigned char Cmd,unsigned char *send_data,unsigned char send_bytelen,unsigned char *rec_data,  unsigned char *rec_bytelen);
//
// void start_timeout(unsigned int _50us);
// void stop_timeout(void);
void CommRx(void);
void BeepBeep(unsigned char cunt,unsigned char Hold);
void BeepControl(void);
void Copy(unsigned char *ptr1,unsigned char *ptr2,unsigned char Numb);
void LED_R_Flash(unsigned char cunt,unsigned char timer);
void LEDControl(void);
void SysIni(void);
// void eStart(void);
// void eStop(void);
// void eSend(unsigned char ebyte);
// void WaitAck(void);
// void eNack(void) ;   //停止继续读
// void eAck(void) ; //发送继续读信号
// void DelayMS(unsigned char val);
// void DelayUS(void);//10us
// void Write24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr);
// void Read24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr);
// unsigned char eReceive(void);




//****************************************************************
//***************************** 主程序 ****************************
//****************************************************************
void main (void)
{
    SysIni();
while(1)
  {
    if(tmrCommRx)
    {
        // 操作请求
        status1 = Mf500PiccRequest(PICC_REQALL, tt1);//
        if (status1==MI_OK)
        // 读物理卡号
            status1=RC500GetSnr(Snr_RC500);
        if (status1==MI_OK)
        // 防碰撞
            status1=Mf500PiccAnticoll(0,Snr_RC500);
        if (status1==MI_OK)
        {
        // 选择卡
            status1=Mf500PiccSelect(Snr_RC500,sak1);
            Flag.CardIn=1;// 读到卡
           // BeepBeep(1,8);// 调试
            tmrReadCard=0;
            if ((Snr_RC500[0]==Snr_Temp[0])&&
                (Snr_RC500[1]==Snr_Temp[1])&&
                (Snr_RC500[2]==Snr_Temp[2])&&
                (Snr_RC500[3]==Snr_Temp[3]))
            {
                Flag.CardSame=1;
            }
            else
            {
                Flag.CardSame=0;
                Snr_Temp[0]=Snr_RC500[0];
                Snr_Temp[1]=Snr_RC500[1];
                Snr_Temp[2]=Snr_RC500[2];
                Snr_Temp[3]=Snr_RC500[3];
            }
        }
    }
    if (Flag.Over50ms)
    {
        Flag.Over50ms=0;
        if (Flag.cRxOver)
        {
             CommRx();
             Flag.cRxOver=0;
             cRxCunt=0;
        }
        LEDControl();
        BeepControl();
    }
  }
}
unsigned char HexToChar(unsigned char Hex)
{
unsigned char CharByte;
    if (Hex<0x0a)
    {
        CharByte=Hex+0x30;
    }
    else
    {
        Hex-=9;
        CharByte=Hex+0x40;
    }
    return CharByte;
}
unsigned char CharToHex(unsigned char Char1,unsigned char Char2)
{
unsigned char Hex;

    if (Char1 < 'A')
    {
        Char1 -= 0x30;
    }
    else
    {
        Char1 -= 0x40;
        Char1 += 9;
    }

    if (Char2 < 'A')
    {
        Char2 -= 0x30;
    }
    else
    {
        Char2 -= 0x40;
        Char2 += 9;
    }
    Hex = (Char1<<4)|Char2;
    return Hex;
}
interrupt intserv(void)
{
    unsigned char iRxByte;
    if ((RCIF)&&(RCIE))
    {
        tmrCommRx=0;
        iRxByte=RCREG;
        if ((FERR)||(OERR))
        {
            SPEN=0;
            SPEN=1;
            RCREG==RCREG;
        }
        else
        {
            Sta.CommErr=0;
            tmrCommErr=0;
            CommBuff[cRxCunt]=iRxByte;
            cRxCunt++;
        }
    }
    if (T0IF)//1.45ms
    {
        T0IF=0;
        tmrCommRx++;
        tmr50ms++;

        if (tmrCommRx==0) tmrCommRx=1;
        if ((tmrCommRx>=3)&&(cRxCunt))
        {
            Flag.cRxOver=1;
        }
    // 50ms
        if (tmr50ms>=68)
        {
            tmr50ms=0;
            Flag.Over50ms=1;
            tmrBeep++;
            tmrLed++;
            tmr500ms++;
            tmrCommErr++;
            if (tmrBeep>=BeepHoldTmr) {Flag.BeepOver=1;tmrBeep=0;}
            if (tmrLed>=LedHoldTmr) {Flag.LedOver=1;tmrLed=0;}
            if (tmrCommErr>42)
            {
                Sta.CommErr=1;
                LedHoldTmr=5;//每秒闪两次,亮250ms,灭250ms
            }

    // 500ms
            if (tmr500ms>=10)
            {
                tmr500ms=0;
                tmrReadCard++;
                if (tmrReadCard>=8)
                {
                    Flag.CardIn=0;
                    Snr_Temp[0]=0xff;
                    Snr_Temp[1]=0xff;
                    Snr_Temp[2]=0xff;
                    Snr_Temp[3]=0xff;
                    tmrReadCard=0;
                }

            }
        }

    }
    if (RBIF)
    {
        RBIE=0;
        RBIF=0;
    }
    if (INTF)
    {
        INTF=0;
        INTE=0;
    }
}
#include "code\rc500.c"
#include "code\comm.c"

void Copy(unsigned char *ptr1,unsigned char *ptr2,unsigned char Numb)
{
unsigned char i;
    while(Numb)
    {
        ptr2[i]=ptr1[i];
        Numb--;
        i++;
    }
}

void BeepBeep(unsigned char cunt,unsigned char Hold)
{
    BBcunt=cunt;
    BeepHoldTmr=Hold;
}

void BeepControl(void)
{
    if (Flag.BeepOver)
    {
        if (Sta.BEEP_ON)
        {
            BeepOff();
            Sta.BEEP_ON=0;
            BBcunt--;
            tmrBeep=0;
        }
        else
        {
            if (BBcunt)
            {
                BeepOn();
                Sta.BEEP_ON=1;
                tmrBeep=0;
            }
            else
            {
                BeepOff();
            }
        }
    }
    Flag.BeepOver=0;
}
void LED_R_Flash(unsigned char cunt,unsigned char timer)
{
    LEDcunt=cunt;
    LedHoldTmr=timer*2;
    Sta.CommErr=0;
    Flag.LedOver=1;
    tmrLed=0;
    Sta.LED_R_ON=0;
}
// LED 控制
void LEDControl(void)
{
    if (!Flag.LedOver)
        return;
    Flag.LedOver=0;
    if (Sta.CommErr) // 通信错误,2秒无通信
    {
        if (Sta.LED_R_ON)
        {
            Sta.LED_R_ON=0;
            LED_R_OFF();
            LED_G_OFF();
        }
        else
        {
            LED_G_OFF();
            Sta.LED_R_ON=1;
            LED_R_ON();
        }
    }
    else
    {

        if (LEDcunt)
        {
            if (Sta.LED_R_ON)
            {
                LED_R_OFF();
                LED_G_OFF();
                Sta.LED_R_ON=0;
                LEDcunt--;
            }
            else
            {
                LED_R_ON();
                LED_G_OFF();
                Sta.LED_R_ON=1;

            }
            tmrCommErr=0;
        }
//         else
//         {
//             LED_G_ON();
//             LED_R_OFF();
//         }

    }

}
void SysIni(void)
{
    unsigned int i;

    STATUS=0;
    INTCON=0x0;

    for(i=0;i<650;i++);         //for(i=0;i<550;i++);

    ADCON0=adcon0_ini;          //adc 初始化
    ADCON1=adcon1_ini;

    TRISA=trisa_ini;            //io 口初始化
    TRISB=trisb_ini;
    TRISC&=0xf2;
    PORTA=porta_ini;
    PORTB=portb_ini;
    PORTC=portc_ini;

    OPTION=option_ini;          //定时器0 初始化
    TMR0=timer0_ini;
    T0IF=0;

    T1CON=t1con_ini;            //定时器1 初始化
    TMR1L=timer1l_ini;
    TMR1H=timer1h_ini;
    TMR1IF=0;

    T2CON=t2con_ini;            //定时器 2 初始化
    TMR2=timer2_ini;
    TMR2IF=0;

    clrwdt();
//     eStop();
    ADCON1=adcon1_ini;
    ADCON0=adcon0_ini;          //adc 初始化
    rc500_rst = 0;
    rc500_cs  = 1;              // enable the cs for rc500
    rc500_wr  = 1;
    rc500_rd  = 1;
    rc500_ale = 0;

    RC500Config();           // Initialise the RC500
    RC500OutSelect(mfout);
    MyAddr=0x31;
//     Read24C32(E2Addr_Baud,1,&Baud);

    if (Baud!=35)
    {
        Baud=71;
    }
    SPBRG=Baud;
    RCSTA=rxdsta_ini;          //串口初始化
    TXSTA=txdsta_ini;
    RCIE=1;
    INTCON=0xE0;

    BeepBeep(2,8);
    Sta.CommErr=0;
    tmrCommErr=0;
    LED_R_Flash(1,5);
}
//#include "code\a24c01.c"
//#include "code\a24c32.c"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -