rfid 125khz

环境是STVD V4.1.6,
编译器是COSMIC STM8 C Compiler 16K ,Version: 4.3.1
调用的库有:GPIO,TIM2

相关宏定义:

//RF数据引脚
#define DATA_PORT   GPIOC
#define DATA_PIN    GPIO_PIN_3

//定义每一位的宽度,t/4us
#define BIT_TIME        128//一位数据时间
#define HAFE_TIME       64//半位数据时间
#define ERROR_BAND      10//允许是时间误差
#define BIT_HAFE_TIME   192//1.5位数据时间

//端口C外部中断,捕捉RFID卡数据输出的所有电平跳变
@far @interrupt void IntSrvPortC(void)
{
    unsigned char ucTemp;
    unsigned char ucCurrBitTime;
    _Bool bData;
   
    static _Bool s_bLastData;
   
    //先读取定时器计数器,即与上次中断的时间间隔,这是当前位的位宽
    //定时器每个值为4us,单独开启一个定时器计数
    if(TIM2->CNTRH == 0)
    {
        ucCurrBitTime = TIM2->CNTRL;
    }
    else//如果定时时间超过255,则以255计算
    {
        ucCurrBitTime = 255;
    }
    TIM2_SetCounter(0);//复位计数器,从0开始重新计时
   
    //接收到数据,接收超时计数器清零
    g_ucNoDataCnt = 0;
   
    //开始接收
    if(s_ucBitCounter < 18)//同步头,一共9个1,所以有18个跳变
    {
        if(s_ucBitCounter == 0)
        {
            //先找上升沿,数据0
            if(RESET != GPIO_ReadInputPin(DATA_PORT,DATA_PIN))
            {
                //找到上升沿,进入下一步
                s_ucBitCounter = 1;
            }
        }
        else if(s_ucBitCounter == 1)
        {
            //再找下降沿,如果上次的上升沿与本下降沿时间间隔为1个数据周期,则为连续的"01"
            //高电平时间持续1个数据周期,必定是"01"
            if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN)//本次为下降沿
            && ucCurrBitTime > BIT_TIME - ERROR_BAND)//一个周期以上的高电平
            {
                //找到"01",进入下一步
                s_ucBitCounter = 2;
            }
            else//不是"01",重新找"01"
            {
                s_ucBitCounter = 0;
            }
        }
        else
        {
            //已经找到"01"了,接下来要再找到连续的8个1
            //若两个电平跳变间隔1个数据周期,则必定出现0,重新找"01"
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN))//下降沿
                {
                    //本次下降沿,重新找上升沿
                    s_ucBitCounter = 0;
                }
                else//本次上升沿,接着找下降沿
                {
                    s_ucBitCounter = 1;
                }
            }
            else
            {
                s_ucBitCounter++;
                bData = 1;//为下面接收到数据作准备
            }
        }
    }
    else//获取同步头成功
    {
        //根据本次电平跳变情况,与上次跳变间隔,及上次数据位,
        //可判断出本次跳变是空跳还是有效数据
        //本次是下降沿
        if(RESET == GPIO_ReadInputPin(DATA_PORT,DATA_PIN))
        {
            //与上次跳变间隔1个数据周期,说明高电平持续了1个数据周期,必然是1
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                bData = 1;
            }
            //与上次跳变间隔半个周期,若上次数据为1,本次数据也为1
            //即连续的两个1
            else if(s_bLastData == 1)
            {
                bData = 1;
            }
            //间隔不足1个数据周期,且上次数据为0,则本次是空跳
            else
            {
                return;
            }
        }
        //本次上升沿
        else
        {
            //与上次跳变间隔1个数据周期,说明低电平持续了1个数据周期,必然是0
            if(ucCurrBitTime > BIT_TIME - ERROR_BAND)
            {
                bData = 0;
            }
            //与上次跳变间隔半个周期,若上次数据为0,本次数据也为0
            //即连续的两个0
            else if(s_bLastData == 0)
            {
                bData = 0;
            }
            //间隔不跳1个数据周期,且上次数据为1,则本次是空跳
            else
            {
                return;
            }
        }
        
        if(s_ucBitCounter >= 73)//同步头18个跳变,加上55个数据位
        {
            //接收到完成数据,重新开始接收数据
            s_ucBitCounter = 0;
            //把数据移出缓冲区,且清空缓冲区
            for(ucTemp=0;ucTemp<11;ucTemp++)
            {
                g_ucData[ucTemp] = g_ucDataBuff[ucTemp] & 0x1f;
            }
            g_bitResevData = TRUE;//接收完成,处理数据
        }
        else
        {
            //把数据放入缓冲区
            ucTemp = s_ucBitCounter - 18;//减去同步头的18个跳变
            ucTemp /= 5;//得到当前接收到的数据属于第几个字节
            g_ucDataBuff[ucTemp] <<= 1;//从高位开始接收
            g_ucDataBuff[ucTemp] += bData;
            s_ucBitCounter++;//继续接收下一位
        }
    }
   
    s_bLastData = bData;//更新历史数据
    return;
}

 

收藏

RFID读卡模块原理图是ORCAD的,有PDF预览,PCB是PADS的,还有BOM烧写说明,标注图等。其中UART输出是量产过的 韦根输出的只是看示波器波形是对的,没有实际应用;里面有源代码,编写前提是是CODE小于1K RAM小于64字节。 原理图原理就是CD4060产生125KHZ的方波,经过推挽电路进行功率放大,高频电流进入LC串联谐振电路,345uH和4.7NF的谐振频率正好是125KHZ,这时电容两端电压会到十几伏,如果用CBB电容,会到二十多伏,这时读卡距离会到10CM以上。当有卡接近线圈时,线圈两端会有曼彻斯特编码的调幅波。通过二极管以及电容的检波和滤波,产生的小信号送入LM358进行放大和整形,变成单片机可以读取的曼彻斯特编码信号。 关于硬件电路设计上,CD4060在3.3V时 4M以下的晶振都可以起振,但2M的晶振体积很大,所以用了4M。实验发现ATTINY13的频率随着工作电压的变化会有很大的变化,所以不能用RC校准了,正好CD4060会输出4M,所以用来当系统时钟,保证时序的精确性。这样模块在3.3V 5V都能工作。 ATTINY13接不了无缘晶振 只能接有源的~ 它只有一个CLKIN脚~有源晶振价格就贵了。 另外ATTINY13只有5个IO口 1个用于中断 1个用于UART输出 1个用于CLKIN 1个用于上电波特率配置 1个用于曼彻斯特编码输入 正好用完了 RFID读卡模块 模块正反面 串口收到5个字节 前4个字节就是卡号 程序中,根据曼彻斯特原理,找到长电平和短电平,根据跳变沿分析出0数据还是1数据。然后寻找消息头,后面的数据进行 行 列奇偶校验,从而分析出卡号。 程序上电时,通过ADC引脚读取外部电阻的分压配置,从而初始化出4中波特率。然后进行读卡操作。实际应用中,要保证读卡的稳定,当卡靠近线圈时,要只发一次数据。要很好的去抖。代码不能超过1K。现在代码正好1024个字节。关于奇偶校验算法,异或和要比对2取余简洁,但我测试时发现异或和代码长度大于对2取余,所以用了对2取余。 RFID读卡模块原理图+PCB+代码+调试至附件下载
125kHz RFID读卡程序是一种用于读取嵌入在RFID标签或卡片中的信息的程序。它通常使用射频技术来实现数据的传输和识别。 首先,程序需要一个用于与RFID读卡器进行通信的接口。这个接口可以是串口、USB接口或者无线网络接口,并且需要根据具体的硬件设备来进行设置和配置。 然后,程序需要初始化RFID读卡器并设置一些必要的参数,例如读卡器的地址、通信速率等。接下来,程序会进入一个循环中,不断尝试读取附近标签的信息。 当有标签靠近读卡器时,程序会发送一个指令给读卡器,让其进行识别。读卡器会发送一个射频信号,激活标签并获取标签中的数据。读卡器将读取到的数据通过接口传送给程序。 接着,程序会对读取到的数据进行解析和处理。它会解析数据中的标签ID、信息内容等,并根据需要进行进一步的处理,例如存储到数据库、进行数据分析等。 最后,程序可以根据实际需求来进行一些额外的操作,例如显示读取到的数据、发送数据给其他系统等。 在整个读卡程序中,关键的部分是与RFID读卡器的通信和数据解析处理。程序需要确保与读卡器的稳定通信,正确解析读取到的数据,并进行相应的处理。此外,程序还需要考虑异常情况的处理,例如读卡器出现故障或者标签信号不稳定等情况的处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值