|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
TCS3200颜色传感器配套资料,含调试程序原理图,结构图& g' q' s* @$ }0 Q; @1 _: F
! k5 G3 Z9 c! W* ?# Y- C
% y: f4 J1 b5 x
2 d, u4 Y5 P' t$ ^& [ x8 y/ R% u6 G4 Z7 z
这次课程设计主要用的TCS3200颜色传感器,附件里面有传感器的原理,结构图,调试例程1 Z& ?; R# ]' H
" ]& g; e8 {4 aTCS3200颜色传感器简介:0 V _2 R% ^" B/ \, I
: g3 ^1 @' A% y: |" k# d
# J: U# m7 M* o' g8 eTCS3200颜色传感模块电路及实验电路图:. P' j0 B) k- e5 F; U
![]()
. f, V1 N# R# F( R: u( F- t0 L8 z
. B+ O z P( m" z+ L8 p9 Y 7 C5 W d( `0 o3 q, x! @
- N, P1 h. o: y P6 s! H
. _( |/ |, w% N9 e* H控制板是通用型的,可以控制语音模块 、超声波模块、AD模块等,如果只是颜色传感器用,AT24C01部分、按键部分可以不焊接;
6 P* F( b U( g/ C% `5 Y超声波控制板电路原理图:
5 R! d- \) c4 A# e $ u) e+ V! ~" B( F9 |
' \' ~/ H2 n; t: @6 B! S
51单片机源程序:
q1 X8 h2 l' X/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用
4 f4 g, L* E. y; J实现功能:对颜色传感器输出RGB
3 r- U0 O' `1 U2 o使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C517 L! H3 t5 }9 z3 n
晶振:12MHZ
! o4 ~ _9 V1 V2 S: j编译环境:Keil
/ K! L& T' L7 f9 J2 J9 ^. W) u作者:zhengzhongxign39*/
" h# B3 d5 ~/ D7 M3 I#include <reg52.h>
1 b7 O' r$ h5 C+ m1 o& l#define uchar unsigned char
1 |& P+ t4 {, v. @; I#define uint unsigned int
( {' T& h |; e//==============LCD1602接口连接方法=====================
/ c/ i$ P7 e) m( U9 A0 C9 a+ f/*-----------------------------------------------------
+ x0 W: w1 \ F |DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
# s& p7 G; ]7 h" s O% {; z9 V. q |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |+ Z3 l3 L& i8 [" I0 V& |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
: O. e: b+ v6 Y @% c( e |DB3-----P0.3 | DB7-----P0.7 |
9 r& v. p2 v" w" T2 Q/ E5 l6 C ---------------------------------------------------*/: D! |: Z; R& L+ c
//================================================*/
$ Q/ h$ i' I1 a5 J& [( e: h#define LCM_Data P0 //LCD1602数据接口
: e' b5 [! ]) @" L- U! V#define Busy 0x80 //用于检测LCM状态字中的Busy标识& f: z0 h7 j/ {) O+ A1 v- h
sbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚
2 j O0 J/ b7 R' B/ [sbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚
5 G! R5 e! C" c. T! usbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚
. g; G" c- T, H1 U' W5 E$ [1 Q
$ y9 n8 c+ y8 a8 H3 T4 n# w* O4 I% F5 l( H2 Z
//=================颜色传感模块连接=====================3 m" g) v0 E, c3 c# N* Y! b( b
/*-----------------------------------------------------
0 A6 U" s: |' @. \6 J1 I |EO-----GND/ u# P8 U: Q+ F+ C2 m6 M. o
|S0-----VCC | S2-----P2.0 | OUT-------P3.5 " d! m9 @8 u4 J; i2 v/ H% K
|S1-----VCC | S3-----P2.1 | + F) ~; j8 g9 ?. l; Q2 [' K
---------------------------------------------------*/) v6 O; {+ _* A
sbit tcs230_s2=P2^0;//TCS230 S2接单片机P2.0
4 n% H$ A) B$ l# Ysbit tcs230_s3=P2^1;//TCS230 S3接单片机P2.1
# d' I8 U9 ?, O% Vsbit tcs230_en=P3^0; //TCS230 EN(E0)接GND2 q6 X! D4 J4 m) e
//**************函数声明***************************************
; j& C# ^ |) N: l5 Fvoid WriteDataLCM (uchar WDLCM);//LCD模块写数据/ }# Q4 n5 T9 R3 D& e2 u
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令- u" Q: g5 f, o. d* e" } u6 u
uchar ReadStatusLCM(void);//读LCD模块的忙标
9 w0 o- |7 z, {void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
: U1 ]; K8 N7 W( q1 uvoid LCMInit(void);//LCD初始5 }7 Y. K5 ^# }6 V+ ^0 I9 Q
void DelayMs(uint Ms);//1MS基准延时程序2 m! q' U$ Z6 ]+ L+ T8 R
void baipingheng();//白平衡子程序$ S1 D# Z1 h! d- }
void celiang();//实际颜色程序* v5 `$ i/ h1 Z( R9 ?# H
uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子
4 K1 M0 y3 n1 B0 M" Q" Nuint rb,gb,bb;//RGB值
+ ?6 _2 g/ F! f+ o, R$ L7 Kuchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
9 H% O5 g! B! g//***********************主程序******************************
5 v/ x' P. h3 zmain() $ J; e0 t5 o4 K. ~
{ 6 R: p! [' F7 _
TMOD=0x51;//设定T0以工作方式1定时10毫秒
- _. I! Z {! v4 _& g+ t LCMInit();//LCD初始- D# N% f9 K7 a3 j" Y, m( J
baipingheng();//上电时先白平衡一次 d% Z. _1 `4 X0 [: j- X v- W/ t
while(1)$ K( ^1 F6 Q, e9 j) f/ p( Q0 J# `
{- u" r4 ?5 p; k' j1 X# J W' ]
celiang();//颜色测试" `4 H0 T1 E0 x, w
DisplayOneChar(0, 0,'R');//以十进制显示RGB中红色的分值: I/ R% w: j* p8 q) ? ^' s
DisplayOneChar(0, 1, rb/100+0x30); //显示百位数据4 H% n! `; o, m
DisplayOneChar(0, 2, rb/10%10+0x30);//显示十位数据2 i" ]1 P& \9 B& a
DisplayOneChar(0, 3, rb%10+0x30);//显示个位数据. |. ~- i9 F% F- Q& |
DisplayOneChar(0, 5,'G');//以十进制显示RGB中绿色的分值7 A0 K, p/ j, e6 u8 J& q5 u# x
DisplayOneChar(0, 6, gb/100+0x30); //显示百位数据
( w( w7 G9 K7 Z+ k# z/ l0 k' A DisplayOneChar(0, 7, gb/10%10+0x30);9 [, D: A/ l% p) t6 P: J) ~6 ^
DisplayOneChar(0, 8, gb%10+0x30);
3 S. h" D2 K1 ^8 H$ l& w& @4 D+ x DisplayOneChar(0, 10,'B');//以十进制显示RGB中蓝色的分值
( [2 e4 x: p, V# c% _. Q DisplayOneChar(0, 11, bb/100+0x30);
8 o Z# G* ]( [: d! ]7 I$ t1 n DisplayOneChar(0, 12, bb/10%10+0x30);( N! F9 _' Z% T7 | W: X
DisplayOneChar(0, 13, bb%10+0x30);
' m# F* A0 {2 V9 J! m //*****在LCD1602的第二行以16进制显示RGB*******************1 N- Y4 j2 E$ g9 U/ L2 \
DisplayOneChar(1, 1, tab1[rb/16]); " X* y$ W2 P# z! r
DisplayOneChar(1, 2, tab1[rb%16]);
+ `, z) \( j* Q. X8 _: e/ ^6 ] DisplayOneChar(1, 3, 'H');
6 u4 o, y* X) j$ y1 L3 t7 m1 h. X DisplayOneChar(1, 6, tab1[gb/16]);
& M1 [9 Q, c1 o: z DisplayOneChar(1, 7, tab1[rb%16]);9 t# }4 Y- a7 ?" g
DisplayOneChar(1, 8, 'H');
; M8 p2 N( E6 N' Q7 E& o* b6 p) } DisplayOneChar(1, 11,tab1[bb/16]);
- U b! I% I! m6 k DisplayOneChar(1, 12,tab1[bb%16]);
0 I8 I+ P7 b8 p/ B DisplayOneChar(1, 13,'H');
9 l! X8 E& p y$ l6 U7 S DelayMs(250);//每隔0.25秒测试一次颜色( x% i& w A5 w, [$ k
}
; J% c- R3 x4 I' N! D}
: w/ X# ~' K* _5 @! |+ Z/ U& B//******************************************************! t' T9 X5 `# f6 n: i% ^
//白平衡子程序, i% k7 }' f; x: ~" P4 }9 X
void celiang(); m; l, H' t/ Q7 I* _6 w# p1 i
{) I) X6 u9 H$ n7 M9 \ ~
//*********求R值************************************
; y) b7 m3 d, `+ I1 G% B5 R5 O TH0=(65536-10000)/256;3 B- e" l& {: W# n8 F, z
TL0=(65536-10000)%256;
- L3 ~( F& e( |9 W: C3 R" X TH1=0;. }0 f' T+ }9 b, o
TL1=0;
6 J$ g& I. T2 I; W tcs230_s2=0;
, A& r2 _% {( b9 m tcs230_s3=0;//选择红色滤光器) F2 N- x3 t' F) O; |
tcs230_en=0;5 c! w8 T3 {6 e7 Z% x# n
TR0=1;//10毫秒开始计时- ^- O; i I* n
TR1=1;//开始计数+ ?6 s! k9 @; D4 l8 l1 a
while(TF0==0);//等待定时器溢出7 @( }$ t0 ?. x' R2 \* ~: i
TF0=0;//清楚定时器0溢出标志- [5 z% C' H) H+ U7 N+ {* S
TR0=0;//关闭定时00 l& u; b6 Y7 @9 F8 H! r- c
TR1=0;
( f) W P; s$ Z+ f7 T4 ]; M @ rb=(unsigned long)(TH1*256+TL1)*255/ryz;% h# s3 q$ |0 W3 H) z9 R& J! _
if(rb>255)rb=255;//判断RGB值是否合法
J! P9 u7 X, X3 u* Y //***********求B值**************************************+ s r& t' C, X* H: S
TH0=(65536-10000)/256;
+ x& E$ x4 D- Y7 Z TL0=(65536-10000)%256;$ a) w- c3 [2 P$ a# O
TH1=0;! R) K b8 z; F0 f6 }5 z9 T3 b
TL1=0;
2 i' ^; k' c! a! i) h tcs230_s2=0;
[. [; R* Z1 ~5 b1 o. Q4 ~ tcs230_s3=1;//选择蓝色滤光器' Y+ K/ `$ D) r( ?/ o5 M
TR0=1;//10毫秒开始计时+ c! @9 v9 f0 X3 R/ w
TR1=1;//开始计数! C3 o- O4 Q' K5 }( B/ l
while(TF0==0);//等待定时器溢出
- p/ \2 }& F5 u, I# o) j TF0=0;//清楚定时器0溢出标志1 F; k8 g# ~7 V p
TR0=0;//关闭定时0& h3 L, ]6 b9 F: _: N
TR1=0;
" i3 V3 R' Y% j bb=(unsigned long)(TH1*256+TL1)*255/byz;
# J* i2 }3 b5 i: V if(bb>255)bb=255;//判断RGB值是否合法 4 e! p+ G7 J% e8 V
//***********求G值************************************** n" }% v: U7 @% a! D
TH0=(65536-10000)/256;
1 e& L+ C6 x* w* Q' p+ A TL0=(65536-10000)%256;
, @0 o s* M. l+ U TH1=0;
( A& U0 X1 q5 i9 n$ V TL1=0;9 d2 }5 a* ]; ?+ Z$ a# E% I
tcs230_s2=1;
2 w9 i4 j" i' z( p T tcs230_s3=1;//选择绿色滤光器" P$ P$ Z' K) s7 b8 }: R6 J8 h
TR0=1;//10毫秒开始计时 g9 @* e" _# G( O
TR1=1;//开始计数7 S E5 W# F1 D5 A
while(TF0==0);//等待定时器溢出& v4 f: R& B. |/ s0 F1 K1 J0 A
TF0=0;//清楚定时器0溢出标志
/ X( Z; D/ |5 f4 p TR0=0;//关闭定时0
) r) S$ `, M h TR1=0;6 R, h) P* ?) a
tcs230_en=1;8 k, N1 ~0 E2 e+ e
gb=(unsigned long)(TH1*256+TL1)*255/gyz;
7 k6 b$ H% A! V if(gb>255)gb=255;//判断RGB值是否合法
, n) J5 E( q3 H3 [2 F# V) I}% \/ Z" f6 {% Z# {& i7 v
//******************************************************
* v, [& n. W- B//白平衡子程序$ M' `2 C$ i2 `; Q; x
void baipingheng()
& ~; k6 g2 O! X5 y5 o4 W6 P: \{$ n( Y$ s u/ ]8 Z4 w
//**************求取红色因子***********************0 r4 N1 j* l: ~5 Q; \) ~$ y |
TH0=(65536-10000)/256;
5 b! o1 G3 a8 C, \. [* n/ r TL0=(65536-10000)%256;
% K5 E" `* o( G% a TH1=0;' C5 W a8 z i/ e4 |
TL1=0;
# u' h# s$ A+ f tcs230_s2=0;$ s( r2 W( k5 c
tcs230_s3=0;//选择红色滤光器& D& l" L! [, n7 U3 [5 U8 h1 J! j
tcs230_en=0;
2 a$ g2 D& r/ R2 O& ]$ \ G TR0=1;//10毫秒开始计时7 R) C2 q3 J8 j- C0 k: @3 a
TR1=1;//开始计数" C, }1 f* Z, D/ [5 D; e
while(TF0==0);//等待定时器溢出
; W# [0 V' U) U9 M: `- t' @6 p TF0=0;//清楚定时器0溢出标志8 l/ H d6 H; ~* ]9 ]$ y7 Q
TR0=0;//关闭定时0& Q" w; H4 L- O) n6 ~% }
TR1=0;
1 [" a6 g3 x4 \' a' Z; q: y8 J( Y ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)% D8 z" O9 E. I- k' d5 [1 x& r
//**************求取蓝色因子***********************& \6 K5 m4 Q! F" s$ \) Z) Z5 |$ b8 U
TH0=(65536-10000)/256;
7 L! A2 \& p0 E+ P, O6 M TL0=(65536-10000)%256;
/ z0 P8 i* D# p. x) t) ` TH1=0;# o3 ]4 p t& O8 I4 z$ ^
TL1=0;
: f& H' X8 w- F4 z tcs230_s2=0;
+ ~; [6 U& I4 ]4 \; a7 V4 K2 w tcs230_s3=1;//选择蓝色滤光器8 ~) q+ B" ?& D2 |/ g& Q. p9 x2 B$ ~
TR0=1;//10毫秒开始计时( f d! K3 P/ U3 t7 ^7 i! t0 ~
TR1=1;//开始计数
/ E% c/ n; @7 t* p( B while(TF0==0);//等待定时器溢出4 n2 }, V$ D) r, l9 `+ f
TF0=0;//清楚定时器0溢出标志) ?$ m0 a: s9 w& V1 N a" A2 L* j
TR0=0;//关闭定时0
9 q' t1 s0 K( m, z! z TR1=0;
1 y8 ?# D0 R5 a* u% p/ ? byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
+ v% Y3 k& W, J- M; | //**************求绿红色因子***********************
2 W# y4 ?$ a! x4 j4 H TH0=(65536-10000)/256;% b0 E2 A o* L4 ^5 \& f
TL0=(65536-10000)%256;
- O8 t5 \# X. E6 A6 s8 F6 a q/ c TH1=0;
z1 c0 e2 ] K, d+ B4 L( O) T TL1=0;
0 c& ]6 H; _9 J2 n+ x tcs230_s2=1;
; F, C$ D9 H) N3 h! E8 Z/ N) l3 G tcs230_s3=1;//选择绿色滤光器
4 ^# [0 S# E8 m3 o# |. g TR0=1;//10毫秒开始计时( L( M* o, D0 H4 _ A/ j
TR1=1;//开始计数
+ ^* N9 Z0 @; v while(TF0==0);//等待定时器溢出
9 n& j7 y9 K3 s4 H, y TF0=0;//清楚定时器0溢出标志
' x: N, F- `) K O9 \& @" \ TR0=0;//关闭定时0
) {$ z* x8 {% l9 k/ c. Q) X TR1=0;3 E/ C- }. q+ g) t1 K- n8 s7 r
tcs230_en=1;& {4 p2 P7 {0 m- P) l
gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)2 u. G1 I) K. @0 |& m& m
}
: K c. B# S8 r) l# r# M/*======================================================================$ a3 N# \. Y( i* h& V$ \
LCM初始化3 K/ d4 N$ i) V8 F% b$ r+ e+ \ t8 Z
% R+ d0 t# d# g6 I
' m1 F7 y1 y6 Z4 c3 m( g5 Q…………限于本文篇幅 余下代码请从论坛下载附件…………: s+ p# a7 n" U4 c- v
" R2 N; E- t3 c$ ^ a下载:! H) t6 @" {6 ^0 _, a: G3 G
6 Z3 Z+ R3 Q0 z+ F
& T2 s# l' l6 d1 u E |
|