📄 chengxu.c
字号:
/********************************************************************
汇诚科技
实现功能:对颜色传感器输出的频率进行测量
使用芯片:AT89S52 或者 STC89C52
晶振:11.0592MHZ
编译环境:Keil
作者:zhangxinchunleo
网站:www.ourhc.cn
淘宝店:汇诚科技 http://shop36330473.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
/*******************************************
* 文件名:TCS230.c
* 功能: 读取RGB值
/********************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/**引脚定义**/
sbit oe=P1^0;
sbit s0=P1^2;
sbit s1=P1^3;
sbit s2=P1^5;
sbit s3=P1^4;
//变量、常量定义
long int color,red,green,blue;
long int disp_tc;
long int buf_cor; //颜色值
uint rp=3,gp=6,bp=3; //定义比例因子
uchar disp_p; //颜色标志位(0:红 1:绿 2:蓝)
//数组
uchar disp_buf[3]={0xff,0xff,0xff}; //临时保存当前的色值
uchar code table[]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*数码管段码*/
uchar code scan[4]={0XEf,0XDf,0XBf,0X7f}; /*数码管位选*/
/*******************************************
* 函数名称: t0_init()
* 函数功能: 定时器0初始化
/********************************************/
void t0_init()
{
TMOD=0x51; //T1计数 T0定时 工作方式1
TH0=0x3C; //定时50ms
TL0=0xB0;
TH1=0xFF; //计数初值
TL1=0x9C;
EA=1; //开中断
ET0=1;
TR0=1; //启动
TR1=1;
}
/*******************************************
* 函数名称: delay_1ms(uint w)
* 函数功能: 延时1mx
/********************************************/
void delay_1ms(uint w)
{
uint y,z;
for(z=w;z>0;z--)
for(y=100;y>0;y--);
}
/*******************************************
* 函数名称: feed_buf()
* 函数功能: 根据颜色标志位disp_p,读取当前检测
到的色值,并保存到disp_buf[]
/********************************************/
void feed_buf()
{
//依次读取红、绿、蓝色值
if(disp_p==0)
{red=buf_cor/rp;color=red;} //读取红色值
else if(disp_p==1)
{green=buf_cor/gp;color=green;}
else if(disp_p==2)
{blue=buf_cor/bp;color=blue;}
disp_buf[0]=color/100;
disp_buf[1]=(color-100*disp_buf[0])/10;
disp_buf[2]=color%10;
}
/*******************************************
* 函数名称: display()
* 函数功能: 数码管显示
/********************************************/
void display()
{
uchar i;
for(i=0;i<3;i++)
{
if(disp_p==0&&i==0)
{P0=table[10];P2=scan[0];delay_1ms(2);P2=0xff;}
else if(disp_p==1&&i==0)
{P0=table[11];P2=scan[0];delay_1ms(2);P2=0xff;}
else if(disp_p==2&&i==0)
{P0=table[12];P2=scan[0];delay_1ms(2);P2=0xff;}
else if(i<=3)
{P0=table[disp_buf[i-1]];P2=scan[i];delay_1ms(2);P2=0xff;}
}
}
/*******************************************
* 函数名称: main()
/********************************************/
void main()
{
oe=0; //使能TCS230
s0=1; s1=1; //选择输出比例因子100%
t0_init(); //定时计数初使化
while(1)
{
display();
}
}
/*******************************************
* 函数名称: c10ms_out()
* 函数功能: 定时中断0服务程序
修改颜色标志disp_tc(0:红 1:绿 2:蓝)
设置S0 S1 S2 选择滤波器
计算脉冲,读取色值
/********************************************/
void c10ms_out() interrupt 1
{
TR0=0; //关闭定时
TR1=0; //关闭计数
disp_tc+=1;//实现先检测绿色,再检测蓝色,然后检测红色,循环检测
if(disp_tc==100)
{
disp_tc=0;
if(disp_p==0)
{
disp_p+=1;
s2=1;s3=1; //选择滤波器为绿色
}
else if(disp_p==1)
{
disp_p+=1;
s2=1;s3=0; //选择滤波器为蓝色
}
else if(disp_p==2)
{
disp_p=0;
s2=0;s3=0; //选择滤波器为红色
}
}
if(disp_tc%10==0)
{
buf_cor=TH1*256+TL1; //计算这段时间内 TCS230 的输出脉冲数
feed_buf();
}
//重赋初值
TH0=0xB0;
TL0=0x3C;
TL1=0x00;
TH1=0x00;
TR0=1;
TR1=1;
}
/*************************************************************************
结束
**************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -