【蓝桥杯省赛九届-彩灯控制】

蓝桥杯省赛九届-彩灯控制

ss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aWL5paX55qE5bCP5q63,size_20,color_FFFFFF,t_70,g_se,x_16)
在这里插入图片描述

在这里插入图片描述


/**********************************************************
*Date:2022-2-22
*Author:小殷同学
*Version:1.0
**********************************************************/

# include "reg52.h"
# include "iic.h"
# include "absacc.h"

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

unsigned int rb2 = 0;								//存放读取的Rb2的数据
unsigned char mode = 1;								//流水灯模式
unsigned int interval[4] = {
    
    400,400,400,400};		//4种模式流水灯的流转间隔
unsigned char bright_grade = 4;		 				//led灯的亮度等级
unsigned char led_mode[24] = {
    
    0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};		   //24种led流转模式
unsigned char duanma[18] = {
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};			   //段码值
unsigned char led_stat = 0;			 				//led模式对应的索引值
unsigned int count = 0;              				//定时器T0的计数变量
unsigned char k7 = 0;                				//k7的标志位
unsigned char k6 = 0;				 				//k6的标志位
unsigned int smg_c = 0;				 				//定时器数码管计数变量
unsigned char smg_f = 0;			 				//数码管闪烁标志变量
unsigned char pwm_t = 100;			 				//脉宽占空比
unsigned int pwm_c = 0;				 				//脉宽计数变量
unsigned char pwm_f = 1;			 				//灯亮灭标志变量

void ExecuteRb2 ();
void LEDRunning ();

//======================初始化函数=========================
void InitSystem()
{
    
    
	XBYTE[0x8000] = 0xff;
	XBYTE[0xa000] = 0x00;
}
//=========================================================

//====================24C02数据读写操作====================
unsigned char Read24C02(unsigned char addr)
{
    
    
	unsigned char tmp;

	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	tmp = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	return tmp;	
}

void Write24C02 (unsigned char addr,unsigned char dat)
{
    
    
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();		
}
//=========================================================

//====================读取Rb2电位器的值====================
void Readrb2 ()
{
    
    
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	rb2 = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();	
}
//=========================================================

//=====================数码管显示函数======================
void ShowSMG_bit (unsigned char pos,unsigned char dat)
{
    
    
	XBYTE[0xc000] = 0x01 << pos - 1;
	XBYTE[0xe000] = dat;
}

void Delay_SMG (unsigned int t)
{
    
    
	while (t--);	
}

void AllSMG(unsigned char dat)
{
    
    
	XBYTE[0xe000] = 0xff;
	XBYTE[0xc000] = 0xff;
	XBYTE[0xe000] = dat;	
}

void ShowSMG_M ()
{
    
    
	ShowSMG_bit(1,duanma[16]);
	Delay_SMG(500);
	if (((k6 == 1) & (smg_f == 1)) | (k6 == 0) | (k6 == 2))
	{
    
    
		ShowSMG_bit(2,duanma[mode]);
		Delay_SMG(500);		
	}
	ShowSMG_bit(3,duanma[16]);
	Delay_SMG(500);
	ShowSMG_bit(4,0xff);
	Delay_SMG(500);
	if (((k6 == 2) & (smg_f == 1)) | (k6 == 0) | (k6 == 1))
	{
    
    
		if (interval[mode - 1] > 999)
		{
    
    
			ShowSMG_bit(5,duanma[interval[mode - 1] / 1000]);
			Delay_SMG(500);	
		}
		ShowSMG_bit(6,duanma[(interval[mode - 1] / 100) % 10]);
		Delay_SMG(500);
		ShowSMG_bit(7,duanma[(interval[mode - 1] / 10) % 10]);
		Delay_SMG(500);
		ShowSMG_bit(8,duanma[interval[mode - 1] % 10]);
		Delay_SMG(500);		
	}
	AllSMG(0xff);
}

void ShowSMG_L ()
{
    
    
	ShowSMG_bit(1,0xff);
	Delay_SMG(500);
	ShowSMG_bit(2,0xff);
	Delay_SMG(500);	
	ShowSMG_bit(3,0xff);
	Delay_SMG(500);
	ShowSMG_bit(4,0xff);
	Delay_SMG(500);
	ShowSMG_bit(5,0xff);
	Delay_SMG(500);	
	ShowSMG_bit(6,duanma[16]);
	Delay_SMG(500);
	ShowSMG_bit(7,duanma[bright_grade]);
	Delay_SMG(500);
	ShowSMG_bit(8,duanma[16]);
	Delay_SMG(500);
	AllSMG(0xff);
}
//=========================================================

//=====================定时器T0 100us======================
void InitTime0 ()
{
    
    
	TMOD = 0x01;

	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;

	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

void ServiceTime0 () interrupt 1
{
    
    
	TH0 = (65535 - 100) / 256;
	TL0 = (65535 - 100) % 256;

	if (k7 == 1)
	{
    
    
		count++;	
	}
	if (count >= (interval[mode - 1] * 10))
	{
    
    
		led_stat++;
		count = 0;
	}

	smg_c++;
	if (smg_c >= 5000)
	{
    
    
		smg_c = 0;
		if (smg_f == 0)
		{
    
    
			smg_f = 1;
		}
		else if (smg_f == 1)
		{
    
    
			smg_f = 0;
		}
	}

	pwm_c++;
	if (pwm_c >= pwm_t)
	{
    
    
		pwm_f = 0;
		if (pwm_c >= 100)
		{
    
    
			pwm_c = 0;
			pwm_f = 1;	
		}
	}
}
//=========================================================

//=====================浏览按键============================
void Delay_Key (unsigned char t)
{
    
    
	while (t--);
}

void ScanKey ()
{
    
    
	if (S7 == 0)
	{
    
    
		Delay_Key(100);
		if (S7 == 0)
		{
    
    
			while(S7 == 0)
			{
    
    
				ShowSMG_M ();
			}
			if (k7 == 0)
			{
    
    
				k7 = 1;
			}
			else if (k7 == 1)
			{
    
    
				k7 = 0;	
			}
		}	
	}
	else if (S6 == 0)
	{
    
    
		Delay_Key(100);
		if (S6 == 0)
		{
    
    
			while(S6 == 0)
			{
    
    
				ShowSMG_M ();	
			}
			if (k6 == 0)
			{
    
    
				k6 = 1;
			}
			else if (k6 == 1)
			{
    
    
				k6 = 2;
			}
			else if (k6 == 2)
			{
    
    
				k6 = 0;
			}
		}	
	}
	else if (S5 == 0)
	{
    
    
		Delay_Key(100);
		if (S5 == 0)
		{
    
    
			while(S5 == 0)
			{
    
    
				ShowSMG_M ();
			}
			if (k6 == 1)
			{
    
    
				mode++;
				if (mode >= 4)
				{
    
    
					mode = 4;
				}
			}
			else if (k6 == 2)
			{
    
    
				interval[mode - 1] = interval[mode - 1] + 100;
				if (interval[mode - 1] >= 1200)
				{
    
    
					interval[mode - 1] = 1200;
				}
				if (mode == 1)
				{
    
    
					Write24C02(0x00,interval[mode - 1] / 10);	
				}
				else if (mode == 2)
				{
    
    
					Write24C02(0x01,interval[mode - 1] / 10);	
				}
				else if (mode == 3)
				{
    
    
					Write24C02(0x02,interval[mode - 1] / 10);	
				}
				else if (mode == 4)
				{
    
    
					Write24C02(0x03,interval[mode - 1] / 10);	
				}
			}
		}	
	}
	else if (S4 == 0)
	{
    
    
		Delay_Key(100);
		if (S4 == 0)
		{
    
    
			if (k6 == 0)
			{
    
    
				while(S4 == 0)
				{
    
    
					ExecuteRb2 ();
					LEDRunning ();
					ShowSMG_L ();	
				}	
			}
			else if (k6 == 1)
			{
    
    
				while(S4 == 0)
				{
    
    
					ShowSMG_M ();	
				}
				mode = mode -1;
				if (mode <=1)
				{
    
    
					mode = 1;
				}
			}
			else if (k6 == 2)
			{
    
    
				while(S4 == 0)
				{
    
    
					ShowSMG_M ();	
				}
				interval[mode - 1] = interval[mode - 1] - 100;
				if (interval[mode - 1] <= 400)
				{
    
    
					interval[mode - 1] = 400;
				}
				if (mode == 1)
				{
    
    
					Write24C02(0x00,interval[mode - 1] / 10);	
				}
				else if (mode == 2)
				{
    
    
					Write24C02(0x01,interval[mode - 1] / 10);	
				}
				else if (mode == 3)
				{
    
    
					Write24C02(0x02,interval[mode - 1] / 10);	
				}
				else if (mode == 4)
				{
    
    
					Write24C02(0x03,interval[mode - 1] / 10);	
				}
			}
		}	
	}
}
//=========================================================

//=======================LED工作===========================
void LEDRunning ()
{
    
    
	if (mode == 1)
	{
    
    
		if (led_stat > 7)
		{
    
    
			led_stat = 0;
		}
		if (pwm_f == 1)
		{
    
    
			XBYTE[0x8000] = led_mode[led_stat];	
		}
		else if (pwm_f == 0)
		{
    
    
			XBYTE[0x8000] = 0xff;	
		}
	}
	else if (mode == 2)
	{
    
    
		if (led_stat < 8 | led_stat > 15)
		{
    
    
			led_stat = 8;
		}
		if (pwm_f == 1)
		{
    
    
			XBYTE[0x8000] = led_mode[led_stat];	
		}
		else if (pwm_f == 0)
		{
    
    
			XBYTE[0x8000] = 0xff;	
		}
	}
	else if (mode == 3)
	{
    
    
		if (led_stat < 16 | led_stat > 19)
		{
    
    
			led_stat = 16;
		}
		if (pwm_f == 1)
		{
    
    
			XBYTE[0x8000] = led_mode[led_stat];	
		}
		else if (pwm_f == 0)
		{
    
    
			XBYTE[0x8000] = 0xff;	
		}
	}
	else if (mode == 4)
	{
    
    
		if (led_stat < 20 | led_stat > 23)
		{
    
    
			led_stat = 20;
		}
		if (pwm_f == 1)
		{
    
    
			XBYTE[0x8000] = led_mode[led_stat];	
		}
		else if (pwm_f == 0)
		{
    
    
			XBYTE[0x8000] = 0xff;	
		}
	}
}
//=========================================================

//=====================处理rb2的值=========================
void ExecuteRb2 ()
{
    
    
	Readrb2 ();
	if (rb2 <= 60)
	{
    
    
		bright_grade = 1;
		pwm_t = 25;	
	}
	else if ((rb2 > 60) & (rb2 <= 120))
	{
    
    
		bright_grade = 2;
		pwm_t = 50;	
	}
	else if ((rb2 > 120) & (rb2 <= 180))
	{
    
    
		bright_grade = 3;
		pwm_t = 75;	
	}
	else if (rb2 > 180)
	{
    
    
		bright_grade = 4;
		pwm_t = 100;	
	}
}
//=========================================================

//========================主函数===========================
void main (void)
{
    
    
	InitSystem();
	interval[0] = Read24C02(0x00) * 10;
	interval[1] = Read24C02(0x01) * 10;
	interval[2] = Read24C02(0x02) * 10;
	interval[3] = Read24C02(0x03) * 10;
	InitTime0 ();
	while (1)
	{
    
    
		ExecuteRb2 ();
		ScanKey ();
		if (k7 == 1)
		{
    
    
			LEDRunning ();	
		}
		else if (k7 == 0)
		{
    
    
			XBYTE[0x8000] = 0xff;
		}
		ShowSMG_M ();	
	}
}
//=========================================================
                       

猜你喜欢

转载自blog.csdn.net/boybs/article/details/123078851