當前位置:編程學習大全網 - 編程語言 - 用 stc12c5a60s2單片機控制顏色傳感器tcs3200的程序,我做得不知為什麽識別不了,

用 stc12c5a60s2單片機控制顏色傳感器tcs3200的程序,我做得不知為什麽識別不了,

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初始化

其他程序網上自己找找參照

  • 上一篇:設計感簡歷模板——如何制作壹份設計感簡歷Zhihu
  • 下一篇:求pascal語言編程中的書上不太常見的但程序中會出現的函數。
  • copyright 2024編程學習大全網