找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1349|回复: 1
收起左侧

单片机+光纤传感器程序,识别不准确,求分析

[复制链接]
ID:803579 发表于 2020-8-11 13:53 | 显示全部楼层 |阅读模式
最近想玩一个识别卡片的小玩具,在卡片上排列两行排列不同的激光点,光纤有信号时输出高电平。char  ah,al;
int temp;
temp=(ah<<4)|al;
总是识别不准确,不知道有没有大神指导指导。

单片机源程序如下:识别不准确
void        LIGHT(void)
{
//        short flag_key;  
        unsigned char xms=20;
        if(LIGHT_G1==0)
        {
                while(1)
                {
                        LIGHT_LNF=0;
                        while(LIGHT_G1==0&&LIGHT_G2==1)
                                {
                                        if(LIGHT_L1==1&&LIGHT_L2==1)
                                                {
                                                        delay_ms(xms);
                                                        if(LIGHT_L1==1&&LIGHT_L2==1)
                                                                {
                                                                        while(LIGHT_L1==1);
                                                                        lig1=1;
                                                                        lig2=1;BEEP=1;
                                                                        break;
                                                                }
                                                }                                                        
                                        else if(LIGHT_L1==1&&LIGHT_L2==0)
                                                {
                                                        delay_ms(xms);
                                                        if(LIGHT_L1==1&&LIGHT_L2==0)
                                                                {
                                                                        while(LIGHT_L1==1);
                                                                        lig1++;
                                                                        break;
                                                                }
                                                }
                                        else if(LIGHT_L1==0&&LIGHT_L2==1)
                                                {
                                                        delay_ms(xms);
                                                        if(LIGHT_L1==0&&LIGHT_L2==1)
                                                                {
                                                                        while(LIGHT_L2==1);
                                                                        lig2++;
                                                                        break;
                                                                }               
                                        }                                                
                                        else if(LIGHT_L1==0&&LIGHT_L2==0&&u==0)
                                        {
                                                delay_ms(xms);
                                                if(LIGHT_L1==0&&LIGHT_L2==0&&u==0)
                                                        {
                                                                lig1=0;
                                                                lig2=0;
                                                                u=1;
                                                        }
                                        }
                                }
                                while(LIGHT_G1==0&&LIGHT_G2==0)
                                        {
                                                if(LIGHT_L1==1&&LIGHT_L2==1)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==1&&LIGHT_L2==1)
                                                                        {
                                                                                        while(LIGHT_L1==1);
                                                                                        lig1++;
                                                                                        lig2++;
                                                                                        break;
                                                                        }
                                                        }
                                                else if(LIGHT_L1==0&&LIGHT_L2==1)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==0&&LIGHT_L2==1)
                                                                        {
                                                                                        while(LIGHT_L2==1);
                                                                                        lig2++;
                                                                                        break;
                                                                        }
                                                        }
                                                else if(LIGHT_L1==1&&LIGHT_L2==0)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==1&&LIGHT_L2==0)
                                                                        {
                                                                                        while(LIGHT_L1==1);
                                                                                        lig1++;
                                                                                        break;
                                                                        }
                                                        }
                                                else if(LIGHT_L1==0&&LIGHT_L2==0&&u==1)
                                                        {
                                                                                lig1 <<= 1;
                                                                                lig2 <<= 1;
                                                                                u=2;
                                                        }
                                        }
                                while(LIGHT_G2==0&&LIGHT_G1==1)
                                        {
                                                if(LIGHT_L1==1&&LIGHT_L2==1)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==1&&LIGHT_L2==1)
                                                                        {
                                                                                while(LIGHT_L1==1);
                                                                                lig1++;
                                                                                lig2++;
                                                                                break;
                                                                        }        
                                                        }
                                                else if(LIGHT_L1==1&&LIGHT_L2==0)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==1&&LIGHT_L2==0)
                                                                        {
                                                                                while(LIGHT_L1==1);
                                                                                lig1++;
                                                                                break;
                                                                        }
                                                        }
                                                else if(LIGHT_L1==0&&LIGHT_L2==1)
                                                        {
                                                                delay_ms(xms);
                                                                if(LIGHT_L1==0&&LIGHT_L2==1)
                                                                        {
                                                                                while(LIGHT_L2==1);
                                                                                lig2++;
                                                                                break;
                                                                        }
                                                        }
                                                else if(LIGHT_L1==0&&LIGHT_L2==0&&u==2)
                                                        {
                                                                lig1 <<= 1;
                                                                lig2 <<= 1;
                                                                u=0;
                                                        }
                                        }
                        if(LIGHT_G2==1&&LIGHT_G1==1)   
                                {
                                        LIGHT_LNF=1;
                                        lig3=(lig1<<4)|lig2;
                                        LM_Cler();
                                        LM_ShowNum(15,0,lig1,3,16);
                                        LM_ShowNum(15,2,lig2,3,16);
                                        sprintf((char*)LIG1,"%x",lig3);
                                        LM_ShowString(0,2, LIG1);
                                        lig3=lig1=lig2=0;BEEP=0;
                                        break;
                                }
                }
        }
}

回复

使用道具 举报

ID:803579 发表于 2020-8-12 16:38 | 显示全部楼层
识别的过程比较快,所以导致上述不准,有什么办法优化一下程序嘛,例如不要死循环等待光纤经过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表