【蓝桥杯】第十一届单片机省赛第一场

【蓝桥杯】第十一届单片机省赛

题目

在这里插入图片描述

代码参考

#include "reg52.h"
#include "iic.h"
#include "onewire.h"


typedef unsigned char uint8;
typedef unsigned int uint32;

#define LED_Channel  		4
#define BEEP_DELAY_Channel  5
#define COM_Channel  		6
#define SMG_Channel  		7

sfr P4 = 0xc0;
sfr AUXR = 0x8e;

//数码管编码
uint8 code TAB[19] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0x8c};
//带小数点
uint8 code Dot_TAB[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e} ;

//独立按键   J5:23
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;

uint8 node = 0;
uint32 temp;
uint8 tmax = 30;
uint8 tmin = 20;
uint8 tmode = 1;
uint8 pretmax = 30;
uint8 pretmin = 20;
uint8 errflag = 0;
void Delay(uint32 ms);
void InitHC138(uint8 Channel);
void Init_System(void);
void Display_Bit(uint8 pos,uint8 date);
void Display_All(uint8 date);
void Display(uint8 node);
void Key_Scan(void);
void Read_Temp(void);
void SMG_Delay(uint32 t);
void DAC(uint8 date);
void DAC_Hander(void);
void main()
{
	Init_System();
	
	while(1)
	{
		if(node == 0)
			Read_Temp();
		Key_Scan();
		Display(node);
		DAC_Hander();
	}
}
void DAC_Hander(void)
{
	P0 = 0xff;
	if(temp>tmax)
	{
		DAC(255*4/5);
		P0&=0xfe;//L1
	}
	else if(temp<tmin)
	{
		DAC(255*2/5);
		P0&=0xfb;//L3
	}
	else if(temp<=tmax&&temp>=tmin)
	{
		DAC(255*3/5);
		P0&=0xfd;//L2
	}
	if(node==0)
		InitHC138(LED_Channel);
	if(errflag == 1)
	{
		P0&=0xf7;//L4
	}
	InitHC138(0);
	
}
void Delay(uint32 ms)
{
	uint32 x,y;
	for(x=0;x<ms;x++)
		for(y=846;y>0;y--){}
}
void InitHC138(uint8 Channel)
{
	switch(Channel)
	{
		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;
		default:P2 &= 0x1f;
	}
}
void Init_System(void)
{
	InitHC138(BEEP_DELAY_Channel);
	P0 = 0x00;
	InitHC138(LED_Channel);
	P0 = 0xff;
	InitHC138(0);
}

void Display_Bit(uint8 pos,uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0x01<<pos;
	InitHC138(SMG_Channel);
	P0 = date;
	InitHC138(0);
}
void Display_All(uint8 date)
{
	InitHC138(COM_Channel);
	P0 = 0xff;
	InitHC138(SMG_Channel);
	P0 = date;
	InitHC138(0);
}
void Display(uint8 node)
{
	switch(node)
	{
		case 0:
			Display_Bit(0,TAB[12]),Delay(1);
			Display_Bit(1,0xff),Delay(1);
			Display_Bit(2,0xff),Delay(1);
			Display_Bit(3,0xff),Delay(1);
			Display_Bit(4,0xff),Delay(1);
			Display_Bit(5,0xff),Delay(1);
			Display_Bit(6,TAB[temp/10]),Delay(1);
			Display_Bit(7,TAB[temp%10]),Delay(1);
			Display_All(0xff);
			break;
		case 1:
			Display_Bit(0,TAB[18]),Delay(1);
			Display_Bit(1,0xff),Delay(1);
			Display_Bit(2,0xff),Delay(1);
			Display_Bit(3,TAB[tmax/10]),Delay(1);
			Display_Bit(4,TAB[tmax%10]),Delay(1);
			Display_Bit(5,0xff),Delay(1);
			Display_Bit(6,TAB[tmin/10]),Delay(1);
			Display_Bit(7,TAB[tmin%10]),Delay(1);
			Display_All(0xff);
			break;
		default:Display_All(0xff);
		
	}
}
void SMG_Delay(uint32 t)
{
	while(t--)
	{
		Display(node);
	}
}
void Key_Scan(void)
{
	if(S4==0)
	{
		Delay(10);
		if(S4==0)
		{
			++node;
			if(node>=2)
				node = 0;
			if(node)
			{
				pretmax = tmax;
				pretmin = tmin;
				tmode = 1;
			}
			else
			{
				if(tmax<tmin)
				{
					tmax = pretmax;
					tmin = pretmin;
					errflag = 1;
				}
				else
					errflag = 0;
			}
			while(S4==0);
		}
	}
	
	if(S5==0)
	{
		Delay(10);
		if(S5==0)
		{
			++tmode;
			if(tmode>=2)
				tmode = 0;
			while(S5==0);
		}
	}
	
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			switch(tmode)
			{
				case 0:
					if(tmax<99)
						++tmax;
					break;
				case 1:
					if(tmin<99)
						++tmin;
					break;
			}
			
			while(S6==0);
		}
	}
	
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			
			switch(tmode)
			{
				case 0:
					if(tmax>0)
						--tmax;
					break;
				case 1:
					if(tmin>0)
						--tmin;
					break;
			}
			while(S7==0);
		}
	}
}

//初始化,跳过rom,操作
//前5位是符号位,后4位是小数位,小数存放在LSB(低位先读),//0.0625*10
void Read_Temp(void)
{
	uint8 LSB,MSB;
	
	init_ds18b20();
	Write_DS18B20(0xcc);  //跳过ROM指令
	Write_DS18B20(0x44);	//开始温度转换
	SMG_Delay(50);
	//可用 Delay_OneWire(200);	   // 延时一段时间
	
	init_ds18b20();
	Write_DS18B20(0xcc);	//跳过ROM指令
	Write_DS18B20(0xbe);	//读取高速暂存器
	
	LSB =Read_DS18B20();  //读取第一个字节
	MSB =Read_DS18B20();	//读取第二字节

	temp = (MSB<<8)|LSB;
	
	//包含小数 ,如果不包含小数,直接将temp右移4位即可
	if((temp & 0xf800)== 0x0000)  //判断高五位符号位是否为0 ,即是否为证书
	{
		temp = temp>>4;
//		temp = temp * 10;
//		temp = temp + (LSB & 0x0f)*0.625 ;//0.0625*10
	}
	
}

void DAC(uint8 date)	// 输入值需要转换
{

	IIC_Start();
	IIC_SendByte(0x90);		
	IIC_WaitAck();				
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}




总结

效果差不多,具体对不对还没细看。

### 回答1: 蓝桥杯单片机11届省赛第1场题目pdf文件是一份包含了本场比赛全部考题的pdf文档。该文档一共包含了两个部分:单选题和编程题。单选题主要考察了考生对单片机的基础知识、指令系统及其他相关知识的掌握情况。编程题则主要考察了考生对单片机应用程序开发和编程调试能力的掌握情况。 在单选题部分,考生需要根据题目要求进行选择题作答。这些选择题旨在考察考生的理论知识掌握情况,考查内容包含了单片机内部模块原理、寄存器使用方法、程序设计思路、常用外设接口以及通信协议等。考生需要根据自身的掌握情况进行选择,并将自己的答案填入答题卡中。 在编程题部分,考生需要根据题目要求使用指定的语言和开发工具,编写一定的单片机应用程序,并完成程序调试和验证。考试通过指示灯或者液晶显示屏等方式,展示程序的正确运行情况。编程题考查内容包含了对单片机的开发环境、程序设计流程、编程调试、应用实现逻辑等方面的掌握情况。考生需要具备一定的实操能力,并能够将理论知识与实践能力相结合,顺利完成编程任务。 总的来说,蓝桥杯单片机11届省赛第1场题目pdf文档是一份涉及单片机理论与实践知识的综合性考试文件,对单片机应用程序开发和编程调试水平的考查具有一定的参考意义。 ### 回答2: 蓝桥杯单片机11届省赛第1场题目pdf文件中包含了该场比赛的各个题目,共分为基础题、提高题、创意题三个部分。基础题主要考察对单片机编程基础语法和基本知识的掌握程度,内容包括LED灯闪烁、蜂鸣器发声等常见实验,难度逐渐递增。提高题则较为复杂,需考生掌握较深入的单片机编程知识和技巧,例如读写AT24C02芯片、使用定时器、串口通信等。创意题则要求考生要有一定的创意思维和实际操作能力,能够完成较为实用性和创意性的电子设备制作,例如设计简易报警器等。 该份pdf文件还提供了详细的题目描述、给定的测试程序框架和输入输出格式要求等信息,以及需要的元器件或接口要求等内容,有助于考生进行题目的理解和实际操作。这些题目在一定程度上考验了参赛者的实际动手能力、代码调试能力和解决问题的能力,在实践中提升了考生的编程技能和实用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值