背景:
隨著現(xiàn)代工業(yè)生產(chǎn)向高速化、自動(dòng)化方向的發(fā)展,生產(chǎn)過程中長(zhǎng)期以來由人眼起主導(dǎo)作用的顏色識(shí)別工作將越來越多地被相應(yīng)的顏色傳感器所替代。例如:圖書館使用顏色區(qū)分對(duì)文獻(xiàn)進(jìn)行分類,能夠極大地提高排架管理和統(tǒng)計(jì)等工作;在包裝行業(yè),產(chǎn)生包裝利用不同的顏色和裝潢來表示其不同的性質(zhì)或用途。目前的顏色傳感器通常是在獨(dú)立的光電二極管上覆蓋經(jīng)過修正的紅、綠、藍(lán)濾波片,然后對(duì)輸出信號(hào)進(jìn)行相應(yīng)的處理,才能將顏色信號(hào)識(shí)別出來;有的將兩者集合起來,但是輸出模擬信號(hào),需要一個(gè)A/D電路進(jìn)行采集,對(duì)該信號(hào)進(jìn)一步處理,才能進(jìn)行識(shí)別,增加了電路的復(fù)雜性,并且存在較大的識(shí)別誤差,影響了識(shí)別的效果。TAOS(TexasAdvancedOptoelectronicSolutions)公司最新推出的顏色傳感器TCS3200,不僅能夠?qū)崿F(xiàn)顏色的識(shí)別與檢測(cè),與以前的顏色傳感器相比,還具有許多優(yōu)良的新特性。
最近在網(wǎng)上淘了一片TCS3200模塊,從官方的介紹中看的出這片TCS3200功能好強(qiáng)大,閑來沒事就做了一實(shí)驗(yàn),想看看這個(gè)TCS3200的性能、檢測(cè)能力到底怎樣;
需要的器件和材料:
1.51最小系統(tǒng)(12T 時(shí)鐘:11.0592MHz)
2.TCS3200顏色識(shí)別模塊
3.各種顏色的物料
4.1602液晶屏
TCS3200接口定義:
S0、S1接VCC
EO接GND(或用IO口控制)
S2接P1.0
S3接P1.1
OUT接P3.5(必須)
(測(cè)試程序貼在后面,實(shí)物測(cè)試通過!)
(TCS3200顏色識(shí)別模塊)
(自己做的TCS3200模塊轉(zhuǎn)接板,方便連線,方便檢測(cè)顏色)
(模塊和轉(zhuǎn)接板連接完成)
(最小系統(tǒng))
(1602液晶屏)
(連接好1602液晶屏)
(為了方便檢測(cè)小物料和白平衡檢測(cè),需要自己做一個(gè)小平臺(tái),倆飲料瓶蓋子,一顆自攻螺絲即可搞定!)
(做好的平臺(tái),為了方便白平衡,需要在上面蓋子上劃倆口子,只要能卡住一張白紙即可!)
(最終效果)
(全家福)
(連接好TCS3200模塊)
(白平衡測(cè)試,注意:上電前必須白平衡檢測(cè),不然后面檢測(cè)的顏色都不會(huì)準(zhǔn)確的;檢測(cè)方法:白紙放在TCS3200模塊前面1公分處,然后單片機(jī)上電,只要第一次讀出的值為255,255,255即可,否則請(qǐng)重新進(jìn)行白平衡!)
(白平衡的結(jié)果,現(xiàn)在就可以進(jìn)行顏色識(shí)別了)
(識(shí)別到綠色娃娃的顏色,上位機(jī)上面的顏色為識(shí)別到的顏色,同時(shí)液晶上會(huì)顯示RGB值)
(識(shí)別到黃色娃娃的顏色值)
(識(shí)別到粉紅色娃娃的顏色值)
(上位機(jī)顯示粉紅色娃娃的顏色)
(上位機(jī)界面)

(這倆高爾夫球的識(shí)別,但是結(jié)果不準(zhǔn)確,估計(jì)是這倆高爾夫球的反光能力太強(qiáng)烈了,只要表面不是很光滑的物體檢測(cè)出來誤差都是很小的,另外,有網(wǎng)友說要放在黑盒子里檢測(cè),我感覺沒必要,只要白平衡做好了基本就沒什么問題了,至于表面特別光滑的物體,只能去尋找其他方法去進(jìn)行檢測(cè)了!)
========================= 測(cè) 試 程 序 ======================== #include "reg52.h"
#define _data P2 //LCD1602數(shù)據(jù)接口
/******************************************************************
- 說明:端口定義
- 備注:無
******************************************************************/
sbit EN =P0^5; //讀寫使能,高電平有效,下降沿鎖定數(shù)據(jù)。
sbit RW =P0^6; //讀/寫選擇:高電平為讀數(shù)據(jù),低電平為寫數(shù)據(jù)。
sbit RS =P0^7; //數(shù)據(jù)/指令選擇:高電平為數(shù)據(jù),低電平為指令。
sbit tcs230_s2=P1^0; //TCS3200 S2 P1.0
sbit tcs230_s3=P1^1; //TCS3200 S3 P1.1
//TCS3200 OUT 接P3.5
/******************************************************************
- 說明:變量定義
- 備注:無
******************************************************************/
unsigned int Ryz,Gyz,Byz; //分別定義紅色因子 綠色因子 藍(lán)色因子
unsigned int Rzhi,Gzhi,Bzhi; //RGB值
unsigned char code num[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/******************************************************************
- 功能描述:延時(shí)子程序
- 入口參數(shù):長(zhǎng)整數(shù)型
- 參 數(shù) 值:0-65535
- 返回說明:無
- 備 注:無
******************************************************************/
void delay1ms(unsigned int ms)//延時(shí)1毫秒(不夠精確的)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void delay600ms(void)
{
unsigned char a,b,c;
for(c=89;c>0;c--)
for(b=230;b>0;b--)
for(a=12;a>0;a--);
}
/******************************************************************
- 功能描述:寫數(shù)據(jù)子程序
- 入口參數(shù):數(shù)據(jù)
- 參 數(shù) 值:字節(jié)型
- 返回說明:無
- 備 注:無
******************************************************************/
void wdat(unsigned char dat)
{
delay1ms(1);
RS=1;
RW=0;
EN=0;
_data=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
/******************************************************************
- 功能描述:寫命令子程序
- 入口參數(shù):數(shù)據(jù)
- 參 數(shù) 值:字節(jié)型
- 返回說明:無
- 備 注:無
******************************************************************/
void wcmd(unsigned char com)
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
_data=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
/******************************************************************
- 功能描述:初始化子程序
- 入口參數(shù):無
- 參 數(shù) 值:無
- 返回說明:無
- 備 注:無
******************************************************************/
void init_1602(void)
{
delay1ms(15);
wcmd(0x38);delay1ms(5); //功能設(shè)置 8位總線 2行顯示 5*7點(diǎn)陣
wcmd(0x06);delay1ms(5); //設(shè)置輸入模式 光標(biāo)右移 整體不移
wcmd(0x08);delay1ms(5); //設(shè)置顯示方式 顯示關(guān)
wcmd(0x01);delay1ms(5); //清除顯示
wcmd(0x0c);delay1ms(5); //設(shè)置顯示方式 顯示開 無光標(biāo) 光標(biāo)不閃爍
}
/******************************************************************
- 功能描述:指定位置寫字符函數(shù)
- 入口參數(shù):行,列,字符
- 參 數(shù) 值:無
- 返回說明:無
- 備 注:無
******************************************************************/
void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char in)
{
X &= 0x1; //限制X值為 0 和 1
Y &= 0xF; //限制Y值為 0 - 15
if (X)
{Y|=0x40;} //當(dāng)要顯示第二行時(shí)地址碼+0x40;
Y |= 0x80; //得出列位置
wcmd(Y); //寫地址
wdat(in); //寫數(shù)據(jù)
}
/******************************************************************
- 功能描述:發(fā)送數(shù)據(jù)到上位機(jī)
- 入口參數(shù):數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3
- 參 數(shù) 值:無
- 返回說明:無
- 備 注:無
******************************************************************/
void SendOneByte(unsigned char ina,unsigned char inb,unsigned char inc)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
SBUF = ina;
while(!TI);
TI = 0;
SBUF = inb;
while(!TI);
TI = 0;
SBUF = inc;
while(!TI);
TI = 0;
}
/******************************************************************
- 功能描述:白平衡函數(shù)
- 入口參數(shù):無
- 參 數(shù) 值:無
- 返回說明:無
- 備 注:無
******************************************************************/
void baipingheng(void)
{
TMOD=0x51; //設(shè)定T0以工作方式1定時(shí)10毫秒
TH0=(65536-10000)/256; //取紅色因子
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=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; //取藍(lán)色因子
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; //選擇綠色濾光器
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;
Gyz=TH1*256+TL1; //其實(shí)這里的比例因子應(yīng)該為255/(TH1*256+TL1)
}
/******************************************************************
- 功能描述:測(cè)量顏色值
- 入口參數(shù):無
- 參 數(shù) 值:無
- 返回說明:無
- 備 注:無
******************************************************************/
void ceyanse(void)
{
TMOD=0x51; //設(shè)定T0以工作方式1定時(shí)10毫秒
TH0=(65536-10000)/256; //求R值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0; //選擇紅色濾光器
tcs230_s3=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;
Rzhi=(unsigned long)(TH1*256+TL1)*255/Ryz;
if(Rzhi>255)Rzhi=255; //判斷RGB值是否合法
TH0=(65536-10000)/256; //求B值
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;
Bzhi=(unsigned long)(TH1*256+TL1)*255/Byz;
if(Bzhi>255)Bzhi=255; //判斷RGB值是否合法
TH0=(65536-10000)/256; //求G值
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;
Gzhi=(unsigned long)(TH1*256+TL1)*255/Gyz;
if(Gzhi>255)Gzhi=255; //判斷RGB值是否合法
}
void main(void)
{
init_1602();//LCD初始
baipingheng();//上電時(shí)先白平衡一次
while(1)
{
ceyanse(); //顏色測(cè)試
DisplayOneChar(0, 0,'R');//以十進(jìn)制顯示RGB中紅色的分值
DisplayOneChar(0, 1, Rzhi/100+0x30); //顯示百位數(shù)據(jù)
DisplayOneChar(0, 2, Rzhi/10%10+0x30);//顯示十位數(shù)據(jù)
DisplayOneChar(0, 3, Rzhi%10+0x30);//顯示個(gè)位數(shù)據(jù)
DisplayOneChar(0, 5,'G');//以十進(jìn)制顯示RGB中綠色的分值
DisplayOneChar(0, 6, Gzhi/100+0x30); //顯示百位數(shù)據(jù)
DisplayOneChar(0, 7, Gzhi/10%10+0x30);
DisplayOneChar(0, 8, Gzhi%10+0x30);
DisplayOneChar(0, 10,'B');//以十進(jìn)制顯示RGB中藍(lán)色的分值
DisplayOneChar(0, 11, Bzhi/100+0x30);
DisplayOneChar(0, 12, Bzhi/10%10+0x30);
DisplayOneChar(0, 13, Bzhi%10+0x30);
//*****在LCD1602的第二行以16進(jìn)制顯示RGB*******************
DisplayOneChar(1, 1, num[Rzhi/16]);
DisplayOneChar(1, 2, num[Rzhi%16]);
DisplayOneChar(1, 3, 'H');
DisplayOneChar(1, 6, num[Gzhi/16]);
DisplayOneChar(1, 7, num[Gzhi%16]);
DisplayOneChar(1, 8, 'H');
DisplayOneChar(1, 11,num[Bzhi/16]);
DisplayOneChar(1, 12,num[Bzhi%16]);
DisplayOneChar(1, 13,'H');
SendOneByte(Rzhi,Gzhi,Bzhi); //發(fā)送數(shù)據(jù)到上位機(jī)
delay600ms(); //每隔0.6秒測(cè)試一次顏色
}
}
=========================== 《 完 》 ==========================
薛 二 煒 于江蘇·無錫
2015 年 05 月 19 日
smhacker@126.com 轉(zhuǎn)載請(qǐng)注明出處