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

目录

 

前言

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

单片机资源数据包_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, //90x40,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)//菜单0mod=1;else if(mod==1)//菜单1mod=2;else if(mod==2)//菜单2mod=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);//则点亮L1L1_is_on=1;}else if(mo_shi!=0&&L1_is_on==1)//如果DAC不处在模式1.且L1被点亮了{LED_OFF(0);//则熄灭L1L1_is_on=0;}if(mod==0&&L2_is_on==0)//如果在温度显示界面,且L2未点亮{LED_ON(1);//则点亮L2L2_is_on=1;}else if(mod!=0&&L2_is_on==1)//如果不在温度显示界面,且L2被点亮{LED_OFF(1);//则熄灭L2L2_is_on=0;}if(mod==1&&L3_is_on==0)//如果在参数显示界面,且L3未点亮{LED_ON(2);//则点亮L3L3_is_on=1;}else if(mod!=1&&L3_is_on==1)//如果不在参数显示界面,且L3被点亮{LED_OFF(2);//则熄灭L3L3_is_on=0;}if(mod==2&&L4_is_on==0)//如果在DAC显示界面,且L4未点亮{LED_ON(3);//则点亮L4L4_is_on=1;}else if(mod!=2&&L4_is_on==1)//如果不在DAC显示界面,且L4被点亮{LED_OFF(3);//则熄灭L4L4_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.00VDAC=0;//输出0Velse if(temp/100>wendu_canshu&&DAC!=500)//如果温度大于阈值,且没有输出5.00VDAC=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.mzph.cn/news/708678.shtml

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

相关文章

金三银四面试必问:Redis真的是单线程吗?

文章目录 01 Redis中的多线程1&#xff09;redis-server&#xff1a;2&#xff09;jemalloc_bg_thd3&#xff09;bio_xxx&#xff1a; 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者&#xff1a;李乐 来源&#xff1a;IT阅读…

Android Kotlin协程实战

你能听懂的Kotlin协程课&#xff0c;跟老司机学&#xff0c;不用自己瞎折腾 认识协程 协程难在哪儿? Ja v a中不曾出现的&#xff0c;新概念概念不清晰&#xff0c;我们看到的大都是不同语言对于协程的实现或者衍生Kotlin 基础不扎实多线程编程基础太薄弱 协程是什么? 协…

OpenAI最新发布的文生视频模型Sora到底强在哪?

文章目录 1.Sora到底强在哪&#xff1f;2. 不足3. 结尾 2024年2月16日&#xff0c;当大家沉浸在过年的喜庆氛围中&#xff0c;OpenAI发布首款文生成视频大模型 Sora &#xff0c;其炸裂登场让人感到惊艳。 Sora官网介绍&#xff1a;https://openai.com/sora 说起文生视频工具…

【Python笔记-设计模式】备忘录模式

一、说明 备忘录模式是一种行为设计模式&#xff0c;允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 (一) 解决问题 主要解决在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要时恢复对象…

log4j 基础使用入门教程

一、Log4j介绍 在项目中&#xff0c;不管是开发人员写代码还是测试人员写的测试代码一般都需要做一些日志来记录项目的行为&#xff0c;以便更好的跟踪项目中的一些交互和问题。 Log4j ( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache 的一个开源项目…

SRC漏洞挖掘思路手法

这段时间挖掘了挺多的SRC漏洞&#xff0c;虽然都是一些水洞&#xff0c;也没有一些高级的漏洞挖掘利用手法&#xff0c;但是闲下来也算是总结一下&#xff0c;说说我对SRC漏洞挖掘的思路技巧。 很多人可能都挖过很多漏洞其中包括一些EDU或者别的野战&#xff0c;但是对于SRC往…

QQ录屏会录到外界声音吗?这篇文章告诉你答案

在现代网络科技快速发展的今天&#xff0c;屏幕录制已成为人们日常办公、学习、娱乐的重要工具。qq作为国内最受欢迎的社交软件之一&#xff0c;其内置的屏幕录制功能受到很多人的青睐。可是使用的过程中&#xff0c;很多人会有疑问&#xff1a;qq录屏会录到外界声音吗&#xf…

单片机烧录方式 -- IAP、ISP和ICP

目录 背景 1 什么是ICP 2 什么是ISP 3 什么是IAP 4 总结 背景 对于51单片机&#xff0c;我们使用STC-ISP上位机软件通过串口进行程序的烧写&#xff1b;对于STM32系列单片机&#xff0c;我们既可以通过串口烧写程序&#xff0c;也能通过JLink或是STLink进行程序的烧写&am…

如何保护服务器的安全

互联网的迅速发展&#xff0c;让很多企业都很重视网络技术的使用&#xff0c;但是网络的传播速度比较快&#xff0c;同时容易造成数据、隐私方面的泄露现在每个企业基本有自己的服务器。有几点需要注意&#xff0c;可以参考&#xff1a; 1.基础密码安全 最基本的安全就是密码安…

车载电子电器架构 —— 基础技术开发概述

车载电子电器架构 —— 基础技术开发概述 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

【element-ui】el-select multiple多选,表单校验问题解决方法

在项目开发过程中发现&#xff0c;el-select设置了multiple支持多选属性之后&#xff0c;el-select赋值之后&#xff0c;表单校验不通过 解决思路及解决方法&#xff1a; 1、首先看看v-model 、prop属性、rules校验是否正确&#xff0c;这里注意el-select的rules校验的trigger…

【Go语言】Go语言中的指针

Go语言中的指针 变量的本质是对一块内存空间的命名&#xff0c;我们可以通过引用变量名来使用这块内存空间存储的值&#xff0c;而指针则是用来指向这些变量值所在内存地址的值。 注&#xff1a;变量值所在内存地址的值不等于该内存地址存储的变量值。 Go语言中&#xff0c;…

42.do...while语句

目录 一.什么是do...while语句 二.语法 三.执行流程图 四.举例 五.视频教程 一.什么是do...while语句 do...while语句也是循环语句&#xff0c;和while语句的区别是&#xff0c;while语句是先判断表达式&#xff0c;如果表达式成立才会执行循环体中的内容&#xff0c;否则…

新书速览|Python数据分析快速上手

从零开始&#xff0c;小白轻松入手&#xff0c;一步一步教你学数据分析&#xff0c;让数据分析变得简单易懂 本书内容 《Python数据分析快速上手》通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了使用Python进行数据分析应该掌握的各方面技术。本书内容包括Python基…

区块链游戏解说:什么是 Arcade Champion

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Arcade Champion Dashboard 什么是 Arcade Champion Arcade Champion 代表了移动游戏世界的重大革新。它将经典街机游戏的怀旧与创新元素结合在一起&#xff0c;包括 NF…

自学Python笔记总结(2——了解)

网络了解 网络调试助手 NetAssist.exe NetAssist.exe 使用方法请自行寻找 UDP协议 &#xff08;只能一来一回的的发消息&#xff0c;不可连续发送&#xff09; UDP 是User Datagram Protocol的简称&#xff0c; 中文名是用户数据报协议。在通信开始之前&#xff0c;不需要建…

计算机网络体系结构

本篇博客是基于谢希仁编写的《计算机网络》和王道考研视频总结出来的知识点&#xff0c;本篇总结的主要知识点是第一章的计算机网络概述。 计算机网络概述 整体介绍 概念 计算机网络&#xff1a;是一个将分散的。具有独立功能的计算机系统&#xff0c;通过通信设备和线路连…

Zookeeper基础入门-1【集群搭建】

Zookeeper基础入门-1【集群搭建】 一、Zookeeper 入门1.1.概述1.2.Zookeeper工作机制1.3.Zookeeper特点1.4.数据结构1.5.应用场景1.5.1.统一命名服务1.5.2.统一配置管理1.5.3.统一集群管理1.5.4.服务器动态上下线1.5.5.软负载均衡 1.6.Zookeeper官网1.6.1.Zookeeper下载1.6.2.历…

day01-HTML-CSS

一、Web 开发 1. 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www&#xff0c;World Wide Web)&#xff0c;能够通过浏览器访问的 网站。 2. Web 网站的开发模式 3. Web 标准 Web 标准也称为网页标准&#xff0c;由一系列的标准组成&#xff…

REVERSE-COMPETITION-VNCTF-2024

REVERSE-COMPETITION-VNCTF-2024 前言TBXObaby_c2yunobfuseko 前言 ko的随机数算法没看出来&#xff0c;可惜~ 这里给自己打个广告&#xff1a;东南网安研二在读&#xff0c;求实习&#xff0c;求内推&#xff0c;求老板们多看看我QAQ TBXO 通过字符串定位到main函数汇编视…