微信公眾號 | strongerHuang
單片機有很多叫法,MCU(Microcontroller Unit,微控制單元),又叫微控制器等。
隨著物聯(lián)網(wǎng)的普及,單片機現(xiàn)在的需求越來越大了。同時,隨著單片機性能和資源的增強,開發(fā)單片機的語言也越來越多了。
那么,你知道單片機目前支持哪些主流開發(fā)語言嗎?
1、匯編語言說明:匯編語言是一種底層(低級)的、與硬件緊密相關(guān)的編程語言。它直接映射到機器語言,允許程序員直接控制硬件資源。
舉例:用匯編語言寫一段51單片機(AT89S52)點燈程序。
ORG0x0000 ?; 程序起始地址
MOVP1,?#0x00 ?; 初始化P1口為低電平
MAIN:
MOVP1.0,?#1 ?; 點亮LED,將P1.0置為高電平
ACALLDELAY ? ; 調(diào)用延時子程序
MOVP1.0,?#0 ?; 熄滅LED,將P1.0置為低電平
ACALLDELAY ? ; 調(diào)用延時子程序
SJMPMAIN ? ? ; 無限循環(huán)
DELAY:
;延時子程序
MOVR2,?#50
DELAY_LOOP:
DJNZR2, DELAY_LOOP
? ? RET
2、C語言說明:C語言是最常用的一種用于單片機的開發(fā)語言,也是一種高級編程語言,具有較好的可移植性和可讀性。對于單片機,通常使用嵌入式C來進行開發(fā)。
舉例:用C語言寫一段STM32單片機點燈程序。
#include?"stm32f4xx_hal.h"
intmain(void)
{
??HAL_Init();
??SystemClock_Config();
??__HAL_RCC_GPIOA_CLK_ENABLE(); ?// 啟用GPIOA時鐘
? GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置GPIO引腳
? GPIO_InitStruct.Pin?=?GPIO_PIN_5; ? ? ?// 假設(shè)LED連接到GPIOA的引腳5
? GPIO_InitStruct.Mode?=?GPIO_MODE_OUTPUT_PP;?// 推挽輸出
? GPIO_InitStruct.Pull?=?GPIO_NOPULL; ? ? ??// 無上下拉
? GPIO_InitStruct.Speed?=?GPIO_SPEED_FREQ_LOW;?// 低速
??HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
while?(1)
? {
? ??HAL_GPIO_WritePin(GPIOA,?GPIO_PIN_5,?GPIO_PIN_SET);?// 點亮LED
? ??HAL_Delay(1000);?// 延時1秒
? ??HAL_GPIO_WritePin(GPIOA,?GPIO_PIN_5,?GPIO_PIN_RESET);?// 關(guān)閉LED
? ??HAL_Delay(1000);?// 延時1秒
? }
}
3、C++語言說明:C++是一種基于C語言的面向?qū)ο缶幊陶Z言,盡管在單片機領(lǐng)域使用相對較少,但還是一些現(xiàn)代的單片機也開始支持C++。
舉例:用C++語言寫一段STM32單片機點燈程序。
int?main(void)
{
LED_Class?LED1(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);
LED_Class?LED2(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);
? LED1.Init();
? LED2.Init();
while(1)
? {
? ? LED1.Open();
? ? LED2.Open();
? ? Delay(10);
? ? LED1.Close();
? ? LED2.Close();
? ? Delay(10);
? }
}
當然,這里定義的類和調(diào)用的函數(shù)接口,請看我之前推送的文章《單片機能用C++開發(fā)嗎?》。
4、Python語言說明:Python雖然不常用于傳統(tǒng)的單片機編程,但一些微控制器如MicroPython和CircuitPython支持Python語言,使得開發(fā)更加簡化。
舉例:用MicroPython語言寫一段單片機點燈程序。
import?machine
import?time
led_pin?= machine.Pin(2, machine.Pin.OUT) ?# 假設(shè)LED連接到引腳2
whileTrue:
? ??led_pin.on() ? # 點亮LED
? ??time.sleep(1) ?# 延時1秒
? ??led_pin.off() ?# 關(guān)閉LED
? ??time.sleep(1) ?# 延時1秒
說明一下,這里代碼使用的MicroPython,而不是標準的Python。確保你的開發(fā)板支持MicroPython,并已正確安裝和配置。在實際的嵌入式開發(fā)中,你可能還需要考慮硬件配置、時鐘設(shè)置以及其他底層細節(jié)。
5、Rust語言說明:Rust本身并不是直接用于編寫STM32單片機程序的常見語言,但你可以通過一些工具和庫來實現(xiàn)。
舉例:用Rust語言寫一段STM32單片機點燈程序。
#![no_std] ?
#![no_main] ?
#![feature(lang_items)] ?
extern crate cortex_m; ?
extern crate cortex_m_rt?as?rt; ?
extern crate stm32f1xx_hal?as?hal;?// 注意:這里需要根據(jù)你的STM32型號選擇合適的HAL庫 ?
use?core::panic::PanicInfo; ?
use?hal::prelude::*; ?
use?hal::stm32; ?
use?rt::entry; ?
// 語言項 ?
#[lang = "start"] ?
fn?start(_main: &() -> !, _argc: isize, _argv: *const?*const?u8) -> !?{ ?
? ??// 初始化HAL和CPU ?
? ? let cp = cortex_m::Peripherals::take().unwrap(); ?
? ? let dp = stm32::Peripherals::take().unwrap(); ?
? ? let mut rcc = dp.RCC.constrain(); ?
? ? let mut gpioa = dp.GPIOA.split(&mut rcc.ahb); ?
? ??// 假設(shè)LED連接在GPIOA的PIN5上 ?
? ? let mut led = gpioa.pa5.into_push_pull_output(); ?
? ? loop { ?
? ? ? ??// 打開LED ?
? ? ? ? led.set_high().unwrap(); ?
? ? ? ??// 延時一段時間(這里需要實現(xiàn)一個延時函數(shù)) ?
? ? ? ??delay_ms(1000); ?
? ? ? ??// 關(guān)閉LED ?
? ? ? ? led.set_low().unwrap(); ?
? ? ? ??// 再次延時 ?
? ? ? ??delay_ms(1000); ?
? ? } ?
}?
6、其他編程語言
除了以上匯編、C語言、C++、Python語言,其實還有極少一些用Java語言,但JAVA需要運用虛擬機,需要在高性能的單片機上運行。
還看到有用一種叫Ada的編程語言,據(jù)說主要用在在一些航空航天和軍事應(yīng)用中得到廣泛應(yīng)用,具有強大的靜態(tài)類型檢查和并發(fā)編程支持。
除了上面說到的匯編、C語言、C++、Python語言,你還想到有哪些?或者你用過哪些編程語言開發(fā)單片機?