日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

蓝桥杯单片机设计与开发_标准模板

發布時間:2023/12/20 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯单片机设计与开发_标准模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

藍橋杯單片機設計與開發_標準模板

一、前言

首先,這篇文章是筆者第一次在 CSDN 上寫博文,較為生疏,讀者若有任何意見,歡迎大家在評論區交流!
筆者目前為一名大二學生,參加了2021年藍橋杯單片機設計與開發組省賽,獲省賽一等獎成功入圍決賽。筆者將在接下來一個月的時間內不斷更新關于藍橋杯單片機設計與開發國賽的博文,初衷是與各位同學共勉,一起準備國賽,希望和大家共同取得佳績。
同時,筆者也希望將這篇文章作為51單片機的一個基礎部分,為本校自動化專業的學弟學妹們答疑解惑,祝學弟學妹們在即將到來的科技創新思維訓練的結課測試中取得優異的成績。

二、標準模板

話不多說,我們直接進入正題。文章中所說的標準模板,其實是指包含了初始化函數、鎖存器驅動、數碼管驅動函數、矩陣鍵盤/獨立鍵盤以及定時器中斷等模塊的可編譯.c文件。
筆者的標準模板并不是采用模塊化編程,筆者認為定義包含多個LED、數碼管等多個頭文件看起來較為繁瑣,對于新手不太友善。而應付藍橋杯比賽、51單片機考試等,筆者以為通過采用“函數模塊化”編程即可,故本模板在一個.c文件中分模塊定義多個驅動函數,也是十分簡潔、容易上手的。

1、創建工程

創建工程:依次點擊菜單欄中 Project → New uvision Project… → 輸入工程名稱并保存 → 選擇STC15F2K60S2(注:需通過 stc-isp 軟件 Keil 仿真添加頭文件)→ 點擊 File 下方空白頁新建空文件并命名為.c文件 → 雙擊 Source Group 將.c文件加入工程,就可以開始在文件中編寫程序。


2、編程準備

(1)首先,包含頭文件。對于藍橋杯單片機設計與開發大賽采用的單片機為 IAP15 系列單片機,型號為:IAP15F2K61S2,頭文件使用“STC15F2K60S2.h”即可(本文章將以此為例)。若采用“reg52.h”需在頭文件中添加AUXR、SCON等特殊寄存器,以免影響串口及一些芯片的正常編程。
而對于剛入門的新手,使用 STC89S52 單片機編寫簡單的 LED、數碼管、鍵盤等程序,使用“reg52.h”頭文件足矣。

#include "STC15F2K60S2.h" //頭文件#define u8 unsigned char //宏定義常用類型 #define u16 unsinged int u8 dspbuf[8] = {10,10,10,10,10,10,10,10}; //定義緩沖區 u8 code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //定義數組存放數碼管數字1~9和熄滅狀態

3、鎖存器驅動函數

筆者主函數前編寫鎖存器驅動函數,將為接下來的數碼管驅動、主函數功能等程序的編寫帶來極大的益處,十分便捷。

void door(u8 choose,input) //數碼管驅動函數 {P2 = (P2&0x1f) | choose; //相與空出高3位,choose輸入打通鎖存器P0 = input; //送入數據P2 &= 0x1f; //關閉鎖存器 }

4、數碼管驅動函數

數碼管顯示數字 0~9 采用了編程準備步驟中的 dspbuf 緩沖區及數組 tab ,我們通過改變 dspbuf 數組中對應的八個數字即可改變八個數碼管顯示的數字。例:dspbuf [0] = 8;將在第一個數碼管上顯示數字“8”。
語句 door(0xe0,tab[dspbuf[dspcom++]]) 原理其實很簡單:通過初始化語句 dspbuf [0] = 8,使得 dspbuf 數組選中第一個緩沖區(即顯示第一個數碼管),而 tab 數組將選中第八個數,第八個數“0x80”對應的將在數碼管中顯示數字“8”(對于數碼管顯示數字的二進制代碼計算這里不再贅述)。

u8 dspcom = 0; //定義數碼管點亮位數 void display() //數碼管驅動函數 {door(0xe0,0xff); //消隱door(0xc0,0x01<<dspcom); //位選door(0xe0,tab[dspbuf[dspcom++]]); //段選if(dspcom >= 8) //初始化位數,動態循環dspcom = 0; }

5、初始化函數

(1)LED、蜂鳴器等初始化

筆者在初始化函數 all_init 前定義數碼管熄滅函數,主要目的是便于在設計比賽試題各種功能時熄滅數碼管,避免各個功能相互干涉,使用較為方便,程序更加簡潔。

void num_close() //熄滅數碼管 {dspbuf[0] = 10;dspbuf[1] = 10;dspbuf[2] = 10;dspbuf[3] = 10;dspbuf[4] = 10;dspbuf[5] = 10;dspbuf[6] = 10;dspbuf[7] = 10; }void all_init() //初始化函數 {door(0x80,0xff); //熄滅LEDdoor(0xa0,0xaf); //關閉蜂鳴器、繼電器num_close(); //熄滅數碼管 }

(2)定時器初始化

定時器初始化函數,這里主要對本校自動化專業的學弟學妹們有一些寄語,在你們初步接觸51單片機時可能會認為定時中斷很難、看不懂,但其實并不是這樣的。對于定時器中斷,只要肯花點時間去看,其實是很容易掌握的(建議學弟學妹們多花點功夫把這篇文章閱讀完)。掌握之后通過中斷動態顯示數碼管,以及用中斷設置計時、LED定時閃爍,在科創的結課測試是非常好用的。

//定時器0初始化函數 void Timer0Init(void) //2毫秒@12.000MHz {AUXR |= 0x80; //定時器時鐘1T模式TMOD &= 0xF0; //設置定時器模式TL0 = 0x40; //設置定時初值TH0 = 0xA2; //設置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時EA = 1; //打開總中斷ET0 = 1; //打開定時器0中斷 }

定時器初始化函數這里需要說明一下,函數內容看上去非常繁瑣,對于新手可能覺得一臉懵。但其實定時器初始化函數可通過 STC-ISP 軟件中的“定時器計算器”進行代碼生成,再加上對應的定時器開關即可。具體操作步驟如下:點擊“定時器計算機”按鈕,設置系統頻率為對應頻率(這里以12MHZ為例),設置定時長度為2ms,其余選項保持默認,復制代碼即可(注:版本較低的 STC-ISP 軟件需點擊生成c代碼,再點擊復制按鈕)。

6、矩陣鍵盤

在書寫矩陣鍵盤的程序前,我們先看一下原理圖(2.0版本)。對于藍橋杯單片機2.0版本,即IAP15系列單片機的需要注意的是圖中WR、RD引腳替換成P42、P44引腳,因此書寫程序時可采取變量代換。同時,對于STC89C52系列單片機的則省去變量代換。

程序中都注有詳細的注釋,因此這里不再解釋,如若有不懂的同學歡迎評論區提問。同時,筆者僅以矩陣鍵盤為例,對于獨立鍵盤則同理且更加簡單,這里也不再贅述。

u8 keypress = 0,keyread = 0,keyvalue = 0xff; u8 Read_key() {u8 key_m,cal;//檢測按鍵列數P3 = 0xf0;P42 = 1;P44 = 1;P36 = P42;P44 = P37; //變量代換,區別于STC89C52系列單片機key_m = P3&0xf0;if(key_m != 0xf0)keypress++; //識別到按鍵elsekeypress = 0; //按鍵抖動if(keypress == 3) //多次檢測,避免誤判{keypress = 0; //清空按鍵計數keyread = 1; //讀取按鍵標志位//列數判斷switch(key_m){case 0x70:cal = 0;break; //檢測到第一列case 0xb0:cal = 1;break; //檢測到第二列case 0xd0:cal = 2;break; //檢測到第三列case 0xe0:cal = 3;break; //檢測到第四列}//檢測按鍵行數P3 = 0x0f;P42 = 0;P44 = 0;key_m = P3&0x0f;//行數判斷switch(key_m){case 0x0e:keyvalue = 4*cal+7;break; //檢測到第一行case 0x0d:keyvalue = 4*cal+6;break; //檢測到第二行case 0x0b:keyvalue = 4*cal+5;break; //檢測到第三行case 0x07:keyvalue = 4*cal+4;break; //檢測到第四行}}//再次賦值檢測松手P3 = 0x0f;P42 = 0;P44 = 0;key_m = P3&0x0f;if((keyread) && (key_m == 0x0f)) //松手檢測{keyread = 0; //清空讀取標志位return keyvalue; //返回讀到的按鍵}return 0xff; //未識別到按鍵 }

7、中斷函數

首先,由前文可知定時器初始化函數中定義了 2ms 產生一次中斷,因此筆者將數碼管顯示函數 display 放在中斷里,并定義了靜態變量計時每 20ms 將按鍵標志位置一,在主函數中識別按鍵,可避免按鍵抖動帶來的影響。

bit key_flag = 0; //定義按鍵標志位 void timer0() interrupt 1 //定義中斷模式1 {static u8 t_20ms = 0; //定義靜態變量計時20msdisplay(); //數碼管顯示函數t_20ms++; //計數自增if(t_20ms >= 10) //判斷計時時間{t_20ms = 0; //計數清零key_flag = 1; //按鍵標志位置1} }

三、應用示例

1、鎖存器驅動函數

LED:由原理圖可知,選中控制 LED 的芯片 M74HC573M1R 需要打通鎖存器 Y4C。對應的二進制代碼為:100 0 0000(100轉換為十進制即為4,Y4C),即0x80。

再通過 P0 口輸入需要點亮 LED 對應的十六進制代碼。注意:原理圖中采用共陽極接法,因此對應的端口輸入低電平即可點亮相應的 LED。

例:

door(0x80,0x00); //0000 0000:點亮所有LED door(0x80,0xff); //1111 1111:熄滅所有LED door(0x80,0xaa); //1010 1010:點亮第1、3、5、7個LED

蜂鳴器、繼電器:由原理圖可知,選中控制蜂鳴器、繼電器的芯片 M74HC573M1R 需要打通鎖存器Y5C。對應的二進制代碼為:101 0 0000(101轉換為十進制即為5,Y5C),即0xa0。

再通過 P0 口輸入相應的十六進制代碼。由圖可見,控制蜂鳴器的 BUZZ 引腳由 P06 引腳控制,給予 P06 引腳一個高電平即可打開蜂鳴器;同理,控制繼電器的 RELAY 引腳由 P04 引腳控制,給予 P04 引腳一個高電平即可打開繼電器;其余 P0 口置1即可。

例:

door(0xa0,0xaf); //1010 1111 關閉蜂鳴器、繼電器 door(0xa0,0xef); //1110 1111 打開蜂鳴器,關閉繼電器 door(0xa0,0xbf); //1011 1111 關閉你蜂鳴器,打開繼電器

2、數碼管驅動函數

數碼管:前文提到的數碼管驅動函數,同樣是對于 M74HC573M1R 芯片。筆者通過打通鎖存器Y6C,控制數碼管位選,對應的二進制代碼為:110 0 0000(110轉換為十進制即為6,Y6C),即0xc0;通過打通鎖存器Y7C,控制數碼管段選,對應的二進制代碼為:111 0 0000(111轉換為十進制即為7,Y7C),即0xe0;

再通過 P0 口輸入相應的十六進制代碼即可點亮響應的數碼管段。注意:原理圖中各數碼管段采用共陽極接法,因此對應的輸入端輸入低電平即可點亮相應的數碼管段。

接下來分析一下上文的數碼管驅動函數中的剩余語句。語句 door(0xe0,0xff) 通過打通鎖存器 Y7C 對數碼管段選,輸入 0xff(1111 1111)熄滅數碼管,屏蔽前一時刻數碼管狀態實現消隱;再通過語句 door(0xc0,0x01<<dspcom) 打通鎖存器 Y6C ,輸入不同值進行位選;最后調用語句 door(0xe0,tab[dspbuf[dspcom++]]) 進行段選輸入點亮不同狀態的數碼管。
例:

door(0xe0,0xff); //消隱door(0xc0,0x01<<dspcom); //位選 door(0xe0,tab[dspbuf[dspcom++]]); //段選

3、主函數

主函數:即為調用前文編寫的各種驅動函數。筆者通過在中斷中定義按鍵識別標志位 key_flag,每 20 秒掃描讀取一次按鍵,將按鍵返回值存取在變量 key_re 中,再通過 case 語句實現不同按鍵控制不同功能(通過按鍵調參,可節約不少時間)。

void main() //主函數 {u8 key_re; //定義變量讀取按鍵返回值all_init(); //初始化函數Timer0Init(); //定時器0初始化while(1){if(key_flag) //每20ms掃描一次按鍵{key_flag = 0; //標志位置0key_re = Read_key(); //讀取按鍵if(key_re != 0xff) //判斷按鍵是否按下{//判斷按鍵switch(key_re){//放入需要執行的功能case 4: break;case 5: break;case 6: break;case 7: break;case 8: break;case 9: break;case 10:break;case 11:break;case 12:break;case 13:break;case 14:break;case 15:break;case 16:break;case 17:break;case 18:break;case 19:break;}}}} }

例:

case 4:door(0x80,0x00);break; //按下按鍵4,點亮所有LED case 5:door(0xa0,0xff);break; //按下按鍵5,打開蜂鳴器、繼電器 case 6:dspbuf[0] = 1;break; //按下按鍵6,第一位數碼管顯示數字1

到此,藍橋杯單片機設計與開發_標準模板兼新手入門STC89C52系列單片機基礎模板講解到此結束啦,讀者若有不懂的歡迎在提問區討論!!!
最后,在文末附上18年科創結課考試試題,供本校自動化專業的學弟學妹們參考(圖片略微模糊),祝各位取得佳績。

總結

以上是生活随笔為你收集整理的蓝桥杯单片机设计与开发_标准模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。