蓝桥杯单片机省赛题目《全集》之第九届

这届还是有一定难度的,主要处理好,数码管和小灯的显示关系,通过定时器的延时,设置一个可变的间隔时间,然后延时到就改变小灯的状态,其他的时候不改变小灯状态,也有注意这个时候处理好P0口的内容,不要影响小灯的显示,或者引起数码管的隐显。

我的pwm部分还没写,如果之后写了的话再补上吧

                               

代码应该还算简单看懂,就是设置了挺多的变量的,需要仔细看一下,看不懂的话可以随时和我交流。

#include "reg52.h"
#include "iic.h"
sbit S7 = P3 ^ 0;
sbit S6 = P3 ^ 1;
sbit S5 = P3 ^ 2;
sbit S4 = P3 ^ 3;
unsigned char code duanma[18] =//1
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f };
void display_choose();
void keys();
unsigned char led_flow = 1;

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

void HC573(unsigned char t)
{
	switch (t)
	{
	case 4:P2 = (P2 & 0x1f) | 0x80; break;2
	case 5:P2 = (P2 & 0x1f) | 0xa0; break;
	case 6:P2 = (P2 & 0x1f) | 0xc0; break;
	case 7:P2 = (P2 & 0x1f) | 0xe0; break;
	case 0:P2 = (P2 & 0x1f) | 0x00; break;
	}
}

void first()
{
	HC573(4);
	P0 = 0xff;/3
	HC573(5);
	P0 = 0x00;
	HC573(6);
	P0 = 0x00;
	HC573(7);
	P0 = 0xff;
	HC573(0);
}

void timer0()
{
	TMOD = 0x01;//4 
	TH0 = (65535 - 20000 + 1) / 256;
	TL0 = (65535 - 20000 + 1) % 256;
	ET0 = 1;
	EA = 1;

}
unsigned char t1s = 0;
unsigned char count_1 = 0;
unsigned char count_jiange = 0;
unsigned int jiange = 400;//4-12
unsigned char led_change = 0;
unsigned char led_n = 1;

void servicetimer0() interrupt 1
{
	TH0 = (65535 - 20000 + 1) / 256;
	TL0 = (65535 - 20000 + 1) % 256;//20ms
	count_1++;
	if (led_flow == 1) {
		count_jiange++;
	}
	if (count_1 == 40)
	{
		t1s++;
		if (t1s == 2) { t1s = 0; }
		count_1 = 0;
	}
	if (count_jiange >= (jiange /20))
	{
		led_n++;
		if (led_n == 9) { led_n = 1; }
		led_change = 1;
		count_jiange = 0;
	}

}
/*
void Read_rb2()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();

	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat_rb2 = IIC_RecByte();
	IIC_Ack(1);
	IIC_Stop();
	dianya = dat_rb2 * 1.961;
	if (dianya_stat == 2)
	{
		dianya = 200;
	}
}
*/
void Write_24C02(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();
}
//********?????**********

unsigned char Read_24C02(unsigned char addr)
{
	unsigned char k = 0;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();

	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	k = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return k;
}

void displayled(unsigned char pos, unsigned char value)

{
	P0 = 0xff;
	HC573(7);
	P0 = 0xff;
	HC573(6);
	P0 = 0x01 << pos;
	HC573(7);
	P0 = value;
	//hc573(0);//这里不能加

}

void displayoff()
{
	P0 = 0xff;
	HC573(7);
	P0 = 0xff;
	HC573(6);
	P0 = 0x00;
	//hc573(0);//这里不能加
}
unsigned char mode = 1;

void display_1()
{
	displayoff();
}
void display_2()
{
	if (t1s == 0)
	{
		displayled(0, duanma[16]);
		delay(500);
		displayled(1, 0xff);
		delay(500);
		displayled(2, duanma[16]);
		delay(500);
		if (jiange > 999) { displayled(4, duanma[1]); }
		else { displayled(4, 0xff); }
		delay(500);
		displayled(5, duanma[(jiange / 100) % 10]);
		delay(500);
		displayled(6, duanma[(jiange / 10) % 10]);
		delay(500);
		displayled(7, duanma[jiange % 10]);
		delay(500);
		displayoff();

	}
	else if (t1s == 1)
	{
		displayled(0, duanma[16]);
		delay(500);
		displayled(1, duanma[mode]);
		delay(500);
		displayled(2, duanma[16]);
		delay(500);
		displayled(3, 0xff);
		delay(500);
		if (jiange > 999) { displayled(4, duanma[1]); }
		else { displayled(4, 0xff); }
		delay(500);
		displayled(5, duanma[(jiange / 100) % 10]);
		delay(500);
		displayled(6, duanma[(jiange / 10) % 10]);
		delay(500);
		displayled(7, duanma[jiange % 10]);
		delay(500);
		displayoff();

	}
}
void display_3()
{
	if (t1s == 0)
	{
		displayled(0, duanma[16]);
		delay(500);
		displayled(1, duanma[mode]);
		delay(500);
		displayled(2, duanma[16]);
		delay(500);
		displayled(3, 0xff);
		delay(500);
		if (jiange > 999) { displayled(4, duanma[1]); }
		else { displayled(4, 0xff); }
		delay(500);
		displayled(5, duanma[(jiange / 100) % 10]);
		delay(500);
		displayled(6, duanma[(jiange / 10) % 10]);
		delay(500);
		displayled(7, duanma[jiange % 10]);
		delay(500);
		displayoff();

	}
	else if (t1s == 1)
	{
		displayled(0, duanma[16]);
		delay(500);
		displayled(1, duanma[mode]);
		delay(500);
		displayled(2, duanma[16]);
		delay(500);
		/*
		displayled(3, 0xff);
		delay(100);
		displayled(4, 0xff);
		delay(100);
		displayled(5, 0xff);
		delay(100);
		displayled(6, 0xff);
		delay(100);
		displayled(7, 0xff);
		delay(100);
		*/
		displayoff();

	}
}
unsigned char display_stat = 1;
unsigned char stat_led = 0xff;
unsigned char i = 0;

void led()
{
	P0 = 0xff;//这个一定要
	if (led_flow == 1)
	{
		if (mode == 1)
		{
			if (led_change == 1) {
				
				switch (led_n)
				{
				case 1:
					P0 = 0xfe;

					break;

				case 2:
					P0 = 0xfd;
					break;

				case 3:
					P0 = 0xfb;
					break;

				case 4:
					P0 = 0xf7;
					break;

				case 5:
					P0 = 0xef;
					break;

				case 6:
					P0 = 0xdf;
					break;

				case 7:
					P0 = 0xbf;
					break;

				case 8:
					P0 = 0x7f;
					break;
				}
				HC573(4);
				led_change = 0;
			}
		}
		else if (mode == 2)
			{
			if (led_change == 1) {
				switch (led_n)
				{
				case 1:
					P0 = 0x7f;
					break;

				case 2:
					P0 = 0xbf;
					break;

				case 3:
					P0 = 0xdf;
					break;

				case 4:
					P0 = 0xef;
					break;

				case 5:
					P0 = 0xf7;
					break;

				case 6:
					P0 = 0xfb;
					break;

				case 7:
					P0 = 0xfd;
					break;
				case 8:
					P0 = 0xfe;
					break;
				}
				HC573(4);
				led_change = 0;
			}

			}
		else if (mode == 3)
			{
			if (led_change == 1) {
				switch (led_n)
				{
				case 1:
					P0 = 0x7e;
					break;

				case 2:
					P0 = 0xbd;
					break;

				case 3:
					P0 = 0xdb;
					break;

				case 4:
					P0 = 0xe7;
					break;
				case 5:
					P0 = 0x7e;
					break;

				case 6:
					P0 = 0xbd;
					break;

				case 7:
					P0 = 0xdb;
					break;

				case 8:
					P0 = 0xe7;
					break;
				}
				HC573(4);
				led_change = 0;
			}
			}
		else if (mode == 4)
		{
			if (led_change == 1) {
				switch (led_n)
				{
				case 1:
					P0 = 0xe7;
					break;

				case 2:
					P0 = 0xdb;
					break;

				case 3:
					P0 = 0xbd;
					break;

				case 4:
					P0 = 0x7e;
					break;
				case 5:
					P0 = 0xe7;
					break;

				case 6:
					P0 = 0xdb;
					break;

				case 7:
					P0 = 0xbd;
					break;

				case 8:
					P0 = 0x7e;
					break;
				}
				HC573(4);
				led_change = 0;
			}
		}
	}
	else
	{
		HC573(4);
	}
	HC573(0);//小灯改完状态,也要关
}

	void display_choose()
	{
		if (display_stat == 1) { display_1(); }
		else if (display_stat == 2) { display_2(); }
		else if (display_stat == 3) { display_3(); }
		led();
	}

	void keys()
	{
		if (S7 == 0)
		{
			delay(100);
			if (S7 == 0)
			{
				led_flow++;
				if (led_flow == 2) { led_flow = 0; }

			}
			while (S7 == 0)
			{
				display_choose();
			}
		}
		if (S6 == 0)
		{
			delay(100);
			if (S6 == 0)
			{
				TR0 = 0;
				display_stat++;
				TR0 = 1;
				if (display_stat == 4)
				{
					display_stat = 1;
				}
				while (S6 == 0)
				{
					display_choose();
				}
			}
		}
		if (S5 == 0)
		{
			delay(100);
			if (S5 == 0)
			{
				if (display_stat == 2)
				{
					mode++;
					if (mode == 5) { mode = 1; }
					led_n = 0;
					count_jiange = 0;
				}
				else if (display_stat == 3)
				{
					jiange = jiange + 100;
					if (jiange > 1200) { jiange = 400; }
					Write_24C02(0x05, jiange / 100);//防止第一次取出来的时候不是100的倍数
				}
				while (S5 == 0)
				{
					display_choose();
				}
			}
		}
		if (S4 == 0)
		{
			delay(100);
			if (S4 == 0)
			{
				if (display_stat == 2)
				{
					mode--;
					if (mode == 0) { mode = 4; }
					led_n = 0;
					count_jiange = 0;
				}
				else if (display_stat == 3)
				{
					jiange = jiange - 100;
					if (jiange < 400) { jiange = 1200; }
					Write_24C02(0x05, jiange / 100);
				}
				while (S4 == 0)
				{
					display_choose();
				}
			}
		}
	}

	void main()
	{
		jiange =  Read_24C02(0x05);
		jiange = 100 * jiange;//防止第一次取出来的时候不是100的倍数
		if (jiange < 400) { jiange = 1200; }
		if (jiange > 1200) { jiange = 400; }//防止第一次取出来的数越界
		first();
		timer0();
		while (1)
		{

			//led();
			keys();
			display_choose();
		}
	}

省赛加油

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值