蓝桥杯---第六届省赛单片机组真题

先出手写的代码,代码分析还需要一段时间,不难,大家认真写。

#include <STC15F2K60S2.H>
#include "Seg.h"
#include "LED.h"
#include "Key.h"
#include "DS1302.h"
#include "DS18B20.h"idata unsigned char DS18B20_Flag = 0;  //DS18B20采集标志位,为1开始采集
idata unsigned char DS1302_Slow_Down;  //DS1302实时时钟读取延时
idata unsigned char Seg_Slow_Down;  //数码管延时变量
idata unsigned char Key_Slow_Down;  //按键延时变量
idata unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};  //数码管显示内容
idata unsigned char Seg_Scan;   //数码管扫描
idata unsigned char LED_Buf[8]={0,0,0,0,0,0,0,0};    //LED亮灭数据
idata unsigned char Key_Val,Key_Down,Key_Up,Key_Old;  //按键参数
unsigned char Time[3]={23,59,50};  //存储时间
idata unsigned char Temper;   //温度unsigned char Seg_Show_Mode;  //数码管显示模式
idata unsigned char Gather_Time[4] = {1,5,30,60};  //设置采集时间数组
idata unsigned char Gather_Time_Index;   //设置采集时间指针,用于变化采集时间
idata unsigned char Real_Gather_Time;   //采集时间,将设置值传给Real_Gather_Timeidata unsigned int Time_1000ms;    //计时1s,用于设计时钟界面1s闪烁
idata unsigned char Time_1000_Flag;   idata unsigned char Temper_Gather[10];    //采集温度数据
idata unsigned char Temper_Gather_Index;   //温度数组指针
idata unsigned int Time_1000_Gather;      //用于采集界面计时
idata unsigned char Count;     //1s变化一次,相当与秒计时器idata unsigned char LED_Disable_Flag;   //按下按键6可以开始展示温度,同时熄灭LED,LED_Disable_Flag == 1时表示熄灭
idata unsigned int Time_1000_LED;     //单独设计LED周期闪烁,防止4T判断时周期错误
idata unsigned char Time_1000_LED_Flag;void System_Init()  //系统初始化
{unsigned char temp;//关闭所有LEDP0 = 0xff;temp = P2 & 0x1f;temp = temp | 0x80;P2 = temp;temp = P2 & 0x1f;P2 = temp;//关闭外设P0 = 0x00;temp = P2 & 0x1f;temp = temp | 0xa0;P2 = temp;temp = P2 & 0x1f;P2 = temp;}//定时器一初始化,自己加上EA = 1;ET1 = 1;
void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时EA = 1;                 //打开总中断ET1 = 1;                //打开定时器一中断允许位
}void Key_Proc()   //按键处理函数
{if(Key_Slow_Down <20) return;  //按键减速Key_Slow_Down = 0;Key_Val = Key_Read();     //读取键码值Key_Down = Key_Val & (Key_Old ^ Key_Val);  //判断按下Key_Up =  ~Key_Val & (Key_Old ^ Key_Val);  //判断松开Key_Old = Key_Val;       //判断长按switch(Key_Down){case 4:  //切换采集间距按键if(Seg_Show_Mode == 0){LED_Disable_Flag = 0;    //复位LED_Disable_Flagif(++Gather_Time_Index == 4)   //选择采集时间Gather_Time_Index = 0;}break;case 5: //确定采集时间,开始采集if(Seg_Show_Mode == 0){Real_Gather_Time = Gather_Time[Gather_Time_Index]; //确定采集时间Gather_Time_Index  = 0;Seg_Show_Mode = 1;   //开始采集}break;case 6:  //开始展示数据if(Seg_Show_Mode == 2){LED_Disable_Flag = 1;if(++Temper_Gather_Index == 10)Temper_Gather_Index = 0;}break;case 7:  //重新确认采集时间,重新开始采集if(Seg_Show_Mode == 2){Seg_Show_Mode = 0;Temper_Gather_Index = 0;Time_1000_Gather = 0;Count = 0;}break;}
}void Seg_Proc()   //数码管处理函数
{if(Seg_Slow_Down <100) return;  //减速Seg_Slow_Down = 0;switch(Seg_Show_Mode){case 0:  //采集时间界面Seg_Buf[0] = Seg_Buf[1] = Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = 10;  //熄灭Seg_Buf[5] = 11;  //-Seg_Buf[6] = Gather_Time[Gather_Time_Index]/10%10;Seg_Buf[7] = Gather_Time[Gather_Time_Index]%10;break;case 1:  //时间显示界面(界面二)Seg_Buf[0] = Time[0]/10%10;Seg_Buf[1] = Time[0]%10;Seg_Buf[2] = Time_1000_Flag ? 11:10;  //闪烁Seg_Buf[3] = Time[1]/10%10;Seg_Buf[4] = Time[1]%10;Seg_Buf[5] = Time_1000_Flag ? 11:10;  //闪烁Seg_Buf[6] = Time[2]/10%10;Seg_Buf[7] = Time[2]%10;break;case 2:   //数据显示界面(界面三)Seg_Buf[0] = 11;  //-Seg_Buf[1] = Temper_Gather_Index/10%10;   //索引值Seg_Buf[2] = Temper_Gather_Index%10;Seg_Buf[3] = Seg_Buf[4] = 10;Seg_Buf[5] = 11;  //-Seg_Buf[6] = Temper_Gather[Temper_Gather_Index]/10%10;  //采集数据Seg_Buf[7] = Temper_Gather[Temper_Gather_Index]%10;break;}
}void LED_Proc()  //LED处理函数
{LED_Buf[0] = (Seg_Show_Mode == 2) & (LED_Disable_Flag == 0) & (Time_1000_LED_Flag) ;//当处于界面二时采集数据完成,自动跳转界面三(显示界面),此时按下S6(LED_Disable_Flag == 1直接熄灭)//Time_1000_LED_Flag闪烁控制//LED亮的条件,处于界面三,未按下S6,Time_1000_LED_Flag条件为真
}void DS1302_Proc()  // DS1302处理函数
{if(DS1302_Slow_Down <160) return;  //减速DS1302_Slow_Down = 0;DS1302_Read();  //获取时间
}void DS18B20_Proc()
{if(DS18B20_Flag == 0) return;    //未到单次采集时间,不采集DS18B20_Flag = 0;   //DS18B20_Flag == 1开始采集一次,复位标志位Temper_Gather[Temper_Gather_Index] = (unsigned char)Temperature_Read(); //开始采集Temper_Gather_Index++;if(Temper_Gather_Index == 10)  //采集完成,自动跳转界面三显示{Seg_Show_Mode = 2;Temper_Gather_Index = 0;Time_1000_Gather = 0;Count = 0;}
}void main()
{System_Init();Timer1_Init();DS1302_Write();while((unsigned char)Temperature_Read() == 85);while(1){Key_Proc();Seg_Proc();LED_Proc();DS1302_Proc();DS18B20_Proc();}
}//定时器一中断打开---中断标志位3
void Timer1_Routine() interrupt 3
{Seg_Slow_Down++;Key_Slow_Down++;DS1302_Slow_Down++;if(Seg_Show_Mode == 2 && (LED_Disable_Flag == 0))  //处于界面三且未按下S6,开始闪烁{if(++Time_1000_LED == 1000){Time_1000_LED = 0;Time_1000_LED_Flag ^=1; }}else  //不满足则清空计时{Time_1000_LED = 0;}if(++Time_1000ms == 1000)  //设计时间显示界面闪烁{Time_1000ms = 0;Time_1000_Flag ^=1; }if(Seg_Show_Mode == 1)  //处于时间显示界面,开始采集数据{if(++Time_1000_Gather == 1000)   //计时{Count++;   //秒计时器Time_1000_Gather = 0;if(Count == Real_Gather_Time)   //当秒计时器达到采集时间间隔{Count = 0;DS18B20_Flag = 1;   //开始温度采集}}}if(++Seg_Scan == 8) Seg_Scan = 0;if(Seg_Buf[Seg_Scan] > 20)  //判断带小数点的数据Seg_Disp(Seg_Scan,Seg_Buf[Seg_Scan]-',',1);elseSeg_Disp(Seg_Scan,Seg_Buf[Seg_Scan],0);LED_Disp(LED_Buf);         //LED扫描
}

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

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

相关文章

GPT-5深度解析:精准、高效、务实的新一代AI引擎

&#x1f31f; GPT-5深度解析&#xff1a;精准、高效、务实的新一代AI引擎在万众瞩目中&#xff0c;OpenAI于2025年8月7日正式推出GPT-5——这一代模型没有华丽的创意革命&#xff0c;却以惊人的准确率提升、断崖式降价和强大的工程能力&#xff0c;悄然重塑了生成式AI的应用边…

oss(阿里云)前端直传

WEB端前端直传 参考文档&#xff1a;web前端直传并设置上传回调 封装oss-upload.ts // 图片上传 import { uploadToken } from /api/uploadFile.js // 获取oss token接口// 定义 OSS 信息类型 interface OssInfo {policy: string;signature: string;x_oss_credential: strin…

vscode uv 发布一个python包:编辑、调试与相对路径导包

背景 最近一直在使用uv做python包管理&#xff0c;用起来很方便。 尤其是在代码上传到github的时候&#xff0c;pyproject.toml 会显示出当前项目依赖的python包。这样在把代码下载到本地之后&#xff0c;直接uv sync就可以很方便地恢复出python环境。 uv 除了有上述优点&…

Secure 第四天作业

实验需求&#xff1a;需求一拓扑&#xff1a;按照以上拓扑所示&#xff0c;完成以下需求&#xff1a;参考以上拓扑&#xff0c;配置设备IP地址&#xff0c;使用UNL里Secure第四天拓扑即可。&#xff08;有兴趣的同学课后也可按照PPT原拓扑做做实验&#xff09;&#xff1b;配置…

利用开漏输出模式模拟IIC

/************************************************************利用IO口模拟IIC时序&#xff0c;需要使用2个IO口(SDA和SCL)SCL时钟线只能由主器件进行控制&#xff0c;所以SCL引脚必须为输出模式SDA数据线&#xff0c;在主器件发送数据时&#xff0c;SDA引脚为输出模式SDA数…

闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计

第 5 篇&#xff1a;RabbitMQ 消息队列与闸机通信设计RabbitMQ 是一款开源的消息队列中间件&#xff08;Message Queue&#xff0c;MQ&#xff09;&#xff0c;基于 Erlang 语言开发&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队…

Linux 常用命令大全:覆盖日常 99% 操作需求

1、基本命令 pwd&#xff1a;显示当前工作目录的绝对路径&#xff0c;例如在复杂目录结构中快速确认位置&#xff0c;执行后会输出类似/home/user/documents的结果。 cd&#xff1a;切换目录&#xff0c;cd 目录路径可进入指定目录&#xff0c;cd ~回到当前用户的家目录&…

普通电脑与云电脑的区别有哪些?全面科普

近年来&#xff0c;越来越多的人不再购置升级自己的电脑&#xff0c;转而选择云电脑&#xff0c;云端产品正在变得越来越普及易用。那么它究竟跟我们的普通本地设备有什么区别呐&#xff1f;或许很多人并不知悉&#xff0c;对此&#xff0c;本篇内容小编就为大家简要科普一下普…

【Python】支持向量机SVM

示例代码&#xff1a;import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report# 设…

当AI学会“抄近路”:残差网络如何突破深度学习的极限

**——解读《Deep Residual Learning for Image Recognition》**今天我想带大家回到2015年&#xff0c;见证人工智能领域的一场“捷径革命”——由何恺明等人提出的**深度残差学习框架&#xff08;ResNet&#xff09;**。这篇论文解决了困扰AI界多年的“深度诅咒”&#xff0c;…

HCIP--BGP综合实验

目录 BGP综合实验报告 一、实验拓扑 二、实验要求 三、实验思路 &#xff08;一&#xff09;IP地址规划 &#xff08;二&#xff09;整体思路 四、实验步骤 &#xff08;一&#xff09; IP地址配置 &#xff08;二&#xff09; AS2内部配置OSPF协议 &#xff08;三&a…

Java 基础编程案例:从输入交互到逻辑处理

在Java编程学习中&#xff0c;输入输出、循环控制和逻辑判断是核心基础。本文整理了10个经典案例&#xff0c;涵盖Scanner输入处理、斐波那契数列、成绩统计、登录验证等场景&#xff0c;帮助初学者掌握编程逻辑与实用技巧。 一、Scanner输入交互&#xff1a;获取用户输入并处理…

LeetCode 面试经典 150_数组/字符串_整数转罗马数字(18_12_C++_中等)(模拟)(对各位进行拆解)

LeetCode 面试经典 150_数组/字符串_整数转罗马数字&#xff08;18_12_C_中等&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;模拟&#xff09;&#xff1a;思路二&#xff08;对各位进行拆解&#xff09;&a…

计算机网络摘星题库800题笔记 第6章 应用层

第6章 应用层 6.1 网络应用的架构 考点 1 CS 架构 题组闯关 1.DNS 是基于 ( ) 模式的分布式系统。 A. C/S B. B/S C. P2P D. 以上均不正确 1.【参考答案】A 【解析】本题考查网络应用模型。 DNS 作为分布式应用&#xff0c;是一种典型的 C/S 模式&#xff0c;是随着 Internet 技…

BLUCK电路的输入电容应该怎么选取

借用TI的BULK芯片讨论一下输入电容怎么选取的问题&#xff0c;BULK电源是我们常用的电源&#xff0c;它的原理请看之前的文章&#xff1a; 高压差为何不用LDO&#xff1f;DCDC效率更高&#xff01;-CSDN博客 本文我们探讨一下输入电容&#xff0c;输入电容是控制纹波的关键&a…

CAN仲裁机制的原理

我们来详细讲 CAN 仲裁机制 的原理和工作方式,这是 CAN 总线最核心的特性之一。 1️⃣ 基本概念 CAN 总线是 多主机、多节点的串行总线,所有节点共享一根差分信号线(CAN_H / CAN_L)。 每个节点都可以随时发送消息(多主机机制) 总线只能同时有一个节点成功发送 仲裁 用…

【GPT入门】第46课 vllm安装、部署与使用

【GPT入门】第46课 vllm安装、部署与使用 1.准备服务器 2. 安装 conda环境,隔离base环境 3. vllm使用 3.1 在线推理, openai兼容服务器 3.2 模型离线调用 4. 没有使用GPU问题分析 1.准备服务器 cuda 版本选12.1 vllm官网介绍: https://vllm.hyper.ai/docs/getting-started/…

【从网络基础到实战】理解TCP/IP协议体系的核心要点(包含ARP协议等其他协议介绍)

前言&#xff1a; 学习计算机网络不仅是软件开发的基础功&#xff0c;更是成为一名合格后端工程师、网络工程师的重要门槛。本文将基于 TCP/IP 协议体系&#xff0c;系统梳理网络层、数据链路层、以及相关协议的核心知识&#xff0c;并结合实际案例与代码示例帮助理解。一、网络…

Python 元类基础:从理解到应用的深度解析

在 Python 的高级编程中&#xff0c;元类&#xff08;metaclass&#xff09; 无疑是最神秘又最强大的特性之一。它不仅是构建类的“工厂”&#xff0c;更是 Python 灵活对象模型的体现。本文将带你从基础概念入手&#xff0c;深入理解元类的本质、工作机制以及实际应用&#xf…

Nginx 配置代理服务器的详细方法

一、什么是代理服务器&#xff1f; 类型说明正向代理客户端通过代理访问目标服务器&#xff08;隐藏客户端身份&#xff09;反向代理客户端访问代理服务器&#xff0c;由代理服务器请求后端服务器&#xff08;隐藏后端服务器&#xff09; 二、Nginx 反向代理配置方法&#xff…