我在學(xué)習(xí)單片機的過程中懵懵懂懂地學(xué)了半桶水,以上幾種單片機都學(xué)過一點,但是都不是很精,最近想把自己學(xué)過的知識梳理一遍,所以就做了這個筆記。
學(xué)習(xí)單片機有句話叫“萬物之初在于點燈”(誰說的?不知道,可能是魯迅∩0∩),所以我在這篇筆記里比較一下這三種單片機的4種點燈方式。
1、51單片機的點燈方式:
我用的51單片機是AT89S52,51單片機的設(shè)置和電路接線非常簡單。這也是51比較好學(xué)的原因。
#include while(1) D1=0; } } void delay(unsigned int z) //延遲函數(shù) { unsigned int i,j; for(i=0;i } 2、arduino的點燈方式: 我用的是arduino uno的板子,arduino的設(shè)置和接線都相當(dāng)簡單,這正是電子愛好者最容易上手arduino的原因。 /* LED閃爍程序 */ // 大多數(shù)Arduino板的Pin 13會連接一個LED int LED = 13; void setup() { // 將LED代表的13pin腳定義為輸出 pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); //開燈 delay(1000); // 等1秒 digitalWrite(LED, LOW); // 關(guān)燈 delay(1000); // 等1秒 } 3、STM8的兩種點燈代碼。 STM8和STM32有兩種編碼方式:庫函數(shù)模式和寄存器模式。寄存器模式與51單片機的編碼方式類似,即通過設(shè)置寄存器來控制IO口輸入輸出;庫函數(shù)模式則是通過調(diào)用官方提供的標(biāo)準(zhǔn)固件庫,來實現(xiàn)對IO口的控制。 固件庫可以這么理解,官方按照一定的標(biāo)準(zhǔn)格式,將寄存器的設(shè)置封裝在固件庫里,我們應(yīng)用時,可以不用去記繁雜的各種寄存器設(shè)置方法,只要應(yīng)用官方提供的固件庫標(biāo)準(zhǔn)接口函數(shù)即可實現(xiàn)對單片機的控制。 庫函數(shù)模式雖然不可避免地增加了代碼長度和一定的復(fù)雜度,但是從編程方式的簡易化、代碼的可讀性和通用性以及復(fù)雜工程的系統(tǒng)化等方面有極其明顯的優(yōu)勢。 但是寄存器模式也有它自己的優(yōu)勢,代碼短,結(jié)構(gòu)簡單,執(zhí)行效率高,在一些對系統(tǒng)資源比較緊張的工程中比較適用。 (1)庫函數(shù)版本: 首先是建立一個工程,建立STM8工程的方法可以參考我前一個筆記。 如下圖所示: 其中“Driver”文件夾下的“l(fā)ed.c”文件是用戶,也就是我們自己編寫的驅(qū)動文件。用戶在使用中,只需要編寫“l(fā)ed.c”驅(qū)動文件和“main.c”主函數(shù)就好了。 整個工程項目加入分層的思想,將對以后的移植非常有利。打個比方:底層和應(yīng)用層隔離。底層驅(qū)動與應(yīng)用層無關(guān),“main.c”函數(shù)在“l(fā)ed.c”驅(qū)動文件中已經(jīng)寫好,這些才與硬件有關(guān),這樣需要移植到不同硬件時,“main.c”主函數(shù)可以不做任何修改,只需要修改和底層相關(guān)的“l(fā)ed.c”驅(qū)動。 下面是“l(fā)ed.c”驅(qū)動程序示范。 #include "led.h" void LED_Init(void) { GPIO_Init(LED1_PORT,LED1_PIN,GPIO_MODE_OUT_PP_HIGH_FAST ); //定義LED的管腳的模式 } void LED1_Open(void) { GPIO_WriteLow(LED1_PORT,LED1_PIN);//打開LED } void LED1_Close(void) { GPIO_WriteHigh(LED1_PORT,LED1_PIN);//關(guān)掉LED } void LED1_Toggle(void) { GPIO_WriteReverse(LED1_PORT,LED1_PIN);//翻轉(zhuǎn)LED狀態(tài) } 注:GPIO的輸入輸出和管腳模式設(shè)置準(zhǔn)備在另一個筆記里詳述,此處不詳細展開。 這里還要注意的是“l(fā)ed.h”,這個文件定義了操作硬件哪個具體的pin腳。如下面程序: #ifndef __LED_H #define __LED_H #include "stm8s_gpio.h" #define LED1_PIN GPIO_PIN_5 #define LED1_PORT GPIOB void LED_Init(void); void LED1_Open(void); void LED1_Close(void); void LED1_Toggle(void); #endif 在這個頭文件里,我們定義了LED1對應(yīng)的是芯片的PB5腳,這跟我用來測試的stm8s103f3最小系統(tǒng)板的設(shè)置是符合的,PB5腳接了一個測試用的LED。 所以以后要使用更多的pin腳來控制LED燈或pin腳輸出,可以按以上“l(fā)ed.c”和“l(fā)ed.h”的形式來編寫驅(qū)動程序。 然后就是“main.c”主程序: #include "stm8s.h" #include "stm8s_clk.h" #include "led.h" void delay() //延遲函數(shù) { int i,j; for(i=0;i<1000;i++) { for(j=0;j<1000;j++); } } int main(void) { /*設(shè)置內(nèi)部高速時鐘16M為主時鐘*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); LED_Init(); //LED驅(qū)動程序初始化 LED1_Close(); //關(guān)閉LED1 while(1) { LED1_Toggle(); // LED1狀態(tài)翻轉(zhuǎn) delay(); //延遲函數(shù) } } 主函數(shù)沒什么太多好講的,基本上思路跟前面51和arduino是一樣的。在實踐過程中我碰到過兩個問題,一個是時鐘設(shè)置的問題,另一個是由于ASSERT報錯的問題。這兩個問題我準(zhǔn)備都另外寫文說明一下,這里就不重復(fù)了。 (1)寄存器版本: 寄存器版本的程序簡單了,有多種寫法,下面是我寫的一個例子: #include "stm8s.h" #include "stm8s_clk.h" void delay() { int i,j; for(i=0;i<1000;i++) { for(j=0;j<1000;j++); } } int main(void) { /*設(shè)置內(nèi)部高速時鐘16M為主時鐘*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); GPIOB->DDR = 0x20;//配置GPIOB的方向寄存器,設(shè)置pin5為輸出模式 GPIOB->CR1 = 0x20;//配置GPIOB_5為推挽輸出 GPIOB->CR2 = 0x00; while(1) { GPIOB->DDR = 0x20;//GPIOB_5輸出高電平,亮 delay(); GPIOB->DDR = 0x00;//GPIOB_5輸出低電平,暗 delay(); } } STM8的GPIO寄存器配置可以參考下表。
sbit LED1=P1^0; //P1口0 pin接LED,并在程序里定義
void delay(unsigned int z);
void main()
{
{
delay(100);
D1=1;
delay(100);
上一篇:STM8學(xué)習(xí)筆記三——錯誤:no definition for "assert_failed"
下一篇:IAR for STM8學(xué)習(xí)筆記(一)建立工程
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 柔性機器人,你了解嗎
- 工業(yè)機器人產(chǎn)業(yè)分析,賺錢的基本上只剩下系統(tǒng)集成商了
- 怎樣在機器人風(fēng)口到來前活下去,B端市場是現(xiàn)在的救生場
- 車規(guī)級BLE方案如何應(yīng)用在汽車上
- 助力智能化發(fā)展,Molex 推出多種高性能產(chǎn)品
- 小米12售價解密:這外形、配置實力對標(biāo)iPhone 13
- 小米12屏幕最高支持12bit色深,向華星專門定制
- 頗受資本青睞的酒店機器人,是噱頭還是好生意?
- 三星Galaxy S21 FE顯示屏維修替換部件圖像與價格信息泄露
- 一部分蘋果員工在網(wǎng)絡(luò)上組織圣誕夜罷工