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

师从小蜜蜂,代码简单易懂,

 

 

#include "reg52.h"
#include "iic.h"
sfr P4 = 0xC0;
sbit R1 = P3 ^ 0;
sbit R2 = P3 ^ 1;
sbit R3 = P3 ^ 2;
sbit R4 = P3 ^ 3;
sbit C4 = P3 ^ 4;
sbit C3 = P3 ^ 5;
sbit C2 = P4 ^ 2;
sbit C1 = P4 ^ 4;
unsigned int AIN3;///必须int
unsigned int SET = 0;
unsigned int key_cnt = 0;//无效按键
unsigned int display_stat = 1;
unsigned char dat_rb2;
unsigned char cnt_5s = 0;
unsigned int equ_cnt = 0;//等于设定值计数
unsigned int flag = 2;
unsigned char L1_stat = 0;
unsigned char stat_L3 = 0;
unsigned char P0_stat = 0Xff;
unsigned char code smg_duanma[18] =
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f };
unsigned char code dian_duanma[10] =
{ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10 };
void display_choose();
void LED();

void delay(unsigned char t)
{
	while (t--);
}
void delay_display(unsigned char t)
{
	while (t--);
	display_choose();
}
void HC573(unsigned char n)
{
	switch (n)
	{
	case 4:P2 = (P2 & 0x1f) | 0x80; break;
	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(5);
	P0 = 0x00;
	HC573(4);
	P0 = 0xff;
	HC573(5);
	P0 = 0x00;
	HC573(6);
	P0 = 0xff;
	HC573(5);
	P0 = 0x00;
	HC573(7);
	P0 = 0xff;
	flag = 2;
	key_cnt = 0;
}
void display_led(unsigned char value, unsigned char pos)
{
	HC573(7);//防止按键时小灯暗
	P0 = 0xff;/关键
	HC573(6);
	P0 = 0x01 << pos;
	HC573(7);
	P0 = value;
}
//********三种显示界面切换**************
void display_1()
{
	display_led(smg_duanma[AIN3 % 10], 7);
	delay(500);
	display_led(smg_duanma[(AIN3 / 10) % 10], 6);
	delay(500);
	display_led(dian_duanma[AIN3 / 100], 5);
	delay(500);
	display_led(0xff, 4);
	delay(500);
	display_led(0xff, 3);
	delay(500);
	display_led(0xff, 2);
	delay(500);
	display_led(0xff, 1);
	delay(500);
	display_led(0xc1, 0);
	delay(500);
	HC573(7);
	P0 = 0xff;
}
void display_2()
{

	display_led(smg_duanma[SET % 10], 7);
	delay(500);
	display_led(smg_duanma[(SET / 10) % 10], 6);
	delay(500);
	display_led(dian_duanma[SET / 100], 5);
	delay(500);
	display_led(0xff, 4);
	delay(500);
	display_led(0xff, 3);
	delay(500);
	display_led(0xff, 2);
	delay(500);
	display_led(0xff, 1);
	delay(500);
	display_led(0x8c, 0);
	delay(500);
	HC573(7);
		P0 = 0xff;
}
void display_3()
{
	display_led(smg_duanma[equ_cnt % 10], 7);
	delay(500);
	if (equ_cnt > 9)
	{
		display_led(smg_duanma[(equ_cnt / 10) % 10], 6);
		delay(500);
	}
	if (equ_cnt > 99)
	{
		display_led(smg_duanma[equ_cnt / 100], 5);
		delay(500);
	}
	display_led(0xff, 4);
	delay(500);
	display_led(0xff, 3);
	delay(500);
	display_led(0xff, 2);
	delay(500);
	display_led(0xff, 1);
	delay(500);
	display_led(0x89, 0);
	delay(500);
	HC573(7);
	P0 = 0xff;
}
void display_choose()
{
	if (display_stat == 1) { display_1(); }
	else if (display_stat == 2) { display_2(); }
	else if (display_stat == 3) { display_3(); }
	LED();
}
//************定时5s***********
void timer0()
{
	TMOD = 0x01;
	TH0 = (65535 - 50000) / 256;//50ms定时
	TL0 = (65535 - 50000) % 256;
	ET0 = 1;
	EA = 1;

}
void servicetimer() interrupt 1
{
	TH0 = (65535 - 50000) / 256;
	TL0 = (65535 - 50000) % 256;
	cnt_5s++;
	if (cnt_5s == 100)
	{
		L1_stat = 1;
	}
}
//***************rb2电压A/D转化*************
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();
	AIN3 = dat_rb2 * 1.961;
}
//********存储器写入**********
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)
{
	int 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_Ack(1);
	IIC_Stop();
	return k;
}
void scankey()
{
	R1 = 0;
	R2 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;

	if (C1 == 0)//S11
	{
		delay(10);
		if (C1 == 0)
		{
			if (display_stat == 2)
			{
				key_cnt = 0;
				stat_L3 = 0;
				SET = SET + 50;
				if (SET > 500)
				{
					SET = 0;

				}
			}
			else 
			{	key_cnt++; 
				if (key_cnt >= 3)
				{
				stat_L3 = 1;
				}
			}
			while (C1 == 0)
			{
				display_choose();
			}
		}
	}
	else if (C2 == 0)//S15
	{
		delay(10);
		if (C2 == 0)
		{
			if (display_stat == 2)
			{
				key_cnt = 0;
				stat_L3 = 0;
				SET = SET - 50;
				if (SET < 0)
				{SET = 500;}
				
			}
			else 
			{ 
				key_cnt++; 
				if (key_cnt >= 3)
				{stat_L3 = 1;}
			}
			
		}
		while (C2 == 0)
		{
			display_choose();
		}
	}
	R2 = 0;
	R1 = R3 = R4 = 1;
	C1 = C2 = C3 = C4 = 1;
	if (C1 == 0)//S7
	{
		delay(10);
		if (C1 == 0)
		{
			key_cnt = 0;
			stat_L3 = 0;
			display_stat++;
			if (display_stat == 4)
			{
				display_stat = 1;
			}

			if (display_stat == 3)
			{
				Write_24C02(0x01, (SET / 10));
			}
		}
		while (C1 == 0)
		{
			display_choose();
		}
	}
	
	else if (C2 == 0)//S19
	{
		delay_display(1000);
		if (C2 == 0)
		{
			if (display_stat == 3)
			{
				equ_cnt = 0;
				key_cnt = 0;
				stat_L3 = 0;
			}
			else { 
				key_cnt++; 
				
			if (key_cnt >= 3)
			{
				stat_L3 = 1;
			}
			
			}
		}
		while (C2 == 0)
		{
			display_choose();
		}
	}
}
void timer_5s()
{
	if (AIN3 < SET)
	{
		TR0 = 1;

	}
	else {
		TR0 = 0;
		cnt_5s = 0;
		L1_stat = 0;
	}
}
void LED()
{
	HC573(4);
	P0 = 0xff;
	if (L1_stat == 1) {
		P0_stat = (P0_stat & 0xfe); P0 = P0_stat;
	}
	else { P0_stat = (P0_stat | 0x01); P0 = P0_stat; }
	if ((equ_cnt % 2) == 1) {
		P0_stat = P0_stat & 0xfd; P0 = P0_stat;
	}
	else { P0_stat = (P0_stat | 0x02); P0 = P0_stat; }
	if (stat_L3==1) {
		P0_stat = P0_stat & 0xfb; P0 = P0_stat;
	}
	else { P0_stat = (P0_stat | 0x04); P0 = P0_stat; }
	delay(1000);
}

void cnt()
{
	if (AIN3 > SET)
	{
		if (flag == 0) { equ_cnt++; }
		flag = 1;
		delay(1000);
	}
	else if (AIN3 < SET)
	{
		if (flag == 1) { equ_cnt++; }
		flag = 0;
		delay(1000);
	}
}


void main()
{
	first();
	timer0();

	SET = Read_24C02(0x01); 
	SET = 10 * SET;
	while (1)
	{
		Read_rb2();
		cnt();
		timer_5s();
		scankey();
		display_choose();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值