一個(gè)基于TCS230顏色傳感器和51單片機(jī)為核心的顏色識(shí)別系統(tǒng),能夠?qū)㈩伾D(zhuǎn)化成構(gòu)成它的R、G、B三基色數(shù)值。
本次設(shè)計(jì)由TCS230顏色傳感器做為顏色的采集識(shí)別裝置、STC89C52單片機(jī)做為核心控制系統(tǒng)、1602液晶顯示器和LED小燈做為信號(hào)數(shù)字顯示裝置。通過三基色原理[10],和TCS230顏色傳感器在工作時(shí)可以自主的選用其內(nèi)部相應(yīng)的濾波器,透過并識(shí)別不同頻段的光強(qiáng),在單片機(jī)程序的控制作用下將不同頻段的波段信號(hào)最終以數(shù)字信號(hào)的形式在液晶顯示器上顯現(xiàn)出來。 主要工作內(nèi)容如下:系統(tǒng)通電后打開開關(guān)先進(jìn)行白平衡,白平衡過后將需要識(shí)別的顏色卡片置于顏色傳感器上,顏色傳感器會(huì)將采集到的顏色進(jìn)行采集識(shí)別,并且將識(shí)別出的信號(hào)以波段的形式輸送至單片機(jī),單片機(jī)通過程序識(shí)別顏色傳感器所發(fā)出的信號(hào),在通過程序控制LCD液晶顯示模塊和LED燈組模塊,顯示出顏色傳感器所采集到的信號(hào)。具體的系統(tǒng)結(jié)構(gòu)如圖2-1所示。 圖2-1 顏色檢測(cè)系統(tǒng)硬件結(jié)構(gòu)示意圖
2.2 方案比較與選擇 由于單片機(jī)、顏色傳感器和液晶顯示器的種類眾多,該顏色識(shí)別系統(tǒng)可以選擇不同的元件。以下為本次硬件設(shè)計(jì)的幾個(gè)核心模塊元件的比較分析和最終選擇。 2.2.1 單片機(jī)主控模塊的選擇 硬件部分涉及到了單片機(jī),在我們?nèi)粘W(xué)習(xí)中,常用的單片機(jī)有STM32系列、Arduino、51系列。以下為這三種單片機(jī)的比較以及最終選擇。 STM32系列單片機(jī)。該系列單片機(jī)擁有強(qiáng)勁的性能、可嵌套中斷、低功耗、位帶操作、高代碼密度等眾多優(yōu)點(diǎn),還擁有著豐富的片內(nèi)資源和強(qiáng)大的庫函數(shù)支持。但對(duì)于本設(shè)計(jì)來說32系列單片機(jī)的運(yùn)用較為復(fù)雜,32系列功能完全溢出。 Arduino 單片機(jī)內(nèi)部直接包含硬件和軟件能夠直接讀取傳感器的數(shù)字或模擬輸入信號(hào),可連接云端操作,不需要額外的編程下載器將代碼下載到板子上,能夠極大縮減軟件開發(fā)時(shí)間。但對(duì)于本設(shè)計(jì)來說Arduino核心板的I/O 端口較少、主頻較低不適用。 89C52單片機(jī)是最簡潔基礎(chǔ)的入門級(jí)單片機(jī),同時(shí)也是應(yīng)用最廣泛的8位單片機(jī)之一。其能夠通過下載器將Keil上面的程序直接下載進(jìn)單片機(jī)進(jìn)行仿真、調(diào)試。而且其還具有方便插入到用戶板中、體積小、價(jià)格實(shí)惠等優(yōu)點(diǎn)。在插入時(shí)將單片機(jī)緊貼用戶板,不需用連接線纜,可以有效地降低運(yùn)行中的干擾,同時(shí)也能避免仿真時(shí)出現(xiàn)的一些不確定故障,雖然功能不如32強(qiáng),但完全適用于本設(shè)計(jì)。 2.2.2 顏色采集識(shí)別模塊的選擇 現(xiàn)存的顏色采集識(shí)別元件分為兩種類型,第一類是帶有濾波片的光電二極管、第二類則是顏色識(shí)別傳感器。 帶有濾波器的光電二極管是直接將紅、綠、藍(lán)濾波片分別放置于相對(duì)獨(dú)立的光電二極管的表面,對(duì)光信號(hào)進(jìn)行初步的處理,在經(jīng)過A/D電路對(duì)信號(hào)進(jìn)行采集,采集過后在進(jìn)一步的對(duì)信號(hào)進(jìn)行處理識(shí)別,這樣做電路較為復(fù)雜,增大了系統(tǒng)體積和設(shè)計(jì)成本,且識(shí)別顏色的效果較差。 顏色識(shí)別傳感器可以直接對(duì)接受到的顏色信號(hào)進(jìn)行采集處理并識(shí)別,再通過以不同頻率的波段信號(hào)的形式直接將信號(hào)傳遞給單片機(jī)控制系統(tǒng)。這樣使得識(shí)別系統(tǒng)電路較為簡單,減少了系統(tǒng)體積和設(shè)計(jì)成本,同時(shí)TCS230顏色識(shí)別傳感器本身還具有體積較小、識(shí)別精度較高等特點(diǎn),完全適合該設(shè)計(jì)所需條件。 2.2.3 顯示模塊的選擇 顯示模塊只需要能夠顯示出構(gòu)成待測(cè)顏色的R、G、B數(shù)值即可。OLED1286液晶具有顯示反應(yīng)速度快,像素點(diǎn)密集,有著128*64個(gè)點(diǎn)陣等優(yōu)勢(shì),不過在實(shí)際使用時(shí)發(fā)現(xiàn)該液晶需要自主建立字體模型使用較為復(fù)雜,而且該設(shè)計(jì)的需求并不能完全的適配與該液晶,最終使用LCD1602液晶。該液晶可顯示兩行,每行顯示16個(gè)字符[11],具有使用簡便、價(jià)格實(shí)惠的優(yōu)點(diǎn)。雖然反應(yīng)速度和顯示能力不如OLED12864液晶,但完全能夠適用于本設(shè)計(jì)。 2.2.4 設(shè)計(jì)所需元件清單 下表為該設(shè)計(jì)所需要的元器件清單表 表2-1 元件清單表
2.3 主要器件介紹 以下主要對(duì)構(gòu)成設(shè)計(jì)的STC89C52單片機(jī)、TCS230顏色傳感器、LCD1062液晶顯示器做一個(gè)全面系統(tǒng)的介紹。 2.3.1 STC89C52單片機(jī)(1)STC89C51系列引腳功能 STC89C51系列單片機(jī)擁有40根引腳,每根引腳有不同的功能。圖2-2為STC89C52單片機(jī)的引腳圖,其中2根主電源線引腳VCC(P40)和VDDGND/VSS(P20)分別表示可接+5V電源的電源接口和電路接地線。2根外界晶振引腳XTAL1(P19)、XTAL2(P18)分別表示片內(nèi)振蕩電路的輸入端口和片內(nèi)振蕩電路的輸出端口。4根控制引腳即RST/VPP(P9)復(fù)位引腳,當(dāng)單片機(jī)復(fù)位時(shí)該引腳上會(huì)出現(xiàn)兩個(gè)機(jī)器周期的高電平;ALE/PROG(P30)地址鎖存允許信號(hào);PSEN(P29)外部儲(chǔ)存器讀選信號(hào);EA/VPP(P31)程序存儲(chǔ)器的內(nèi)外部選通,當(dāng)接高電平時(shí)從內(nèi)部程序儲(chǔ)存器讀指令,當(dāng)接低電平時(shí)從外部程序存儲(chǔ)器讀指令。4組8位可編程I/O口,每個(gè)口有8根引腳一共32根可編程輸入/輸出引腳,分別位于P0、P1、P2、P3口。P0口(P39~P32):8位雙向I/O口線,名稱為P0.0~P0.7;P1口(P1~P8):8位準(zhǔn)雙向I/O口線,名稱為P1.0~P1.7;P2口(P21~P28):8位準(zhǔn)雙向I/O口線,名稱為P2.0~P2.7;P3口(P10~P17):8位準(zhǔn)雙向I/O口線,名稱為P3.0~P3.7。 
圖2-2 STC89C52單片機(jī)引腳圖
(2)STC89C52的工作原理 單片機(jī)就是按時(shí)鐘周期,取出指命和數(shù)據(jù),作出相關(guān)的硬件操作[12]。當(dāng)系統(tǒng)需要做出一項(xiàng)指令時(shí),能否找到該項(xiàng)指令,要對(duì)該項(xiàng)指令做出什么處理,就需要單片機(jī)軟件程序判斷,并且做出相應(yīng)的數(shù)據(jù)存儲(chǔ)器。在單片機(jī)尋找的過程中,可能會(huì)出現(xiàn)單片機(jī)的中斷。當(dāng)單片機(jī)完成該項(xiàng)指令后,若是沒有新的指令下達(dá)則單片機(jī)開始進(jìn)入休眠狀態(tài),—但系統(tǒng)有新的指令下達(dá)單片機(jī)便又開始工作。STC89C52的內(nèi)部結(jié)構(gòu)如圖2-3。 
圖2-3 STC89C52內(nèi)部結(jié)構(gòu)圖 2.3.2 TCS230顏色傳感器(1)TCS230的結(jié)構(gòu)及工作原理 TCS230在單一芯片上集成了64個(gè)光電二極管,這64個(gè)光電二極管分為4類,16個(gè)帶有紅色濾波器的光電二極管;16個(gè)帶有綠色濾波器的光電二極管;16個(gè)帶有藍(lán)色濾波器的光電二極管和16個(gè)不帶有任何濾波器的光電二極管,基本上可以透過全部的光信號(hào)。這些光電二極管在芯片中又是交叉排列的,能夠最大限度的減少入射光輻射的不均勻性,同時(shí)顏色相同的16個(gè)光電二極管是并聯(lián)的,均勻分布在二極管陣列中,可以消除顏色的位置誤差極大的提高了識(shí)別精度。工作時(shí)可通過兩個(gè)可編程的引腳來動(dòng)態(tài)選擇所需要的濾波器。其內(nèi)部結(jié)構(gòu)如圖2-4所示。 
圖2-4 TCS230顏色傳感器內(nèi)部結(jié)構(gòu)圖 由圖可知當(dāng)光照射到TCS230顏色傳感器上時(shí),光電二極管能夠控制引腳S2,S3進(jìn)行不同的組合,從而選擇不同的濾波器,在通過電流-頻率轉(zhuǎn)換器將濾過識(shí)別到的顏色信號(hào)轉(zhuǎn)換成不同的方波段,不同的顏色對(duì)應(yīng)不同頻率的波段;還可以通過輸出信號(hào)控制引腳SO,S1,選擇不同的信號(hào)輸出比例因子(100%,20%,2%),從而調(diào)節(jié)輸出波段頻率范圍,來達(dá)到不同的識(shí)別要求。以下兩表為內(nèi)部引腳所對(duì)應(yīng)的功能和不同引腳工作在高低電平時(shí)傳感器所對(duì)應(yīng)的工作選項(xiàng)。 表2-2 STC230內(nèi)部引腳所對(duì)應(yīng)的功能表
表2-3 不同組合下的工作狀態(tài)表
TCS230顏色傳感器能夠識(shí)別顏色的方式基于三點(diǎn)即三基色原理、顏色識(shí)別原理、白平衡原理。 三基色原理:人眼能夠看到東西是因?yàn)槿搜勰軌蚪邮盏絹碜晕矬w反射的光。當(dāng)太陽光或其它光源照射到物體表面時(shí),某些頻率的可見光會(huì)被物體表面吸收,不能吸收的可見光則會(huì)被物體表面反射,當(dāng)肉眼接收到這一部分反射光,就形成了我們看到的顏色。這也說明了太陽光是一種由各種頻率的可見光混合而成的光束,其中包含著各種顏色的光。自然界中所有顏色都可以通過不同比例的三基色(紅、綠、藍(lán))混合得到,這稱為三基色原理。 顏色識(shí)別原理:由三基色原理可知,任何顏色都可以由三基色通過不同比例構(gòu)成,當(dāng)確定了某物體的三基色比例數(shù)值,就可以反過來確定該物體的顏色。TCS230顏色傳感器能夠識(shí)別顏色是因?yàn)樗鼉?nèi)部含有64個(gè)光電二極管構(gòu)成的濾波器。進(jìn)行顏色識(shí)別時(shí)它能夠選擇一種特定的濾波器工作,當(dāng)該種濾波器工作時(shí)只能通過特定的顏色,阻止其它顏色通過。這樣就能得到通過濾波器的顏色的光強(qiáng),通過透過顏色的不同光強(qiáng)數(shù)值,就可以分析照射在TCS230顏色傳感器上的光的顏色。當(dāng)使用TCS230顏色識(shí)別傳感器識(shí)別顏色時(shí):依次選擇三種顏色濾波器,再對(duì)TCS230的輸出脈沖進(jìn)行依次計(jì)數(shù)。當(dāng)計(jì)數(shù)到255時(shí)停止計(jì)數(shù),記錄下每個(gè)通道到達(dá)的時(shí)間,在這段時(shí)間內(nèi)所測(cè)得的脈沖數(shù)量就是該顏色所對(duì)應(yīng)的R、G、B的值。 白平衡和顏色識(shí)別原理:在顏色識(shí)別系統(tǒng)軟件上確定一個(gè)基底色,由于該基底色通常選為白色故而稱為白平衡。通常情況下白色應(yīng)是由紅色、綠色、藍(lán)色按照相同的比例混合而成的,因此在調(diào)節(jié)白平衡時(shí)系統(tǒng)液晶顯示屏上R、G、B的數(shù)值應(yīng)保持在(255、255、255)。但實(shí)際測(cè)試中白色中的三基色數(shù)值并不相同,這樣會(huì)導(dǎo)致TCS230顏色傳感器上R、G、B的輸出數(shù)值不同,導(dǎo)致后面的顏色識(shí)別不準(zhǔn)確[14]。故在測(cè)試顏色前需要調(diào)節(jié)白平衡,使TCS230顏色傳感器上檢測(cè)到白色中的三基色數(shù)值相同,保證后面顏色識(shí)別的準(zhǔn)確性。 (3)TCS230顏色識(shí)別電路接口 
圖2-5 TCS230與單片機(jī)的連接方式圖
如圖2-5所示,將TCS230顏色傳感器的輸出引腳連接到單片機(jī)的定時(shí)\計(jì)數(shù)的輸入端。設(shè)置單片機(jī)定時(shí)計(jì)數(shù)器的工作方式,初始化單片機(jī)定時(shí)器的值,在調(diào)整TCS230的輸出比例因子。在測(cè)量時(shí)通過單片機(jī)計(jì)數(shù)器的值,就可以計(jì)算出TCS230的各種輸出頻率,從而確定待測(cè)顏色的R、G、B三基色的數(shù)值。 2.3.3 LCD1602液晶LCD1602液晶顯示器是廣泛使用的一種字符型液晶顯示模塊。它是由字符型液晶顯示屏(LCD)、控制驅(qū)動(dòng)主電路HD44780及其擴(kuò)展驅(qū)動(dòng)電路HD44100,以及少量電阻、電容元件和結(jié)構(gòu)件等裝配在PCB板上而組成,內(nèi)部帶了80個(gè)字節(jié)的顯示RAM,用來儲(chǔ)存發(fā)送的數(shù)據(jù)。其與單片機(jī)的連接方式如圖2-6。 
圖2-6 LCD1062與單片機(jī)的連接方式
其一共有16個(gè)引腳,每個(gè)引腳功能如下表。 表2-4 LCD1602引腳功能表
LCD1602液晶是可以顯示兩行,每行16個(gè)字符的液晶。第一行的地址是 0x00H 到 0x27,第二行的地址從 0x40 到 0x67,其中第一行0x00 到 0x0F是與液晶上第一行 16 個(gè)字符顯示位置相對(duì)應(yīng)的,第二行 0x40 到 0x4F 是與第二行 16 個(gè)字符顯示位置相對(duì)應(yīng)的[15]。而每行都多出來一部分,是為了顯示移動(dòng)字幕設(shè)置。其工作狀態(tài)如下表。 表2-5 LCD工作狀態(tài)表
圖2-7所示是在本設(shè)計(jì)中當(dāng)LCD1602處于白平衡工作狀態(tài)時(shí),所顯示出的R、G、B三基色數(shù)值。 
圖2-7 LCD在工作時(shí)顯示數(shù)值
第3章 系統(tǒng)軟件設(shè)計(jì)設(shè)計(jì)中TCS230顏色傳感器是現(xiàn)成的,可直接通電使用,在軟件中不需要對(duì)系統(tǒng)進(jìn)行初始化也可以進(jìn)行顏色的識(shí)別。開始先在程序中定義參數(shù),在識(shí)別待測(cè)顏色過程中,程序先將信號(hào)進(jìn)行線性處理,再調(diào)用白平衡函數(shù)進(jìn)行白平衡調(diào)節(jié),然后在調(diào)用顏色識(shí)別函數(shù),其能夠完成顏色的采集、對(duì)比、轉(zhuǎn)化并輸出R、G、B的值,然后進(jìn)行三種顏色數(shù)值的比較以此來控制LED燈的亮滅,最后在通過調(diào)用顯示函數(shù),將R、G、B的數(shù)值顯示在顯示模塊之中,這樣便完成了一次顏色的識(shí)別。具體程序框圖如圖3-1所示,整體程序詳見附錄。 
圖3-1 主程序框圖 其中參數(shù)定義部分程序說明了單片機(jī)與1602液晶、LED和顏色傳感器之間對(duì)應(yīng)的引腳連接方式,還說明了程序中引用的子函數(shù)的作用以及定義了函數(shù)中某些字符所代表的顏色、顏色因子等必要參數(shù);線性處理部分程序是對(duì)顏色傳感器識(shí)別的信號(hào)先做一個(gè)處理。CMOD=0x51設(shè)置16位定時(shí)計(jì)數(shù)工作模式,由于顏色傳感器識(shí)別的信號(hào)是不同頻率的波段,設(shè)置一個(gè)16位的定時(shí)計(jì)數(shù)模式,用10ms內(nèi)識(shí)別到的脈沖數(shù)量來求取待測(cè)顏色數(shù)值;顏色對(duì)比部分程序是用來判斷構(gòu)成該顏色的三基色的最大值,來控制對(duì)應(yīng)LED的點(diǎn)亮和熄滅。 顏色識(shí)別子函數(shù):該程序設(shè)置了顏色傳感器的引腳工作狀態(tài)的高低電平,以此來選擇其內(nèi)部的濾波器類型,如設(shè)置(S2=0、S3=0)此時(shí)紅色濾波器工作,可求得三基色中的紅色數(shù)值。具體方法如下:定時(shí)器(TH0、TL0)定時(shí)工作10ms,在這10ms內(nèi)計(jì)數(shù)器(TH1、TL1)會(huì)記錄出輸入的脈沖個(gè)數(shù),當(dāng)10ms過后關(guān)閉定時(shí)器、計(jì)數(shù)器。此時(shí)紅色濾波器工作,那么R=((TH1*256+TL1)/紅色因子)。同理,調(diào)整傳感器S2、S3的工作狀態(tài)分別使另外兩個(gè)濾波器工作即可求出其它兩基色的值,R、G、B三個(gè)數(shù)值即可確定顏色。 白平衡子程序:上述中顏色識(shí)別過程中最終得出的顏色數(shù)值為脈沖數(shù)量/顏色因子,白平衡的過程就是求取顏色因子。由白平衡原理可知此時(shí)R、G、B的值應(yīng)為(255、255、255),在通過計(jì)數(shù)器計(jì)算出在10ms內(nèi)的脈沖數(shù)即可求得顏色因子。此時(shí)顏色因子=((TH1*255+TL1)/255)。通過設(shè)置不同的濾波器工作可以求出不同顏色(R、G、B)的顏色因子。 顯示部分程序:1602液晶可以每行顯示16個(gè)字符,共可顯示兩行。先設(shè)置1602初始化函數(shù),定義液晶引腳的工作電平以此來控制其工作狀態(tài)(讀寫狀態(tài)、讀寫指令),在顯示時(shí)設(shè)置顯示在第X(X不大于1)行第Y列(Y不大于15),由于第二行顯示的地址是從0x40開始的,當(dāng)顯示在第二行時(shí)地址碼需加0x40,算出指令碼進(jìn)行顯示。
第4章 硬件電路設(shè)計(jì)及測(cè)試 4.1 硬件電路 由于該設(shè)計(jì)較為便捷,在了解了各個(gè)模塊的功能與作用之后,只需要將第二章所述模塊各自按照其與單片機(jī)的連接方式逐一搭建起來,然后在通過仿真模擬記錄下顯示模塊的數(shù)據(jù),并且與網(wǎng)絡(luò)上的標(biāo)準(zhǔn)比色卡的數(shù)據(jù)進(jìn)行對(duì)比,判斷本設(shè)計(jì)是否能夠?qū)崿F(xiàn)其要求的顏色識(shí)別功能即可。 首先在Altium Designer 軟件上面構(gòu)建出顏色采集識(shí)別模塊、單片機(jī)主控模塊、液晶顯示模塊中各個(gè)引腳之間的硬件模擬圖。由于在Altium Designer 軟件上面沒有TCS230和LCD1602這兩款元件,則需要自己通過創(chuàng)建子電路的方式進(jìn)行構(gòu)建。如圖4-1,4-2,4-3是該設(shè)計(jì)的總硬件電路圖、PCB版圖和3D模擬圖。 
圖4-1 顏色識(shí)別系統(tǒng)硬件電路模擬圖 
圖4-2 系統(tǒng)PCB版圖

圖4-3 系統(tǒng)3D效果圖
由于在Altium Designer上構(gòu)建出來的元器件不能實(shí)現(xiàn)該元器件應(yīng)有的功能,所以本設(shè)計(jì)不能通過軟件仿真測(cè)試,只能通過實(shí)物進(jìn)行仿真測(cè)試,因此需要先進(jìn)行本設(shè)計(jì)的實(shí)物搭建。按照上述硬件模擬電路圖,將實(shí)物逐步焊接在電路板上,為了能夠使得LCD液晶顯示器模塊有更好的顯示效果,在電路的設(shè)計(jì)中添加了一個(gè)滑動(dòng)變阻器,通過調(diào)節(jié)滑動(dòng)變阻器的阻值來控制LCD液晶的顯示數(shù)值的亮暗程度,更加便于肉眼觀察。如圖4-4是本設(shè)計(jì)的硬件實(shí)物圖。   圖4-4 顏色識(shí)別系統(tǒng)硬件電路實(shí)物圖 4.2實(shí)物測(cè)試 在Keil軟件上編寫程序,利用串口下載器將程序下載進(jìn)STC89C52單片機(jī)中,并且使用不同顏色的卡紙放置在TCS230顏色傳感器上,記錄出現(xiàn)在LCD液晶顯示模塊上面的R、G、B數(shù)值。R、G、B三基色的數(shù)值只會(huì)出現(xiàn)在0-255之間,當(dāng)某一數(shù)值顯示為0時(shí)表示該基色顏色不參與該待測(cè)顏色的構(gòu)成,若是待測(cè)顏色為三基色本身那么其余的兩個(gè)基色的數(shù)值應(yīng)顯示為0,待測(cè)三基色應(yīng)顯示為255.如:測(cè)試基色紅色,則顯示結(jié)果應(yīng)該為(R:255、G:0、B:0)同理其它三基色也是如此。將記錄下的R、G、B數(shù)值輸入到三基色顏色配比表(網(wǎng)頁版)中,將待測(cè)顏色與三基色顏色配比表中出現(xiàn)的顏色進(jìn)行對(duì)比,判斷本顏色識(shí)別系統(tǒng)是否能夠準(zhǔn)確的識(shí)別待測(cè)顏色。如圖4-5是本顏色識(shí)別系統(tǒng)的實(shí)物進(jìn)行白平衡時(shí)的工作狀態(tài)圖。 
圖4-5 顏色識(shí)別系統(tǒng)實(shí)物白平衡仿真圖 由上圖可以看出,當(dāng)帶有顏色的卡紙放置在TCS230顏色傳感器上時(shí),在LCD顯示模塊上面會(huì)顯示出R、G、B各自占比的數(shù)值,上圖為系統(tǒng)白平衡調(diào)試故顯示的數(shù)值為(R255、G255、B255)。 4.3數(shù)據(jù)測(cè)試 由于顏色的多種多樣性,故選取7種具有代表性的顏色進(jìn)行顏色識(shí)別測(cè)試,并分別將液晶顯示模塊上的數(shù)值記錄下來,并且將數(shù)據(jù)輸入進(jìn)顏色生成器中,看生成的顏色是否符合待測(cè)顏色。下表為測(cè)試結(jié)果以及顏色生成器生成的目標(biāo)顏色。 表4-1 顏色識(shí)別裝置測(cè)試結(jié)果表
以下兩組圖片為該顏色識(shí)別系統(tǒng)在兩種顏色的卡紙識(shí)別時(shí)的工作狀態(tài),以及數(shù)據(jù)驗(yàn)證。 
圖4-6 紅色卡紙識(shí)別工作狀態(tài) 
圖4-7 紅色卡紙數(shù)據(jù)驗(yàn)證

圖4-8 綠色卡紙識(shí)別工作狀態(tài)

圖4-9 綠色卡紙數(shù)據(jù)驗(yàn)證
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCM_Data P0 //LCD1602數(shù)據(jù)接口
- #define Busy 0x80 //用于檢測(cè)LCM狀態(tài)字中的Busy標(biāo)識(shí)
- sbit LCM_RW = P2^6; //讀寫控制輸入端,LCD1602的第五腳
- sbit LCM_RS = P2^7; //寄存器選 擇輸入端,LCD1602的第四腳
- sbit LCM_E = P2^5; //使能信號(hào)輸入端,LCD1602的第6腳
- sbit deng_r =P2^0;
- sbit deng_g =P2^1;
- sbit deng_b =P2^2;
- sbit tcs230_s2=P1^1;//TCS230 S2接單片機(jī)P2.0
- sbit tcs230_s3=P1^0;//TCS230 S3接單片機(jī)P2.1
- sbit tcs230_en=P3^0; //TCS230 EN(E0)接GND
- void WriteDataLCM (uchar WDLCM);//LCD模塊寫數(shù)據(jù)
- void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模塊寫指令
- uchar ReadStatusLCM(void);//讀LCD模塊的忙標(biāo)
- void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個(gè)字符
- void LCMInit(void);//LCD初始
- void DelayMs(uint Ms);//1MS基準(zhǔn)延時(shí)程序
- void baipingheng();//白平衡子程序
- void celiang();//實(shí)際顏色程序
- uint ryz,gyz,byz;//分別定義紅色因子 綠色因子 藍(lán)色因子
- uint rb,gb,bb;//RGB值
- uchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- main()
- {
- int i;
- unsigned char max=0;
- TMOD=0x51;//設(shè)定T0以工作方式1定時(shí)10毫秒
- LCMInit();//LCD初始
- for(i=0;i<5;i++)
- baipingheng();//上電時(shí)先白平衡一次
- while(1)
- {
- celiang();//顏色測(cè)試
- max=rb;
- if(gb>max)
- max=gb;
- else
- max=max;
- if(bb>max)
- max=bb;
- else
- max=max;
- if(max==rb)
- deng_r=1;
- else
- deng_r=0;
- if(max==gb)
- deng_g=1;
- else
- deng_g=0;
- if(max==bb)
- deng_b=1;
- else
- deng_b=0;
- DisplayOneChar(0, 0,'R');//以十進(jìn)制顯示RGB中紅色的分值
- DisplayOneChar(0, 1, rb/100+0x30); //顯示百位數(shù)據(jù)
- DisplayOneChar(0, 2, rb/10%10+0x30);//顯示十位數(shù)據(jù)
- DisplayOneChar(0, 3, rb%10+0x30);//顯示個(gè)位數(shù)據(jù)
- DisplayOneChar(0, 5,'G');//以十進(jìn)制顯示RGB中綠色的分值
- DisplayOneChar(0, 6, gb/100+0x30); //顯示百位數(shù)據(jù)
- DisplayOneChar(0, 7, gb/10%10+0x30);
- DisplayOneChar(0, 8, gb%10+0x30);
- DisplayOneChar(0, 10,'B');//以十進(jìn)制顯示RGB中藍(lán)色的分值
- DisplayOneChar(0, 11, bb/100+0x30);
- DisplayOneChar(0, 12, bb/10%10+0x30);
- DisplayOneChar(0, 13, bb%10+0x30);
- DisplayOneChar(1, 1, tab1[rb/16]);
- DisplayOneChar(1, 2, tab1[rb%16]);
- DisplayOneChar(1, 3, 'H');
- DisplayOneChar(1, 6, tab1[gb/16]);
- DisplayOneChar(1, 7, tab1[rb%16]);
- DisplayOneChar(1, 8, 'H');
- DisplayOneChar(1, 11,tab1[bb/16]);
- DisplayOneChar(1, 12,tab1[bb%16]);
- DisplayOneChar(1, 13,'H');
- DelayMs(250);//每隔0.25秒測(cè)試一次顏色
- }
- }
- void celiang()
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=0;
- tcs230_s3=0;//選擇紅色濾光器
- tcs230_en=0;
- TR0=1;//10毫秒開始計(jì)時(shí)
- TR1=1;//開始計(jì)數(shù)
- while(TF0==0);//等待定時(shí)器溢出
- TF0=0;//清楚定時(shí)器0溢出標(biāo)志
- TR0=0;//關(guān)閉定時(shí)0
- TR1=0;
- rb=(unsigned long)(TH1*256+TL1)*255/ryz;
- if(rb>255)rb=255;//判斷RGB值是否合法
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=0;
- tcs230_s3=1;//選擇藍(lán)色濾光器
- TR0=1;//10毫秒開始計(jì)時(shí)
- TR1=1;//開始計(jì)數(shù)
- while(TF0==0);//等待定時(shí)器溢出
- TF0=0;//清楚定時(shí)器0溢出標(biāo)志
- TR0=0;//關(guān)閉定時(shí)0
- TR1=0;
- bb=(unsigned long)(TH1*256+TL1)*255/byz;
- if(bb>255)bb=255;//判斷RGB值是否合法
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=1;
- tcs230_s3=1;//選擇綠色濾光器
- TR0=1;//10毫秒開始計(jì)時(shí)
- TR1=1;//開始計(jì)數(shù)
- while(TF0==0);//等待定時(shí)器溢出
- TF0=0;//清楚定時(shí)器0溢出標(biāo)志
- TR0=0;//關(guān)閉定時(shí)0
- TR1=0;
- tcs230_en=1;
- gb=(unsigned long)(TH1*256+TL1)*255/gyz;
- if(gb>255)gb=255;//判斷RGB值是否合法
- }
- void baipingheng()
- {
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=0;
- tcs230_s3=0;//選擇紅色濾光器
- tcs230_en=0;
- TR0=1;//10毫秒開始計(jì)時(shí)
- TR1=1;//開始計(jì)數(shù)
- while(TF0==0);//等待定時(shí)器溢出
- TF0=0;//清楚定時(shí)器0溢出標(biāo)志
- TR0=0;//關(guān)閉定時(shí)0
- TR1=0;
- ryz=TH1*256+TL1;//其實(shí)這里的比例因子應(yīng)該為255/(TH1*256+TL1)
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=0;
- tcs230_s3=1;//選擇藍(lán)色濾光器
- TR0=1;//10毫秒開始計(jì)時(shí)
- TR1=1;//開始計(jì)數(shù)
- while(TF0==0);//等待定時(shí)器溢出
- TF0=0;//清楚定時(shí)器0溢出標(biāo)志
- TR0=0;//關(guān)閉定時(shí)0
- TR1=0;
- byz=TH1*256+TL1;//其實(shí)這里的比例因子應(yīng)該為255/(TH1*256+TL1)
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- TH1=0;
- TL1=0;
- tcs230_s2=1;
- tcs230_s3=1;//選擇綠色濾光器
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
以上內(nèi)容的Word格式文檔51黑附件下載:
基于單片機(jī)顏色識(shí)別系統(tǒng)的設(shè)計(jì).docx
(3.64 MB, 下載次數(shù): 152)
2021-7-22 08:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|