藍橋杯一些血的教訓

2020-10-09 16:00:25

第四屆藍橋杯省賽 智慧灌溉系統

  1. 首先,新建一個keil工程
  2. 一定記得main.c,iic.c要新增到資料夾中…!
    圖1
    圖一
    否則檔案將無法執行。
    (ps: 有時候是微控制器板子的問題,如下圖,當時的情況是led燈全亮了,smg不亮)(我有什麼辦法,俺只能挨個排查呀!!)(排查現有模組。發現中斷√ smg√ 初始化√)(只有新增一些絕對正確的特徵判斷程式的執行情況,就比如讓特定的LED燈亮)
    在這裡插入圖片描述
    後面發現LED燈也不亮(只有兩種可能:1.程式未執行到這裡(不可能!!!!) 2.板子壞了)然後再繼續判斷
    ······
  3. 遇見按鍵一次,自加多次的問題.
    你能看出是什麼錯誤麼? 在這裡插入圖片描述現狀描述:
    這也太神奇了吧,同樣都是damp–,一個按鍵一次,自減一次,一個自減多次
    在這裡插入圖片描述
    真的過於神奇:沒註釋的部分會按鍵一次自減多次
    註釋的部分就是正常的

揭祕:
是因為吧cont 錯寫成了count
這是兩個不同的變數
有這個事件也可以得出
以後百度搜不到的問題,也許你目前想的這裡並沒有問題
去尋找一下
其他可能的錯誤

第五屆 簡易溫度檢測

多個 if 與 else if的問題

1,從字面上理解if為如果,就是如果這種情況,如果那種情況。
2,else if 不是上一個條件的前提下,如果是這個條件。
3,區別1:if無論是否滿足條件都會向下執行,知道程式結束,else if 滿足一個條件就會停止執行。
4,區別2:由於if都會執行一遍,則可能會同一個需要判斷的事件,會進入2個if語句中,出現錯誤,而else if就不會發生這樣的事情。
在這裡插入圖片描述
這樣寫成else if的形式,就不容易程式同時執行兩次

區域性變數初始值的問題

  1. 有關按鍵不靈敏的問題
    在這裡插入圖片描述
    沒有寫key = 0,就死翹翹了…,後面的判斷情況不起作用。
    原因:
    C語言中,定義區域性變數時如果未初始化,則值是隨機的,這是為什麼呢?

定義區域性變數,其實就是在棧中通過移動棧指標來給程式提供一個記憶體空間和這個區域性變數名系結。因為這段記憶體空間在棧上,而棧記憶體是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的區域性變數定義時如果不顯式初始化,值就是髒的。

c語言中只有區域性變數在未賦初值時,才是亂數,全域性變數和靜態變數未賦初值時編譯器會自動將其初始化為0。區域性變數是分配在堆疊上的,而全域性變數和靜態變數是分配在資料段中的。這個跟程式的記憶體分配是有關係的。
3. 燈光閃爍時間問題
在這裡插入圖片描述
4.讀溫度的時間不能太長
在這裡插入圖片描述
這樣800ms就讀不出來,試試0300ms

這是10ms讀取一次的效果:

在這裡插入圖片描述3000ms的讀取效果:
數碼管無閃爍
但是led幾乎沒亮

在這裡插入圖片描述
在這裡插入圖片描述
這樣就可以亮
經過很多次的測驗,發現很多時候不是空格的問題

因此,控制變數很重要,要記錄下倆對應的程式和現象
在這裡插入圖片描述
結果:
400ms的不能亮,800ms能亮
(猜測1:是讀取溫度需要750ms,恰好跳過了中斷
猜測2: 400ms太短,程式執行到這裡來的時候,標誌位又變了
(大概程式就是再寫了溫度後,LED不太正常的亮了)
{所以以後不能隨意的更改程式碼,改一次,一定要記住更改內容,變化物件!)

揭祕:
在這裡插入圖片描述
800 是200,400,800的公倍數,如果用if else語句,就會造成選擇結構,滿足其中一個,就不會進入另一個繼續判斷。
就會造成flag標誌位不產生變化。

一個優秀的程式設計師對這些簡單的語句用的是爐火純青,淋漓盡致啊