tft每日頭條

 > 科技

 > 單片機c語言快速入門

單片機c語言快速入門

科技 更新时间:2024-08-10 02:32:56

一、引 言

STC8051系列單片機主要使用Keil的C51編譯器,STC32位8051單片機主要使用Keil的C251編譯器。

STC8位單片機系列片上的XRAM空間從早期的256字節發展到現在的STC8系列的8K字節,STC官方的實驗箱還給出了通過外部擴張将XRAM空間增加到32K字節的例子,完全可以跑RTOS實時多任務操作系統了。那麼C51這個編譯器能不能适應STC8位單片機的現狀和未來的發展呢?

現在的STC32位的8051單片機系列片上的XRAM空間已經有12K字節(STC32G:4KB的EDATA和8KB的XDATA)和40K字節(STC16F:8KB的EDATA和32KB的XDATA),目前已經可以跑FreeRTOS實時多任務操作系統了。如果未來STC32F系列的XRAM超過64KB,甚至達到STC32F8M8M以後,C251這個編譯器能不能适應STC32位單片機未來的發展呢?

通常理科大學生學習PC機上的C語言,這個C語言的教學标準是國家計算機等級考試,已經形成了固定的模式了:固定的等級考試題目類型,固定的教程和固定的教師隊伍。如果要改變這個模式,筆者認為是要為這些理科教師和理科學生建立一個入門級(比如64 32學時課程)單片機C語言标準,教到什麼程度,學些什麼内容,正所謂沒有規矩,不成方圓。

基于以上考慮和教學實踐,筆者按照“全國計算機等級考試二級C語言程序設計考試大綱(2018年版)”的标準提出了“ STC8051單片機C351規範”,C351是C51和C251語言的一個子集,C351語法兼顧了入門的簡單性要求,又能滿足編寫STC單片機RTOS實時多任務系統的複雜性要求。為了能夠用C351語言編寫STC單片機程序,筆者研制實現了“長纓8 C351編譯器”,它是一個Windows下的沒有界面的命令行可執行文件,可以直接對Keil的項目文件進行編譯。

本系列文章将逐步地介紹C351單片機計算機語言的特點與編程方法,本文首先介紹在C351中用中文編程的方法。用中文進行C語言編程始終是一個有争議的話題:首先是能不能,能意味是中國自己的編譯器。其次是方不方便,這個就仁者見仁智者見智,各人有各人的看法了。

二、英文程序

下面是一個在STC打狗棒開發闆上運行的8個LED發光二極管左右閃動的單片機程序:

單片機c語言快速入門(C351編程1單片機C語言中文編程方法探讨)1

(1)這是一個很平凡的STC8051單片機C語言英文程序,對于STC89Cxx系列到STC8xx系列的單片機都适用,隻是LED閃動的速度不同。這個程序用Keil編譯器很容易通過,通常作為入門課程教學。

(2)第14行到第21行程序給出了程序運行的SFR定義,注意STC早期類型的單片機沒有多種端口工作模式,也就沒有第15和16行的端口模式配置寄存器。

(3)第24行到35行程序是延時函數定義,其中使用了3種循環語句類型,利用空循環來耗時間,實現軟件延時。本例子是示意性的,延時未必是準确的以毫秒為單位。

(4)第38到44行程序是任務函數定義,第41行現按任務函數參數點亮LED燈,然後第42行延時指定的時間。這個例子主要延時函數調用。

下圖是程序的主函數部分:

單片機c語言快速入門(C351編程1單片機C語言中文編程方法探讨)2

(5)主函數“main()”是用戶程序的起點,STC8051單片機加電或者複位後從地址0x0000開始執行機器指令,執行完由編譯器給出的引導(BOOT)程序後,從main函數開始執行用戶編寫的程序。

(6)第50行到第52行對LED燈連接的P2端口進行設置,設置為準雙向工作模式。将關閉中斷作為用戶的第一行程序,是在掉過N次坑後的經驗,是高可靠程序标準開始。

(7)第55行到58行程序是通常單片機程序應該具備的開機LOGO,明顯地提示用戶系統重新起點了。這裡的LOGO先左4個LED亮1秒鐘,後右4個LED亮1秒鐘。

(8)像本範例這樣的無操作系統的單片機程序任何時候都應該運行在用戶程序的控制之下,這時用戶程序不能從主函數main()中退出,。退出将引起未知的後果。因此第61行到64行形成一個無限循環,8個LED相鄰兩個交替發光。

下面是本程序運行效果的視頻。

視頻中可以看到STC打狗棒(STC8H8K64U)開發闆插在了一塊面包闆上,一是有個固定的支撐物,二是避免管腳碰到哪裡造成短路事故。

三、中文編程

探讨中文編程,以其坐而論道,不如提供實際例子來供大家評論。下圖是一個與上英文程序對應的STC8051單片機C語言中文程序,用“長纓8 C351編譯器”編譯通過後,運行效果與前面英文的程序一緻。

單片機c語言快速入門(C351編程1單片機C語言中文編程方法探讨)3

(9)用中文進行編程碰到的第一個問題是對于C語言的語法關鍵字是用中文還是用英文。如果決定用中文,可以利用C語言的宏定義功能來解決。

上面第14行程序包含了一個中文關鍵字宏定義的頭文件,對本程序用到的C語言關鍵字宏定義為中文關鍵字。長纓8是用英文做關鍵字,在編譯的過程中這些中文關鍵字會被恢複為英文的關鍵字,編譯器能夠正确的識别。

在中文語法分析技術中,實現中文分詞是很困難的(類似的困難同樣出現中文斷句中,比如客人說“下雨天留客天留我不留”,你說客人的意思是他留不留?),因此筆者認為用中文語言編程,為了避免歧義,語法應該采用FORTH計算機語言的标準,由用戶用空格将C語言關鍵字、變量名和函數名等用空格或者指定的數學符号分離開來,就像上面的程序那樣。

(10)用中文進行編程碰到的第二個問題數值常數怎麼辦?比如像第17行程序,是寫成中文的一百六十,還是寫成阿拉伯數值160?如果寫成中文,十六進制數怎麼表達?

筆者覺得在中文C程序中數值表示就用傳統的阿拉伯數字算了,畢竟商場裡的價格也是阿拉伯數字表示的。

(11)在中文C語言中變量名應該可以用中文字,像第28行那樣,這個大家都應該會認可的,畢竟現實中數量、單價和總計這種變量名大家都可以接受。

下圖是程序的後半部分:

單片機c語言快速入門(C351編程1單片機C語言中文編程方法探讨)4

(12)可能有争議的是像上圖第48行程序,宏定義名以及變量名可以用字符0~9開頭嗎?

長纓8 編譯器計劃支持中文編程,因此采用FORTH語言規範,将C語言程序中的空格作為優先級最高的“分界符”,将空格分開的字符串作為一個整體的“中文詞”(英文的“word”)來進行語法分析。所以第48行用“1秒鐘”來表達1000毫秒是允許的。

(13)中文程序語句分詞問題的另一個例子是像前面第34和35行的“--”減一算符,它和後面的中文之間不需要空格,可以被編譯器正确識别。但是如果要用中文“減一”來表示減一運算,就必須加空格,寫成“減一 循環指标3”和“減一 循環指标2”的形式。

(14)在上面的中文C語言程序中,有大量的空格被用來分隔各個語法詞,這樣看起來很不像中文文章,令人不太習慣。長纓8隻是一個簡單的編譯器,隻能要求用戶自己用空格來分詞。在AI技術不斷發展的趨勢下,借助AI技術可以取消空格分詞,未來的中文編程時用戶直接用連續的中文描述解決問題的方法就行了,AI技術自動提取關鍵字和語法詞,忽略中文輔助詞,然後再提交給C語言編譯器進行編譯,輸出單片機可以執行的機器代碼。

附:下圖是本文使用的C語言關鍵詞替換頭文件的内容:

單片機c語言快速入門(C351編程1單片機C語言中文編程方法探讨)5

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved