如何自制條形碼掃描器

在文章之前要先感謝我的老師黃小平先生,在制作這個掃描器期間,給了我們很大的幫助和指導(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)傳感器
色標(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;
        }
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市懦铺,隨后出現(xiàn)的幾起案子捉貌,更是在濱河造成了極大的恐慌支鸡,老刑警劉巖冬念,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牧挣,居然都是意外死亡急前,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瀑构,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆针,“玉大人,你說我怎么就攤上這事寺晌∈蓝郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵呻征,是天一觀的道長耘婚。 經(jīng)常有香客問我,道長陆赋,這世上最難降的妖魔是什么沐祷? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮攒岛,結(jié)果婚禮上赖临,老公的妹妹穿的比我還像新娘。我一直安慰自己灾锯,他們只是感情好兢榨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顺饮,像睡著了一般吵聪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上领突,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天暖璧,我揣著相機(jī)與錄音,去河邊找鬼君旦。 笑死澎办,一個胖子當(dāng)著我的面吹牛嘲碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播局蚀,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼麦锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琅绅?” 一聲冷哼從身側(cè)響起扶欣,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千扶,沒想到半個月后料祠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年髓绽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆绞。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡顺呕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出括饶,到底是詐尸還是另有隱情株茶,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布图焰,位于F島的核電站启盛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楞泼。R本人自食惡果不足惜驰徊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕阔。 院中可真熱鬧棍厂,春花似錦、人聲如沸超陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽时呀。三九已至张漂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谨娜,已是汗流浹背航攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趴梢,地道東北人漠畜。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓币他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憔狞。 傳聞我的和親對象是個殘疾皇子蝴悉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容