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

📄 c_demo.c

📁 是用51单片机检测色度色差的算法和具体实现的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			
uchar code calendar[3][4][8] = {
				{0x00,0x20,0x10,0xFC,0x13,0x12,0x12,0xFE,
				0x12,0x12,0x12,0x12,0x02,0x00,0x00,0x00,
				0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x1F,
				0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00},	/* '年' */
				{0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,
				0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
				0x00,0x00,0x10,0x0C,0x03,0x01,0x01,0x01,
				0x09,0x11,0x11,0x0F,0x00,0x00,0x00,0x00},	/* '月' */
				{0x00,0x00,0x00,0xFF,0x21,0x21,0x21,0x21,
				0x21,0x21,0x21,0xFF,0x00,0x00,0x00,0x00,
				0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,
				0x08,0x08,0x08,0x1F,0x00,0x00,0x00,0x00},	/* '日' */
			};

uchar code tris[4][4][8] = {
				{0x00,0x00,0x02,0x42,0x42,0x42,0x42,0x42,
				0x42,0x42,0x42,0x42,0x02,0x00,0x00,0x00,
				0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
				0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},	/* '三' */
				{0x00,0x74,0x14,0x14,0xFF,0x14,0x54,0x74,
				0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,0x00,
				0x00,0x04,0x02,0x01,0x1F,0x01,0x02,0x06,
				0x00,0x03,0x08,0x10,0x0F,0x00,0x00,0x00},	/* '刺' */
				{0x00,0x31,0x86,0x40,0xBE,0xAA,0xEB,0xAA,
				0xBE,0x28,0xCF,0x88,0x78,0x08,0x00,0x00,
				0x00,0x1F,0x00,0x10,0x08,0x07,0x12,0x12,
				0x0E,0x18,0x06,0x01,0x06,0x18,0x00,0x00},	/* '激' */
				{0x00,0x20,0x10,0xFC,0x03,0x02,0xFA,0xAA,
				0xAA,0xAF,0xAA,0xAA,0xFA,0x02,0x00,0x00,
				0x00,0x00,0x00,0x1F,0x00,0x08,0x0F,0x0A,
				0x0A,0x0A,0x0A,0x0A,0x0F,0x08,0x00,0x00}	/* '值' */
			};

/***** 斜率 *****/
int code slope[65]={
			20621,	20628,	20589,	20563,
			20531,	20492,	20441,	20378,	20271,
			20092,	19854,	19513,	19088,	18554,
			17860,	17037,	16038,	14833,	13169,
			11019,	8289,	5011,	1330,	-2562,
			-6308,	-9760,
		
			-7661,	-6149,	-5174,
			-4445,	-3779,	-3131,	-2463,	-1726,
			-883,	122,	1366,	2941,	5004,
			7784,
		
			8554,	5725,	3757,	2344,
			1334,	574,	21,	-392,	-697,
			-925,	-1102,	-1245,	-1358,	-1444,
			-1510,	-1559,	-1595,	-1618,	-1637,
			-1652,	-1667,	-1679,	-1687,	-1692,
			-1694
		};

/***** 函数声明 *****/
/*延时*/
void wait(void);
void delay(uchar time);
/* 液晶 */
void funcreg1(uchar command);
void disdata1(uchar value);
void funcreg2(uchar command);
void disdata2(uchar value);
void initlcd(void);
void clslcd(void);
void dis68(uchar *s, uchar x, uchar y);
void dis88(uchar *s, uchar x, uchar y);
void dis816(uchar (*s)[8], uchar x, uchar y);
void dis1616(uchar (*s)[8], uchar x, uchar y);
uchar dis_int(uint disnum, uchar x, uchar y);
void dis_float(float disnum, uchar x, uchar y);
/* 显示 */
void dis_cover(void);
void dis_menu(void);
void dis_arrow(uchar y);
void dis_sample(void);
void dis_samples(uchar num);
void dis_wait(void);
void dis_result(void);
void dis_clock(uchar *pclk);
/* DS1302 */
void WrByte(uchar val);
uchar RdByte(void);
void WrData(uchar addr, uchar value);
uchar RdData(uchar addr);
void SetClk(uchar *pClk);
void GetClk(uchar *pClk);
/* TLC1549 */
uint adconvert(void);
/* 计算 */
void color(float Ir, float Ig, float Ib, uchar i);
uint measure(uchar led);
float Eab(void);
float Euv(void);
int wavelength(float x, float y);
uchar wl_num(uchar n1, uchar n2, long k);
/* 操作 */
void init(void);
void MeaC(void);
void MeaC1(void);
void MeaC2(void);
void MeaC3(void);
void all_result(uchar i);
void C_result(void);
void Cp_result(void);
void Wl_result(void);
void MeaE(void);
void MeaE1(void);
void MeaE2(void);
void MeaE3(void);
void MeaE4(void);
void ChangeTime(void);
/* KEY */
uchar getkey(void);
/* 其他 */
uchar B_BCD(uchar val);
uchar BCD_B(uchar val);
float tqrt(float x);
/* 主函数 */
void main(void);

/***************************************************************************
*	函数原型:void wait(void);
*	函数功能:短时间延时程序。
***************************************************************************/
void wait(void)
{ 
	uchar i;
	for (i=0; i<1; i++);
}

/***************************************************************************
*	函数原型:void delay(uchar time);
*	函数功能:长时间延时程序。
***************************************************************************/
void delay(uchar time)
{
	uchar i,j,k;
	for (i=0; i<time; i++)
		for (j=0; j<109; j++)
			for (k=0; k<40; k++);
}

/***** MG-12864-5液晶模块 *****/
/***************************************************************************
*	函数原型:void funcreg1(uchar command);
*	函数功能:CS1 = 0,CS2 = 1时对液晶模块写命令。
***************************************************************************/
void funcreg1(uchar command)
{
	PB = 0x08;
	PB = 0x18;
	PA = command;
	PB = 0x08;
}

/***************************************************************************
*	函数原型:void disdata1(uchar digit);
*	函数功能:CS1 = 0,CS2 = 1时对液晶模块写数据。
***************************************************************************/
void disdata1(uchar value)
{
	PB = 0x08;
	PB = 0x19;
	PA = value;
	PB = 0x09;
	PB = 0x08;
}

/***************************************************************************
*	函数原型:void funcreg2(uchar command);
*	函数功能:CS1 = 1,CS2 = 0时对液晶模块写命令。
***************************************************************************/
void funcreg2(uchar command)
{
	PB = 0x04;
	PB = 0x14;
	PA = command;
	PB = 0x04;
}

/***************************************************************************
*	函数原型:void disdata2(uchar digit);
*	函数功能:CS1 = 1,CS2 = 0时对液晶模块写数据。
***************************************************************************/
void disdata2(uchar value)
{
	PB = 0x04;
	PB = 0x15;
	PA = value;
	PB = 0x05;
	PB = 0x04;
}

/***************************************************************************
*	函数原型:void initlcd(void);
*	函数功能:初始化LCD。
***************************************************************************/
void initlcd(void)
{
	delay(30);
	COM8155 = 0x03; 	/*PA口输出;PB口输出;PC口输入*/
	funcreg1(0x3f);		/*开显示区1*/
	funcreg2(0x3f);		/*开显示区2*/
	funcreg1(0xc0);		/*设置显示区1起始行为0*/
	funcreg2(0xc0);		/*设置显示区2起始行为0*/
}

/***************************************************************************
*	函数原型:void clslcd(void);
*	函数功能:清空LCD显示区。
***************************************************************************/
void clslcd(void)
{
	uchar i,j;
	for (i=0xb8; i<=0xbf; i++)
	{
		funcreg1(0x40);
		funcreg2(0x40);		/*设置Y地址*/
		funcreg1(i); 
		funcreg2(i);		/*设置X地址*/
		for (j=0; j<64; j++)
		{
			disdata1(0x00);
			disdata2(0x00); 
		}
	}
	delay(8);
}

/***************************************************************************
*	函数原型:void dis68(uchar *s, uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个6×8字符,x在0到20之间,y在0到7之间。
***************************************************************************/
void dis68(uchar *s,uchar x,uchar y)
{
	uchar i;
	if((x<10)&&(x>=0))
	{
		funcreg1(0xb8+y); 
		funcreg1(0x43+x*6);
		for(i=0;i<5;i++)
		{
			disdata1(*(s+i));
		}
	}
	else if((x>=10)&&(x<20))
	{
		funcreg2(0xb8+y); 
		funcreg2(0x40+6*(x-10));
		for(i=0;i<5;i++)
		{ 
			disdata2(*(s+i));
		}
	}
}

/***************************************************************************
*	函数原型:void dis88(uchar *s, uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个8×8字符,x在0到15之间,y在0到7之间。
***************************************************************************/
void dis88(uchar *s, uchar x, uchar y)
{
	uchar i;
	if ((x>=0)&&(x<8))
	{
		funcreg1(0xb8+y);
		funcreg1(0x40+x*8);
		for (i=0; i<8; i++)
		{
			disdata1(*(s+i));
		}
	}
	if ((x>=8)&&(x<16))
	{
		funcreg2(0xb8+y);
		funcreg2(0x40+(x - 8)*8);
		for (i=0; i<8; i++)
		{
			disdata2(*(s+i));
		}
	}
}

/***************************************************************************
*	函数原型:void dis816(uchar (*s)[8], uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个8×16字符,x在0到15之间,y在0到6之间。
***************************************************************************/
void dis816(uchar (*s)[8], uchar x, uchar y)
{
	dis88(*s, x, y);
	dis88(*(s+1), x, y+1);
}

/***************************************************************************
*	函数原型:void dis1616(uchar (*s)[8], uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个16×16字符,x在0到14之间,y在0到6之间。
***************************************************************************/
void dis1616(uchar (*s)[8], uchar x, uchar y)
{
	dis88(*s, x, y);
	dis88(*(s+1), x+1, y);
	dis88(*(s+2), x, y+1);
	dis88(*(s+3), x+1, y+1);
}

/***************************************************************************
*	函数原型:uchar dis_int(uint disnum, uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个0--65535的整数,并返回位数。
*		x在0到15之间,y在0到6之间。
***************************************************************************/
uchar dis_int(uint disnum, uchar x, uchar y)
{
	uchar i, j;
	uchar temp;
	
	if (disnum == 0)
	{
		j = 1;
		dis816(*number, x, y);
	}
	else
	{
		if (disnum >= 10000)
		{
			j = 5;
		}
		else if (disnum >= 1000)
			{
				j = 4;
			}
			else if (disnum >= 100)
				{
					j = 3;
				}
				else if (disnum >=10)
					{
						j = 2;
					}
					else
					{
						j = 1;
					}
		
		for (i=1; i<=j; i++)
		{
			temp = disnum % 10;
			disnum /= 10;
			dis816(*(number+temp), x+j-i, y);
		}
	}
	return j;
}

/***************************************************************************
*	函数原型:void dis_float(float disnum, uchar x, uchar y);
*	函数功能:在LCD的(x,y)位置显示一个0--1的整数,保留小数点后3位,
*		x在0到15之间,y在0到6之间。
***************************************************************************/
void dis_float(float disnum, uchar x, uchar y)
{
	uchar i, j;

	j = dis_int((uint)disnum, x, y);
	dis816(dot, x+j, y);
	for(i=1; i<=3; i++)
	{
		disnum -= (uint)disnum;
		disnum *= 10;
		dis816(*(number+(uint)disnum), x+j+i, y);
	}
}


/***** 屏幕 *****/
/***************************************************************************
*	函数原型:void dis_cover(void);
*	函数功能:显示开机画面。
***************************************************************************/
void dis_cover(void)
{
	uchar i;
	clslcd();
	dis1616(icon, 1, 0);
	for (i=0; i<3; i++)
	{
		dis816(*(ver+i), 10+i, 0);
	}
	dis816(*(number_s+1), 13, 0);
	dis816(dot_s, 14, 0);
	dis816(*number_s, 15, 0);
	dis1616(*(title_big), 1, 3);
	dis1616(*(title_big+1), 4, 3);
	dis1616(*(title_big), 7, 3);
	dis1616(*(title_big+2), 10, 3);
	dis1616(*(title_big+3), 13, 3);
	for (i=0; i<6; i++)
	{
		dis1616(*(company+i), 2+2*i, 6);
	}
}

/***************************************************************************
*	函数原型:void dis_menu(void);
*	函数功能:显示“选项”。
***************************************************************************/
void dis_menu(void)
{
	uchar i;
	clslcd();
	for (i=0; i<3; i++)
	{
		dis1616(*(menu+i), 5+2*i, 0);
	}
	dis1616(*title, 4, 2);
	dis1616(*(title+1), 6, 2);
	dis1616(*(sample+6), 8, 2);
	dis1616(*result, 10,2);
	dis1616(*title, 4, 4);
	dis1616(*(title+2), 6, 4);
	dis1616(*(sample+6), 8, 4);
	dis1616(*result, 10,4);	
	for (i=0; i<4; i++)
	{
		dis1616(*(settime+i), 4+2*i, 6);
	}	
}

/***************************************************************************
*	函数原型:void dis_arrow(uchar y);
*	函数功能:显示箭头。
***************************************************************************/
void dis_arrow(uchar y)
{
	uchar i;
	for (i=0; i<3; i++)
	{
		dis816(blank, 2, 2+2*i);
	}
	dis816(arrow, 2, 2+2*y);
}

/***************************************************************************
*	函数原型:void dis_blank(void);
*	函数功能:显示“请放入空白样品”。
***************************************************************************/
void dis_blank(void)
{
	uchar i;
	clslcd();
	for (i=0; i<5; i++)
	{
		dis1616(*(sample+i), 1+2*i, 2);
	}
	for (i=7; i<9; i++)
	{
		dis1616(*(sample+i), 2*i-3, 2);
	}
	for (i=0; i<6; i++)
	{
		dis1616(*(next+i), 2+2*i, 5);
	}
}

/***************************************************************************
*	函数原型:void dis_sample(void);
*	函数功能:显示“请放入待测样品”。
***************************************************************************/
void dis_sample(void)
{
	uchar i;
	clslcd();
	for (i=0; i<3; i++)
	{
		dis1616(*(sample+i), 1+2*i, 2);
	}
	for (i=5; i<9; i++)
	{
		dis1616(*(sample+i), 2*i-3, 2);
	}
	for (i=0; i<6; i++)

⌨️ 快捷键说明

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