|
顏色傳感器的使用方法及源程序
/*實現功能:對顏色傳感器輸出RGB
得出數據后可到www點59178點com/tools/sejie.asp 查詢數據是否正確
使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
晶振:12MHZ
編譯環境:Keil
作者:zhengzhongxign39*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//==============LCD1602接口連接方法=====================
/*-----------------------------------------------------
|DB0-----P2.0 | DB4-----P2.4 | RW-------P0.6 |
|DB1-----P2.1 | DB5-----P2.5 | RS-------P0.7 |
|DB2-----P2.2 | DB6-----P2.6 | E--------P0.5 |
|DB3-----P2.3 | DB7-----P2.7 |
---------------------------------------------------*/
//================================================*/
#define LCM_Data P0 //LCD1602數據接口
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
sbit LCM_RW = P0^6; //讀寫控制輸入端,LCD1602的第五腳
sbit LCM_RS = P0^7; //寄存器選擇輸入端,LCD1602的第四腳
sbit LCM_E = P0^5; //使能信號輸入端,LCD1602的第6腳
//=================顏色傳感模塊連接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC | S2-----P1.0 | OUT-------P3.5
|S1-----VCC | S3-----P1.1 |
---------------------------------------------------*/
sbit tcs230_s2=P1^0;//TCS230 S2接單片機P1.0
sbit tcs230_s3=P1^1;//TCS230 S3接單片機P1.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()
{
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秒測試一次顏色
}
}
//******************************************************
//白平衡子程序
void celiang()
{
//*********求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值是否合法
}
//******************************************************
//白平衡子程序
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;//選擇綠色濾光器
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初始化
=====================================這是部分程序。
|
評分
-
查看全部評分
|