|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
TCS3200颜色传感器配套资料,含调试程序原理图,结构图
; \- t3 N M" j/ j4 I* c. p
0 h1 |+ K4 \% ^3 \5 w: A4 ^: q$ H; F1 c4 [
. p$ N: {8 B2 c% P6 K4 E1 V* M
B4 O% n0 z) D
这次课程设计主要用的TCS3200颜色传感器,附件里面有传感器的原理,结构图,调试例程4 O- @5 R; z- T. X0 h" k
5 e& p# s6 r; N4 D6 R; J, ATCS3200颜色传感器简介:
* F0 P7 ^* H" j; {; d7 u1 D X; J* C5 Z' D0 n8 ~- d8 ~* w' ~
: ?; S/ a, @( T" \+ x: ^TCS3200颜色传感模块电路及实验电路图:# a9 x7 g; R. U- t8 M% Q
![]() * Y1 e! D4 ^2 w
% [: m& v0 y( j
6 m0 _: T4 }. u$ z5 t3 C3 Z; I. F, [# S, b0 a; B* ?
$ {( A) k# @) i4 F控制板是通用型的,可以控制语音模块 、超声波模块、AD模块等,如果只是颜色传感器用,AT24C01部分、按键部分可以不焊接;* n' [+ {3 }, S! f
超声波控制板电路原理图:) G" K$ |: k Z5 ~4 r
9 R/ w' l- H2 j4 @7 f* V
5 Q T6 ]8 F! {8 Q# [51单片机源程序:
) O' P; `, Z$ Z/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用8 K2 v! {( Q! ^" o1 m$ ^+ m
实现功能:对颜色传感器输出RGB
* M, d, u, v: L0 r1 c使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51$ n5 s+ V0 J c5 U Z' A6 n/ a ~, }
晶振:12MHZ1 ? ]3 j9 C9 ^
编译环境:Keil% |& D8 B0 b6 _; ^0 ?
作者:zhengzhongxign39*/. A m, T3 m8 l }9 {
#include <reg52.h>
% u. j, k/ L# n3 u3 { {) O#define uchar unsigned char/ J' e! z+ s; m# I5 a& C
#define uint unsigned int
4 Q9 X5 n; _7 t, e//==============LCD1602接口连接方法=====================8 o, p! v! p' {- X* h
/*-----------------------------------------------------
& |" |2 W& K6 ^6 l, K6 \ |DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |( Y6 G8 A, ?; G5 Q6 d- u
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |
r- h, J; P8 o! T) B. W8 c |DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |$ Y2 ^( T$ B6 ]
|DB3-----P0.3 | DB7-----P0.7 |
( |) W- M# c( U S+ X ---------------------------------------------------*/5 j5 ]+ }! M6 i- P+ i* Y
//================================================*/
- `! a* C9 D: d# O#define LCM_Data P0 //LCD1602数据接口 ^7 K f/ P; q$ H: ]" h4 q8 J
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
7 b7 a2 j! _, ~; l! Psbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚
& Z1 l, L3 H/ ^8 n' J- C9 usbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚/ J5 S6 m6 f/ G1 w' r
sbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚
& z! t( n2 y9 I+ b q
2 V+ e4 l' e( t. K6 e2 J/ J7 [6 p" |! ?! ~% y. K
//=================颜色传感模块连接=====================' j! B& _, V* m3 h3 Y2 Z+ B
/*-----------------------------------------------------
/ H' K& ~# h4 H; F0 \/ N H% A2 k |EO-----GND$ E" l; B6 m9 h( M
|S0-----VCC | S2-----P2.0 | OUT-------P3.5
2 @- X* k8 Y. z" T' o8 d |S1-----VCC | S3-----P2.1 | 3 Q0 e' x4 y _) u3 N* }3 k
---------------------------------------------------*/7 @# F+ d: r# R/ x: V& @0 K# i
sbit tcs230_s2=P2^0;//TCS230 S2接单片机P2.0
4 L! s j3 N/ b5 J) X \sbit tcs230_s3=P2^1;//TCS230 S3接单片机P2.15 A4 [! y/ n. J+ e5 P& [2 p8 M
sbit tcs230_en=P3^0; //TCS230 EN(E0)接GND7 z2 E# o. F! s+ K# L, u& V7 w
//**************函数声明***************************************; b: J' U" N: g& n
void WriteDataLCM (uchar WDLCM);//LCD模块写数据* Z4 m1 [- b# M4 g, X- H# y+ i
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
6 F( F8 O& o4 ?* h9 ^6 ~: Xuchar ReadStatusLCM(void);//读LCD模块的忙标% b5 @ t q3 z+ I* [3 M
void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符0 K$ |, L& r# w
void LCMInit(void);//LCD初始( g7 C" P" V2 l
void DelayMs(uint Ms);//1MS基准延时程序- T" t4 ?) D n" F; C
void baipingheng();//白平衡子程序
# Z8 N& Y0 R6 vvoid celiang();//实际颜色程序3 y1 ~+ v" j2 ]' }% r+ o
uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子- S# U+ N0 {3 c% a* h/ w0 A
uint rb,gb,bb;//RGB值
4 A' q/ q' G- B8 C! t/ K8 juchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
1 E6 r& {( D9 R) u' X//***********************主程序******************************
# Y9 N% `7 f0 [% Tmain() 1 D6 y; b/ l. h* r. \2 ~2 h
{ - N7 t* r' ?" J; m* S" W+ H, G
TMOD=0x51;//设定T0以工作方式1定时10毫秒5 S' k& N* m) X, K* u
LCMInit();//LCD初始) Z" w1 `6 r! ~1 P
baipingheng();//上电时先白平衡一次
* S3 s. m& x# ^ x6 B/ U% E. t' F while(1)9 A H, K* W; W2 C$ J# e, n
{
/ M& x3 e) ]# D% ~+ R! d+ @# b celiang();//颜色测试
2 ]( A% U% U% ]& J+ o2 Y2 a: r DisplayOneChar(0, 0,'R');//以十进制显示RGB中红色的分值
9 u+ H6 z2 W1 I8 } u DisplayOneChar(0, 1, rb/100+0x30); //显示百位数据
, I4 V+ u2 D5 ^ DisplayOneChar(0, 2, rb/10%10+0x30);//显示十位数据. X% C+ i/ o" w. V! ?
DisplayOneChar(0, 3, rb%10+0x30);//显示个位数据# Q4 m+ {- g/ L' y1 u1 ?# y
DisplayOneChar(0, 5,'G');//以十进制显示RGB中绿色的分值
9 p; ^, k* c* C0 I DisplayOneChar(0, 6, gb/100+0x30); //显示百位数据
2 q0 T9 m( s& D( Q2 h9 C DisplayOneChar(0, 7, gb/10%10+0x30);
7 h+ P& w9 i- A) J d4 ]5 } DisplayOneChar(0, 8, gb%10+0x30);
; Q. A6 M* H8 |/ S DisplayOneChar(0, 10,'B');//以十进制显示RGB中蓝色的分值
6 w6 H* S. e/ B+ X8 B% }. i* U( Z DisplayOneChar(0, 11, bb/100+0x30);& ~6 Z# h: M. `. b) R5 r2 m; E
DisplayOneChar(0, 12, bb/10%10+0x30);
" ]/ B+ W) N7 g8 E& }/ u+ V DisplayOneChar(0, 13, bb%10+0x30);1 r2 b& G1 Y7 g) g
//*****在LCD1602的第二行以16进制显示RGB******************* d3 X; e( t, M D" t p0 N( L
DisplayOneChar(1, 1, tab1[rb/16]); 4 N% l7 {; s ]
DisplayOneChar(1, 2, tab1[rb%16]);
' b8 A" T- H/ z9 { DisplayOneChar(1, 3, 'H');5 u6 e4 ~* w* S' ^
DisplayOneChar(1, 6, tab1[gb/16]); 6 P) k( |3 [+ h! C3 p
DisplayOneChar(1, 7, tab1[rb%16]);
j9 q2 B( _: t# W" E C" y DisplayOneChar(1, 8, 'H');
9 }. j4 g, n: R( ^) }7 O DisplayOneChar(1, 11,tab1[bb/16]);
- u3 n2 c9 ^9 Y- D+ p DisplayOneChar(1, 12,tab1[bb%16]);+ h: C5 ^' P5 P2 p' N
DisplayOneChar(1, 13,'H');
* \9 l' M: h% A" J( m; f! h# V DelayMs(250);//每隔0.25秒测试一次颜色5 q, O. |8 ^5 _1 e$ d. I: H$ Z
}; Z2 A3 z" F4 O! [0 q
}
* v) u; x9 A0 w" F0 J0 [//******************************************************# u" }4 \( Q% y! ]: L3 |
//白平衡子程序% |# i9 F5 ?( K- {8 D5 s; `
void celiang()
2 ~1 o' X4 k1 @. {7 ~{
- A! {" C6 S; a. w2 f3 R: k //*********求R值************************************5 x- X- t! N: M9 |2 u w; z
TH0=(65536-10000)/256;
; L6 y1 D+ i% C) C6 @ TL0=(65536-10000)%256;" i3 S( S9 P. E; o" A1 @: g
TH1=0;
9 r( b) V2 Z0 g. k5 i; v- ~ TL1=0;, a7 H% y2 g+ u# @. v5 G8 R6 } h4 c
tcs230_s2=0;, |0 y( b& p2 L# C$ l
tcs230_s3=0;//选择红色滤光器6 ]4 z! z+ Y9 z- Q1 k
tcs230_en=0;1 T$ \) G' ?% [. A( Q
TR0=1;//10毫秒开始计时
4 B- ^+ k. J( S: x6 F TR1=1;//开始计数
+ ?# k. W- ]$ M- ?' K6 Y2 X* ? while(TF0==0);//等待定时器溢出
: _0 e% }8 f; X8 _+ Y) x TF0=0;//清楚定时器0溢出标志) J& Z+ R1 Q0 r3 N6 f1 w! j9 h( _: x7 s
TR0=0;//关闭定时0+ @3 G1 m5 D) R- B/ S q- r
TR1=0;
7 c- s- S' [$ i- r( w P b. x1 j i rb=(unsigned long)(TH1*256+TL1)*255/ryz;- u! {/ i, Z5 g: G! s, C0 }1 ^
if(rb>255)rb=255;//判断RGB值是否合法
0 B+ j8 o! _, d$ f //***********求B值**************************************
: u$ t6 I9 n# s, h1 D; v5 ?" B TH0=(65536-10000)/256;/ J/ l7 v, h9 C- e( C$ g" @) s
TL0=(65536-10000)%256;
0 ?( q5 P+ S% C, u8 @ TH1=0;5 p. B1 p5 V& H1 p D# ]8 b& |3 F
TL1=0;$ L7 |; s, Z' l9 ^' j# [8 b6 _
tcs230_s2=0;' ?2 d) D8 z8 j
tcs230_s3=1;//选择蓝色滤光器
0 A0 ~- \5 R/ e& o B7 G TR0=1;//10毫秒开始计时6 ?! x2 M0 ~1 |. D5 }; h
TR1=1;//开始计数1 a. j; I4 C$ e. ]- r
while(TF0==0);//等待定时器溢出
5 g) S% t( W0 _ C ^7 r TF0=0;//清楚定时器0溢出标志2 ^5 y7 C( R4 p7 l# E+ E3 {5 M. U
TR0=0;//关闭定时0% y) A- f4 A6 a: h+ t7 B! f) ~( Y
TR1=0;% I: H D' ?' H3 a
bb=(unsigned long)(TH1*256+TL1)*255/byz;
) B9 x3 m4 j7 W* ^4 {( h0 L if(bb>255)bb=255;//判断RGB值是否合法 + Y! t5 Z4 p& u5 a5 t
//***********求G值************************************** 7 q8 Q" t) b# z K2 O b0 ^# k
TH0=(65536-10000)/256;0 g5 |/ G3 @6 L( n% ^7 x
TL0=(65536-10000)%256;% e8 q5 H) q9 Z6 r, w( |; G5 L
TH1=0;0 ^( V) y+ N; H! g$ P8 M+ I Z
TL1=0;* F: w P& e8 e. J0 m' F; T
tcs230_s2=1; g' |$ S) T/ O- E$ M8 |) O) A
tcs230_s3=1;//选择绿色滤光器
0 h/ y; n! ?$ _ TR0=1;//10毫秒开始计时; n$ L9 [, F7 {$ X& h l6 V
TR1=1;//开始计数" X D6 X+ ]! o6 p3 ~$ r
while(TF0==0);//等待定时器溢出( z: I+ M2 d3 W/ M
TF0=0;//清楚定时器0溢出标志
. d4 N# J+ [+ U TR0=0;//关闭定时0% B7 U! H+ @+ L: N: \; z9 t
TR1=0;1 S: A# d0 d( S
tcs230_en=1;5 n; X! l, r( S
gb=(unsigned long)(TH1*256+TL1)*255/gyz;
' v3 @5 H0 y( T. F- I- b if(gb>255)gb=255;//判断RGB值是否合法 M( e- Z6 Y) Q& Z0 L7 u0 t, X
}
: q' D- `6 P; S; F1 x//******************************************************
* H2 T/ O( n a1 S9 V//白平衡子程序
* |1 n/ B, L8 nvoid baipingheng()
, r9 Y6 k% I! u: Q{- G' w5 }! h9 T# Z8 p( U) F1 b
//**************求取红色因子***********************
# N7 u6 z* M. r% d# [! W$ T" f TH0=(65536-10000)/256;
0 C( I; k j: g* _. c TL0=(65536-10000)%256;
9 t$ P% d, t+ y2 H TH1=0;3 f2 z8 e: x& [1 `% @ h% V, n% T
TL1=0;
+ H6 S3 v5 W' Z! m) J( q$ }' |' m tcs230_s2=0; ]$ v6 A1 y+ g% @4 [7 A# P
tcs230_s3=0;//选择红色滤光器
" T2 `2 `$ r' f% v5 | tcs230_en=0;7 B6 g2 f( X) ~0 r5 l0 R Q1 ^
TR0=1;//10毫秒开始计时
+ K$ ^: A3 w1 a' } TR1=1;//开始计数5 P' E- O0 S0 g0 \8 H& o5 t
while(TF0==0);//等待定时器溢出
( \1 o6 e* V& O, I- r TF0=0;//清楚定时器0溢出标志+ `& b2 f# \7 R
TR0=0;//关闭定时0/ h" t @% R& x) @
TR1=0;+ {. l1 B/ x$ u: y" |. N
ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)/ k$ r. q, t% u7 G) q$ G
//**************求取蓝色因子***********************7 V4 B: H* I- Q/ m! E% a
TH0=(65536-10000)/256;
5 m% @' n/ N1 T+ j7 Q. F TL0=(65536-10000)%256;
7 B# k. ^5 A4 o, {% ?4 Y3 @, _ TH1=0;
9 c0 O1 ]9 }: s4 q$ B8 Q TL1=0;
9 a! m0 \/ \4 q) j tcs230_s2=0;
$ P8 O+ K2 Z4 e! ? tcs230_s3=1;//选择蓝色滤光器9 B& o* x2 w7 c: ~2 o! w/ d
TR0=1;//10毫秒开始计时
( G* K f0 ?# q( A+ P TR1=1;//开始计数
4 H2 e0 L8 R' G8 a* u6 @ S- R) L while(TF0==0);//等待定时器溢出. \8 I) A- O, h2 F) v
TF0=0;//清楚定时器0溢出标志% V5 @% H) Y, y+ W' C% y
TR0=0;//关闭定时04 N; ?& t0 S% |! X4 q9 C
TR1=0;6 V3 s9 s) ^ L2 W1 w- z& ~* r
byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)4 ]! E! {3 s; y/ i7 d. O" v2 c. I
//**************求绿红色因子***********************
4 W+ Q9 N# H g" o% I8 f7 { TH0=(65536-10000)/256;. Y* C/ Y* h+ F/ j0 @4 L
TL0=(65536-10000)%256;
, S. f3 p7 Z5 M TH1=0;
* c; _5 H" k7 N$ W/ K& U TL1=0;4 s+ o8 @6 A) C0 U
tcs230_s2=1;( F! z( f4 ]4 G F* u! ?% R
tcs230_s3=1;//选择绿色滤光器
+ T; |& A, d$ @8 |5 q+ Z TR0=1;//10毫秒开始计时
) ~$ |0 \, A+ M# P8 z/ e8 T TR1=1;//开始计数
$ m" U' U: w3 c7 x" s1 a8 H8 s G while(TF0==0);//等待定时器溢出
; A$ o9 K: @ e/ \ TF0=0;//清楚定时器0溢出标志& X3 e3 o5 S1 N9 Q3 g
TR0=0;//关闭定时0
5 O3 P3 i) M/ ]8 b TR1=0;8 ?8 l5 ^ ?, s5 ^2 p
tcs230_en=1;$ K3 U& `5 l4 Z
gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1). ^* I) v8 [/ d( }7 p% z
}
3 T" l7 F o1 D% _% `/*======================================================================
e: _6 n. S( C. i0 T" W LCM初始化
" `- Z/ B4 d$ C' U6 H; R5 y
1 L! P% Z4 m! e$ F& a( `/ }3 S
, n/ \/ Z" a% X) C5 l6 ~5 c…………限于本文篇幅 余下代码请从论坛下载附件…………
K- F$ X- \4 g2 J2 i' o0 H/ u6 k* y
下载:1 t r% ]- U1 x
+ T0 [8 \1 X6 E& l
' W& `/ P3 e2 A3 V, y |
|