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

📄 ri-r6c-001a.c

📁 基于HT46R24设计的电子标签读卡器设计
💻 C
字号:
#include <ht46r24.h>

#define SCLOCK   _pa3
#define CCLOCK   _13_3          //时钟控制权的设置
#define M_ERR    _pa2
#define DIN      _pa1
#define DOUT     _pa0
#define LED      _pc0
#define HTTX     _pd0
#define HTTR     _pd1
#define T        90             //波特率 9600 = 4M/4/(T+14) ===> T = 90
#define merr     0x40

/////////////////////////////////////////////////////////////////////////////////////
//           HT46R24初始化
/////////////////////////////////////////////////////////////////////////////////////
void init(){
    _pac = 0x05;     //其中SCLOCK、DIN初始化为输出,M_ERR、DOUT初始化为输入
    _pa  = 0x00;
    _pcc = 0x00;     //全部设置为输出
    _pc  = 0x00;
    _pdc = 0x02;     //HTTX设置为输出、HTTR设置为输入
    _pd  = 0x00;
}
//////////////////////////////////////////////////////////////////////////////////////
//            延时函数
//////////////////////////////////////////////////////////////////////////////////////
void delay()
{
    _nop();
    _nop();
    _nop();
    _nop();
}
//////////////////////////////////////////////////////////////////////////////////////
//          向串口发送一个字节
//////////////////////////////////////////////////////////////////////////////////////
void transmit(unsigned char val)
{
	unsigned char i;
	HTTX = 0;
	for(i=0; i<8; i++)
	{
		_delay(T);
		if (val & 1) 
			HTTX = 1;
		else 
			HTTX = 0;
		val >>= 1;
	}
	_delay(T);
	HTTX = 1;
	_delay(T);
}
//////////////////////////////////////////////////////////////////////////////////////
//        从串口接收一个字节
//////////////////////////////////////////////////////////////////////////////////////
void receive(unsigned char *val)
{
	unsigned char i, v;
	v = 0;
	while(HTTR);      //wait start bit
	for(i=0; i<8; i++)
	{
		_delay(T);
		if (HTTR) 
			v |= (unsigned char)0x80;
		v >>= 1;
	}
	_delay(T);      //skip stop bit
	_delay(T);
	*val = v;
}
//////////////////////////////////////////////////////////////////////////////////////
//              CRC效验函数
//////////////////////////////////////////////////////////////////////////////////////
unsigned int CRC(unsigned char *cBuffer, unsigned int iBufLen, bit fan)
{
    unsigned int i, j;
    unsigned long wPolynom = 0x8408, wCrc = 0xffff;

    for (i = 0; i < iBufLen; i++)
    {
        wCrc ^= cBuffer[i];

        for (j = 0; j < 8; j++)
        {
            if (wCrc &0x0001)
            {
                wCrc = (wCrc >> 1) ^ wPolynom;
            }
            else
            {
                wCrc = wCrc >> 1;
            }
        }
    }
    if (fan)
    {
        wCrc = ~wCrc;
    }
    return wCrc;
}
//////////////////////////////////////////////////////////////////////////////////////
//             时钟信号函数
//////////////////////////////////////////////////////////////////////////////////////
void clock(void)
{
    _nop();
    SCLOCK = 1;
    delay();
    SCLOCK = 0;
}
///////////////////////////////////////////////////////////////////////////////
//             开始信号函数
///////////////////////////////////////////////////////////////////////////////
void start()
{
    SCLOCK = 0; 
    delay();
    DIN = 0; 
    delay();
    SCLOCK = 1; 
    delay();
    DIN = 1;
    delay();
    SCLOCK = 0; 
    delay();
}
///////////////////////////////////////////////////////////////////////////////
//             结束信号函数
///////////////////////////////////////////////////////////////////////////////
void stop()
{
    SCLOCK = 0;
    delay();
    DIN = 1;
    delay();
    SCLOCK = 1;
    delay();
    DIN = 0;
    delay();
    SCLOCK = 0;
    delay();
}
///////////////////////////////////////////////////////////////////////////////
//            TRAN1
///////////////////////////////////////////////////////////////////////////////
void tran1()
{
    SCLOCK = 0;
    DIN = 1;
    delay();
    CCLOCK = 1;    //时钟控制权交给RI-R6C-001A
    delay();
    DIN = 0;
    delay();
    DIN = 1;
}
////////////////////////////////////////////////////////////////////////////////
//             TRAN2
////////////////////////////////////////////////////////////////////////////////
void tran2()
{
    DIN = 0;
    delay();
    DIN = 1;
    delay();
    DIN = 0;
    delay();
}
////////////////////////////////////////////////////////////////////////////
//                  发8位数据到RI-R6C-001A,低位在先
////////////////////////////////////////////////////////////////////////////
void SendByte(unsigned char datas)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        while (DOUT);      //检测FIFO是否允许MCU发送是数据
        DIN = (bit)(datas & 0x01); 
        clock();
        datas = datas >> 1;
    }

}
////////////////////////////////////////////////////////////////////////////
//                   发8位数据到RI-R6C-001A,高位在先
////////////////////////////////////////////////////////////////////////////
void SendCmd(unsigned char datas, unsigned char length)	  
{
    unsigned char i;
    for (i = 0; i < length; i++)
    {
        while (DOUT);           //检测FIFO是否允许MCU发送是数据
		DIN = (datas >> (7 - i)) & 0x01;
        clock();
    }
}
/////////////////////////////////////////////////////////////////////////////
//                   向RI-R6C-001A发送数据
/////////////////////////////////////////////////////////////////////////////
void SendData(unsigned char *sdatas, unsigned char length)
{
    unsigned char i;
    SendCmd(0x2b, 8);           //命令编码选用‘2B’--->获取系统信息
    for (i = 0; i < length; i++)
    {
        SendByte(sdatas[i]);
    }
}
/////////////////////////////////////////////////////////////////////////////
//                   初始化RI-R6C-001A
/////////////////////////////////////////////////////////////////////////////
void InitTIC(void)
{
    SCLOCK = 0; 
    DIN = 0; 

    start();                   //发送起始信号
    SendCmd(0x7b, 8);          //初始化时间寄存器
    SendCmd(0x80, 8);
    SendCmd(0xC0, 5);
    stop();

    start();
    SendCmd(0x7D, 8);         //初始化配置寄存器
    SendCmd(0x2A, 8);
    stop();
}
/////////////////////////////////////////////////////////////////////////////
//                   从RI-R6C-001A接收数据
/////////////////////////////////////////////////////////////////////////////
unsigned char ReceiveData(unsigned char *datas, unsigned char len)
{
    #define timeout 1000
    unsigned char rd = 0, i = 0, j = 0, k = 0;
    unsigned int time;
    bit rdb;
    time = 0;
    while (!SCLOCK)
    {
        time++;
        if (time > timeout)
        {
            return 0;
        }
    }
    time = 0;
    while (SCLOCK)
    {
        time++;
        if (time > timeout)
        {
            return 0;
        }
    }
    for (i = 0; i < len; i++)
    {
        time = 0;
        while (!SCLOCK)
        {
            if (M_ERR == 1)
            {
                return merr;
            }
            time++;
            if (time > timeout)
            {
                return 0;
            }
        }
        rd = rd >> 1;
        rdb = DOUT;
        if (rdb == 1)
        {
            rd = rd | 0x80; 
        }
        j++;
        if (j == 0x08)    // 已经有8位
        {
            datas[k] = rd;
            k++;
            rd = 0;
            j = 0;
        }
        time = 0;
        while (SCLOCK)
        {
            if (M_ERR == 1)
            {
                return merr;
            }
            time++;
            if (time > timeout)
            {
                return 0;
            }
        }
    }
    return 1;
}
///////////////////////////////////////////////////////////////////////////////
//                获取电子标签的UID号
///////////////////////////////////////////////////////////////////////////////
unsigned char getid(unsigned char *id)
{
    unsigned char datas[4];   //={0x03,0x2b,0xfe,0xba};
    unsigned char buffer[17];  //={0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,};

    //for(i=0;i<4;i++) buffer[i]=0xff;
    buffer[0] = 0xff;
    buffer[1] = 0xff;
    buffer[2] = 0xff;
    buffer[3] = 0xff;
	//buffer[4] = 0;buffer[5] = 0;buffer[6] = 0;buffer[7] = 0;
	//buffer[8] = 0;buffer[9] = 0;buffer[10] = 0;buffer[11] = 0;buffer[12] = 0;buffer[13] = 0;
	//buffer[14] = 0;buffer[15] = 0;buffer[16] = 0;

    datas[0] = 0x03;
    datas[1] = 0x2b;
    datas[2] = 0xfe;
    datas[3] = 0xba;

    start();
    SendData(datas, 0x04);
    stop();
    tran1();
    ReceiveData(buffer, 136);
    tran2();

    if (0xF0B8 == CRC(buffer, 14, 0))  //Calc the Receive-data CRC.
    {
        id[0] = buffer[9];	  //
        id[1] = buffer[8];	  //
        id[2] = buffer[7];	  //
        id[3] = buffer[6];    //  return result
        id[4] = buffer[5];	  //
        id[5] = buffer[4];	  //
        id[6] = buffer[3];	  //
        id[7] = buffer[2];	  //
        return (0x1);         //  CRC ok
    }
    else
    {
        return (0x0);         //CRC error
    }

}
/////////////////////////////////////////////////////////////
//               main()函数
/////////////////////////////////////////////////////////////
void main()
{
    char tmp,i;
    unsigned char id[8];
    LED = 0;
    delayms(500);
    LED = 1;
    init();
    InitTIC();           //配置RI-R6C-001A-iso15693
    while (1)
    {
        tmp = getid(id);
        if (tmp == 1)         
        {
            LED = 0;
			delayms(1);
            for (i = 0; i < 8; i++)
            {
				transmit(id[i]);
            }
        }
		LED = 1;
    }
}

⌨️ 快捷键说明

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