我在學(xué)習(xí)單片機(jī)的過(guò)程中懵懵懂懂地學(xué)了半桶水,以上幾種單片機(jī)都學(xué)過(guò)一點(diǎn),但是都不是很精,最近想把自己學(xué)過(guò)的知識(shí)梳理一遍,所以就做了這個(gè)筆記。
學(xué)習(xí)單片機(jī)有句話叫“萬(wàn)物之初在于點(diǎn)燈”(誰(shuí)說(shuō)的?不知道,可能是魯迅∩0∩),所以我在這篇筆記里比較一下這三種單片機(jī)的4種點(diǎn)燈方式。
1、51單片機(jī)的點(diǎn)燈方式:
我用的51單片機(jī)是AT89S52,51單片機(jī)的設(shè)置和電路接線非常簡(jiǎn)單。這也是51比較好學(xué)的原因。
#include while(1) D1=0; } } void delay(unsigned int z) //延遲函數(shù) { unsigned int i,j; for(i=0;i } 2、arduino的點(diǎn)燈方式: 我用的是arduino uno的板子,arduino的設(shè)置和接線都相當(dāng)簡(jiǎn)單,這正是電子愛好者最容易上手arduino的原因。 /* LED閃爍程序 */ // 大多數(shù)Arduino板的Pin 13會(huì)連接一個(gè)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的兩種點(diǎn)燈代碼。 STM8和STM32有兩種編碼方式:庫(kù)函數(shù)模式和寄存器模式。寄存器模式與51單片機(jī)的編碼方式類似,即通過(guò)設(shè)置寄存器來(lái)控制IO口輸入輸出;庫(kù)函數(shù)模式則是通過(guò)調(diào)用官方提供的標(biāo)準(zhǔn)固件庫(kù),來(lái)實(shí)現(xiàn)對(duì)IO口的控制。 固件庫(kù)可以這么理解,官方按照一定的標(biāo)準(zhǔn)格式,將寄存器的設(shè)置封裝在固件庫(kù)里,我們應(yīng)用時(shí),可以不用去記繁雜的各種寄存器設(shè)置方法,只要應(yīng)用官方提供的固件庫(kù)標(biāo)準(zhǔn)接口函數(shù)即可實(shí)現(xiàn)對(duì)單片機(jī)的控制。 庫(kù)函數(shù)模式雖然不可避免地增加了代碼長(zhǎng)度和一定的復(fù)雜度,但是從編程方式的簡(jiǎn)易化、代碼的可讀性和通用性以及復(fù)雜工程的系統(tǒng)化等方面有極其明顯的優(yōu)勢(shì)。 但是寄存器模式也有它自己的優(yōu)勢(shì),代碼短,結(jié)構(gòu)簡(jiǎn)單,執(zhí)行效率高,在一些對(duì)系統(tǒng)資源比較緊張的工程中比較適用。 (1)庫(kù)函數(shù)版本: 首先是建立一個(gè)工程,建立STM8工程的方法可以參考我前一個(gè)筆記。 如下圖所示: 其中“Driver”文件夾下的“l(fā)ed.c”文件是用戶,也就是我們自己編寫的驅(qū)動(dòng)文件。用戶在使用中,只需要編寫“l(fā)ed.c”驅(qū)動(dòng)文件和“main.c”主函數(shù)就好了。 整個(gè)工程項(xiàng)目加入分層的思想,將對(duì)以后的移植非常有利。打個(gè)比方:底層和應(yīng)用層隔離。底層驅(qū)動(dòng)與應(yīng)用層無(wú)關(guān),“main.c”函數(shù)在“l(fā)ed.c”驅(qū)動(dòng)文件中已經(jīng)寫好,這些才與硬件有關(guān),這樣需要移植到不同硬件時(shí),“main.c”主函數(shù)可以不做任何修改,只需要修改和底層相關(guān)的“l(fā)ed.c”驅(qū)動(dòng)。 下面是“l(fā)ed.c”驅(qū)動(dòng)程序示范。 #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)備在另一個(gè)筆記里詳述,此處不詳細(xì)展開。 這里還要注意的是“l(fā)ed.h”,這個(gè)文件定義了操作硬件哪個(gè)具體的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 在這個(gè)頭文件里,我們定義了LED1對(duì)應(yīng)的是芯片的PB5腳,這跟我用來(lái)測(cè)試的stm8s103f3最小系統(tǒng)板的設(shè)置是符合的,PB5腳接了一個(gè)測(cè)試用的LED。 所以以后要使用更多的pin腳來(lái)控制LED燈或pin腳輸出,可以按以上“l(fā)ed.c”和“l(fā)ed.h”的形式來(lái)編寫驅(qū)動(dòng)程序。 然后就是“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)部高速時(shí)鐘16M為主時(shí)鐘*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); LED_Init(); //LED驅(qū)動(dòng)程序初始化 LED1_Close(); //關(guān)閉LED1 while(1) { LED1_Toggle(); // LED1狀態(tài)翻轉(zhuǎn) delay(); //延遲函數(shù) } } 主函數(shù)沒(méi)什么太多好講的,基本上思路跟前面51和arduino是一樣的。在實(shí)踐過(guò)程中我碰到過(guò)兩個(gè)問(wèn)題,一個(gè)是時(shí)鐘設(shè)置的問(wèn)題,另一個(gè)是由于ASSERT報(bào)錯(cuò)的問(wèn)題。這兩個(gè)問(wèn)題我準(zhǔn)備都另外寫文說(shuō)明一下,這里就不重復(fù)了。 (1)寄存器版本: 寄存器版本的程序簡(jiǎn)單了,有多種寫法,下面是我寫的一個(gè)例子: #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)部高速時(shí)鐘16M為主時(shí)鐘*/ 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í)筆記三——錯(cuò)誤:no definition for "assert_failed"
下一篇:IAR for STM8學(xué)習(xí)筆記(一)建立工程
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 阿里黑科技落地!夸克AI眼鏡全球首發(fā),高德、淘寶、支付寶都能用
- 化繁為簡(jiǎn), 適配復(fù)雜磁場(chǎng)環(huán)境,MT73xx 3D雙路輸出霍爾鎖存器賦能車規(guī)電機(jī)精準(zhǔn)控制
- 9.5億美元收購(gòu)恩智浦MEMS傳感器業(yè)務(wù),意法半導(dǎo)體 在傳感器領(lǐng)域的地位再升級(jí)
- 高性能電動(dòng)滑板車 BLDC 電機(jī)驅(qū)動(dòng)器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測(cè)的實(shí)時(shí)聯(lián)動(dòng)
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時(shí)疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語(yǔ)義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢(shì)”多模態(tài)交互設(shè)計(jì)
- 工業(yè)機(jī)器人高精度力控的“雙模融合”傳感器設(shè)計(jì)
- 有獎(jiǎng)直播|基于TI最新低功耗60GHz毫米波雷達(dá)傳感器的工業(yè)應(yīng)用
- 有獎(jiǎng)直播報(bào)名:賽靈思和安富利專注嵌入式視覺應(yīng)用,助力人工智能和汽車輔助駕駛!
- 直播已結(jié)束【最新 TI C2000實(shí)時(shí)控制芯片 — F28003X】
- TI 有獎(jiǎng)直播 | 毫米波雷達(dá)在樓宇自動(dòng)化的應(yīng)用
- 馬上下載Intel白皮書 贏取驚喜禮品
- ST直播主題:高度靈活的、易用的、可定制化的協(xié)議棧--BlueNRG-LP 協(xié)議棧介紹
- 有獎(jiǎng)直播 | 羅徹斯特電子為您細(xì)說(shuō):半導(dǎo)體停產(chǎn)后的挑戰(zhàn)與解決方案
- Littelfuse【智能家居的電路保護(hù)方案】在線研討會(huì) 11月22日10點(diǎn) 強(qiáng)勢(shì)登場(chǎng)!預(yù)報(bào)名、參與研討會(huì)贏好禮!
- 有獎(jiǎng)直播已結(jié)束【如何利用 TI MSPM0 汽車微控制器提高檢測(cè)和控制性能】
- 行芯科技CEO賀青:EDA行業(yè)黑馬是如何快速成長(zhǎng)的
- 芯動(dòng)科技敖鋼:IP是個(gè)難啃的硬骨頭,但我們依然要堅(jiān)持
- 芯來(lái)科技彭劍英:要圍繞RISC-V打造IP矩陣
- STM32CubeMX | 30-使用硬件SPI讀寫FLASH(W25Q64)
- 基于STM32芯片創(chuàng)建HelloWorld工程
- STM32堆棧整理
- STM32的啟動(dòng)堆棧初始化
- MSP430常見問(wèn)題之指令系統(tǒng)類
- MSP430矩陣及獨(dú)立鍵盤
- 中標(biāo)9臺(tái)長(zhǎng)江存儲(chǔ)蝕刻機(jī) 中微半導(dǎo)體給國(guó)產(chǎn)閃存助力