⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_demo.c

📁 是用51单片机检测色度色差的算法和具体实现的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	int mainwl;
	uchar i;
	
	_x_ = X[0]/(X[0] + Y[0] + Z[0]);
	_y_ = Y[0]/(X[0] + Y[0] + Z[0]);
	mainwl = wavelength(_x_, _y_);
	clslcd();
	for (i=0; i<3; i++)
	{
		dis1616(*(mwl+i), 5+2*i, 0);
	}
	if (mainwl >= 0)
	{
		dis816(lambda, 5, 4);
		dis816(blank, 6, 4);
		dis816(equal, 7, 4);
		dis816(blank, 8, 4);
		dis_int(mainwl, 9, 4);
	}
	else
	{
		dis816(lambda, 5, 4);
		dis816(blank, 6, 4);
		dis816(equal, 7, 4);
		dis816(blank, 8, 4);
		dis816(minus, 9, 4);
		dis_int(-mainwl, 10, 4);
	}
}

/***************************************************************************
*	函数原型:void MeaE(void);
*	函数功能:测量色差开始。
***************************************************************************/
void MeaE(void)
{
	uchar status = 0;
	
	uchar key;
	dis_blank();
	while (1)
	{
		key = getkey();
		if (key == Enter)
		{
			if(status < 5)
			{
				status++;
			}
			switch (status)
			{
				case 1:	MeaE1();break;
				case 2:	MeaE2();break;
				case 3:	MeaE3();break;
				case 4:	MeaE4();break;
				default:break;
			}
		}
		if (key == Esc)
		{
			dis_menu();
			dis_arrow(1);
			break;
		}
	}
}


/***************************************************************************
*	函数原型:void MeaE1(void);
*	函数功能:测量色差步骤1。
***************************************************************************/
void MeaE1(void)
{
	dis_wait();
	Ir0 = measure(RED) - I0;
	Ig0 = measure(GREEN) - I0;
	Ib0 = measure(BLUE) - I0;
	dis_samples(1);
}

/***************************************************************************
*	函数原型:void MeaE2(void);
*	函数功能:测量色差步骤2。
***************************************************************************/
void MeaE2(void)
{
	float Ar1, Ag1, Ab1;
	
	dis_wait();
	Ar1 = (measure(RED)-I0)/(float)Ir0;
	Ag1 = (measure(GREEN)-I0)/(float)Ig0;
	Ab1 = (measure(BLUE)-I0)/(float)Ib0;
	color(Ar1, Ag1, Ab1, 0);
	dis_samples(2);
}

/***************************************************************************
*	函数原型:void MeaE3(void);
*	函数功能:测量色差步骤3。
***************************************************************************/
void MeaE3(void)
{
	float Ar1, Ag1, Ab1;
	
	dis_wait();
	Ar1 = (measure(RED)-I0)/(float)Ir0;
	Ag1 = (measure(GREEN)-I0)/(float)Ig0;
	Ab1 = (measure(BLUE)-I0)/(float)Ib0;
	color(Ar1, Ag1, Ab1, 1);
	MeaE4();
}

/***************************************************************************
*	函数原型:void MeaE4(void);
*	函数功能:测量色差步骤4。
***************************************************************************/
void MeaE4(void)
{
	float E;
	uchar i;
	clslcd();
	dis1616(*title, 5, 0);
	dis1616(*(title+2), 7, 0);
	dis1616(*(tris+3), 9, 0);
	E = Eab();
	for (i=0; i<3; i++)
	{
		dis816(*(eabuv+i), 2+i, 3);
	}
	dis816(blank, 5, 3);
	dis816(equal, 6, 3);
	dis816(blank, 7, 3);
	dis_float(E, 8, 3);
	E = Euv();
	dis816(*eabuv, 2, 5);
	dis816(*(eabuv+3), 3, 5);
	dis816(*(eabuv+4), 4, 5);
	dis816(blank, 5, 5);
	dis816(equal, 6, 5);
	dis816(blank, 7, 5);
	dis_float(E, 8, 5);
}

/***************************************************************************
*	函数原型:void ChangeTime(void);
*	函数功能:设定时间。
***************************************************************************/
void ChangeTime(void)
{
	uchar clock[7];	
	uchar temp;
	uchar status = 0;
	
	GetClk(clock);
	dis_clock(clock);
	while (1)
	{
		switch (getkey())
		{
			case Up:
				switch (status)
				{
					case 0:
						temp = BCD_B(clock[6]);
						temp++;	
						if (temp > 99)
						{
							temp = 0;
						}
						clock[6] = B_BCD(temp);
						dis816(blank, 3, 2);
						dis816(blank, 4, 2);
						dis816(*(number_dark+(clock[6]>>4)), 3, 2);
						dis816(*(number_dark+(clock[6]&0x0f)), 4, 2);
						break;
					case 1:
						temp = BCD_B(clock[4]);
						temp++;	
						if (temp > 12)
						{
							temp = 1;
						}
						clock[4] = B_BCD(temp);
						dis816(blank, 7, 2);
						dis816(blank, 8, 2);
						dis816(*(number_dark+(clock[4]>>4)), 7, 2);
						dis816(*(number_dark+(clock[4]&0x0f)), 8, 2);
						break;
					case 2:
						temp = BCD_B(clock[3]);
						temp++;	
						if ((clock[4]==1||clock[4]==3||clock[4]==5||clock[4]==7||clock[4]==8||clock[4]==10||clock[4]==12)
							&&(temp > 31))
						{
							temp = 1;
						}
						if ((clock[4]==4||clock[4]==6||clock[4]==9||clock[4]==11)&&(temp > 30))
						{
							temp = 1;
						}
						if ((clock[4]==2)&&(clock[6]%4!=0)&&(temp > 28))
						{
							temp = 1;
						}
						if ((clock[4]==2)&&(clock[6]%4==0)&&(temp > 29))
						{
							temp = 1;
						}
						clock[3] = B_BCD(temp);
						dis816(blank, 11, 2);
						dis816(blank, 12, 2);
						dis816(*(number_dark+(clock[3]>>4)), 11, 2);
						dis816(*(number_dark+(clock[3]&0x0f)), 12, 2);
						break;
					case 3:
						temp = BCD_B(clock[2]);
						temp++;	
						if (temp > 23)
						{
							temp = 0;
						}
						clock[2] = B_BCD(temp);
						dis816(blank, 4, 4);
						dis816(blank, 5, 4);
						dis816(*(number_dark+(clock[2]>>4)), 4, 4);
						dis816(*(number_dark+(clock[2]&0x0f)), 5, 4);
						break;
					case 4:
						temp = BCD_B(clock[1]);
						temp++;	
						if (temp > 59)
						{
							temp = 0;
						}
						clock[1] = B_BCD(temp);
						dis816(blank, 7, 4);
						dis816(blank, 8, 4);
						dis816(*(number_dark+(clock[1]>>4)), 7, 4);
						dis816(*(number_dark+(clock[1]&0x0f)), 8, 4);
						break;
					case 5:
						temp = BCD_B(clock[0]);
						temp++;	
						if (temp > 59)
						{
							temp = 0;
						}
						clock[0] = B_BCD(temp);
						dis816(blank, 10, 4);
						dis816(blank, 11, 4);
						dis816(*(number_dark+(clock[0]>>4)), 10, 4);
						dis816(*(number_dark+(clock[0]&0x0f)), 11, 4);
						break;
					default:
						break;
				}
				break;
			case Down:
				switch(status)
				{
					case 0:
						temp = BCD_B(clock[6]);
						temp--;
						if (temp == 0xff)
						{
							temp = 99;
						}
						clock[6] = B_BCD(temp);
						dis816(blank, 3, 2);
						dis816(blank, 4, 2);
						dis816(*(number_dark+(clock[6]>>4)), 3, 2);
						dis816(*(number_dark+(clock[6]&0x0f)), 4, 2);
						break;
					case 1:
						temp = BCD_B(clock[4]);
						temp--;
						if (temp == 0xff)
						{
							temp = 12;
						}
						clock[4] = B_BCD(temp);
						dis816(blank, 7, 2);
						dis816(blank, 8, 2);
						dis816(*(number_dark+(clock[4]>>4)), 7, 2);
						dis816(*(number_dark+(clock[4]&0x0f)), 8, 2);
						break;
					case 2:
						temp = BCD_B(clock[3]);
						temp--;
						if ((clock[4]==1||clock[4]==3||clock[4]==5||clock[4]==7||clock[4]==8||clock[4]==10||clock[4]==12)
							&&(temp < 1))
						{
							temp = 31;
						}
						if ((clock[4]==4||clock[4]==6||clock[4]==9||clock[4]==11)&&(temp < 1))
						{
							temp = 30;
						}
						if ((clock[4]==2)&&(clock[6]%4!=0)&&(temp<1))
						{
							temp = 28;
						}
						if ((clock[4]==2)&&(clock[6]%4==0)&&(temp<1))
						{
							temp = 29;
						}
						clock[3] = B_BCD(temp);
						dis816(blank, 11, 2);
						dis816(blank, 12, 2);
						dis816(*(number_dark+(clock[3]>>4)), 11, 2);
						dis816(*(number_dark+(clock[3]&0x0f)), 12, 2);
						break;
					case 3:
						temp = BCD_B(clock[2]);
						temp--;
						if (temp == 0xff)
						{
							temp = 23;
						}
						clock[2] = B_BCD(temp);
						dis816(blank, 4, 4);
						dis816(blank, 5, 4);
						dis816(*(number_dark+(clock[2]>>4)), 4, 4);
						dis816(*(number_dark+(clock[2]&0x0f)), 5, 4);
						break;
					case 4:
						temp = BCD_B(clock[1]);
						temp--;
						if (temp == 0xff)
						{
							temp = 59;
						}
						clock[1] = B_BCD(temp);
						dis816(blank, 7, 4);
						dis816(blank, 8, 4);
						dis816(*(number_dark+(clock[1]>>4)), 7, 4);
						dis816(*(number_dark+(clock[1]&0x0f)), 8, 4);
						break;
					case 5:
						temp = BCD_B(clock[0]);
						temp--;
						if (temp == 0xff)
						{
							temp = 59;
						}
						clock[0] = B_BCD(temp);
						dis816(blank, 10, 4);
						dis816(blank, 11, 4);
						dis816(*(number_dark+(clock[0]>>4)), 10, 4);
						dis816(*(number_dark+(clock[0]&0x0f)), 11, 4);
						break;
					default:
						break;
				}
				break;
			case Enter:
				switch(status)
				{
					case 0:
						status++;
						dis816(blank, 3, 2);
						dis816(blank, 4, 2);
						dis816(*(number+(clock[6]>>4)), 3, 2);
						dis816(*(number+(clock[6]&0x0f)), 4, 2);
						dis816(blank, 7, 2);
						dis816(blank, 8, 2);
						dis816(*(number_dark+(clock[4]>>4)), 7, 2);
						dis816(*(number_dark+(clock[4]&0x0f)), 8, 2);
						break;
					case 1:
						status++;
						dis816(blank, 7, 2);
						dis816(blank, 8, 2);
						dis816(*(number+(clock[4]>>4)), 7, 2);
						dis816(*(number+(clock[4]&0x0f)), 8, 2);
						dis816(blank, 11, 2);
						dis816(blank, 12, 2);
						dis816(*(number_dark+(clock[3]>>4)), 11, 2);
						dis816(*(number_dark+(clock[3]&0x0f)), 12, 2);
						break;
					case 2:
						status++;
						dis816(blank, 11, 2);
						dis816(blank, 12, 2);
						dis816(*(number+(clock[3]>>4)), 11, 2);
						dis816(*(number+(clock[3]&0x0f)), 12, 2);
						dis816(blank, 4, 4);
						dis816(blank, 5, 4);
						dis816(*(number_dark+(clock[2]>>4)), 4, 4);
						dis816(*(number_dark+(clock[2]&0x0f)), 5, 4);
						break;
					case 3:
						status++;
						dis816(blank, 4, 4);
						dis816(blank, 5, 4);
						dis816(*(number+(clock[2]>>4)), 4, 4);
						dis816(*(number+(clock[2]&0x0f)), 5, 4);
						dis816(blank, 7, 4);
						dis816(blank, 8, 4);
						dis816(*(number_dark+(clock[1]>>4)), 7, 4);
						dis816(*(number_dark+(clock[1]&0x0f)), 8, 4);
						break;
					case 4:
						status++;
						dis816(blank, 7, 4);
						dis816(blank, 8, 4);
						dis816(*(number+(clock[1]>>4)), 7, 4);
						dis816(*(number+(clock[1]&0x0f)), 8, 4);
						dis816(blank, 10, 4);
						dis816(blank, 11, 4);
						dis816(*(number_dark+(clock[0]>>4)), 10, 4);
						dis816(*(number_dark+(clock[0]&0x0f)), 11, 4);
						break;
					case 5:
						status++;
						SetClk(clock);
						break;
					default:
						break;
				}
				break;
			case Esc:
				status = 6;
				break;
			default:
				break;
		}
		if (status > 5)
		{
			break;
		}
	}
	dis_menu();
	dis_arrow(2);
}

/***** 按键 *****/
/***************************************************************************
*	函数原型:uchar getkey(void);
*	函数功能:扫描按键,并且返回按键码。
***************************************************************************/
uchar getkey(void)
{
	uchar keycode;
	uchar i,key;
	key = (PC&0x1f);
	if (key != 0x1f)
	{
		delay(5);
		key = (PC&0x1f);
		if (key != 0x1f)
		{
			for (i=1; i<6; i++)
			{
				if ((key&0x01) == 0)
				{
					keycode = i;
					break;
				}
				key >>= 1;
			}
			while (1)
			{
				key = (PC&0x1f);
				if (key == 0x1f)
				{
					break;
				}
			}
		}
	}
	else
	{
		keycode = 0;
	}
	return keycode;
}

/***************************************************************************
*	函数原型:void color(float Ir, float Ig, float Ib, uchar i);
*	函数功能:本函数计算待测溶液颜色三刺激值及色品座标。
***************************************************************************/
void mulmatrix(float Ir, float Ig, float Ib, uchar i, K_RGB *p)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -