蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)

一、前言:

        这届赛题我认为是非常简单的一届赛题,看来第一场的难度普遍是低于第二场的难度,本届赛题没有什么难度。闲话少数直接上。已经将所有的资料0积分上传,题目在资料里有,需要的自取

二、题目

蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)_第1张图片

蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)_第2张图片 

蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)_第3张图片 蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)_第4张图片

蓝桥杯的被圈钱之旅(二):第十二届第一场(电子类)_第5张图片 

三、 代码展示

因为文章篇幅原因,这里不展示全部代码,所有资料都已经0积分上传。

一、矩阵键盘key.c

#include "key.h"
#include "delay.h"
//
unsigned char key_sign=0;
unsigned char mode_dis=0;
unsigned char mode_set=0;
unsigned char temp_tb=25;
extern unsigned char temp_set;
//
sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
//
sbit L1=P4^4;
sbit L2=P4^2;
sbit L3=P3^4;
sbit L4=P3^5;
//
void key_scan()
{
	H1=H2=H3=L1=L2=L3=L4=1;H4=0;
	if(L1==0)
	{
		Delay100us();
		if(L1==0)
		{
			key_sign=4;
		}
		while(!L1);
	}
	if(L2==0)
	{
		Delay100us();
		if(L2==0)
		{
			key_sign=8;
		}
		while(!L2);
	}
	H1=H2=H4=L1=L2=L3=L4=1;H3=0;
	if(L1==0)
	{
		Delay100us();
		if(L1==0)
		{
			key_sign=5;
		}
		while(!L1);
	}
	if(L2==0)
	{
		Delay100us();
		if(L2==0)
		{
			key_sign=9;
		}
		while(!L2);
	}
	//
	if(key_sign==4)
	{
		key_sign=0;
		mode_dis=mode_dis+1;
		if(mode_dis>=3)
		{
			mode_dis=0;
		}
	}
	if(key_sign==8&&mode_dis==1)
	{
		key_sign=0;
		temp_tb=temp_tb-1;
	}
		if(key_sign==9&&mode_dis==1)
	{
		key_sign=0;
		temp_tb=temp_tb+1;
	}
	if(key_sign==5)
	{
		key_sign=0;
		mode_set^=1;
	}
	if(mode_dis!=1)
	{
		temp_set=temp_tb;
	}
	//
}

二、ds18b20温度传感器

#include "temp.h"
extern unsigned char smgBuffer[10];
extern unsigned char font[10];
int temp;
int temp_int;
unsigned char temp_set=25;
extern unsigned char temp_tb;
void read_temp()
{
	int tp;
	int tl,th;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	tl= Read_DS18B20();
	th= Read_DS18B20();
	tp=th<<8|tl;
	temp=(tp>>2)*25;
	temp_int=(temp/1000&10)*10+(temp/100%10);
}
void temp_dis()
{
	smgBuffer[0]=0xc6;//1100 0110
	smgBuffer[1]=0xff;
	smgBuffer[2]=0xff;
	smgBuffer[3]=0xff;
	smgBuffer[4]=font[temp/1000%10];
	smgBuffer[5]=font[temp/100%10]&0x7f;
	smgBuffer[6]=font[temp/10%10];
	smgBuffer[7]=font[temp%10];
}
void temp_set_dis()
{
	smgBuffer[0]=0x8c;//1000 1100
	smgBuffer[1]=0xff;
	smgBuffer[2]=0xff;
	smgBuffer[3]=0xff;
	smgBuffer[4]=0xff;
	smgBuffer[5]=0xff;
	smgBuffer[6]=font[temp_tb/10];
	smgBuffer[7]=font[temp_tb%10];
}

三、LED.C

因为博主这边喜欢用bdata片内寻址来操作led,所以经常这个.c文件会混入一些定时器中断的函数,比如这次因为考察的重点是矩阵键盘松开及响应,这边博主又比较喜欢这种while判断的方式,之后这边便直接使用中断来打断while循环的操作,主函数while循环只放矩阵键盘。其他的工作交给定时器中断来打断循环操作。
 

#include "led.h"
#include "delay.h"
#include "buffer.h"
#include "delay.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "temp.h"
#include "adda.h"
#include "timing.h"
//
extern unsigned char key_sign;
//
extern unsigned char mode_dis;
extern unsigned char mode_set;
//
extern unsigned char temp_set;
extern int temp_int;
extern int temp;
//
extern long int dianya;
//
unsigned char bdata led=0,out=0;
sbit L1=led^0;
sbit L2=led^1;
sbit L3=led^2;
sbit L4=led^3;
sbit L5=led^4;
sbit L6=led^5;
sbit L7=led^6;
sbit L8=led^7;
sbit relay=out^4;
sbit buzz=out^6;
//
extern unsigned char key_sign;
//
void led_init()
{
	P2&=0x1f;
	P0=0xff;
	P2|=Y4;
	P2&=0x1f;
}
void led_dis()
{
	P2&=0x1f;
	P0=~led;
	P2|=Y4;
	P2&=0x1f;
}

void out_dis()
{
	P2&=0x1f;
	P0=out;
	P2|=Y5;
	P2&=0x1f;
}
void mode_define()
{
	//
	if(mode_dis==0)
	{
			temp_dis();
			L2=1;
			L3=0;
			L4=0;
	}
	if(mode_dis==1)
	{
			temp_set_dis();
			L2=0;
			L3=1;
			L4=0;
	}
	if(mode_dis==2)
	{
			dac_dis();
		  L2=0;
			L3=0;
			L4=1; 
	}
	//
	if(mode_set==0)
	{
		L1=1;
		if(temp_int>=temp_set)
		{
			dianya=500;
		}
		if(temp_int=4000)
		{
			dianya=400;
		}
		if(temp>2000&&temp<4000)
		{
			dianya=100+(0.15*(temp-2000));
		}
	}
}
void T0_irq() interrupt 1
{
	 DAC();
	 buffer_dis();
	 led_dis();
	 out_dis();
	 mode_define();
	 read_temp();
}




四、ADDA.C

这部分主要是写ADC和DAC的

#include "adda.h"
extern unsigned char smgBuffer[10];
extern unsigned char font[10];
unsigned long int dianya=0;
unsigned int dianweiqi;
void DAC()
{
	unsigned char d;
	d=dianya*(255/500);
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(d);
	IIC_WaitAck();
	IIC_Stop();
}
void ADC()
{
	unsigned char a;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x43);
	IIC_WaitAck();
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	IIC_RecByte();
	IIC_SendAck(0);
	a=IIC_RecByte();
	dianweiqi=a*(500/255);
	IIC_SendAck(1);
	IIC_Stop(); 
}
void dac_dis()
{
	smgBuffer[0]=0x88;//1000 1000
	smgBuffer[1]=0xff;
	smgBuffer[2]=0xff;
	smgBuffer[3]=0xff;
	smgBuffer[4]=0xff;
	smgBuffer[5]=font[dianya/100%10]&0x7f;
	smgBuffer[6]=font[dianya/10%10];
	smgBuffer[7]=font[dianya%10];
}

五、main.c

#include "led.h"
#include "delay.h"
#include "buffer.h"
#include "delay.h"
#include "key.h"
#include "onewire.h"
#include "iic.h"
#include "temp.h"
#include "adda.h"
#include "timing.h"
void main()
{
	Timer0Init();
	buffer_init();
	led_init();
	while(1)
	{
		key_scan();
	}
}

四、总结

这套题目难度适中,没有明显难点,属于中规中矩的一套赛题.

五、大家关心的客观题

这边我放个链接

这边分享一个我在csdn找到的宝贵博主的博客这边直接分享给大家

最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案_davies*的博客-CSDN博客_第十二届蓝桥杯单片机省赛真题

你可能感兴趣的:(蓝桥杯圈钱杯,蓝桥杯,p2p,linq)