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

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

圖4-8 綠色卡紙識別工作狀態

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