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

条形码简介

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

条形码的编码原理


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

条形码的编码原理 –>一维条码

编码方法
- 模块组配编码法

- 宽度调节编码法

条形码的编码原理 –>二维条码

编码方法
- 堆叠式 / 行排式

- 矩阵式(二维码)

识别原理
- 1、扫描轨迹

- 2、光探头接收到信号

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

系统硬件


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

扫描器原理图

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

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


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

译码器的功能:
数据采集。
• 确认位于符号两侧的有效静区。
• 通过起始字符、终止字符判别条形码符号的码制及扫描方向。
• 将每个元素宽度量化成相应码制的若干个单位元素宽度。
• 确保被量化的元素宽度与所译码制的编码规则一致。
• 将条码符号所表示的数据转换成计算机可识别的数据(译码),并传输给计算机。
• 显示条形码符号表示的数据,从而使蜂鸣器、显示灯指示阅读成功。
数据采集电路图
- 当INT1第一个脉冲下降沿触发中断时,中断服务程序启动定时器0,记录条的脉宽。当INT0的第一个脉冲下降沿触发中断时,中断服务程序启动定时器1记录空的脉宽。

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

系统软件

条形码宽度测量



其中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.
程序流程图

主程序流程图

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

交叉25码编码规则

码制判别程序流程图

串口通信电路图



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



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

这里贴上部分代码,感兴趣的可以去我的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;}
}
}

如何自制条形码扫描器相关推荐

  1. USB口的红外条形码扫描器的另类使用

    目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入 ...

  2. 通过条形码扫描器攻击工控系统

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本周二,网络安全公司IOActive 的研究人员指出,可通过条形码扫描器入侵工业控制系统 (ICS). 此前,黑客曾演示了如何通过工业 ...

  3. 条形码扫描器会受到光波和无线电波的影响吗?

    条形码扫描器会受到光波和无线电波的影响吗? 条形码是由一系列不同宽度的平行黑条和空格组成.每个条和空格的组合或序列都是一个代码,表示诸如产品类型.大小.制造商或运输来源等信息.条形码结构如图1所示. ...

  4. USB口的条形码扫描器接口编程(VB) 转

    目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入 ...

  5. USB口的红外条形码扫描器的另类使用 1

    2006年08月30日 17:18:00 目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果 ...

  6. 条形码扫描器识别条形码的原理

    条形码扫描器识别条形码的原理 条形码扫描器识别条形码时,根据不同颜色的物体,其反射的可见光的波长不同,白色物体能反射各种波长的可见光,黑色物体则吸收各种波长的可见光,当条形码扫描器光源发出的光经光阑及 ...

  7. Android 系列 5.7使用Google ZXing条形码扫描器扫描条形码或QR码

    5.7使用Google ZXing条形码扫描器扫描条形码或QR码 问题 您希望应用程序能够扫描条形码或QR码("QR"原本代表"快速反应"). 解 使用Inte ...

  8. 激光条形码扫描器和CCD条形码扫描器什么区别?

    所条形码扫描器的功能基本相同:扫描仪会产生一束光束,用于条形码中条形的宽度以及它们之间的间隔.激光扫描仪和成像仪之间的区别在于它们如何这些条. 激光扫描器在条形码处发出一束细光束.根据光束撞击的表面颜 ...

  9. 条形码扫描器通讯编程

    条形码扫描器通讯编程 作者: xuzhenrui ,2006-8-16 11:00:00 发表于:<高级语言开发论坛> 共有3人回复,838次点击   加为好友 留言    请教各位:   ...

  10. Android 系列 5 7使用Google ZXing条形码扫描器扫描条形码或QR码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 5.7使 ...

最新文章

  1. python-opencv中的cv2.inRange函数
  2. 世界上最伟大的10个公式,其中一个人尽皆知
  3. mysql57 修改root密码,MySQL 5.7.x修改root默认密码(CentOS下)
  4. WLA-云鹰计划加速千家创新创业企业成为独角兽
  5. 将HTML字符转换为DOM节点并动态添加到文档中
  6. HDU - 4292 Food(最大流+思维建边)
  7. POJ 2513 Colored Sticks
  8. OptionRoom推出通缩NFT质押活动,销毁15万代币
  9. 软件oem要注意什么_租房软件有哪些 租房有什么需要注意的地方
  10. 透明loading_四步搞定小菊花 Loading 动画
  11. pmp第六版错题集6.1
  12. 单片机上的8位数码管显示数字12345678
  13. 2020最新抖音上热门技巧你知道了几个?
  14. 直方图均衡化取整怎么计算_玩转直方图处理之直方图均衡化、规定化
  15. 【C语言学习】C语言入门
  16. AI工具究竟是帮手还是对手?你怎么看,一起来聊聊吧!
  17. 启发式算法与元启发式算法的区别
  18. c与c++的struct区别
  19. POA理论:不要被你的目标欺骗了你
  20. 数据库课设:机房管理系统

热门文章

  1. TouchRetouch CR2 2.1.1 特别版 Mac 扣图修图软件
  2. MATLAB-二次曲面
  3. 微信公众号开发流程指南
  4. java游戏走到边缘_java-3D对象相遇的边缘和毛刺不均匀
  5. 用摄动法证明fibs的一个公式(变形)
  6. 素数筛 python
  7. Xshell6 安装包下载
  8. 了解89C51单片机
  9. FPGA综合项目——SDRAM控制器
  10. 设计一个RC高通滤波器或低通滤波器