颜色传感器输出的RBG都特别大都大于255是为啥
时间:10-02
整理:3721RD
点击:
#include"uart2.h"
#define LED P1_3
#define uchar unsigned char
#define uint unsigned int
sbit s0 = P2^1;
sbit s1 = P2^2;
sbit s2 = P2^3;
sbit s3 = P2^4;
void baipingheng();//白平衡子程序
void celiang();//实际颜色程序
uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子
uint rb,gb,bb;//RGB值
void delay_nms(unsigned int n);
/***************************led测试 闪烁3次****************************/
void test_led()
{
uchar i;
for(i=0;i<3;i++)
{
LED=0;
delay_nms(200);
LED=1;
delay_nms(200);
}
LED=0;
}
/***************************计数器初始化****************************/
void t0_init()
{
TMOD=0x51;//设置定时器0为工作方式一 定时器1为工作方式一,计数模式
TH0=(65536-10000)%256;
TL0=(65536-10000)/256;//如果晶振是11.0592MHZ的话,误差是0.00017%
}
void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延时n ms
{
n=n+1;
while(--n)
delay_nus(900); //延时 1ms,同时进行补偿
}
//白平衡子程序
void celiang()
{
//*********求R值************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=0;//选择红色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
rb=(unsigned long)(TH1*256+TL1)*255/ryz;
if(rb>255)
rb=255;//判断RGB值是否合法
//***********求B值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
bb=(unsigned long)(TH1*256+TL1)*255/byz;
if(bb>255)
bb=255;//判断RGB值是否合法 ]
//***********求G值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=1;
s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
gb=(unsigned long)(TH1*256+TL1)*255/gyz;
if(gb>255)
gb=255;//判断RGB值是否合法
}
//******************************************************
//白平衡子程序
void baipingheng()
{
//**************求取红色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=0;//选择红色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
ryz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求取蓝色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
byz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求绿色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=1;
s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
gyz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
delay_nms(250);
}
/*****************************主控制程序****************************/
void main()
{
test_led(); //测试led
delay_nms(80); //延时 等待串口调试工具
LED=1; //打开led
s0=0; s1=1; //关断电源
t0_init();
Time2_init();
while(1)
{
baipingheng();
celiang();
printf("ryz=%ld\n",ryz);
delay_nms(250);
printf("byz=%ld\n",byz);
delay_nms(250);
printf("gyz=%ld\n",gyz);
delay_nms(250);
printf("rb=%ld\n",rb);
delay_nms(250);
printf("bb=%ld\n",bb);
delay_nms(250);
printf("gb=%ld\n",gb);
delay_nms(250);
}
}
/*----------------------------------------------------------------
函数名:Time2_init( )
功 能:使用T2做串口时钟
-----------------------------------------------------------------*/
得到的脉冲数也特别大
#define LED P1_3
#define uchar unsigned char
#define uint unsigned int
sbit s0 = P2^1;
sbit s1 = P2^2;
sbit s2 = P2^3;
sbit s3 = P2^4;
void baipingheng();//白平衡子程序
void celiang();//实际颜色程序
uint ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子
uint rb,gb,bb;//RGB值
void delay_nms(unsigned int n);
/***************************led测试 闪烁3次****************************/
void test_led()
{
uchar i;
for(i=0;i<3;i++)
{
LED=0;
delay_nms(200);
LED=1;
delay_nms(200);
}
LED=0;
}
/***************************计数器初始化****************************/
void t0_init()
{
TMOD=0x51;//设置定时器0为工作方式一 定时器1为工作方式一,计数模式
TH0=(65536-10000)%256;
TL0=(65536-10000)/256;//如果晶振是11.0592MHZ的话,误差是0.00017%
}
void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延时n ms
{
n=n+1;
while(--n)
delay_nus(900); //延时 1ms,同时进行补偿
}
//白平衡子程序
void celiang()
{
//*********求R值************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=0;//选择红色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
rb=(unsigned long)(TH1*256+TL1)*255/ryz;
if(rb>255)
rb=255;//判断RGB值是否合法
//***********求B值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
bb=(unsigned long)(TH1*256+TL1)*255/byz;
if(bb>255)
bb=255;//判断RGB值是否合法 ]
//***********求G值**************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=1;
s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
gb=(unsigned long)(TH1*256+TL1)*255/gyz;
if(gb>255)
gb=255;//判断RGB值是否合法
}
//******************************************************
//白平衡子程序
void baipingheng()
{
//**************求取红色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=0;//选择红色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
ryz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求取蓝色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=0;
s3=1;//选择蓝色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
byz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
//**************求绿色因子***********************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
s2=1;
s3=1;//选择绿色滤光器
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清楚定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
gyz=(TH1*256+TL1);//其实这里的比例因子应该为255/(TH1*256+TL1)
delay_nms(250);
}
/*****************************主控制程序****************************/
void main()
{
test_led(); //测试led
delay_nms(80); //延时 等待串口调试工具
LED=1; //打开led
s0=0; s1=1; //关断电源
t0_init();
Time2_init();
while(1)
{
baipingheng();
celiang();
printf("ryz=%ld\n",ryz);
delay_nms(250);
printf("byz=%ld\n",byz);
delay_nms(250);
printf("gyz=%ld\n",gyz);
delay_nms(250);
printf("rb=%ld\n",rb);
delay_nms(250);
printf("bb=%ld\n",bb);
delay_nms(250);
printf("gb=%ld\n",gb);
delay_nms(250);
}
}
/*----------------------------------------------------------------
函数名:Time2_init( )
功 能:使用T2做串口时钟
-----------------------------------------------------------------*/
得到的脉冲数也特别大
这得有传感器资料和相关部分的电路,才能判断问题原因
有人说是颜色传感器比例因子初始化计算错误
不管是什么原因,在没找到根本时,只能一个一个的排除,即使是比例因子计算错误,应该也会跟传感器相关吧,计算总要有个依据吧