1、參考網上程序或者模塊提供的程序
2、仔細參讀datasheet,尤其研究時序以及邏輯功能的實現
3、多動腦筋思考,學會調試程序,多百度Google。
/*模塊的使用方法:把板距離白紙2CM處開機,使輸出的數據位FFFFFFF(白平衡),接下來就可以正常使用實現功能:對顏色傳感器輸出RGB
使用芯片:AT89S52?或者?STC89C52?或AT89S51?STC89C51
晶振:12MHZ
編譯環境:Keil
作者:zhengzhongxign39*/
#include?<reg52.h>
#define?uchar?unsigned?char
#define?uint?unsigned?int
//==============LCD1602接口連接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0?|?DB4-----P0.4?|?RW-------P2.3|
|DB1-----P0.1?|?DB5-----P0.5?|?RS-------P2.4|
|DB2-----P0.2?|?DB6-----P0.6?|?E--------P2.2|
|DB3-----P0.3?|?DB7-----P0.7?|?
---------------------------------------------------*/
//================================================*/?
#define?LCM_Data?P0//LCD1602數據接口
#define?Busy?0x80//用於檢測LCM狀態字中的Busy標識
sbitLCM_RW?=?P2^3;?//讀寫控制輸入端,LCD1602的第五腳
sbitLCM_RS?=?P2^4;?//寄存器選擇輸入端,LCD1602的第四腳
sbitLCM_E?=?P2^2;?//使能信號輸入端,LCD1602的第6腳
//=================顏色傳感模塊連接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC?|?S2-----P2.0?|?OUT-------P3.5?
|S1-----VCC?|?S3-----P2.1?|?
---------------------------------------------------*/sbittcs230_s2=P2^0;//TCS230?S2接單片機P2.0
sbittcs230_s3=P2^1;//TCS230?S3接單片機P2.1
sbittcs230_en=P3^0;?//TCS230?EN(E0)接GND
//**************函數聲明***************************************
voidWriteDataLCM(uchar?WDLCM);//LCD模塊寫數據
voidWriteCommandLCM(uchar?WCLCM,BuysC);?//LCD模塊寫指令
ucharReadStatusLCM(void);//讀LCD模塊的忙標
voidDisplayOneChar(uchar?X,uchar?Y,uchar?ASCII);//在第X+1行的第Y+1位置顯示壹個字符
voidLCMInit(void);//LCD初始
voidDelayMs(uint?Ms);//1MS基準延時程序
voidbaipingheng();//白平衡子程序
voidceliang();//實際顏色程序
uintryz,gyz,byz;//分別定義紅色因子?綠色因子?藍色因子
uintrb,gb,bb;//RGB值
uchartab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//***********************主程序******************************
main()
{
TMOD=0x51;//設定T0以工作方式1定時10毫秒
LCMInit();//LCD初始
baipingheng();//上電時先白平衡壹次
while(1)
{
celiang();//顏色測試
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);
//*****在LCD1602的第二行以16進制顯示RGB*******************
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秒測試壹次顏色
}
}?
//******************************************************
//白平衡子程序
voidceliang()
{
//*********求R值************************************ 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值是否合法 //***********求B值************************************** 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值是否合法? //***********求G值************************************** 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值是否合法?}
//******************************************************
//白平衡子程序
voidbaipingheng()
{
//**************求取紅色因子*********************** 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;//選擇綠色濾光器 TR0=1;//10毫秒開始計時 TR1=1;//開始計數 while(TF0==0);//等待定時器溢出 TF0=0;//清楚定時器0溢出標誌 TR0=0;//關閉定時0 TR1=0; tcs230_en=1; gyz=TH1*256+TL1;//其實這裏的比例因子應該為255/(TH1*256+TL1)}
/*======================================================================
LCM初始化其他程序網上自己找找參照