找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8870|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)TCS230顏色識(shí)別系統(tǒng)的設(shè)計(jì)資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:955480 發(fā)表于 2021-7-22 08:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一個(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 元件清單表

序號(hào)

元器件

數(shù)量

1

STC89C51單片機(jī)

1

2

TCS230顏色傳感器

1

3

LCD1602液晶

1

4

彩色LED燈泡

3



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)的功能表

引腳名稱

輸入/輸出

備注

GND(8)


電源接地線

OE(7)

輸入

啟用(低電平有效)

OUT(3)

輸出

輸出頻率

S0、S1(5、6)

輸入

輸出頻率縮放選擇輸入

S2、S3(2、1)

輸入

光電二極管類型選擇輸入

VCC(4)


電源線(接2.7V-5.5V)



表2-3 不同組合下的工作狀態(tài)表

S0

S1

輸出頻率

S2

S3

濾波器顏色

電源斷開

紅色

2%

藍(lán)色

20%

無色

100%

綠色


  • TCS230顏色識(shí)別

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引腳功能表

編號(hào)

符號(hào)

引腳說明

編號(hào)

符號(hào)

引腳說明

1

VSS

接地線

9

D2

Data I/O

2

VDD

電源線

10

D3

Data I\O

3

VL

液晶顯示偏壓信號(hào)

11

D4

Data I\O

4

RS

數(shù)據(jù)\命令選擇端

12

D5

Data I\O

5

R/W

讀/寫選擇端

13

D6

Data I\O

6

E

使能信號(hào)

14

D7

Data I\O

7

D0

Data I\O

15

BLA

背光源正極

8

D1

Data I/O

16

BLK

背光源負(fù)極



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)表

工作狀態(tài)

RS

R/W

E

D0-D7

讀狀態(tài)

讀數(shù)據(jù)

寫指令

指令碼

寫數(shù)據(jù)

數(shù)據(jù)



圖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é)果表

待測(cè)顏色

R

G

B

目標(biāo)顏色

207

55

53

255

190

80

255

255

210

95

146

74

195

255

255

藍(lán)

77

164

206

199

188

214



以下兩組圖片為該顏色識(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ī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int      
  4. #define LCM_Data     P0    //LCD1602數(shù)據(jù)接口
  5. #define Busy         0x80   //用于檢測(cè)LCM狀態(tài)字中的Busy標(biāo)識(shí)
  6. sbit    LCM_RW     = P2^6;  //讀寫控制輸入端,LCD1602的第五腳
  7. sbit    LCM_RS     = P2^7;  //寄存器選  擇輸入端,LCD1602的第四腳
  8. sbit    LCM_E      = P2^5;  //使能信號(hào)輸入端,LCD1602的第6腳
  9. sbit              deng_r                            =P2^0;
  10. sbit              deng_g                            =P2^1;
  11. sbit              deng_b                            =P2^2;
  12. sbit    tcs230_s2=P1^1;//TCS230 S2接單片機(jī)P2.0
  13. sbit    tcs230_s3=P1^0;//TCS230 S3接單片機(jī)P2.1
  14. sbit    tcs230_en=P3^0; //TCS230 EN(E0)接GND
  15. void    WriteDataLCM                            (uchar WDLCM);//LCD模塊寫數(shù)據(jù)
  16. void    WriteCommandLCM              (uchar WCLCM,BuysC); //LCD模塊寫指令
  17. uchar   ReadStatusLCM(void);//讀LCD模塊的忙標(biāo)
  18. void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置顯示一個(gè)字符
  19. void    LCMInit(void);//LCD初始
  20. void    DelayMs(uint Ms);//1MS基準(zhǔn)延時(shí)程序
  21. void    baipingheng();//白平衡子程序
  22. void    celiang();//實(shí)際顏色程序
  23. uint    ryz,gyz,byz;//分別定義紅色因子 綠色因子 藍(lán)色因子
  24. uint    rb,gb,bb;//RGB值
  25. uchar   tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  26. main()  
  27. {
  28. int i;
  29.               unsigned char  max=0;
  30.    TMOD=0x51;//設(shè)定T0以工作方式1定時(shí)10毫秒
  31.    LCMInit();//LCD初始
  32.    for(i=0;i<5;i++)
  33.                  baipingheng();//上電時(shí)先白平衡一次
  34.    while(1)
  35.    {
  36.        celiang();//顏色測(cè)試
  37.                                max=rb;
  38.                                if(gb>max)
  39.                                              max=gb;
  40.                                else
  41.                                              max=max;
  42.                             if(bb>max)
  43.                                           max=bb;
  44.                             else
  45.                                           max=max;
  46.                             if(max==rb)
  47.                                           deng_r=1;
  48.                             else
  49.                                           deng_r=0;
  50.                             if(max==gb)
  51.                                           deng_g=1;
  52.                             else
  53.                                           deng_g=0;
  54.                             if(max==bb)
  55.                                           deng_b=1;
  56.                             else
  57.                                           deng_b=0;
  58.        DisplayOneChar(0, 0,'R');//以十進(jìn)制顯示RGB中紅色的分值
  59.        DisplayOneChar(0, 1, rb/100+0x30); //顯示百位數(shù)據(jù)
  60.        DisplayOneChar(0, 2, rb/10%10+0x30);//顯示十位數(shù)據(jù)
  61.        DisplayOneChar(0, 3, rb%10+0x30);//顯示個(gè)位數(shù)據(jù)
  62.        DisplayOneChar(0, 5,'G');//以十進(jìn)制顯示RGB中綠色的分值
  63.        DisplayOneChar(0, 6, gb/100+0x30); //顯示百位數(shù)據(jù)
  64.        DisplayOneChar(0, 7, gb/10%10+0x30);
  65.        DisplayOneChar(0, 8, gb%10+0x30);
  66.        DisplayOneChar(0, 10,'B');//以十進(jìn)制顯示RGB中藍(lán)色的分值
  67.        DisplayOneChar(0, 11, bb/100+0x30);
  68.        DisplayOneChar(0, 12, bb/10%10+0x30);
  69.        DisplayOneChar(0, 13, bb%10+0x30);
  70.        DisplayOneChar(1, 1, tab1[rb/16]);
  71.        DisplayOneChar(1, 2, tab1[rb%16]);
  72.        DisplayOneChar(1, 3, 'H');
  73.        DisplayOneChar(1, 6, tab1[gb/16]);
  74.        DisplayOneChar(1, 7, tab1[rb%16]);
  75.        DisplayOneChar(1, 8, 'H');
  76.        DisplayOneChar(1, 11,tab1[bb/16]);
  77.        DisplayOneChar(1, 12,tab1[bb%16]);
  78.        DisplayOneChar(1, 13,'H');
  79.        DelayMs(250);//每隔0.25秒測(cè)試一次顏色
  80.    }
  81. }
  82. void   celiang()
  83. {
  84.      TH0=(65536-10000)/256;
  85.                 TL0=(65536-10000)%256;
  86.      TH1=0;
  87.      TL1=0;
  88.      tcs230_s2=0;
  89.      tcs230_s3=0;//選擇紅色濾光器
  90.      tcs230_en=0;
  91.      TR0=1;//10毫秒開始計(jì)時(shí)
  92.      TR1=1;//開始計(jì)數(shù)
  93.      while(TF0==0);//等待定時(shí)器溢出
  94.      TF0=0;//清楚定時(shí)器0溢出標(biāo)志
  95.      TR0=0;//關(guān)閉定時(shí)0
  96.      TR1=0;
  97.      rb=(unsigned long)(TH1*256+TL1)*255/ryz;
  98.      if(rb>255)rb=255;//判斷RGB值是否合法
  99.      TH0=(65536-10000)/256;
  100.                 TL0=(65536-10000)%256;
  101.      TH1=0;
  102.      TL1=0;
  103.      tcs230_s2=0;
  104.      tcs230_s3=1;//選擇藍(lán)色濾光器
  105.      TR0=1;//10毫秒開始計(jì)時(shí)
  106.      TR1=1;//開始計(jì)數(shù)
  107.      while(TF0==0);//等待定時(shí)器溢出
  108.      TF0=0;//清楚定時(shí)器0溢出標(biāo)志
  109.      TR0=0;//關(guān)閉定時(shí)0
  110.      TR1=0;
  111.      bb=(unsigned long)(TH1*256+TL1)*255/byz;
  112.      if(bb>255)bb=255;//判斷RGB值是否合法     
  113.      TH0=(65536-10000)/256;
  114.                 TL0=(65536-10000)%256;
  115.      TH1=0;
  116.      TL1=0;
  117.      tcs230_s2=1;
  118.      tcs230_s3=1;//選擇綠色濾光器
  119.      TR0=1;//10毫秒開始計(jì)時(shí)
  120.      TR1=1;//開始計(jì)數(shù)
  121.      while(TF0==0);//等待定時(shí)器溢出
  122.      TF0=0;//清楚定時(shí)器0溢出標(biāo)志
  123.      TR0=0;//關(guān)閉定時(shí)0
  124.      TR1=0;
  125.      tcs230_en=1;
  126.      gb=(unsigned long)(TH1*256+TL1)*255/gyz;
  127.      if(gb>255)gb=255;//判斷RGB值是否合法
  128. }
  129. void    baipingheng()
  130. {
  131.      TH0=(65536-10000)/256;
  132.                 TL0=(65536-10000)%256;
  133.      TH1=0;
  134.      TL1=0;
  135.      tcs230_s2=0;
  136.      tcs230_s3=0;//選擇紅色濾光器
  137.      tcs230_en=0;
  138.      TR0=1;//10毫秒開始計(jì)時(shí)
  139.      TR1=1;//開始計(jì)數(shù)
  140.      while(TF0==0);//等待定時(shí)器溢出
  141.      TF0=0;//清楚定時(shí)器0溢出標(biāo)志
  142.      TR0=0;//關(guān)閉定時(shí)0
  143.      TR1=0;
  144.      ryz=TH1*256+TL1;//其實(shí)這里的比例因子應(yīng)該為255/(TH1*256+TL1)
  145.      TH0=(65536-10000)/256;
  146.                 TL0=(65536-10000)%256;
  147.      TH1=0;
  148.      TL1=0;
  149.      tcs230_s2=0;
  150.      tcs230_s3=1;//選擇藍(lán)色濾光器
  151.      TR0=1;//10毫秒開始計(jì)時(shí)
  152.      TR1=1;//開始計(jì)數(shù)
  153.      while(TF0==0);//等待定時(shí)器溢出
  154.      TF0=0;//清楚定時(shí)器0溢出標(biāo)志
  155.      TR0=0;//關(guān)閉定時(shí)0
  156.      TR1=0;
  157.      byz=TH1*256+TL1;//其實(shí)這里的比例因子應(yīng)該為255/(TH1*256+TL1)
  158.      TH0=(65536-10000)/256;
  159.                 TL0=(65536-10000)%256;
  160.      TH1=0;
  161.      TL1=0;
  162.      tcs230_s2=1;
  163.      tcs230_s3=1;//選擇綠色濾光器
  164. ……………………

  165. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………

復(fù)制代碼

以上內(nèi)容的Word格式文檔51黑附件下載:
基于單片機(jī)顏色識(shí)別系統(tǒng)的設(shè)計(jì).docx (3.64 MB, 下載次數(shù): 152)

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2021-7-25 17:50 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:63317 發(fā)表于 2021-7-28 07:10 | 只看該作者

好資料,51黑有你更精彩  謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:980576 發(fā)表于 2021-11-13 13:14 來自手機(jī) | 只看該作者
可以發(fā)一下那個(gè)tcs230和單片機(jī)以及1602的連接圖嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:980576 發(fā)表于 2021-11-13 13:33 來自手機(jī) | 只看該作者
就不能1602上面直接顯示顏色嘛
回復(fù)

使用道具 舉報(bào)

6#
ID:262 發(fā)表于 2021-11-13 16:50 | 只看該作者
@lhl 發(fā)表于 2021-11-13 13:33
就不能1602上面直接顯示顏色嘛

1602是單色屏, 只能顯示白色一種顏色呢
回復(fù)

使用道具 舉報(bào)

7#
ID:980576 發(fā)表于 2021-11-13 18:17 | 只看該作者
heicad 發(fā)表于 2021-11-13 16:50
1602是單色屏, 只能顯示白色一種顏色呢

現(xiàn)在1602上面顯示的是RGB值,我在想能不能把這個(gè)值變成某種具體的顏色名字,比如說,R255 G0 B0的時(shí)候,在1602上面顯示red
回復(fù)

使用道具 舉報(bào)

8#
ID:978751 發(fā)表于 2021-11-13 22:20 | 只看該作者
@lhl 發(fā)表于 2021-11-13 18:17
現(xiàn)在1602上面顯示的是RGB值,我在想能不能把這個(gè)值變成某種具體的顏色名字,比如說,R255 G0 B0的時(shí)候, ...

可能不太穩(wěn)定,因?yàn)橥环N顏色也有好多種,例如紅色,分大紅,淡紅,桔紅等.看看能不能設(shè)置個(gè)正負(fù)誤差.
回復(fù)

使用道具 舉報(bào)

9#
ID:156220 發(fā)表于 2021-11-19 14:36 | 只看該作者
這個(gè)資料很好,謝謝樓主的分享,
回復(fù)

使用道具 舉報(bào)

10#
ID:1022270 發(fā)表于 2022-5-3 19:52 來自手機(jī) | 只看該作者
這個(gè)是兩個(gè)定時(shí)器都用了嗎,那我還能不能用定時(shí)器來驅(qū)動(dòng)舵機(jī)呢?
回復(fù)

使用道具 舉報(bào)

11#
ID:387410 發(fā)表于 2022-9-22 19:41 | 只看該作者
不錯(cuò),感恩交流
回復(fù)

使用道具 舉報(bào)

12#
ID:1092242 發(fā)表于 2023-8-30 08:54 | 只看該作者
非常不錯(cuò),感謝樓主
回復(fù)

使用道具 舉報(bào)

13#
ID:981146 發(fā)表于 2023-12-11 10:49 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

14#
ID:433219 發(fā)表于 2023-12-11 15:47 | 只看該作者
加了透鏡?  4個(gè)LED是純白發(fā)光源???
回復(fù)

使用道具 舉報(bào)

15#
ID:1127740 發(fā)表于 2024-7-1 13:47 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表