【开源获奖案例】基于T5L智能屏的指纹识别解决方案

——来自迪文开发者论坛

本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的指纹识别解决方案。该方案通过智能屏串口进行Modbus通讯,实现对指纹识别模块的精准控制,并集成了指纹录入与识别功能。可用于门禁管理、员工考勤、智能门锁等场景,为用户带来更为便捷、安全的交互体验。

    

【演示视频】

    

完整开发资料含迪文屏DGUS工程资料与C51代码,获取方式:

1. 前往迪文开发者论坛获取:/index.html/forum.php?mod=viewthread&tid=10571&extra=page%3D1&_dsign=ea69763b

2. 微信公众号中回复“指纹识别门锁”获取。


【UI素材展示】


12

34

【GUI工程设计】

GUI工程设计



C51工程设计

屏幕进行modbus通讯的部分代码如下:

 

int main(void)

{   

        INIT_CPU();

        T2_Init();

        UART4_Init();

        EA=1;

//     UART4_SendStr("hello",sizeof("hello"));

        WDT_ON();//打开开门狗

        while(1)

        {   

            WDT_RST();//喂狗

            Process();

        }

}

void MainMachineHandle(void)

{

        if(UartDataHandle)

        {

            uartHandle(Uart4_Rx,uart4_rx_count);

            CLR_UartMp3();

            }

}

bool uartHandle(u8 *Tdata,u8 len)

{

        u16Wlen=0;

        u16CRC_1=0,BegAddr=0;

        u8  xdata RetData[Uart4_Rx_Maxlen+10];

        u8  errnum=0;

        CRC_1=CalcCrcAll(0xffff,Tdata,len-2);

        if(CRC_1!= ((Tdata[len-1])<<8 | (Tdata[len-2])))

            returnfalse;

        //这个为写指令

        if(Tdata[0]==0&& Tdata[1]!=0x06)

        {

            returnfalse;

        }

        elseif(Tdata[0]!=DevAddr) //设备地址

        {

            returnfalse;

        }

        //这个为写指令

        if(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 )

        {

            SendModbusAckErr(Tdata,1);

            returnfalse;

        }

        Wlen=(Tdata[4]<<8|Tdata[5]);           //长度

        BegAddr=(Tdata[2]<<8|Tdata[3]);       //开始地址

        if(Tdata[1]==0x06)//写内存

        {

            write_dgusii_vp(BegAddr,&Tdata[4],1);

        }

        elseif(Tdata[1]==0x10)

        {

            write_dgusii_vp(BegAddr,&Tdata[7],Wlen);

        }

        //读操作响应

        //[01][0x03][00][6B][00][02][CRC高][CRC低]

        if(Tdata[1]==0x03)

        {

            RetData[0]=Tdata[0];

            RetData[1]=0x03;

            RetData[2]=Wlen*2;

            read_dgusii_vp(BegAddr,&RetData[3],Wlen);

            CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2);

            RetData[Wlen*2+3]=CRC_1;

            RetData[Wlen*2+3+1]=CRC_1>>8;

            SendModbusAckOK(RetData,3+Wlen*2+2);

        }

        elseif(Tdata[1]==0x10)

        {

            memcpy(RetData,Tdata,6);

             CRC_1=CalcCrcAll(0xFFFF,(INT8U*)&RetData,6);

            RetData[6]=CRC_1;

            RetData[7]=CRC_1>>8;

            SendModbusAckOK(RetData,8);

        }

        elseif(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答

        {

            memcpy(RetData,Tdata,8);

            SendModbusAckOK(RetData,8);         

        }

        returntrue;

}