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

一、真題

二、模塊構建

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

void Cls_Peripheral(void);

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

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記得加' '
  • 判斷是否有 .

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. 返回按鍵所對應的數字

?5.超聲波代碼編寫

unsigned char Wave_Recv(void);

  1. 定義Tx和Rx引腳
  2. 將定時器里的TR0設置為0
  3. 定義變量,初始值為10,發射10個周期的波形
  4. 為了規范,將定時器的初值進行再次賦值
  5. 再令TR0=1,讓定時器開始計時
  6. 發送10個周期的信號
  7. 每12us,TF0溢出,將Tx進行異或運算,while循環加分號
  8. TF0清零
  9. 關閉定時器,將定時器初值清零,打開定時器進行正計時
  10. while(RX&&!TF0)如果接收到信號,或TF0溢出,則退出循環
  11. 退出循環后關閉定時器
  12. 如果TF0溢出導致退出循環,返回最大值255,否則返回計時時間
  13. 返回的時間單位是us,需要統一單位,*0.017 進而換算成距離單位為厘米

6.定時器代碼編寫

void Timer0Init(void);
void Timer1Init(void);?? ?

  1. 定時器0作為超聲波定時器,將TR0=0
  2. ?設置定時器0供超聲波代碼使用,時間為12us,12T,12MHz
  3. 定時器1作為主定時器,加上ET1=1

7.編寫AD/DA代碼

unsigned char PCF8591_ADC(void);

void PCF8591_DAC(unsigned char dat);

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

三、主函數編寫?

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

2.編寫數碼管函數

  1. ?每200ms檢測一次
  2. if模式(Disp_Mode)判斷
  3. 不要忘記調用數碼管轉換函數(否則數碼管會全部點亮)

3. 中斷服務函數

  1. 為各個變量進行自加
  2. ?數碼管的動態顯示

4.模式界面編寫

  1. ?電壓數據為unsigned char類型,要轉化成浮點數? %4.2f
  2. 參數界面注意上下限的值
  3. 測距界面注意超聲波狀態是否開啟

5.ADC函數編寫

  1. ?沒有規定時間,任意即可
  2. 將采集來的數據賦值給變量
  3. 對采集的數據進行判斷,看是否在上下限里,從而對超聲波設置不同的狀態

6.key函數編寫?

  1. ?定義兩個變量
  2. 時間為20ms
  3. if判斷兩個變量是否相等,相等返回
  4. 不相等進入Switch語句,判斷哪個按鍵被按下
  5. 最后不要忘記加上Key_Val_Old=Key_Val
  6. s4按下,Disp_Mode+1對3取模,因為是三個界面進行切換,根據題目要求,判斷是否到參數界面,到參數界面,默認選擇電壓上限
  7. s6按下,參數值加0.5,注意要判斷是否在參數界面
  8. s7按下,參數值減0.5,注意要判斷是否在參數界面
  9. 注意s4按鍵按下界面切換的順序和題目給的順序不一致
  10. 由于要求對參數的調整在s4按下后才生效,所以需要增加兩個參數,同時記得更改其他按鍵參數變量

7.超聲波函數編寫

  1. 性能指標未規定時間,任意即可
  2. 在將測距結果賦值給變量前,先判斷狀態,為0直接返回,不進行測距

8.編寫DAC函數

  1. 判斷超聲波狀態,未開啟輸出0
  2. 若開啟,判斷超聲波測距結果,用if else語句來實現相應功能?
  3. 關于呈線性關系的那部分圖像,可以用數學方法計算出y=kx+b中的k和b

?9.編寫led函數

  1. 性能要求led響應時間小于0.2s
  2. 判斷處于那個界面
  3. 點亮置1,熄滅置0
  4. 點亮用|=,熄滅用&=(置1再取反)切換亮滅狀態用^=
  5. 切換亮滅狀態,把它放到定時器中斷里

?四、難點解析

1.按鍵切換界面的順序和題目所給順序不一致

2.調整參數時,參數值不生效,當按鍵按下時才生效

3.加,減模式的循環,用到了if判斷

4.DAC的數據轉換——通過數學方法解出來


易錯點?

將不同函數的計時變量復制粘貼時忘記更改

五、主函數代碼

#include "led.h"
#include "init.h"
#include "seg.h"
#include "key.h"
#include "tim.h"
#include "ultrasonic.h"
#include "iic.h"
#include "stdio.h"
//seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//time
unsigned long ulms=0;
unsigned int uiSeg_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiDAC_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiLed_Dly=0;
unsigned int uiUltrasonic_Dly=0;
//led
unsigned char ucLed=0x00;
//ADC
unsigned char ucADC=0;
float ADC_Pram_Max=4.5 ,ADC_Pram_Min= 0.5;
float ADC_Pram_Max_temp=4.5 ,ADC_Pram_Min_temp= 0.5;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
//ultrasonic
unsigned char ucDist=0;
unsigned char Ultrasonic_Status=0;
//function
void Seg_Proc(void);
void Led_Proc(void);
void ADC_Proc(void);
void DAC_Proc(void);
void Key_Proc(void);
void Ultrasonic_Proc(void);
//mode
unsigned char Disp_Mode=0;
unsigned char Pram_Mode=0;//0--max  1--minvoid main(void)
{Cls_Peripheral();Timer0Init();Timer1Init();EA=1;while(1){Seg_Proc();ADC_Proc();DAC_Proc();Key_Proc();Led_Proc();Ultrasonic_Proc();}
}
void Seg_Proc(void)
{if(uiSeg_Dly<200)return;uiSeg_Dly=0;if(Disp_Mode==0){sprintf(pucSeg_Buf,"U    %4.2f",ucADC/51.0);}else if(Disp_Mode==2){sprintf(pucSeg_Buf,"P  %3.1f %3.1f",ADC_Pram_Max_temp,ADC_Pram_Min_temp);}else{if(Ultrasonic_Status==0){sprintf(pucSeg_Buf,"L    AAA");}else {sprintf(pucSeg_Buf,"L    %3u",(unsigned int)ucDist);}}Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void Led_Proc(void)
{if(uiLed_Dly<100)return;uiLed_Dly=0;if(Disp_Mode==0){ucLed|=0x01;ucLed&=~0x06;}else if(Disp_Mode==1){ucLed|=0x02;ucLed&=~0x05;}else{ucLed|=0x04;ucLed&=~0x03;}if(Ultrasonic_Status==1){ucLed^=0x80;}else{ucLed&=~0x80;}Led_Disp(ucLed);
}
void ADC_Proc(void)
{if(uiADC_Dly<200)return;uiADC_Dly=0;ucADC=PCF8591_ADC();if((ucADC/51.0>ADC_Pram_Min)&&(ucADC/51.0<ADC_Pram_Max)){Ultrasonic_Status=1;}else{Ultrasonic_Status=0;}
}
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 4:Disp_Mode=(Disp_Mode+1)%3;if(Disp_Mode==2){Pram_Mode=0;ADC_Pram_Max_temp=ADC_Pram_Max;ADC_Pram_Min_temp=ADC_Pram_Min;}else if(Disp_Mode==0){ADC_Pram_Max=ADC_Pram_Max_temp;ADC_Pram_Min=ADC_Pram_Min_temp;}break;case 5:if(Disp_Mode==2){Pram_Mode=(Pram_Mode+1)%2;}break;case 6:if(Disp_Mode==2){if(Pram_Mode==0){if(ADC_Pram_Max_temp==5.0){ADC_Pram_Max_temp=0.5;}else{ADC_Pram_Max_temp+=0.5;}}else{if(ADC_Pram_Min_temp==5.0){ADC_Pram_Min_temp=0.5;}else{ADC_Pram_Min_temp+=0.5;}}}break;case 7:if(Disp_Mode==2){if(Pram_Mode==0){if(ADC_Pram_Max_temp==0.5){ADC_Pram_Max_temp=5.0;}else{ADC_Pram_Max_temp-=0.5;}}else{if(ADC_Pram_Min_temp==0.5){ADC_Pram_Min_temp=5.0;}else{ADC_Pram_Min_temp-=0.5;}}}break;}Key_Val_Old=Key_Val;
}	
void Ultrasonic_Proc(void)
{if(uiUltrasonic_Dly<500)return;uiUltrasonic_Dly=0;if(Ultrasonic_Status==0)return;ucDist=Wave_Recv();
}
void DAC_Proc(void)
{if(uiDAC_Dly<200)return;uiDAC_Dly=0;if(Ultrasonic_Status==0){PCF8591_DAC(0);}else {if(ucDist<=20){PCF8591_DAC(51);}else if(ucDist>=80){PCF8591_DAC(255);}else{PCF8591_DAC(3.4*ucDist-17);}}
}
void Time_1(void) interrupt 3 
{ulms++;uiSeg_Dly++;uiADC_Dly++;uiDAC_Dly++;uiKey_Dly++;uiLed_Dly++;uiUltrasonic_Dly++;if (ulms%2==0){ucSeg_Pos=(ucSeg_Pos+1)%8;Seg_Disp(pucSeg_Code,ucSeg_Pos);}}

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

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

相關文章

【CMake 教程】常用函數與構建案例解析(三)

一、CMake 常用函數簡析 1. 條件判斷 if() / elseif() / else() 在 CMake 腳本中&#xff0c;條件判斷是控制邏輯的重要工具。if() 支持多種比較語句&#xff0c;包括數值、字符串、布爾值和變量存在性等。在條件滿足時執行特定邏輯代碼&#xff0c;下面是典型語法&#xff1…

ASP.NET Core 8.0學習筆記(二十七)——數據遷移:Migrations深入與其他遷移命令

一、數據庫架構的管理 1.EF Core提供兩種方式來保持EF Core的模型與數據庫保持同步。 (1)以數據庫為準&#xff1a;反向工程&#xff08;Db First&#xff09;&#xff0c;適用于中大型工程 (2)以代碼為準&#xff1a;數據遷移&#xff08;Code First&#xff09;&#xff0c;…

Python 基本語法的詳細解釋

目錄 &#xff08;1&#xff09;注釋 &#xff08;2&#xff09;縮進 &#xff08;3&#xff09;變量和數據類型 變量定義 數據類型 &#xff08;4&#xff09;輸入和輸出 輸出&#xff1a;print() 函數 輸入&#xff1a;input() 函數 &#xff08;1&#xff09;注釋 注…

20-R 繪圖 - 餅圖

R 繪圖 - 餅圖 R 語言提供來大量的庫來實現繪圖功能。 餅圖&#xff0c;或稱餅狀圖&#xff0c;是一個劃分為幾個扇形的圓形統計圖表&#xff0c;用于描述量、頻率或百分比之間的相對關系。 R 語言使用 pie() 函數來實現餅圖&#xff0c;語法格式如下&#xff1a; pie(x, l…

Ubuntu 22.04 一鍵部署MinerU1.1.0

MinerU MinerU是一款將PDF轉化為機器可讀格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取為任意格式。 MinerU誕生于書生-浦語的預訓練過程中&#xff0c;我們將會集中精力解決科技文獻中的符號轉化問題&#xff0c;希望在大模型時代為科技發…

紫光同創開發板使用教程(二):sbit文件下載

sbit文件相當于zynq里面的bit文件&#xff0c;紫光的fpga工程編譯完成后會自動生成sbit文件&#xff0c;因工程編譯比較簡單&#xff0c;這里不在講解工程編譯&#xff0c;所以我這里直接下載sbit文件。 1.工程編譯完成后&#xff0c;可以看到Flow列表里面沒有報錯&#xff0c…

DeepSeek 部署全指南:常見問題解析與最新技術實踐

引言 隨著開源大模型DeepSeek的爆火&#xff0c;其部署需求激增&#xff0c;但用戶在實際操作中常面臨服務器壓力、本地部署性能瓶頸、API配置復雜等問題。本文結合2025年最新技術動態&#xff0c;系統梳理DeepSeek部署的核心問題與解決方案&#xff0c;并分享行業實踐案例&am…

Vue02

Vue02 綁定class樣式 字符串寫法&#xff0c;適用于&#xff1a;樣式的類名不確定&#xff0c;需要動態指定 數組寫法&#xff0c;適用于&#xff1a;要綁定的樣式個數不確定&#xff0c;名字也不確定 對象寫法&#xff0c;適用于&#xff1a;要綁定的樣式個數缺點&#xff…

超導量子計算機的最新進展:走向實用化的量子革命

超導量子計算機的最新進展:走向實用化的量子革命 大家好,我是 Echo_Wish,今天我們來聊聊科技圈最炙手可熱的話題之一——超導量子計算機。近年來,量子計算領域可謂是風起云涌,而超導量子計算機作為主流路線之一,已經在學術界和工業界取得了不少突破性進展。 那么,超導…

LangChain構建行業知識庫實踐:從架構設計到生產部署全指南

文章目錄 引言:行業知識庫的進化挑戰一、系統架構設計1.1 核心組件拓撲1.2 模塊化設計原則二、關鍵技術實現2.1 文檔預處理流水線2.2 混合檢索增強三、領域適配優化3.1 醫學知識圖譜融合3.2 檢索結果重排序算法四、生產環境部署4.1 性能優化方案4.2 安全防護體系五、評估與調優…

Node.js中如何修改全局變量的幾種方式

Node.js中如何修改全局變量。我需要先理解他們的需求。可能他們是在開發過程中遇到了需要跨模塊共享數據的情況&#xff0c;或者想要配置一些全局可訪問的設置。不過&#xff0c;使用全局變量可能存在一些問題&#xff0c;比如命名沖突、難以維護和測試困難&#xff0c;所以我得…

【Node.js】express框架

目錄 1初識express框架 2 初步使用 2.1 安裝 2.2 創建基本的Web服務器 2.3 監聽方法 2.3.1 監聽get請求 2.3.2 監聽post請求 2.4 響應客戶端 2.5 獲取url中的參數(get) 2.5.1 獲取查詢參數 2.5.2 獲取動態參數 2.6 托管靜態資源 2.6.1 掛載路徑前綴 2.6.2 托管多…

Vulhub靶機 Apache Druid(CVE-2021-25646)(滲透測試詳解)

一、開啟vulhub環境 docker-compose up -d 啟動 docker ps 查看開放的端口 1、漏洞范圍 在Druid0.20.0及更低版本中 二、訪問靶機IP 8888端口 1、點擊Load data進入新界面后&#xff0c;再點擊local disk按鈕。 2、進入新界面后&#xff0c;在標紅框的Base directory欄寫上…

【c語言】函數_作業詳解

前言&#xff1a; 對應鵬哥專升本c語言&#xff0c;51集 內容&#xff1a; 找出10個數值中的最大值&#xff0c; #include <stdio.h> //求10個整數中的最大值 int main() {//準備10個整數 //int arr[10] {1,2,3,4,13,6,7,8,9,-2};//用于循環10次int i 0;//也可以自…

計算機網絡之路由協議(自治系統)

一、自治系統&#xff08;AS&#xff09; 自治系統是由同一個技術管理機構管理、使用統一選路策略的一些路由器的集合。它是網絡的基本構成單位&#xff0c;每個自治系統是一個獨立運營并自主決定與誰交換流量的實體。自治系統內部運行內部網關協議&#xff08;IGP&#xff09…

【Unity】Unity clone 場景渲染的燈光貼圖異位問題

Unity clone 場景渲染的燈光貼圖異位問題 問題 需要將一個場景clone 一份保存到本地 當克隆完成后&#xff0c;副本場景的燈光貼圖異位了&#xff0c;與原場景存在較大的差別 問題原因 場景被clone 后&#xff0c;場景的燈光渲染數據不能共用&#xff0c;即Lightmapping.li…

Python----數據分析(Numpy一:numpy庫簡介,與list列表的區別,數組的創建,隨機數組的創建)

一、 Numpy庫簡介 1.1、概念 NumPy(Numerical Python)是一個開源的Python科學計算庫&#xff0c;旨在為Python提供 高性能的多維數組對象和一系列工具。NumPy數組是Python數據分析的基礎&#xff0c;許多 其他的數據處理庫&#xff08;如Pandas、SciPy&#xff09;都依賴于Num…

千峰React:函數組件使用(2)

前面寫了三千字沒保存&#xff0c;恨&#xff01; 批量渲染 function App() {const list [{id:0,text:aaaa},{id:1,text:bbbb},{id:2,text:cccc}]// for (let i 0; i < list.length; i) {// list[i] <li>{list[i]}</li>// }return (<div><…

Hot100 動態規劃

動態規劃 動規五部曲&#xff1a; 確定dp數組以及下標的含義確定遞推公式dp數組如何初始化確定遍歷順序舉例推導dp數組 70. 爬樓梯 - 力扣&#xff08;LeetCode&#xff09; 爬到第一層樓梯有一種方法&#xff0c;爬到二層樓梯有兩種方法。 那么第一層樓梯再跨兩步就到第三…

Rust語言基礎知識詳解【一】

1.在windows上安裝Rust Windows 上安裝 Rust 需要有 C 環境&#xff0c;以下為安裝的兩種方式&#xff1a; 1. x86_64-pc-windows-msvc&#xff08;官方推薦&#xff09; 先安裝 Microsoft C Build Tools&#xff0c;勾選安裝 C 環境即可。安裝時可自行修改緩存路徑與安裝路…