在文章之前要先感谢我的老师黄小平先生,在制作这个扫描器期间,给了我们很大的帮助和指导. 先说下这个条形码扫描器的预期功能: 如名称所示,主要达到的功能就是实现给定一个条形码就能扫描出来并通过串口与电脑相联系,在电脑上显示条形码扫描器扫描出来的结果。和超市里面用的是不一样的,没那么高级.
1
条形码由空白区,起始码,数据码,纠错码,终止码等部分组成。
编码方法
2
3
编码方法
4
5 识别原理
6
7
8
9
扫描器 制作条形码扫描器必备的.这个两百多,呜呜,学校说可以报销,我都快毕业了,钱都没看到.
色标传感器
扫描器原理图
扫描器原理图
放大整形电路(好久没看电路图了,想当初学电路时,每天看这些,煎熬啊.还好这个电路图没那么复杂)
12
译码器 制作这个扫描器需要用到C51单片机.
C51
C51原理图
AT89C51特点 这东西当初为了买它,跑了好几次市场,因为型号不对.纠结
特点
译码器的功能: 数据采集。 • 确认位于符号两侧的有效静区。 • 通过起始字符、终止字符判别条形码符号的码制及扫描方向。 • 将每个元素宽度量化成相应码制的若干个单位元素宽度。 • 确保被量化的元素宽度与所译码制的编码规则一致。 • 将条码符号所表示的数据转换成计算机可识别的数据(译码),并传输给计算机。 • 显示条形码符号表示的数据,从而使蜂鸣器、显示灯指示阅读成功。 数据采集电路图
两个中断采集
单中断数据采集
条形码宽度测量
条形码宽度测量
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;
}
}
}