|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
TCS3200颜色传感器配套资料,含调试程序原理图,结构图8 W6 p w/ x2 M( i K+ ~2 }
4 B; P' P/ h' ]' J9 }+ M8 k
" Q% _+ O7 ? s7 Y' w
- L5 k) T- K- K& L( L$ c7 Z( f! ?5 M' b
这次课程设计主要用的TCS3200颜色传感器,附件里面有传感器的原理,结构图,调试例程3 s* F1 i& p0 o+ D) D' m
8 E7 ?8 T: N+ d) T0 }TCS3200颜色传感器简介:
$ _3 o2 ?0 i S+ O, L5 x% ?; y3 ~! g% ], x. F( E) e
+ _; v0 k( H5 b6 ~
TCS3200颜色传感模块电路及实验电路图:
+ B/ U5 h9 S1 g4 k![]() 2 W+ T/ g% D. O8 G$ J& g
1 }5 H" a5 l, _7 C5 g) S6 c) }
+ h7 ?/ b% S& D' @+ l5 ^0 \4 O2 W4 a4 e( _# B \
1 J# R3 ~' g! G( {# l, Y5 k控制板是通用型的,可以控制语音模块 、超声波模块、AD模块等,如果只是颜色传感器用,AT24C01部分、按键部分可以不焊接;) E9 V9 L9 V' g$ u- S+ `! }
超声波控制板电路原理图:
# H9 \7 \3 }, b5 ^% \7 y2 @" d / }7 s* G9 y$ }) ^
5 V0 W) s# I6 E0 V( N$ e: C" V51单片机源程序:
6 Q4 s2 r3 p8 g: [# [4 c/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用
, Z) r& L' z& j3 ]$ g( g实现功能:对颜色传感器输出RGB
! a7 T. r8 ]" B# [使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
8 _' n7 p' p6 r" B$ P晶振:12MHZ( H# U2 {8 ~0 d# U
编译环境:Keil1 D N% h/ U2 ~7 ]
作者:zhengzhongxign39*/
: q2 A( Y! O1 p: X#include <reg52.h>; \# {+ Y4 }$ c
#define uchar unsigned char
4 v2 S# `/ W: a9 ^8 d) G#define uint unsigned int* o7 w; ]6 _7 l1 |
//==============LCD1602接口连接方法=====================5 X; p% @& d0 \; } g# }/ O
/*-----------------------------------------------------/ R1 n: P" @+ Z/ n% e4 W( }
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |# ]8 l! Y9 y% w
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |4 l3 w) G# n7 P* H5 \( i3 P3 S0 Z
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |7 J5 l, s! o) T3 e$ e1 b( y9 j; [
|DB3-----P0.3 | DB7-----P0.7 | 7 I/ U3 ^! E* F: R* T- D
---------------------------------------------------*/. o' U5 r" {1 u6 ^$ H
//================================================*/ ; g; e, q) M- u0 X- E
#define LCM_Data P0 //LCD1602数据接口
0 z$ V% O& R3 p K! }4 w: I#define Busy 0x80 //用于检测LCM状态字中的Busy标识
7 Z4 t; g6 \& Y1 j% S9 lsbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚
1 D# v9 Z' k% L" bsbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚9 [" m4 O& F' Y r! i1 I1 r+ @- e3 C. \
sbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚; K3 m B, |; b
( x! M- S2 J, \5 j% R6 f, P$ O+ q: K
6 m/ H4 n1 G2 a! Q1 Z2 L
//=================颜色传感模块连接=====================- r' z+ M# F5 J, X x
/*-----------------------------------------------------) m1 [# B: M( G4 [2 q
|EO-----GND; A/ t/ u" T) y! X7 _/ z3 S
|S0-----VCC | S2-----P2.0 | OUT-------P3.5 0 N; F* u& L: j1 `; Y
|S1-----VCC | S3-----P2.1 |
0 U7 r9 v* V! B7 g$ b ---------------------------------------------------*/) }* b1 e# ]5 t& G8 b7 J: \
sbit tcs230_s2=P2^0;//TCS230 S2接单片机P2.0) i V9 ?7 z6 u5 q2 K' E
sbit tcs230_s3=P2^1;//TCS230 S3接单片机P2.1
4 p9 B2 A4 P3 @) c9 x8 e5 ssbit tcs230_en=P3^0; //TCS230 EN(E0)接GND( B6 B- i2 t! t/ }/ H+ l
//**************函数声明***************************************$ n8 H1 E- ~& Z( Z( [
void WriteDataLCM (uchar WDLCM);//LCD模块写数据
- T: R, r' d! p" M+ mvoid WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
' @3 |+ C/ ?6 J/ P6 m0 [uchar ReadStatusLCM(void);//读LCD模块的忙标
6 J! ^- y' o1 N2 e$ M1 k6 t1 tvoid DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
* Z# X, ?* \4 o9 q! W: c2 P/ B% svoid LCMInit(void);//LCD初始# ^6 }% ^- J3 o/ w* J
void DelayMs(uint Ms);//1MS基准延时程序( k9 m+ {" V8 A+ P& B8 |, L
void baipingheng();//白平衡子程序
/ t8 Z3 {0 ]5 ?# Jvoid celiang();//实际颜色程序5 q4 U! I& I$ T) @: g/ x
uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子9 r1 x3 u' |* G- W9 b, x# I# d
uint rb,gb,bb;//RGB值
1 a A) C9 X B9 m7 Q5 _- c/ J. ruchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};) z% A, m" E1 \& @
//***********************主程序******************************$ s. `: x k+ C) ]% T; G
main()
; ?9 u3 J1 h4 [. j4 ^1 q2 Z/ \0 O{
/ Y; q' Y- c8 x1 t+ m TMOD=0x51;//设定T0以工作方式1定时10毫秒
: O4 ?" }) D$ D3 _# w5 C* f5 a LCMInit();//LCD初始
/ W$ ?; @5 [; Z& ]+ Z/ U/ M baipingheng();//上电时先白平衡一次
$ j1 ]5 o$ H4 U6 L3 S$ _ while(1)+ M0 m) t' ~* J/ Y2 E1 e' J1 e
{1 E& C# U- C% ~
celiang();//颜色测试
6 x- E* s+ O% {0 y, l/ l' n DisplayOneChar(0, 0,'R');//以十进制显示RGB中红色的分值
# o( q: Y1 m" d9 u& m DisplayOneChar(0, 1, rb/100+0x30); //显示百位数据6 J! H" Q9 }& u
DisplayOneChar(0, 2, rb/10%10+0x30);//显示十位数据
g7 ~7 }7 z8 ?2 p; U+ D DisplayOneChar(0, 3, rb%10+0x30);//显示个位数据
4 r( T {4 P( a% Z4 [+ A4 e DisplayOneChar(0, 5,'G');//以十进制显示RGB中绿色的分值: y# @- d5 l- m8 t( D/ {; K
DisplayOneChar(0, 6, gb/100+0x30); //显示百位数据6 @6 ]! e9 A9 ]1 J
DisplayOneChar(0, 7, gb/10%10+0x30);, T+ A1 K5 m# s$ O8 C" \% g4 M9 T. r
DisplayOneChar(0, 8, gb%10+0x30);
7 q- f1 F, n5 B* w8 a0 ] DisplayOneChar(0, 10,'B');//以十进制显示RGB中蓝色的分值
( E5 F7 v2 Y9 N3 v. j* B! B DisplayOneChar(0, 11, bb/100+0x30);& G7 l( j$ L: f/ a5 E& A
DisplayOneChar(0, 12, bb/10%10+0x30);
1 v. Q, ?, A# F6 J7 y' t U DisplayOneChar(0, 13, bb%10+0x30);
8 J1 a% ]: N! h& R0 { //*****在LCD1602的第二行以16进制显示RGB*******************
1 @ o9 W5 S0 K. M* P j DisplayOneChar(1, 1, tab1[rb/16]); 5 g+ F5 U7 ^5 g; h
DisplayOneChar(1, 2, tab1[rb%16]);
- W! f t& a/ } DisplayOneChar(1, 3, 'H');
- P( e& N8 q! y5 }7 h8 }5 @" @9 w4 g DisplayOneChar(1, 6, tab1[gb/16]); 2 f0 ^+ y" }' q) E# r% I: O
DisplayOneChar(1, 7, tab1[rb%16]);3 j7 d! ?& H" A' D- @' T
DisplayOneChar(1, 8, 'H');0 i3 J# h. ]8 m7 ?/ n+ \" K* `
DisplayOneChar(1, 11,tab1[bb/16]);
. y: R8 z2 M7 A/ }& L DisplayOneChar(1, 12,tab1[bb%16]);/ N! ^8 {/ ?6 ?! R- H" ^, H; o
DisplayOneChar(1, 13,'H');, U& ]0 X# _$ [4 e, a7 c C
DelayMs(250);//每隔0.25秒测试一次颜色& c! E% m$ |+ e9 g: M& n
}
8 f* f4 t& C1 P @} 7 k* p' J" d+ D- B" m0 `7 _
//******************************************************
$ ?+ I6 C% J" N8 [//白平衡子程序
9 i4 n; Q$ V# t) cvoid celiang()7 i! P6 S) d1 F) w: v
{4 T8 R$ C2 E+ p( h1 E3 I& K) p
//*********求R值************************************
! U* x" e/ C+ c1 Q TH0=(65536-10000)/256;+ o/ G+ T) J5 U1 `: F9 W$ S8 \; a Q
TL0=(65536-10000)%256;
; \2 o( K) f. g TH1=0;
' c$ t! \8 k* x TL1=0;
2 D- `# k! z* @5 L( |. u: \: l+ D/ _ tcs230_s2=0;& z$ |, k" [5 e" x( H
tcs230_s3=0;//选择红色滤光器! D& Y. F/ c e; G3 Y7 j
tcs230_en=0;
* K8 [7 T- p7 p2 p# C' c TR0=1;//10毫秒开始计时
' I9 L% j8 Z3 N% L5 Y' U TR1=1;//开始计数3 E+ F) E3 S7 v! Z* _8 F
while(TF0==0);//等待定时器溢出; M3 c' u, I* b
TF0=0;//清楚定时器0溢出标志2 E0 S5 `8 u5 Y' s7 H; j& g$ g
TR0=0;//关闭定时01 ]8 H5 R, Z- k
TR1=0;
* n/ p& Z5 ~2 e9 n/ ]6 e3 R rb=(unsigned long)(TH1*256+TL1)*255/ryz;
" R& b. \3 W8 Q. [2 I if(rb>255)rb=255;//判断RGB值是否合法0 W2 ~8 W( P1 }& H% ^3 C
//***********求B值************************************** A% K5 G n% O5 W1 `/ Y
TH0=(65536-10000)/256;# d2 v6 L6 H. k
TL0=(65536-10000)%256;2 U4 i* I6 T2 @% A/ s* i
TH1=0;( ~* K/ j1 D/ i6 s% C/ y
TL1=0; G7 I4 s) O# r9 j, v
tcs230_s2=0;5 B0 t8 q0 p$ L" T4 P, ?
tcs230_s3=1;//选择蓝色滤光器 K+ ?4 T1 Q4 H( @
TR0=1;//10毫秒开始计时
6 k1 J# }4 _- K8 p* H, \) V4 h TR1=1;//开始计数
+ s( m# t- Z, s4 j% b while(TF0==0);//等待定时器溢出. N3 {5 m0 `! h7 ?& H
TF0=0;//清楚定时器0溢出标志
* I& c# H/ d$ `6 _* U, L7 V TR0=0;//关闭定时0$ n0 X6 ^. Y/ i
TR1=0;6 R8 V4 Y, l0 C
bb=(unsigned long)(TH1*256+TL1)*255/byz;
8 V: {+ ]' e n1 ^' S; D5 a* \) A( } if(bb>255)bb=255;//判断RGB值是否合法
1 v" c1 `9 S# }9 V3 S, o //***********求G值**************************************
; c+ D: j- i8 r: X$ @9 c TH0=(65536-10000)/256;2 D i4 F1 l# f5 e4 i, l J
TL0=(65536-10000)%256;: z. H( L% o/ b
TH1=0;
% c! A% H" |+ J( {3 r. c" F1 ~* T TL1=0;
* p9 L& o$ `- F( ?7 a- o: f, D. f+ }3 t tcs230_s2=1;
# c' X+ a) F- p! f, S4 E tcs230_s3=1;//选择绿色滤光器( K- H8 u$ a. q6 A
TR0=1;//10毫秒开始计时* W3 Z( z( P" k8 Q
TR1=1;//开始计数/ c$ ^6 A' K. g/ |* d" v( H& b
while(TF0==0);//等待定时器溢出
) M. m- N& p4 D; }7 l& W" M. v TF0=0;//清楚定时器0溢出标志) D' ~/ u( ?8 ]; n- F- z' s
TR0=0;//关闭定时0
8 v3 z C& ~, V* u ?- g9 y TR1=0;
+ ?7 P- v1 |+ }" W) I- `& x tcs230_en=1;
, h( |5 y3 ^2 ~+ t2 r gb=(unsigned long)(TH1*256+TL1)*255/gyz;
5 W% a/ G, ?% Z7 s! @1 C/ X if(gb>255)gb=255;//判断RGB值是否合法 + y n! E* k9 b: _% P
}
$ x0 R9 ?0 @: Z! l//******************************************************- T9 D: x1 [5 E% y5 o) J
//白平衡子程序* B( c' }6 x- K1 Y6 i) ]& k+ Q2 K
void baipingheng(), m3 @1 {- l6 B @, R: w
{
) M" {, K1 _2 i# `" q3 S //**************求取红色因子***********************6 E# X2 y. u: L. o! Q
TH0=(65536-10000)/256;
5 }! {, I, [" K) I* Y' W/ |6 e TL0=(65536-10000)%256;
2 t3 i5 c5 R) q5 c1 @2 |, v. V TH1=0;6 D, P; v D9 X! q/ u. o2 q# ]: k
TL1=0;
6 b* }- _) Q; p5 u tcs230_s2=0;
# _' d' B6 C' R( {3 O! u tcs230_s3=0;//选择红色滤光器
2 L& k% ]& G8 G, s2 O. N tcs230_en=0;2 x4 E, [5 v( M3 R) V. i
TR0=1;//10毫秒开始计时
: _9 ], q+ L/ |. `" C0 p! b* q TR1=1;//开始计数
' ? `5 Z, z" V$ [! {5 } while(TF0==0);//等待定时器溢出* e8 N0 S* J' A. v4 [, A7 f
TF0=0;//清楚定时器0溢出标志; B4 ?8 E0 ~# b& H+ i
TR0=0;//关闭定时0
0 |1 s5 c9 @/ ]! X; f6 Y1 ]$ s TR1=0;+ y) }. E$ m& g2 e; \' E; S
ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1); {. b2 n* F% R2 e( d5 P* p
//**************求取蓝色因子***********************9 |, Q- f# \6 u0 S
TH0=(65536-10000)/256;' r0 t6 z8 z6 c( y- P
TL0=(65536-10000)%256;
3 n! A( h' f9 _ TH1=0;
, I" ^6 r# Q5 o1 a: p TL1=0;$ i4 A* q- Z% j7 @( B$ x
tcs230_s2=0;
! v# A4 B4 j. e, A tcs230_s3=1;//选择蓝色滤光器$ g$ D9 E$ D$ I2 [4 ?
TR0=1;//10毫秒开始计时6 [4 d7 e" O" ]% R# P* ]
TR1=1;//开始计数
% |7 C& X3 W/ [7 s& q) ?+ C while(TF0==0);//等待定时器溢出
. N" K/ n4 Q4 h) x1 n! W- v p TF0=0;//清楚定时器0溢出标志
0 {3 Q6 O: p4 v4 Y( y TR0=0;//关闭定时00 R2 p8 c3 _* \ o2 v% y
TR1=0;+ ?0 x9 N: ?% f6 Z, |
byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1): i" Z# j |* m0 V% L i# |$ I K
//**************求绿红色因子***********************
" R. z$ V a( f0 G. Y TH0=(65536-10000)/256;3 l Z. ~* W4 ?6 j; Q, y& }
TL0=(65536-10000)%256;
$ l# C* X" u" w# Z! z, ~ TH1=0;; c/ a' i4 ^( X" p4 F- x0 x; H W
TL1=0;7 j6 t& i+ f( K5 E0 p
tcs230_s2=1;
' P6 g; |0 J5 s2 @# S, Q, d tcs230_s3=1;//选择绿色滤光器
2 p! {$ X5 [. E! J" v TR0=1;//10毫秒开始计时
" G* n5 K+ M- [9 n: p; H$ G TR1=1;//开始计数- @$ R7 n( l! b7 t! T* i
while(TF0==0);//等待定时器溢出# E. ]( o# ?: Z; c u: Q2 }/ _
TF0=0;//清楚定时器0溢出标志
& g: R/ D: [. e. q' ?6 j0 h TR0=0;//关闭定时0
6 P4 v( y) f( \' s5 J* u TR1=0;% O8 V% Y6 G3 s' u- \
tcs230_en=1;1 {: X/ I v% ~( L7 m* G
gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
" I" B$ t3 f3 E2 `2 d* c. O, C}' B; f. T7 a# N* A
/*======================================================================
; b$ a; j+ ?# x5 D6 o* b! ] LCM初始化% ?1 t, H$ m! N0 C. h7 N# k4 M
' q2 d" f( d' r( Q' E, O( L
8 u; A% C; B% @0 P" e6 z( e8 Y( b7 i0 I' b…………限于本文篇幅 余下代码请从论坛下载附件…………
, d0 D9 h" F9 M. a! C, Q- p$ F# D V: o9 \/ B1 V/ A# M
下载:' M. G- `4 C$ m- t( a
0 ]6 l. z+ P3 R
! Q9 U- ~6 M' G# D
|
|