如何自制条形码扫描器

在文章之前要先感谢我的老师黄小平先生,在制作这个扫描器期间,给了我们很大的帮助和指导. 先说下这个条形码扫描器的预期功能: 如名称所示,主要达到的功能就是实现给定一个条形码就能扫描出来并通过串口与电脑相联系,在电脑上显示条形码扫描器扫描出来的结果。和超市里面用的是不一样的,没那么高级.

条形码简介##

  • 1、1974年6月26日,在俄州特洛伊市马什超级市场,一位收银员将10 包黄箭口香糖放在条形码扫描器中扫了一下,收银台自动显示出价格,一个时代便由此诞生了。
  • 2、40 年后的今天,人们每天要扫描50亿次条 形码。
  • 3、研究估计,条形码每年为社会节约300亿美元。
  • 4、条形码在生活中可谓无所不在:其中包括物流、仓储,图书馆,银行,pos收银系统,医疗卫生、零售商品、服装、食品服务以及高科技电子产品等等,而目 前仍然会在每天都在一些新增加的项目上持续的用到条码应用领域。

条形码的编码原理##

1

条形码由空白区,起始码,数据码,纠错码,终止码等部分组成。

条形码的编码原理 -->一维条码###

编码方法

  • 模块组配编码法

2

  • 宽度调节编码法

3

条形码的编码原理 -->二维条码###

编码方法

  • 堆叠式 / 行排式

4

  • 矩阵式(二维码)

5 识别原理

  • 1、扫描轨迹

6

  • 2、光探头接收到信号

7

  • 3、经过放大整形后的电信号

8

系统硬件###

9

扫描器 制作条形码扫描器必备的.这个两百多,呜呜,学校说可以报销,我都快毕业了,钱都没看到.

色标传感器

扫描器原理图

扫描器原理图

放大整形电路(好久没看电路图了,想当初学电路时,每天看这些,煎熬啊.还好这个电路图没那么复杂)

12

译码器 制作这个扫描器需要用到C51单片机.

C51

C51原理图

AT89C51特点 这东西当初为了买它,跑了好几次市场,因为型号不对.纠结

特点

译码器的功能: 数据采集。 • 确认位于符号两侧的有效静区。 • 通过起始字符、终止字符判别条形码符号的码制及扫描方向。 • 将每个元素宽度量化成相应码制的若干个单位元素宽度。 • 确保被量化的元素宽度与所译码制的编码规则一致。 • 将条码符号所表示的数据转换成计算机可识别的数据(译码),并传输给计算机。 • 显示条形码符号表示的数据,从而使蜂鸣器、显示灯指示阅读成功。 数据采集电路图

  • 当INT1第一个脉冲下降沿触发中断时,中断服务程序启动定时器0,记录条的脉宽。当INT0的第一个脉冲下降沿触发中断时,中断服务程序启动定时器1记录空的脉宽。

两个中断采集

  • 设计思想是,无论扫描器输出信号的上升沿还是下降沿,均在INT0端产生负脉冲信号,以触发外中断0中断。

单中断数据采集

系统软件##

条形码宽度测量

条形码宽度测量

26

计时器模式控制寄存器TMOD

其中GATE=1表示Timer1或是timer0必须在INT0或INT1是在高电位时才会初始化,C/T=1表示计时计数是由外部引脚T0或T1输入计时的脉冲。M1和M0用来选择计时计数器的工作模式。 本系统中,设GATE=1,C/T=0(定时功能),TR0=1,INT0=1时开始测量脉冲宽度。M1M0=01即为16位计数器,在晶振为12MHZ时候,能最大定时65.536ms. 程序流程图

15

主程序流程图

16

码制的判别和译码(交叉25码)

17

交叉25码编码规则

18

码制判别程序流程图

19

串口通信电路图##

20

21

本系统兼有硬件和软件设计,如果将光电探头改成CCD扫描器,通过编写相应的图像识别程序,亦能识别二维条码。 下面贴上我的板子~焊得不是很专业,这个线太粗了,应该换成那种细的.

22

23

24

这个是教我这个的老师的图,我的那个线太丑了,就不放了.

成品图

这里贴上部分代码,感兴趣的可以去我的github上看看

include <REGX51.H>
static int wide[19];
static char wi[19];
static int x=0,y=0;
static char a[2],b[2],c[2];
static char n=0;
static char TT0=0,TT1=0,ZZ0=0,ZZ1=0;

void delay (void)  {          
  unsigned char i,j;         
     for (i=0;i<255;i++)
          for(j=0;j<255;j++)
          ;
}
static void xint0_isr(void) interrupt IE0_VECTOR
{ 
      ZZ0=1;ZZ1=0;
  }
static void xint1_isr(void) interrupt IE1_VECTOR
{
ZZ1=1;ZZ0=0;
}
void luoji(void){
   unsigned char m;
    wi[2]=0;
    for(m=2;m<19;m++)
    { 
      if(wide[m+1]>2*wide[m])
          wi[m+1]=1;
           else if(2*wide[m+1]<wide[m])
               wi[m+1]=0;
                else wi[m+1]=wi[m];
     }
}
void yuedu(void){
      {
           if((wi[4]==0)&&(wi[6]==0)&&(wi[8]==1)&&(wi[10]==1)&&(wi[12]==0)) a[0]=0;
           else if((wi[4]==1)&&(wi[6]==0)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==1))a[0]=1;
           else if((wi[4]==0)&&(wi[6]==1)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==1))a[0]=2;
           else if((wi[4]==1)&&(wi[6]==1)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==0))a[0]=3;
           else if((wi[4]==0)&&(wi[6]==0)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==1))a[0]=4;
           else if((wi[4]==1)&&(wi[6]==0)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==0))a[0]=5;
           else if((wi[4]==0)&&(wi[6]==1)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==0))a[0]=6;
           else if((wi[4]==0)&&(wi[6]==0)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==1))a[0]=7;
           else if((wi[4]==1)&&(wi[6]==0)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==0))a[0]=8;
           else if((wi[4]==0)&&(wi[6]==1)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==0))a[0]=9;
         }
         {
            if((wi[5]==0)&&(wi[7]==0)&&(wi[9]==1)&&(wi[11]==1)&&(wi[13]==0)) a[1]=0;
           else if((wi[5]==1)&&(wi[7]==0)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)) a[1]=1;
           else if((wi[5]==0)&&(wi[7]==1)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)) a[1]=2;
           else if((wi[5]==1)&&(wi[7]==1)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==0)) a[1]=3;
           else if((wi[5]==0)&&(wi[7]==0)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==1)) a[1]=4;
           else if((wi[5]==1)&&(wi[7]==0)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)) a[1]=5;
           else if((wi[5]==0)&&(wi[7]==1)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)) a[1]=6;
           else if((wi[5]==0)&&(wi[7]==0)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==1)) a[1]=7;
           else if((wi[5]==1)&&(wi[7]==0)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)) a[1]=8;
           else if((wi[5]==0)&&(wi[7]==1)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)) a[1]=9;
        }
        {
            if((wi[6]==0)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==1)&&(wi[14]==0)) b[0]=0;
           else if((wi[6]==1)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==1))b[0]=1;
           else if((wi[6]==0)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==1))b[0]=2;
           else if((wi[6]==1)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==0))b[0]=3;
           else if((wi[6]==0)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==1))b[0]=4;
           else if((wi[6]==1)&&(wi[8]==0)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==0))b[0]=5;
           else if((wi[6]==0)&&(wi[8]==1)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==0))b[0]=6;
           else if((wi[6]==0)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==1))b[0]=7;
           else if((wi[6]==1)&&(wi[8]==0)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==0))b[0]=8;
           else if((wi[6]==0)&&(wi[8]==1)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==0))b[0]=9;
         }    
           {
            if((wi[7]==0)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==1)&&(wi[15]==0)) b[1]=0;
           else if((wi[7]==1)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==1)) b[1]=1;
           else if((wi[7]==0)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==1)) b[1]=2;
           else if((wi[7]==1)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==0)) b[1]=3;
           else if((wi[7]==0)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==1)) b[1]=4;
           else if((wi[7]==1)&&(wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==0)) b[1]=5;
           else if((wi[7]==0)&&(wi[9]==1)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==0)) b[1]=6;
           else if((wi[7]==0)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==1)) b[1]=7;
           else if((wi[7]==1)&&(wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==0)) b[1]=8;
           else if((wi[7]==0)&&(wi[9]==1)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==0)) b[1]=9;
        }
         {
          if((wi[8]==0)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==1)&&(wi[16]==0)) c[0]=0;
           else if((wi[8]==1)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==0)&&(wi[16]==1))c[0]=1;
           else if((wi[8]==0)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==0)&&(wi[16]==1))c[0]=2;
           else if((wi[8]==1)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==0)&&(wi[16]==0))c[0]=3;
           else if((wi[8]==0)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==0)&&(wi[16]==1))c[0]=4;
           else if((wi[8]==1)&&(wi[10]==0)&&(wi[12]==1)&&(wi[14]==0)&&(wi[16]==0))c[0]=5;
           else if((wi[8]==0)&&(wi[10]==1)&&(wi[12]==1)&&(wi[14]==0)&&(wi[16]==0))c[0]=6;
           else if((wi[8]==0)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==1)&&(wi[16]==1))c[0]=7;
           else if((wi[8]==1)&&(wi[10]==0)&&(wi[12]==0)&&(wi[14]==1)&&(wi[16]==0))c[0]=8;
           else if((wi[8]==0)&&(wi[10]==1)&&(wi[12]==0)&&(wi[14]==1)&&(wi[16]==0))c[0]=9;
         }           
           {
            if((wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==1)&&(wi[17]==0)) c[1]=0;
           else if((wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==0)&&(wi[17]==1)) c[1]=1;
           else if((wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==0)&&(wi[17]==1)) c[1]=2;
           else if((wi[9]==1)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==0)&&(wi[17]==0)) c[1]=3;
           else if((wi[9]==0)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==0)&&(wi[17]==1)) c[1]=4;
           else if((wi[9]==1)&&(wi[11]==0)&&(wi[13]==1)&&(wi[15]==0)&&(wi[17]==0)) c[1]=5;
           else if((wi[9]==0)&&(wi[11]==1)&&(wi[13]==1)&&(wi[15]==0)&&(wi[17]==0)) c[1]=6;
           else if((wi[9]==0)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==1)&&(wi[17]==1)) c[1]=7;
           else if((wi[9]==1)&&(wi[11]==0)&&(wi[13]==0)&&(wi[15]==1)&&(wi[17]==0)) c[1]=8;
           else if((wi[9]==0)&&(wi[11]==1)&&(wi[13]==0)&&(wi[15]==1)&&(wi[17]==0)) c[1]=9;
        }
}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏嵌入式程序猿

博世小功率变频器拆解

变频器在工业生产中应用非常的广泛,橡胶行业的轮胎产线就有很多,而且轮胎产线环境恶劣,灰尘大,今天帮朋友修理一台力士乐的变频器,因为长期使用加上环境恶劣,变频器里...

50520
来自专栏有趣的Python和你

京东文胸爬虫及数据分析爬虫代码数据分析

许久不来写文章了,最近夏令营搞的确实没时间。这次把上次直播讲的东西写成文字,带大家开波车。

11830
来自专栏飞总聊IT

大数据那些事(11):复活的LSM-Tree--BigTable的系统实现

BigTable是一个非常复杂的系统,发表的论文写得并不是很清楚。所幸Google开源了LevelDB这个Key-Value Store。这个项目的作者是Jef...

43650
来自专栏量子位

FPGA开发板剁手,学生狗省钱大法丨吐血资源

博主Joel Williams在他的主页中分享了一篇购买便宜的FPGA开发板的攻略,量子位编译本文。

17900
来自专栏蓝天

Mac Pro Windows 8屏幕偏暗原因

实际使用过程中会发现,刚进入Windows时,屏幕很亮,但一会儿就暗下来了,之后怎么调节也亮不起来,调到最亮也偏暗。这说明Mac Pro本身还是可以很亮的,应当...

9620
来自专栏大数据挖掘DT机器学习

Python爬取链家网数据:新房楼盘价格分析

本文将详细讲解利用python爬虫收集了链家网800多条公开数据并作简单分析。数据真实性有待考查,本文仅作为数据分析入门者参考。 安装环境 Window 10 ...

51750
来自专栏游戏杂谈

游戏繁体化那些让人蛋疼的事儿

项目首先从国内开始做,然后跟台湾那边谈了合作,要发行台湾版本。这过程中遇到一些问题,特别的坑,特此记录一下

15120
来自专栏知晓程序

现实生活压力大,不如用这 4 款小程序去二次元世界找「老婆」

纸片人那么好那么可爱,画出来的场景那么美那么酷炫,低等维度像一个梦,梦里什么都有。

12050
来自专栏无原型不设计

优秀原型设计欣赏:美食类App原型制作-Kitchen Stories

题材有Mockplus(摹客)团队提供,仅供参考学习。

22570
来自专栏智能大石头

MF前传——探索者一号简介

    MF让我们这些C#程序员能够把手伸到嵌入式行业,大大增强我们在各种项目中的竞争能力。无奈国内研究MF的人少之又少,为了加速MF技术的研究,我们团队采用少...

21690

扫码关注云+社区

领取腾讯云代金券