for(j=0;j<100;j++);
}
voiddelay600ms(void)
{
unsignedchara,b,c;
for(c=89;c>0;c--)
for(b=230;b>0;b--)
for(a=12;a>0;a--);
}
/******************************************************************
-功能描述:
写数据子程序
-入口参数:
数据
-参数值:
字节型
-返回说明:
无
-备注:
无
******************************************************************/
voidwdat(unsignedchardat)
{
delay1ms
(1);
RS=1;
RW=0;
EN=0;
_data=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
/******************************************************************
-功能描述:
写命令子程序
-入口参数:
数据
-参数值:
字节型
-返回说明:
无
-备注:
无
******************************************************************/
voidwcmd(unsignedcharcom)
{
delay1ms
(1);
RS=0;
RW=0;
EN=0;
_data=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
/******************************************************************
-功能描述:
初始化子程序
-入口参数:
无
-参数值:
无
-返回说明:
无
-备注:
无
******************************************************************/
voidinit_1602(void)
{
delay1ms(15);
wcmd(0x38);delay1ms(5);//功能设置8位总线2行显示5*7点阵
wcmd(0x06);delay1ms(5);//设置输入模式光标右移整体不移
wcmd(0x08);delay1ms(5);//设置显示方式显示关
wcmd(0x01);delay1ms(5);//清除显示
wcmd(0x0c);delay1ms(5);//设置显示方式显示开无光标光标不闪烁
}
/******************************************************************
-功能描述:
指定位置写字符函数
-入口参数:
行,列,字符
-参数值:
无
-返回说明:
无
-备注:
无
******************************************************************/
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharin)
{
X&=0x1;//限制X值为0和1
Y&=0xF;//限制Y值为0-15
if(X)
{Y|=0x40;}//当要显示第二行时地址码+0x40;
Y|=0x80;//得出列位置
wcmd(Y);//写地址
wdat(in);//写数据
}
/******************************************************************
-功能描述:
发送数据到上位机
-入口参数:
数据1,数据2,数据3
-参数值:
无
-返回说明:
无
-备注:
无
******************************************************************/
voidSendOneByte(unsignedcharina,unsignedcharinb,unsignedcharinc)
{
TMOD=0x20;
SCON=0x50;
TH1=0xFD;
TL1=TH1;
PCON=0x00;
EA=1;
ES=1;
TR1=1;
SBUF=ina;
while(!
TI);
TI=0;
SBUF=inb;
while(!
TI);
TI=0;
SBUF=inc;
while(!
TI);
TI=0;
}
/******************************************************************
-功能描述:
白平衡函数
-入口参数:
无
-参数值:
无
-返回说明:
无
-备注:
无
******************************************************************/
voidbaipingheng(void)
{
TMOD=0x51;//设定T0以工作方式1定时10毫秒
TH0=(65536-10000)/256;//取红色因子
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_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;
tcs230_s2=0;
tcs230_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;
tcs230_s2=1;
tcs230_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)
}
/******************************************************************
-功能描述:
测量颜色值
-入口参数:
无
-参数值:
无
-返回说明:
无
-备注:
无
******************************************************************/
voidceyanse(void)
{
TMOD=0x51;//设定T0以工作方式1定时10毫秒
TH0=(65536-10000)/256;//求R值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;//选择红色滤光器
tcs230_s3=0;
TR0=1;//10毫秒开始计时
TR1=1;//开始计数
while(TF0==0);//等待定时器溢出
TF0=0;//清除定时器0溢出标志
TR0=0;//关闭定时0
TR1=0;
Rzhi=(unsignedlong)(TH1*256+TL1)*255/Ryz;
if(Rzhi>255)Rzhi=255;//判断RGB值是否合法
TH0=(65536-10000)/256;//求B值
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;
Bzhi=(unsignedlong)(TH1*256+TL1)*255/Byz;
if(Bzhi>255)Bzhi=255;//判断RGB值是否合法
TH0=(65536-10000)/256;//求G值
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;
Gzhi=(unsignedlong)(TH1*256+TL1)*255/Gyz;
if(Gzhi>255)Gzhi=255;//判断RGB值是否合法
}
voidmain(void)
{
init_1602();//LCD初始
baipingheng();//上电时先白平衡一次
while
(1)
{
ceyanse();//颜色测试
DisplayOneChar(0,0,'R');//以十进制显示RGB中红色的分值
DisplayOneChar(0,1,Rzhi/100+0x30);//显示百位数据
DisplayOneChar(0,2,Rzhi/10%10+0x30);//显示十位数据
DisplayOneChar(0,3,Rzhi%10+0x30);//显示个位数据
DisplayOneChar(0,5,'G');//以十进制显示RGB中绿色的分值
DisplayOneChar(0,6,Gzhi/100+0x30);//显示百位数据
DisplayOneChar(0,7,Gzhi/10%10+0x30);
DisplayOneChar(0,8,Gzhi%10+0x30);
DisplayOneChar(0,10,'B');//以十进制显示RGB中蓝色的分值
DisplayOneChar(0,11,Bzhi/100+0x30);
DisplayOneChar(0,12,Bzhi/10%10+0x30);
DisplayOneChar(0,13,Bzhi%10+0x30);
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1,1,num[Rzhi/16]);
DisplayOneChar(1,2,num[Rzhi%16]);
DisplayOneChar(1,3,'H');
DisplayOneChar(1,6,num[Gzhi/16]);
DisplayOneChar(1,7,num[Gzhi%16]);
DisplayOneChar(1,8,'H');
DisplayOneChar(1,11,num[Bzhi/16]);
DisplayOneChar(1,12,num[Bzhi%16]);
DisplayOneChar(1,13,'H');
SendOneByte(Rzhi,Gzhi,Bzhi);//发送数据到上位机
delay600ms();//每隔0.6秒测试一次颜色
}
}
===========================《完》==========================