第十四屆藍橋杯單片機模擬賽代碼分享
新建文件夾,創(chuàng)建工程,添加文件,保存文件,將文件添加進工程這些操作在比賽通用模板里面有類似操作,因為這里用的是矩陣鍵盤(注意把板子上面的跳帽接好),那key.c里面的程序就要改成矩陣鍵盤的。
文末附代碼
1.調(diào)試好外設(shè)(DS18B20,PCF8591,串口通信等)
將官方驅(qū)動程序移植進工程后,編寫驅(qū)動程序,并測試模塊是否能正常使用。
onewire.c
添加DS18B20讀取溫度的代碼即可,寫完后可以先用數(shù)碼管顯示一下讀取溫度數(shù)值看看模塊驅(qū)動程序有無問題。

iic.c
添加PCF8591的驅(qū)動代碼即可,寫完后可以先用數(shù)碼管顯示一下讀取數(shù)值看看模塊驅(qū)動程序有無問題。

sys.c
這部分要添加串口通信相關(guān)代碼,包括串口初始化與串口發(fā)送字符串,其實也就是之前視頻里面的代碼。

一定要保證所有外設(shè)都是正常的才好進入下一步,如果有模塊不能正常驅(qū)動,要盡快調(diào)試好,以保證后期系統(tǒng)的正常運行。
2.主函數(shù)main.c函數(shù)介紹
宏定義區(qū)——主要是方便將變量顯示在數(shù)碼管

變量定義區(qū)——系統(tǒng)變量進行全局定義

函數(shù)定義區(qū)——將寫在main()函數(shù)下面的函數(shù)進行定義

main()函數(shù)
首先是各種初始化:sys_init(),這個在sys.c里面,是對LED,蜂鳴器,數(shù)碼管和繼電器的初始化,就是把它們?nèi)缄P(guān)掉;接下來是預(yù)讀取溫度,然后延時這樣能夠解決上電顯示85的問題;然后是定時器與串口初始化函數(shù)(在sys.c里面)
在while(1)里面,第一個進程是按鍵掃描,判斷按鍵S4和S5與題目中的鎖定模式聯(lián)系上,這里的Lock是標志位,Lock=0就是沒鎖,Lock=1就是鎖上了,然后根據(jù)mode執(zhí)行對應(yīng)模式,這兩個函數(shù)將在下面介紹,進程最后是刷新LED,蜂鳴器和繼電器這些。

Time0中斷服務(wù)函數(shù)
數(shù)碼管每隔1ms刷新一次,按鍵每隔20ms掃描一次,Led,蜂鳴器繼電器這些每隔50ms刷新一次,在電壓測量模式下每隔100ms測量一次電壓,time_flag是為了鎖定系統(tǒng)時閃爍L3的標志位,在溫度測量模式每隔500ms測量一次溫度值。

Tmp_Mode()函數(shù)
溫度測量模式函數(shù),這里的tmp_mea是定時器里面的進程,500ms一到,tmp_mea置位此時測溫并顯示溫度在數(shù)碼管上,這里用到了上面定義的宏,shi(temp_T)這里后面+32是為了顯示小數(shù)點,不懂的可以去tube.c里面研究一下,去數(shù)一下wei那個數(shù)組就懂了;這里如果按下S12就會將數(shù)據(jù)上傳至串口助手。
注意:sprintf()函數(shù)在stdio.h里面,要去main.h里面添加#include <stdio.h>這個頭文件
我這里沒有判斷負數(shù)溫度,其實應(yīng)該是要加一下的,這樣穩(wěn)一點。


AD_Mode()函數(shù)
電壓測量模式,讀取電位器電壓,與上面的溫度測量模式函數(shù)類似,不過多解釋了。

LED_Show()函數(shù)
刷新LED,該函數(shù)是我之前總結(jié)出來的,基本可以應(yīng)用在所有的題目上,大家可以參考一下,前面兩個燈就是對應(yīng)模式下點亮,L3是鎖上時閃爍,這里就用到了time_flag,若是鎖上了那么每隔100ms對L3取反就是L3閃爍,沒鎖時就是L3滅。
重點介紹一下uLed:
首先要知道LED是低電平點亮,那么0xf8 = 1111 1000,直接讓前五位都滅,最后三位分別對應(yīng)L3,L2,L1(開發(fā)板上L1對應(yīng)P0^0,L2對應(yīng)P0^1......L8對應(yīng)P0^7)
舉個例子,若是L1 = 1,L2 = 0,L3=1
所以 L3<<2 | L2<<1 | L1 = 0000 0101
uLed = 0xf8 | (L3<<2 |?L2<<1?| L1) = 1111 1101,所以這時候L2被點亮了。大家可以多舉幾個例子自己理解一下哈。
然后下面就是關(guān)中斷,點燈,開中斷,這個步驟是為了點燈時不與數(shù)碼管沖突。

Beep_Realy_Run()
刷新蜂鳴器繼電器,這個過程與上面點燈也是類似的,基本過程是一樣的,唯一要注意的是繼電器和蜂鳴器都是高點平驅(qū)動的。
其實這個0xaf不是固定的,但一定要保證第6位和第4位都是0,因為這兩位連接的蜂鳴器和繼電器。

串口中斷服務(wù)函數(shù)
這里就是從電腦串口接收數(shù)據(jù),根據(jù)Lock的值判斷此時是否可以切換模式。

3.總結(jié)
本次模擬賽的其實就是考個串口來嚇唬我們的,其實基本的功能都很好實現(xiàn),沒有很難的考點,只要串口通信能搞定其他都不是問題。
比賽前把所有模塊的驅(qū)動全都記熟了(包括超聲波和串口都要記),當然也要會靈活變通啦,省賽考的邏輯不會太難也都是比較基礎(chǔ)的吧,所以好好準備,預(yù)祝大家都能取得好成績!
代碼下載地址:https://wwnz.lanzouw.com/iAstT0pn3sza
代碼僅供參考,因為每個人理解不同所以實現(xiàn)的功能可能與大家不太一樣,如果代碼中有任何問題歡迎大家在評論區(qū)留言交流。
如果本專欄內(nèi)容對您有所幫助,可以給新人UP主三連支持一下嘛(手動doge),您的支持是對我最大的鼓勵,謝謝啦!