写一个51单片机 tcs3200颜色识别代码 不用定时器,不用中断,需要白平衡,并说明所有的接线情况
时间: 2023-09-18 13:13:00 浏览: 49
以下是一个基于51单片机的TCS3200颜色识别代码,不使用定时器和中断:
```
#include <reg51.h>
#include <intrins.h>
#define S2 P2_5
#define S3 P2_6
#define OUT P2_7
unsigned int counter = 0;
unsigned char color_flag = 0;
void delay(unsigned int n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void TCS3200_start(void)
{
S2 = 0;
S3 = 0;
}
void TCS3200_read(unsigned char select)
{
switch (select)
{
case 0x00: //红色滤光片
S2 = 0;
S3 = 0;
break;
case 0x01: //蓝色滤光片
S2 = 1;
S3 = 1;
break;
case 0x02: //绿色滤光片
S2 = 0;
S3 = 1;
break;
case 0x03: //无滤光片
S2 = 1;
S3 = 0;
break;
}
delay(10);
counter = 0;
OUT = 1;
while (OUT)
{
counter++;
delay(10);
if (counter > 5000) //避免无限循环
{
color_flag = 1;
break;
}
}
OUT = 0;
}
unsigned char get_color(void)
{
unsigned int red = 0, green = 0, blue = 0;
TCS3200_read(0x00); //红色滤光片
red = counter;
if (color_flag) return 0;
TCS3200_read(0x01); //蓝色滤光片
blue = counter;
if (color_flag) return 0;
TCS3200_read(0x02); //绿色滤光片
green = counter;
if (color_flag) return 0;
if (red > green && red > blue)
{
return 1; //红色
}
else if (green > red && green > blue)
{
return 2; //绿色
}
else if (blue > red && blue > green)
{
return 3; //蓝色
}
else
{
return 0; //无法识别
}
}
void main(void)
{
while (1)
{
TCS3200_start();
delay(10);
get_color();
if (color_flag)
{
P1 = 0xFF; //颜色识别错误,LED灯为红色
}
else
{
switch (get_color())
{
case 1:
P1 = 0x01; //识别到红色,LED灯为红色
break;
case 2:
P1 = 0x02; //识别到绿色,LED灯为绿色
break;
case 3:
P1 = 0x04; //识别到蓝色,LED灯为蓝色
break;
default:
P1 = 0xFF; //无法识别,LED灯为红色
break;
}
}
}
}
```
接线情况如下:
- S0:接单片机P2.0引脚
- S1:接单片机P2.1引脚
- S2:接单片机P2.5引脚
- S3:接单片机P2.6引脚
- OUT:接单片机P2.7引脚
- VCC:接单片机VCC
- GND:接单片机GND