藍橋杯---第六屆省賽單片機組真題

先出手寫的代碼,代碼分析還需要一段時間,不難,大家認真寫。

#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
英文地址,請注明出處:http://en.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…