在文章之前要先感謝我的老師黃小平先生,在制作這個掃描器期間,給了我們很大的幫助和指導(dǎo).
先說下這個條形碼掃描器的預(yù)期功能:
如名稱所示,主要達(dá)到的功能就是實(shí)現(xiàn)給定一個條形碼就能掃描出來并通過串口與電腦相聯(lián)系揉阎,在電腦上顯示條形碼掃描器掃描出來的結(jié)果毙籽。和超市里面用的是不一樣的,沒那么高級.
條形碼簡介##
- 1坑赡、1974年6月26日毅否,在俄州特洛伊市馬什超級市場搀突,一位收銀員將10 包黃箭口香糖放在條形碼掃描器中掃了一下仰迁,收銀臺自動顯示出價格徐许,一個時代便由此誕生了翻默。
- 2修械、40 年后的今天肯污,人們每天要掃描50億次條 形碼蹦渣。
- 3柬唯、研究估計(jì)锄奢,條形碼每年為社會節(jié)約300億美元斟薇。
- 4胯陋、條形碼在生活中可謂無所不在:其中包括物流遏乔、倉儲盟萨,圖書館捻激,銀行胞谭,pos收銀系統(tǒng),醫(yī)療衛(wèi)生旺垒、零售商品先蒋、服裝鞭达、食品服務(wù)以及高科技電子產(chǎn)品等等,而目 前仍然會在每天都在一些新增加的項(xiàng)目上持續(xù)的用到條碼應(yīng)用領(lǐng)域叨襟。
條形碼的編碼原理##
1
條形碼由空白區(qū)糊闽,起始碼,數(shù)據(jù)碼念链,糾錯碼掂墓,終止碼等部分組成君编。
條形碼的編碼原理 -->一維條碼###
編碼方法
-
模塊組配編碼法
2 -
寬度調(diào)節(jié)編碼法
3
條形碼的編碼原理 -->二維條碼###
編碼方法
-
堆疊式 / 行排式
4 - 矩陣式(二維碼)
5
識別原理 -
1梦重、掃描軌跡
6 -
2贪嫂、光探頭接收到信號
7 -
3、經(jīng)過放大整形后的電信號
8
系統(tǒng)硬件###
9
掃描器
制作條形碼掃描器必備的.這個兩百多,嗚嗚,學(xué)校說可以報(bào)銷,我都快畢業(yè)了,錢都沒看到.
色標(biāo)傳感器
掃描器原理圖
掃描器原理圖
放大整形電路(好久沒看電路圖了,想當(dāng)初學(xué)電路時,每天看這些,煎熬啊.還好這個電路圖沒那么復(fù)雜)
12
譯碼器
制作這個掃描器需要用到C51單片機(jī).
C51
C51原理圖
AT89C51特點(diǎn)
這東西當(dāng)初為了買它,跑了好幾次市場,因?yàn)樾吞柌粚?糾結(jié)
特點(diǎn)
譯碼器的功能:
數(shù)據(jù)采集茧吊。
? 確認(rèn)位于符號兩側(cè)的有效靜區(qū)瞄桨。
? 通過起始字符芯侥、終止字符判別條形碼符號的碼制及掃描方向柱查。
? 將每個元素寬度量化成相應(yīng)碼制的若干個單位元素寬度唉工。
? 確保被量化的元素寬度與所譯碼制的編碼規(guī)則一致汹忠。
? 將條碼符號所表示的數(shù)據(jù)轉(zhuǎn)換成計(jì)算機(jī)可識別的數(shù)據(jù)(譯碼)淋硝,并傳輸給計(jì)算機(jī)。
? 顯示條形碼符號表示的數(shù)據(jù)错维,從而使蜂鳴器奖地、顯示燈指示閱讀成功。
數(shù)據(jù)采集電路圖
-
當(dāng)INT1第一個脈沖下降沿觸發(fā)中斷時赋焕,中斷服務(wù)程序啟動定時器0参歹,記錄條的脈寬隆判。當(dāng)INT0的第一個脈沖下降沿觸發(fā)中斷時犬庇,中斷服務(wù)程序啟動定時器1記錄空的脈寬。
兩個中斷采集 -
設(shè)計(jì)思想是侨嘀,無論掃描器輸出信號的上升沿還是下降沿臭挽,均在INT0端產(chǎn)生負(fù)脈沖信號,以觸發(fā)外中斷0中斷咬腕。
單中斷數(shù)據(jù)采集
系統(tǒng)軟件##
條形碼寬度測量
條形碼寬度測量
26
計(jì)時器模式控制寄存器TMOD
其中GATE=1表示Timer1或是timer0必須在INT0或INT1是在高電位時才會初始化欢峰,C/T=1表示計(jì)時計(jì)數(shù)是由外部引腳T0或T1輸入計(jì)時的脈沖。M1和M0用來選擇計(jì)時計(jì)數(shù)器的工作模式涨共。
本系統(tǒng)中纽帖,設(shè)GATE=1,C/T=0(定時功能)举反,TR0=1懊直,INT0=1時開始測量脈沖寬度。M1M0=01即為16位計(jì)數(shù)器火鼻,在晶振為12MHZ時候室囊,能最大定時65.536ms.
程序流程圖
15
主程序流程圖
16
碼制的判別和譯碼(交叉25碼)
17
交叉25碼編碼規(guī)則
18
碼制判別程序流程圖
19
串口通信電路圖##
20
21
本系統(tǒng)兼有硬件和軟件設(shè)計(jì)雕崩,如果將光電探頭改成CCD掃描器,通過編寫相應(yīng)的圖像識別程序融撞,亦能識別二維條碼盼铁。
下面貼上我的板子~焊得不是很專業(yè),這個線太粗了,應(yīng)該換成那種細(xì)的.
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;
}
}
}