#include <at892051.h>
#define uchar unsigned char
#define uint unsigned int
sbit LAMP = P3^7;
sbit OUT = P1^5;
sbit S2 = P1^6;
sbit S3 = P1^7;
bit idata RGB=1,OUT_BAK=1;
uint count1,count2;
uint RED,GREEN,BLUE,MAX;
float XS_RED,XS_GREEN,XS_BLUE;
float XS;
//uchar count3;
/******************************************************************************************
* 函数名称 :time0() interrupt 1 using 1
* 功能描述 :定时器0中断服务程序
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void time0() interrupt 1 using 1
{
TH0=(65536-922)/256; //装入定时器初值
TL0=(65536-922)%256;
RGB=0;TR0=0;EX1=0;
}
void count() interrupt 2 using 2 //计数230输出脉冲
{
count1++;
if(RGB==0)EX1=0; //计时时间到,停止计数
}
/******************************************************************************************
* 函数名称 :Senddata(uchar *relay)
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void Senddata(uchar relay) //串口发送程序
{
SBUF=relay; //写数据
while(TI==0);
TI=0;
return;
}
void Sendstring(uchar * p) //串口发送字符串程序
{
while(*p!=0)
{
Senddata(*p);
p++;
}
return;
}
void TS_init(void) //颜色传感器以及定时器,计数器初始化
{
TMOD=0x21; //TC1作为串口8位自动装入定时器,TC016位定时器,用于时间判断
TH1=0xfd; //装入定时器初值,10MS计时
TL1=0xfd;
SCON=0xD8; //串口方式0输出,输出的内容送RXD脚输出,移位脉冲由TXD引脚输出
PCON=0x00;
TH0=(65536-922)/256; //装入定时器初值,10MS计时
TL0=(65536-922)%256;
EA=1; //开总中断
ET0=1;
TR1=1;
}
void COUNT_init(void)
{
IT1=1;
IP=0x02; //设置优先级
EA=1;
EX1=0;
}
void delay(uint cishu) //纯计数延时,不精确
{
count2=cishu;
for(count1=500;count1>0;count1--)
{
while(count2)count2--;
}
}
//获取红色频率
unsigned int Get_Red()
{
S2=0;S3=0;RGB=1;
count1=0;
delay(1);
TR0=1;
EX1=1;
while(RGB);
return(count1);
}
//获取绿色频率
unsigned int Get_Green()
{
S2=1;S3=1;RGB=1;
count1=0;
delay(1);
TR0=1;
EX1=1;
while(RGB);
return(count1);
}
//获取蓝色频率
unsigned int Get_Blue()
{
S2=0;S3=1;RGB=1;
count1=0;
delay(1);
TR0=1;
EX1=1;
while(RGB);
return(count1);
}
void Put_Ser_Dis(uint num1) //直接串口输出小于9999的整数
{
Senddata(num1/1000+0X30);
Senddata(num1%1000/100+0X30);
Senddata(num1%1000%100/10+0X30);
Senddata(num1%1000%100%10+0X30);
}
void main()
{
LAMP = 0; //打开光源
TS_init(); //系统初始化
COUNT_init();
delay(50000); //延时,保证光源稳定下来
delay(50000);
RED=Get_Red(); //分别取RGB颜色值
GREEN=Get_Green();
BLUE=Get_Blue();
XS_RED=(float)(RED)/(float)(255); //分别计算修正系数
XS_GREEN=(float)(GREEN)/(float)(255);
XS_BLUE=(float)(BLUE)/(float)(255);
while(1)
{
RED=Get_Red();
GREEN=Get_Green();
BLUE=Get_Blue();
(uint)(RED)=(float)(RED)/(XS_RED); //计算出修正后的RGB
(uint)(GREEN)=(float)(GREEN)/(XS_GREEN);
(uint)(BLUE)=(float)(BLUE)/(XS_BLUE);
/*串口输出相关数据*/
Sendstring("R-");
Put_Ser_Dis(RED);
Sendstring("G-");
Put_Ser_Dis(GREEN);
Sendstring("B-");
Put_Ser_Dis(BLUE);
}
}