📄 tcs230.c
字号:
#define uchar unsigned char
#include <reg52.h>
#include<math.h>
sbit S0=P1^7;
sbit S1=P1^0; //端口定义
sbit S2=P1^1;
sbit S3=P1^2;
sbit OE=P1^3;
sbit OUT=P3^4; //频率从TO口输入
sbit key0=P1^5;
sbit LED=P1^6;
sbit a=P3^0;
sbit b=P3^1;
uchar color; //1:blue 2:green 3:red
uchar T[4]; //color timer
uchar TH[4];
uchar TL[4];
uchar bizhi[4];
void time1() interrupt 3
{
TH[color]=TH0;
TL[color]=TL0;
T[color]=(TH[color]*0xff+TL[color]);
TR0=0;//关定时器
TR1=0;
TH1=0xB1;
TL1=0xE0;//归0
TH0=0x00;
TL0=0x00;//归0
}
void TCS320_onecolor(n) //进行一种颜色的扫描识别
{
switch(n)
{ case 1: S2=0; S3=1; break; //bule filter used
case 2: S2=1; S3=1; break; //green filter used
case 3: S2=0; S3=0; break; //red filter used
}
}
void color_data(void) // color balance adjust function
{
for(color=1;color<=3;color++)//三种颜色都判断一下
{
TCS320_onecolor(color);
TR0=1; //打开两个定时器
TR1=1;
TMOD=0x15; //T0--counter mode 2 且是计数器, T1--timer
while(TF1==0)
{
}
}
}
void key(void) // 左转外部中断0是0号
{
uchar B;
color_data();
B=(T[3]+T[2]+T[1]);
B=(B/10);
T[3]=(T[3]/10); //消除抖动
T[2]=(T[2]/10);
T[1]=(T[1]/10);
bizhi[3]=((T[3]*100)/B); //提高精度
bizhi[2]=((T[2]*100)/B);
bizhi[1]=((T[1]*100)/B);
}
void color_shibie(void)
{
uchar i,j,h,k,m;
color_data();
k=(T[1]+T[2]+T[3]);
k=(k/10);
T[3]=(T[3]/10); //消除抖动
T[2]=(T[2]/10);
T[1]=(T[1]/10);
h=((T[3]*100)/k); //提高精度
i=((T[2]*100)/k);
j=((T[1]*100)/k);
m=1;
if((bizhi[2]==i)&&(bizhi[1]==j)&&(bizhi[3]==h))
{LED=0; //进行颜色判断
}
else if((bizhi[2]!=i)||(bizhi[1]!=j)||(bizhi[3]!=h))
{LED=1;}
}
void main()
{
EA=1;
ET1=1;
P1=0x00;
TH0=0x00;
TL0=0x00;
TH1=0xB1;
TL1=0xE0;
OE=0; //频率输出使能端
S0=0; //S0S1=01 output frequency scaling 2%
S1=1;
LED=1;
bizhi[1]=1;
bizhi[2]=1;
bizhi[3]=1;
TMOD=0x15; //T0--counter mode 2 且是计数器,
//T1--timer mode 1 C/T为0时是做定时器用
while(1)
{
if(key0==1)
{key();}
if(key0==0)
{color_shibie();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -