AT89C51单片机IO的最大允许输入电压

AT89C51单片机IO的最大允许输入电压,第1张

AT89C51电源电压VCC和封装有很大关系,大封装VCC=5V,小封装VCC=33V

输入低电压(VIL)Input low voltage指IO口通过软件设置低电平时,输入电压范围。由芯片手册得知:VIL=–05 V到02 VCC–01V,当VCC=5V   输入电压-05V到09V,如图所示,此时场管V2导通,输入电压过低会导致V2寄生二极管导通而损坏,输入电压过大会时流经V2的电流过大而损坏。

输入高电压(VIH)Input high voltage指IO口通过软件设置高电平时,输入电压范围。由芯片手册得知:VHI=02 VCC+09V到 VCC+05V,当VCC=5V,输入电压19到55V,也就是普通IO口>19V就可判断为高电平,当大于55V,由于V2截止,V2有击穿可能。即使输入加了限流电阻,仍改变不了V2击穿的命运,顶多不至于应击穿而损坏。

结果分析:他可能设计时可能用的大封装单片机,即使用的小封装也不会顺坏单片机,TCS230输出电流有限,最多使采集性号偶发失真。

 第一步,认识器件:TCS230是TAOS公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器,TCS230的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其他逻辑电路相连接,由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单,图1是TCS230的引脚和功能框图。

第二步,理解电路连接:下面简要介绍TCS230芯片各个引脚的功能及它的一些组合选项。

S0、S1用于选择输出比例因子或电源关断模式;S2、S3用于选择滤波器的类型;OE反是频率输出使能引脚,可以控制输出的状态,当有多个芯片引脚共用微处理器的输出引脚时,也可以作为片选信号,OUT是频率输出引脚,GND是芯片的接地引脚,VCC为芯片提供工作电压,表1是S0、S1及S2、S3的可用组合。

第三步,结合电路接口理解检测颜色的工作原理

测试RGB颜色:1)、依次选通三颜色的滤波器,然后对TCS230的输出脉冲依次进行计数。当计数到255时停止计数,分别计算每个通道所用的时间,这些时间对应于实际测试时TCS230每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R、G和B的值。2)、设置定时器为一固定时间 (例如10ms),然后选通三种颜色的滤波器,计算这段时间内TCS230的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,室外同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G和B的值。

  4 第四步,参考例程(非原创)

//

#include <reg52h>

#define uchar unsigned char

#define uint  unsigned  int

uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //所需的段的位码

uchar wei[5]={0Xf7,0XEf,0XDf,0XBf,0X7f};                        //位的控制端

uint z,x,c,v,b,n,date; //定义数据类型

uint dispcount=0; //中断计数

uint lck=0;   //定时器计数

uint disp=0;  //频率值

/

延时函数

/

void delay(uchar t) {

uchar i,j;

for(i=0;i<t;i++)    {

   for(j=13;j>0;j--);   {    }

 } }

/              

数码管动态扫描

/

void xianshi()

{

/数据转换/

后面参考文库内容

>

1、参考网上程序或者模块提供的程序

2、仔细参读datasheet,尤其研究时序以及逻辑功能的实现

3、多动脑筋思考,学会调试程序,多百度Google。

/模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用
实现功能:对颜色传感器输出RGB
使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
晶振:12MHZ
编译环境:Keil
作者:zhengzhongxign39/
#include <reg52h>
#define uchar unsigned char
#define uint  unsigned int
//==============LCD1602接口连接方法=====================
/-----------------------------------------------------
       |DB0-----P00 | DB4-----P04 | RW-------P23    |
       |DB1-----P01 | DB5-----P05 | RS-------P24    |
       |DB2-----P02 | DB6-----P06 | E--------P22    |
       |DB3-----P03 | DB7-----P07 | 
    ---------------------------------------------------/
//================================================/              
#define LCM_Data     P0    //LCD1602数据接口
#define Busy         0x80   //用于检测LCM状态字中的Busy标识
sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚
sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚
sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚
//=================颜色传感模块连接=====================
/-----------------------------------------------------
       |EO-----GND
       |S0-----VCC | S2-----P20 | OUT-------P35 
       |S1-----VCC | S3-----P21 | 
  ---------------------------------------------------/
sbit    tcs230_s2=P2^0;//TCS230 S2接单片机P20
sbit    tcs230_s3=P2^1;//TCS230 S3接单片机P21
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);//每隔025秒测试一次颜色
   }

//
//白平衡子程序
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)(TH1256+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)(TH1256+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)(TH1256+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=TH1256+TL1;//其实这里的比例因子应该为255/(TH1256+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=TH1256+TL1;//其实这里的比例因子应该为255/(TH1256+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=TH1256+TL1;//其实这里的比例因子应该为255/(TH1256+TL1)
}
/======================================================================
 LCM初始化
其他程序网上自己找找参照

我是提问者:最高文明
/=============================================================================
FileName:TSL230c
Resouce Descption:
S0:pc0;
S1:pc1;
S2:pc2;
S3:pc3;
OE:Pc5,LOW->Enable,High->Disable;
Out:PD5;T1
Time1:clk计数
time2:1s计时 F=clk/1s
=============================================================================/
#include "includesh"
unsigned char FrequencyMode = F_100_100;//TCS频率输出模式
unsigned char PhotoDiodeMode = PH_CLEAR;//TCS虑光模式
unsigned char Time1sCount=0; //计时1s所用Time Buf
unsigned int TCSPlus_1s=0; //TCS 1s输出的脉冲个数
unsigned char Time_1sFlag = 0;
/=============================================
TSL230 inital
pc0-pc3:s0-s3(out)
OE(PC5):out

=============================================/
void TCS230Inital(void)
{
//Mode Set
//PC0-PC3 OUT
DDRC = DDRC | 0x0f;
PORTC = PORTC | 0x0f;
//PC5 out
PORTC = PORTC | 0x20;//0010 0000
DDRC = DDRC | 0x20;
PORTC = PORTC & 0xdf;//1101 1111
TCS230Mode(FrequencyMode,PhotoDiodeMode);
}
/=====================================================================
PB1:计数PB1 CLK
Timer/Counter 1 initialization
Clock source: T1 pin Falling Edge
Mode: Normal top=FFFFh
OC1A output: Discon
OC1B output: Discon
Noise Canceler: Off
Input Capture on Falling Edge
Timer 1 Overflow Interrupt: Off
Input Capture Interrupt: Off
Compare A Match Interrupt: Off
Compare B Match Interrupt: Off
Timer/Counter 2 initialization
Clock source: System Clock
Clock value: 3600 kHz
Mode: Normal top=FFh
OC2 output: Disconnected
=====================================================================/
void TimerInital(void)
{
//PB1 计数PB1 CLK timer1
TCCR1A=0x00;
TCCR1B=0x06;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//time2 1s 36KHz 72/(361000)s=20ms 255-72=183(初值)=0xb7
ASSR = 0x00;
TCCR2 = 0x07;
TCNT2 = 0xb7;
OCR2 = 0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
}
/=====================================================================
S0:pc0;
S1:pC1;
S2:pC2;
S3:pC3;
S1S0:00(PowerDown) 01(%20) 10(%2) 11(%100)
s3s2:00(Red) 01(clear) 10(blue) 11(green)
return 0:ACK 1:FOutMode erro 2:PhotoType erro
=====================================================================/
unsigned char TCS230Mode(unsigned char FOutMode,unsigned char PhotoType)
{
//frequency mode
if( FOutMode == F_POWERDOWN)
{//S1S0:00 pc1=pC0=0
PORTC = PORTC & 0xfc;//1111 1100
}
else if(FOutMode == F_100_2)
{//S1S0:10 pc1=1,pc0=0
PORTD = PORTD & 0xfe;// 1111 1110
PORTD = PORTD | 0x02;// 0000 0010
}
else if(FOutMode == F_100_20)
{//S1S0:01 pc1=0 pc0=1
PORTD = PORTD & 0xfd;//1111 1101
PORTD = PORTD | 0x01;//0000 0001
}
else if(FOutMode == F_100_100)
{//S1S0:11 pc1=pc0=1
PORTD = PORTD | 0x03;//0000 0011
}
else
{ //参数错误
return 1;
}
FrequencyMode = FOutMode;
//photoDIODE type
if(PhotoType==PH_RED)
{//s3s2:00 pc3=pc2=0
PORTD = PORTD & 0xf3;//1111 0011
}
else if(PhotoType==PH_CLEAR)
{//s3s2:01 pc3=0 pc2=1
PORTC = PORTC & 0xf7;//1111 0111
PORTC = PORTC | 0x04;//0000 0100
}
else if(PhotoType==PH_BLUE)
{//s3s2:10 pc3=1 pc2=0
PORTC = PORTC & 0xfb;//1111 1011
PORTC = PORTC | 0x08;//0000 1000
}
else if(PhotoType==PH_GREEN)
{//s3s2:11 pc3=pc2=1
PORTC = PORTC | 0x0c;//1100 0000
//
}
else
{//参数错误
return 2;
}
PhotoDiodeMode=PhotoType;
return 0;
}
/=====================================================================
Timer 2 overflow interrupt service routine
定时器定时:20ms
=====================================================================/
SIGNAL(SIG_OVERFLOW2)
{
// Reinitialize Timer 2 value
TCNT2=0xb7;
// Place your code here
Time1sCount++;
if(Time1sCount>=5)
{//20ms50=1s
//更新频率值
TCSPlus_1s = TCNT1;
//重新计数
TCNT1 = 0;
Time1sCount = 0;
Time_1sFlag = 1;
}
}
//$

颜色传感器TCS230及颜色识别电路
TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器。该传感器具有分辨率高、可编程的颜色选择与输出定标、单电源供电等特点;输出为数字量,可直接与微处理器连接。文中主要介绍TCS230的原理和应用,以及色光和白平衡的知识,并用一个实例说明TCS230识别颜色的过程。
关键词 TCS23 0颜色传感器 颜色识别 白平衡调整
引言
随着现代工业生产向高速化、自动化方向的发展,生产过程中长期以来由人眼起主导作用的颜色识别工作将越来越多地被相应的颜色传感器所替代。例如:图书馆使用颜色区分对文献进行分类,能够极大地提高排架管理和统计等工作;在包装行业,产品包装利用不同的颜色或装潢来表示其不同的性质或用途。目前的颜色传感器通常是在独立的光电二极管上覆盖经过修正的红、绿、篮滤光片,然后对输出信号进行相应的处理,才能将颜色信号识别出来;有的将两者集合起来,但是输出模拟信号,需要一个A/D电路进行采样,对该信号进一步处理,才能进行识别,增加了电路的复杂性,并且存在较大的识别误差,影响了识别的效果。 TAOS(Texas Advanced Optoelectronic Solutions)公司最新推出的颜色传感器TCS230,不仅能够实现颜色的识别与检测,与以前的颜色传感器相比,还具有许多优良的新特性。
1 TCS230芯片的结构框图与特点
TCS230是TAOS公司推出的可编程彩色光到频率的转换器。它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器。TCS230的输出信号是数字量,可以驱动标准的 TTL或CMOS逻辑输入,因此可直接与微处理器或其他逻辑电路相连接。由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单。图1是TCS230的引脚和功能框图。
图1中,TCS230采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管。这些二极管共分为四种类型。其中16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器;其余16个不带有任何滤波器,可以透过全部的光信息。这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时,通过两个可编程的引脚来动态选择所需要的滤波器。该传感器的典型输出频率范围从2 Hz~500 kHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力。例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS230的输出频率和计数器相匹配。
从图1可知:当入射光投射到TCS230上时,通过光电二极管控制引脚S2、S3的不同组合,可以选择不同的滤波器;经过电流到频率转换器后输出不同频率的方波(占空比是50%),不同的颜色和光强对应不同频率的方波;还可以通过输出定标控制引脚S0、S1,选择不同的输出比例因子,对输出频率范围进行调整,以适应不同的需求。
点击可在新窗口打开查看
图1 TCS230的引脚和功能框图
下面简要介绍TCS230芯片各个引脚的功能及它的一些组合选项。
S0、S1用于选择输出比例因子或电源关断模式;S2、S3用于选择滤波器的类型;OE是频率输出使能引脚,可以控制输出的状态,当有多个芯片引脚共用微处理器的输入引脚时,也可以作为片选信号;OUT是频率输出引脚,GND是芯片的接地引脚,VCC为芯片提供工作电压。表1是S0、S1及 S2、S3的可用组合。
点击可在新窗口打开查看
表1 S0、S1及S2、S3的组合选项
2 TCS230识别颜色的原理
由上面的介绍可知,这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。下面以TCS230在液体颜色识别中的应用为例,介绍它的具体使用。首先了解一些光与颜色的知识。
(1) 三原色的感应原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝 B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
(2) TCS230识别颜色的原理
由三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS230来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其他原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其他的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到 TCS230传感器上的光的颜色。
(3) 白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于TCS230的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS230的RGB输出并不相等,因此在测试前必须进行白平衡调整,使得TCS230对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS230上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的3个调整参数。
当用TCS230识别颜色时,就用这3个参数对所测颜色的R、G和B进行调整。这里有两种方法来计算调整参数:① 依次选通三种颜色的滤波器,然后对TCS230的输出脉冲依次进行计数。当计数到255时停止计数,分别计算每个通道所用的时间。这些时间对应于实际测试时TCS230每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R、G和B的值。② 设置定时器为一固定时间(例如10 ms),然后选通三种颜色的滤波器,计算这段时间内TCS230的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G和B的值。
3 TCS230的应用——颜色识别电路
基于上述分析,采用89C51和TCS230设计一个医用液体颜色识别装置。该装置具有结构简单、识别精度和效率高的特点,并且能够和上位机通信,以将识别的结果实时传送给上位机。由于是说明TCS230的使用情况,下面仅给出其中的TCS230识别电路,如图2所示。图2中用89C51的 P1口的几图3软件流程个引脚来控制TCS230的各个控制引脚,而TCS230的输出引脚连接到89C51的定时器/计数器1的输入端(P35)。设置 89C51定时器/计数器为相应的工作方式,初始化89C51定时器为一个定值,再选择TCS230的输出比例因子,并使能输出引脚。实际使用中,通过读取89C51计数器的值,就可以分别计算出TCS230的3种输出频率,进而确定R、G、B值及颜色。相应的软件流程如图3所示。
点击可在新窗口打开查看
图2 TCS230颜色识别接口电路
在程序流程中:系统初始化负责设置89C51的定时器/计数器的工作方式,选择TCS230的输出比例因子,使能输出引脚以及通信参数的设置。初始化完成后,检测是否需要进行白平衡调整。如有,调整白平衡子程序;否则,转到下一步,检测是否需要进行颜色识别。如不需要颜色识别,返回;如需要颜色识别,调用颜色识别子程序,直到颜色识别完毕。
点击可在新窗口打开查看
图3 软件流程
4 应用中需要注意的问题
① 颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果。最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试。
② 对光源没有特殊的要求,但是光源发出的光要尽量集中,否则会造成传感器之间的相互干扰。
③ 当第1次使用TCS230时,或TCS230识别模块重启、更换光源等情况时,都需要进行白平衡调整。
结语
文章从TCS230的结构特点出发,介绍了色光理论和颜色识别的知识,以及白平衡的原理和进行调整的方法。结合一个具体的应用,给出了相应的硬件设计电路和软件流程图。该传感器和文中介绍的方法对进行其他的颜色识别,也有很大的帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10559752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存