蓝桥杯第十二届电子类单片机组程序设计

news2024/11/18 1:27:35

目录

 

前言

蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课(点击查看)

单片机资源数据包_2023(点击下载)

一、第十二届比赛原题

1.比赛题目

2.题目解读

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

二、代码实现

main.c

onewire.c

onewire.h

iic.c

iic.h


 

前言

完成了第14届的题目之后,再看往些年的题目真的就太简单了,现在年也过完了,相比备战蓝桥杯的同学们也已经回到学校开启忙碌的学习了。但是学习之余也不要忘了做几道前几年简单的题目,保持手感,临近比赛时再做一些比较难的题目,比如国赛题和最近的省赛题。

老规矩,先放题目链接

蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课(点击查看)

单片机资源数据包_2023(点击下载)

一、第十二届比赛原题

1.比赛题目

5fa747278f4442c89fa0f4bd32c095be.png

4d1099ab03e14d5c9a93bab5cb7f1e5a.png

6d35fd8bead540889c636dbb473320b1.png

bda82a75e24149d1af4070ce5a5005ed.png

2.题目解读

第十二届的题目非常简单,不管是按键和菜单还是LED灯,都非常简单:菜单只有三个,没有子菜单;每个按键都只有一个功能,且没有长按短按;LED灯只有简单的指示,不涉及闪烁,也不涉及满足特殊条件后才点亮。总之就是特别简单,感兴趣的可以对比一下第十四届的省赛题目。

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

至于刚才提到的长按短按,和对小数的处理,都在第四届的题目中提到过,本篇文章在写代码时就不过多介绍了。

二、代码实现

main.c

#include <stc15.h>
#include <intrins.h>
#include "iic.h"
#include "onewire.h"

code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
	
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xFF,//20 熄灭
0xC6,//21 C
0x8C,//22 P
0x88,//23 A
};
unsigned char Led_Num=0xFF;
#define LED_ON(x)		Led_Num&=~(0x01<<x);		P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x)	Led_Num|=0x01<<x;				P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;

#define NIXIE_CHECK()		P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON()			P2|=0xE0;P2&=0xFF;P2&=0x1F;

void Delay100ms(void);	//@12.000MHz
void Timer0_Init(void);		//1毫秒@12.000MHz
void get_key(void);//按键处理
void show_menu(void);//菜单显示
void led_run(void);//控制led灯
void DAC_out(void);//控制DAC输出

unsigned char Nixie_num[]={20,20,20,20,20,20,20,20};
unsigned char location=0;
unsigned char key_value=0;
unsigned int temp=0;
unsigned char mod=0;
unsigned char wendu_canshu=25;//温度参数,默认为25
unsigned int DAC=0;//DAC要求保留小数点后两位,这里的DAC的值扩大了100倍

bit mo_shi=0;//0:DAC输出模式1,1:DAC输出模式2
void main()
{
	Timer0_Init();
	EA=1;
	read_temp();//温度传感器初始化
	Delay100ms();
	while(1)
	{
		get_key();
		temp=read_temp();//读取温度
		led_run();//LED灯控制
		DAC_out();//DAC输出
		Delay100ms();
		show_menu();
	}
}
void Timer0_Isr(void) interrupt 1
{
	P0=0x01<<location;NIXIE_CHECK();
	P0=Seg_Table[Nixie_num[location]];NIXIE_ON();
	
	if(++location==8)
		location=0;
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x20;				//设置定时初始值
	TH0 = 0xD1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}

void Delay100ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 144;
	k = 71;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Delay5ms(void)	//@12.000MHz
{
	unsigned char data i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}
void get_key(void)
{
	unsigned char key_P3=P3;
	unsigned char key_P4=P4;
	
	P3=0xFF;
	P4=0xFF;

	P44=0;
	if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=5;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=4;}
	
	P42=0;
	if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=9;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=8;}

	//s4模式切换
	if(key_value==4)
	{
		if(mod==0)//菜单0
			mod=1;
		else if(mod==1)//菜单1
			mod=2;
		else if(mod==2)//菜单2
			mod=0;
	}
	
	//s8 减
	else if(key_value==8)
	{
		if(mod==1)
		{
			wendu_canshu--;
		}
	}
	
	//s9 加
	else if(key_value==9)
	{
		if(mod==1)
		{
			wendu_canshu++;
		}
	}
	
	//s5 切换DAC输出模式
	else if(key_value==5)
	{
		mo_shi=~mo_shi;//切换模式
	}
	
	key_value=0;
	P3=key_P3;
	P4=key_P4;
}
void show_menu(void)
{
	if(mod==0)//菜单0 显示温度
	{
		Nixie_num[0]=21;
		Nixie_num[1]=20;
		Nixie_num[2]=20;
		Nixie_num[3]=20;
		Nixie_num[4]=temp/1000%10;
		Nixie_num[5]=temp/100%10+10;
		Nixie_num[6]=temp/10%10;
		Nixie_num[7]=temp/1%10;
	}
	else if(mod==1)//菜单1 显示参数
	{
		Nixie_num[0]=22;
		Nixie_num[1]=20;
		Nixie_num[2]=20;
		Nixie_num[3]=20;
		Nixie_num[4]=20;
		Nixie_num[5]=20;
		Nixie_num[6]=wendu_canshu/10%10;
		Nixie_num[7]=wendu_canshu/1%10;
	}
	else if(mod==2)//菜单2 显示DAC输出值
	{
		Nixie_num[0]=23;
		Nixie_num[1]=20;
		Nixie_num[2]=20;
		Nixie_num[3]=20;
		Nixie_num[4]=20;
		Nixie_num[5]=DAC/100%10+10;//注意DAC的值是扩大100倍之后的
		Nixie_num[6]=DAC/10%10;
		Nixie_num[7]=DAC/1%10;
	}
}

bit L1_is_on=0;
bit L2_is_on=0;
bit L3_is_on=0;
bit L4_is_on=0;
void led_run(void)
{
	if(mo_shi==0&&L1_is_on==0)//如果DAC处在模式1,且L1未点亮
	{
		LED_ON(0);//则点亮L1
		L1_is_on=1;
	}
	else if(mo_shi!=0&&L1_is_on==1)//如果DAC不处在模式1.且L1被点亮了
	{
		LED_OFF(0);//则熄灭L1
		L1_is_on=0;
	}
	
	if(mod==0&&L2_is_on==0)//如果在温度显示界面,且L2未点亮
	{
		LED_ON(1);//则点亮L2
		L2_is_on=1;
	}
	else if(mod!=0&&L2_is_on==1)//如果不在温度显示界面,且L2被点亮
	{
		LED_OFF(1);//则熄灭L2
		L2_is_on=0;
	}
	
	if(mod==1&&L3_is_on==0)//如果在参数显示界面,且L3未点亮
	{
		LED_ON(2);//则点亮L3
		L3_is_on=1;
	}
	else if(mod!=1&&L3_is_on==1)//如果不在参数显示界面,且L3被点亮
	{
		LED_OFF(2);//则熄灭L3
		L3_is_on=0;
	}
	
	if(mod==2&&L4_is_on==0)//如果在DAC显示界面,且L4未点亮
	{
		LED_ON(3);//则点亮L4
		L4_is_on=1;
	}
	else if(mod!=2&&L4_is_on==1)//如果不在DAC显示界面,且L4被点亮
	{
		LED_OFF(3);//则熄灭L4
		L4_is_on=0;
	}
}
void DAC_out(void)
{
	if(mo_shi==0&&mod!=1)//如果是DAC输出模式1
	{
		//对于当前是否输出0V或者5V的判断,是为了防止重复操作引起误差(不判断也行)
		if(temp/100<wendu_canshu&&DAC!=0)//如果温度大于阈值,且没有输出0.00V
			DAC=0;//输出0V
		else if(temp/100>wendu_canshu&&DAC!=500)//如果温度大于阈值,且没有输出5.00V
			DAC=500;//则输出5.00V
	}
	else if(mo_shi==1)//如果是DAC输出模式2
	{
		//拟合出直线,并限制DAC取值范围在100到400之间
		//注意为方便操作DAC的小数,DAC的值被扩大了100百,100到400就对应1V到4V之间
		DAC=temp*3/20-200>100 ? temp*3/20-200:100;
		DAC=temp*3/20-200<400 ? temp*3/20-200:400;
	}
	write_pcf((unsigned char)(DAC/5*255/100));//将电压转化为0到255,并输出(注意DAC扩大了100倍)
}

onewire.c

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <stc15.h>
#include <intrins.h>
#include "onewire.h"
sbit DQ=P1^4;

//
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

unsigned int read_temp(void)
{
	unsigned char low=0;
	unsigned char high=0;
	unsigned int temp=0;
	unsigned char xiaoshu=0;
	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0xBE);
	low=Read_DS18B20();
	high=Read_DS18B20();
	
	temp=high;
	temp&=0x0F;
	temp<<=8;
	temp|=low;
	temp>>=4;
	
	//处理小数部分
	xiaoshu=low;
	xiaoshu&=0x0F;
	
	temp=temp*100+xiaoshu;//处理小数部分,温度也扩大了100倍
	return temp;
	
}

onewire.h

#ifndef _ONEWIRE_H_
#define _ONEWIRE_H_

unsigned int read_temp(void);

#endif

iic.c

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#define DELAY_TIME	5
#include <stc15.h>
#include <intrins.h>
#include "iic.h"
sbit sda=P2^1;
sbit scl=P2^0;
//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

void write_pcf(unsigned char dat)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x40);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

iic.h

#ifndef _IIC_H_
#define _IIC_H_

void write_pcf(unsigned char dat);

#endif

正在准备蓝桥杯的UU们这个时候也不能泄气,如果你是寒假偷懒,还没开始学习的话,也不要担心后续我也会发几期开荒的文章供大家参考,还有一个月,多花点时间学学,混个奖应该没什么问天。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术

TV-SAM 新型零样本医学图像分割算法&#xff1a;GPT-4语言处理 GLIP视觉理解 SAM分割技术 提出背景TV-SAM 方法论 提出背景 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2402/2402.15759.pdf 代码&#xff1a;https://github.com/JZK00/TV-SAM 利用了GPT-4的强大语…

深入理解Spring Security

第1章&#xff1a;Spring Security简介 大家好&#xff0c;我是小黑&#xff0c;在谈到网站安全的时候&#xff0c;Spring Security是个避不开的话题。它就像是个守门员&#xff0c;决定谁能进入我们的网站&#xff0c;又能在网站的哪些角落里走动。简单来说&#xff0c;Sprin…

语音合成(TTS) GPT-SoVITS认知

写在前面 小伙伴推荐&#xff0c;简单了解相对之前试过的其他的TTS项目&#xff0c;GPT-SoVITS的优点简单易用&#xff0c;文档完整&#xff0c;默认的模型效果就很好理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候…

智能驾驶控制规划理论学习02-基于搜索的路径规划算法

目录 一、路径搜索问题 二、图论基础 三、图搜索方法 1、广度优先搜索&#xff08;BFS&#xff09; bfs与dfs的区别 bfs的搜索过程 bfs的算法实现 2、迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 核心思想 优先级队列 Dijkstra搜索过程 Dijkstra优缺点…

MySQL(基础篇)——函数、约束

一.函数 1.定义 函数是指一段可以直接被另一段程序调用的程序或代码。 2.字符串函数 常见如下&#xff1a; -- 字符串拼接 SELECT CONCAT(hello,MySql) AS CONCAT -- 将字符串全部转为小写 SELECT LOWER(HEllo MYSql) AS LOWER -- 将字符串全部转为大写 SELECT UPPER(Hello…

前端mock数据 —— 使用Apifox mock页面所需数据

前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目&#xff1a; 新建项目名称&#xff1a; 新建接口&#xff1a; 创建json&#xff1a; 请求方法&#xff1a; GET。URL&#xff1a; api/basis。响应类型&#xff1…

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

183896-00-6,Biotin-C3-PEG3-C3-NH2,可以选择性降解靶蛋白

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;183896-00-6&#xff0c;Biotin-C3-PEG3-C3-NH2&#xff0c;Biotin-C3-PEG3-C3-amine&#xff0c;生物素-C3-PEG3-C3-胺 一、基本信息 【产品简介】&#xff1a;Biotin-PEG3-C3-NH2是一种PROTAC linker&#xff0c;…

Redis在中国火爆,为何MongoDB更受欢迎国外?

一、概念 Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。Redis是由Salvatore Sanfilippo于2009年启动开发的&#xff0c;首个版本于同年5月发布。 MongoDB MongoDB…

Apache Bench(ab )压力测试

目录 参数说明示例1&#xff1a;压力测试示例2&#xff1a;测试post接口post数据文件该如何编写&#xff1f; apr_pollset_poll: The timeout specified has expired (70007)apr_socket_recv: Connection reset by peer (104)参考 参数说明 官方文档参考这里。 ab -c 100 -n …

JVM——JVM与Java体系结构

文章目录 1、Java及JVM简介1.1、Java是跨平台的语言1.2、JVM是跨语言的平台 2、Java发展里程碑3、Open JDK和Oracle JDK4、虚拟机与JVM4.1、虚拟机4.2、JVM 5、JVM整体结构6、Java代码执行流程7、JVM的架构模型7.1、基于栈式架构的特点7.2、基于寄存器架构的特点 8、JVM的生命周…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

【JavaEE】网络原理: HTTP协议相关内容

目录 HTTP 是什么 理解HTTP 协议的工作过程 HTTP 协议格式 抓包工具的使用 抓包工具的原理 抓包结果 HTTP请求 HTTP响应 协议格式总结 HTTP 请求 (Request) 认识 URL 关于 URL encode 认识 "方法" (method) get方法 post方法 其他方法 认识请求 &q…

Linux小项目:在线词典开发

在线词典介绍 流程图如下&#xff1a; 项目的功能介绍 在线英英词典项目功能描述用户注册和登录验证服务器端将用户信息和历史记录保存在数据中。客户端输入用户和密码&#xff0c;服务器端在数据库中查找、匹配&#xff0c;返回结果单词在线翻译根据客户端输入输入的单词在字…

李宏毅机器学习入门笔记——第四节

自注意力机制&#xff08;常见的神经网络结构&#xff09; 上节课我们已经讲述过 CNN 卷积神经网络 和 spatial transformer 网络。这次讲述一个其他的常用神经网络自注意力机制神经网络。 对于输入的变量长度不一的时候&#xff0c;采用frame的形式&#xff0c;进行裁剪设计。…

Astra Pro点云代码

github上找到的python读取点云的代码 import timeimport cv2 as cv import numpy as np import open3d from openni import _openni2 from openni import openni2SAVE_POINTCLOUDS True # 是否保存点云数据def get_rgbd(color_capture, depth_stream, depth_scale1000, dept…

猫头虎分享已解决Bug || 依赖问题:DependencyNotFoundException: Module ‘xyz‘ was not found

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术&#xff0c;自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat&#xff0c;Centos&#xff0c;OracleLinux 三种。 三者的区别简单说明如下&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由美国…