【藍橋杯單片機】第十二屆省賽

一、真題

二、模塊構建

1.編寫初始化函數(init.c)?

void Cls_Peripheral(void);

  1. 關閉led? ? led對應的鎖存器由Y4C控制
  2. 關閉蜂鳴器和繼電器 由Y5C控制

2.編寫LED函數(led.c)

void Led_Disp(unsigned char ucLed);

  1. 將ucLed取反的值賦給P0

  2. 開啟鎖存器

  3. 關閉鎖存器

3.編寫數碼管函數(seg.c)

void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);

(1)段碼轉換函數

  • 定義數組要加*
  • 定義兩個變量i,j
  • for循環加Switch語句進行段碼轉換,在資源數據包查找段碼表,并根據題目要求進行段碼轉換
  • 注意添加空格代表都不顯示
  • case記得加' '
  • 判斷是否有 .,是用j+1位判斷

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);

(2)數碼管顯示函數

  • 要對數碼管進行消隱
  • 顯示的位置
  • 顯示的內容

4.獨立按鍵代碼編寫

unsigned char Key_Read_BTN(void)

  1. 有返回值函數(unsigned char)
  2. if語句判斷按鍵是否按下
  3. 返回按鍵所對應的數字
  4. 沒有按鍵按下時返回0

5.編寫ADC代碼

unsigned char PCF8591_ADC(unsigned char dat);

  1. ?定義SCL,SDA
  2. 添加"intrins.h"頭文件
  3. 定義變量用于存儲采集的電壓
  4. 函數定義寫入地址dat,來判斷讀取哪一路
  5. 寫入流程:開始--發送寫入地址--等待應答--發送dat地址--等待應答
  6. 讀取流程:開始--發送讀取地址--等待應答--變量接收數據--發送應答--終止
  7. 讀取地址為0x91 寫入地址為0x90
  8. 電位器地址為0x43 光敏電阻地址為0x41

?6.編寫頻率代碼

通過TMODE 配置將定時器0配置為計數器,實現頻率讀取

7.編寫定時器代碼

  1. 將定時器1用作定時器,定時器0作為計數器供NE555使用
  2. 定時器1為1毫秒定時器,用stc-isp生成,加上ET1=1!!!;
  3. 定時器0的使用需要對TMOD寄存器進行配置

三、主函數代碼

1.初始化,定時器0,定時器1,中斷總開關,stdio.h

2.編寫數碼管函數

  1. 數碼管的數組和數字位置定義 12 8 0
  2. 時間為200ms
  3. 判斷顯示模式
  4. 數碼管轉換函數

3.編寫定時器中斷函數

  1. 所有計時變量自增
  2. 每2ms數碼管顯示
  3. 每1s讀取一次頻率并清零
  4. 將signal和P34引腳短接

4.周期界面

  1. 周期為頻率的倒數?

  2. 因為題目要求周期單位為微秒,所以要乘以10的6次方后再除以頻率

  3. 頻率和周期都定義為unsigned int型

5.編寫按鍵代碼

  1. 時間為20ms
  2. 定義兩個按鍵用于消抖
  3. 調用讀取按鍵函數并賦值給變量Key_Val
  4. 判斷Key_Val和Key_Val_Old是否相等,相等返回
  5. Switch語句判斷哪個按鍵按下
  6. 再將Key_Val的值賦值給?Key_Val_Old
  7. 按下4按鍵,將Disp_Mode自加對3取模,因為有三個界面
  8. 當s6,s7按鍵按下時,定義一個新變量用于數據緩存,直接將原來的值賦值給現在的變量
  9. 對于s7是否長按的處理,將ulms的值賦值給S7_Down,然后在case 0時判斷ulms - S7_Down > 1000,如果是,則直接則執行長按相關命令

6.電壓界面

  1. 定義兩個變量分別為光敏電阻和滑動變阻器的電壓值
  2. ?定義ADC_Mode用于切換兩個界面

7.編寫ADC函數

  1. 時間為200ms
  2. 在同時讀取兩路ADC時會出現反轉的現象

    因此在要求同時采集兩路時,將兩個寫入的數據調換位置

8.所有編寫的函數,一定不要忘記放到主循環里

四、主函數代碼

#include "init.h"
#include "seg.h"
#include "led.h"
#include "key.h"
#include "iic.h"
#include "stdio.h"
#include "tim.h"
//seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//led
unsigned char ucLed=0;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
//ADC
unsigned char ucADC_Res=0,ucADC_Photo=0;
unsigned char ucADC_Res_Buf=255;
//Timer
unsigned long ulms=0;
unsigned long S7_Down=0;
unsigned int uiSeg_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiLed_Dly=0;
//freq
unsigned int uiFreq=0;
unsigned int uiTime=0;
unsigned int uiFreq_Buf=65535;
//function
void Seg_Proc(void);
void Key_Proc(void);
void ADC_Proc(void);
void Led_Proc(void);
//mode
unsigned char Disp_Mode=0;
unsigned char ADC_Mode=1;
unsigned char Led_Mode = 1;
void main(void)
{Cls_Peripheral();Timer0Init();Timer1Init();EA=1;while(1){Seg_Proc();Key_Proc();ADC_Proc();Led_Proc();}
}
void Led_Proc(void)
{if(uiLed_Dly<200)return;uiLed_Dly=0;if(Led_Mode == 0){ucLed = 0x00;}else{if(ucADC_Res>ucADC_Res_Buf){ucLed|=0x01;}else{ucLed&=~0x01;}if(uiFreq > uiFreq_Buf){ucLed |= 0x02;}else{ucLed &= ~0x02;}if(Disp_Mode == 0){ucLed |= 0x04;ucLed &= ~0x18;}else if(Disp_Mode == 1){ucLed |= 0x08;ucLed &= ~0x14;}else{ucLed |= 0x10;ucLed &= ~0x0C;}Led_Disp(ucLed);}
}
void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly=0;if(Disp_Mode==0){sprintf(pucSeg_Buf,"F%7u",uiFreq);}else if(Disp_Mode==1){sprintf(pucSeg_Buf,"N%7u",uiTime);}else {if(ADC_Mode==1){sprintf(pucSeg_Buf,"U-1  %4.2f",ucADC_Photo/51.0);}else{sprintf(pucSeg_Buf,"U-3  %4.2f",ucADC_Res/51.0);}}Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void Key_Proc(void)
{if(uiKey_Dly<20)return;uiKey_Dly=0;Key_Val=Key_Read_BTN();if(Key_Val==Key_Val_Old)return;switch(Key_Val){case 0:if(Key_Val_Old==7){if(ulms-S7_Down>1000)			{Led_Mode=(Led_Mode+1)%2;}else{uiFreq_Buf = uiFreq;}}case 4:Disp_Mode=(Disp_Mode+1)%3;if(Disp_Mode==2){ADC_Mode=1;}break;case 5:if(Disp_Mode==2){if(ADC_Mode==1)ADC_Mode=3;elseADC_Mode=1;}break;case 6:ucADC_Res_Buf=ucADC_Res;break;case 7:S7_Down=ulms;uiFreq_Buf=uiFreq;break;}Key_Val_Old=Key_Val;
}
void ADC_Proc(void)
{if(uiADC_Dly<200)return;uiADC_Dly=0;ucADC_Res=PCF8591_ADC(0x41);ucADC_Photo=PCF8591_ADC(0x43);
}
void Time_1(void) interrupt 3
{ulms++;uiSeg_Dly++;uiKey_Dly++;uiADC_Dly++;uiLed_Dly++;if(ulms%2==0){ucSeg_Pos=(ucSeg_Pos+1)%8;Seg_Disp(pucSeg_Code,ucSeg_Pos);}if(ulms%1000==0){uiFreq=((TH0<<8)|TL0);uiTime=1000000/uiFreq;//以微秒為單位TH0=0;TL0=0;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72441.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyCharm接入本地部署DeepSeek 實現AI編程!【支持windows與linux】

今天嘗試在pycharm上接入了本地部署的deepseek&#xff0c;實現了AI編程&#xff0c;體驗還是很棒的。下面詳細敘述整個安裝過程。 本次搭建的框架組合是 DeepSeek-r1:1.5b/7b Pycharm專業版或者社區版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

CSS 系列之:grid 布局

基本概念 <template><div class"parent"><div class"box">p1-1</div><div class"box">p1-2</div><div class"box">p1-3</div></div><div class"parent"><…

數學軟件Matlab下載|支持Win+Mac網盤資源分享

如大家所了解的&#xff0c;Matlab與Maple、Mathematica并稱為三大數學軟件。Matlab應用廣泛&#xff0c;常被用于數據分析、無線通信、深度學習、圖像處理與計算機視覺、信號處理、量化金融與風險管理、機器人&#xff0c;控制系統等領域。 Matlab將數值分析、矩陣計算、科學…

水仙花數(華為OD)

題目描述 所謂水仙花數&#xff0c;是指一個n位的正整數&#xff0c;其各位數字的n次方和等于該數本身。 例如153是水仙花數&#xff0c;153是一個3位數&#xff0c;并且153 13 53 33。 輸入描述 第一行輸入一個整數n&#xff0c;表示一個n位的正整數。n在3到7之間&#x…

物聯網同RFID功能形態 使用場景的替代品

在物聯網&#xff08;IoT&#xff09;和自動識別技術領域&#xff0c;除了RFID標簽外&#xff0c;還有一些其他技術產品可以在形態和大小上與RFID標簽相似&#xff0c;同時提供類似或更強大的功能。以下是幾種能夠替代RFID標簽的產品&#xff1a; 一、NFC標簽 NFC&#xff08;…

03.03 QT

1.在注冊登錄的練習里面&#xff0c;追加一個QListwidget 項目列表 要求:點擊注冊之后&#xff0c;將賬號顯示到 1istwidget上面去 以及&#xff0c;在listwidget中雙擊某個賬號的時候&#xff0c;將該賬號刪除 Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWi…

c++ cout詳解

在 C++ 中,cout 是標準輸出流對象,用于向控制臺(或標準輸出設備)輸出數據。它是 iostream 庫的核心組件之一,與 << 流插入運算符配合使用。 一、基本用法 1. 頭文件和命名空間 #include <iostream> // 必須包含的頭文件 using namespace std; // 命名空間(…

深入解析 .NET Core 的應用啟動流程

隨著 .NET Core 的發展&#xff0c;它逐漸成為構建跨平臺、高性能 Web 應用的首選框架。了解 .NET Core 的應用啟動流程是開發者成功使用該框架的關鍵&#xff0c;尤其是在調試、優化和部署時。本文將深入探討 .NET Core 的應用啟動過程&#xff0c;從創建 Web 主機、配置服務、…

(十二)基于 Vue 3 和 Mapbox GL 實現的坐標拾取器組件示例

下面是一個基于 Vue 3 和 Mapbox GL 實現的坐標拾取器組件示例: <template><div class="map-container"><div ref="mapContainer" class="map"></div><div class="coordinates-box"><div v-if=&qu…

LINUX網絡基礎 - 網絡編程套接字,UDP與TCP

目錄 前言 一. 端口號的認識 1.1 端口號的作用 二. 初識TCP協議和UDP協議 2.1 TCP協議 TCP的特點 使用場景 2.2 UDP協議 UDP的特點 使用場景 2.3 TCP與UDP的對比 2.4 思考 2.5 總結 三. 網絡字節序 3.1 網絡字節序的介紹 3.2 網絡字節序思考 四. socket接口 …

歌曲分類和流行度預測

1. 項目介紹 本項目從kaggle平臺上下載了數據集&#xff0c;該數據集包含了3萬多首來自Spotify API 的歌曲&#xff0c;共有23個特征。首先對數據集進行預處理&#xff0c;如重復行、缺失值、標準化處理等。再對預處理后的數據進行探索性分析&#xff0c;觀察各變量的分布情況&…

Trae:國內首款AI原生IDE,編程效率大提升

今年一月&#xff0c;在新聞上看到字節跳動面向海外市場推出了一款名為Trae的AI集成開發環境&#xff08;IDE&#xff09;。起初&#xff0c;我并未給予過多關注&#xff0c;因為市面上已有不少IDE集成了AI插件&#xff0c;功能也非常全面&#xff0c;而字節跳動自家的MarsCode…

實訓任務1.3 使用eNSP搭建基礎網絡

目錄 1.【實訓目標】 2.【實訓內容】 1.【實訓目標】 1.掌握eNSP仿真軟件的基本操作方法。 2.掌握使用eNSP仿真軟件搭建簡單的端到端網絡的方法。 【實訓環境】 1.硬件環境&#xff1a;每人一臺配置網卡的計算機。 2.軟件環境&#xff1a;華為eNSP仿真軟件。 2.【實訓內…

藍橋杯備賽Day12 動態規劃1基礎

動態規劃 動態規劃基礎 動態規劃將復雜問題分解成很多重疊的子問題&#xff0c;再通過子問題的解得到整個問題的解 分析步驟: 確定狀態:dp[i][j]val,“到第i個為止&#xff0c;xx為j的方案數/最小代價/最大價值” 狀態轉移方程: 確定最終狀態 要求: (1)最優子結構 (2)無后效性…

mac Homebrew安裝、更新失敗

我這邊使用brew安裝git-lfs 一直報這個錯&#xff1a; curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL更新brew update也是報這個錯誤。最后使用使用大佬提供的腳本進行操作&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/mast…

簡易的微信聊天網頁版【項目測試報告】

文章目錄 一、項目背景二、項目簡介登錄功能好友列表頁面好友會話頁面 三、測試工具和環境四、測試計劃測試用例部分人工手動測試截圖web自動化測試測試用例代碼框架配置內容代碼文件&#xff08;Utils.py&#xff09;登錄頁面代碼文件&#xff08;WeChatLogin.py&#xff09;好…

【開源-鴻蒙土撥鼠大理石系統】鴻蒙 HarmonyOS Next App+微信小程序+云平臺

?本人自己開發的開源項目&#xff1a;土撥鼠充電系統 ?踩坑不易&#xff0c;還希望各位大佬支持一下&#xff0c;在GitHub給我點個 Start ??&#x1f44d;&#x1f44d; ?GitHub開源項目地址&#x1f449;&#xff1a;https://github.com/cheinlu/HarmonyOS-groundhog-mar…

如何停止Oracle expdp/impdp job

一、停止 expdp job舉例 1.執行 expdp 命令 $ expdp rui/rui DIRECTORYdmp_dir dumpfilestudyfull_expdp.dmp FULLy logfilestudyfullexpdp.log job_nameexpdp_job2.查看在運行的作業名稱 SQL> select job_name,state from dba_datapump_jobs; JOB_NAME …

深入解析SQL Server高級SQL技巧

SQL Server 是一種功能強大的關系型數據庫管理系統&#xff0c;廣泛應用于各種數據驅動的應用程序中。在開發過程中&#xff0c;掌握一些高級SQL技巧&#xff0c;不僅能提高查詢性能&#xff0c;還能優化開發效率。這篇文章將全面深入地探討SQL Server中的一些高級技巧&#xf…

ES批量查詢

在 Elasticsearch 中&#xff0c;multi_search&#xff08;也稱為 msearch&#xff09;是一種允許你在單個請求中執行多個搜索操作的 API。它可以顯著減少網絡開銷&#xff0c;尤其是在需要執行多個查詢時。multi_search 會將多個查詢打包成一個請求發送給 Elasticsearch&#…