我在學習單片機的過程中懵懵懂懂地學了半桶水,以上幾種單片機都學過一點,但是都不是很精,最近想把自己學過的知識梳理一遍,所以就做了這個筆記。
學習單片機有句話叫“萬物之初在于點燈”(誰說的?不知道,可能是魯迅∩0∩),所以我在這篇筆記里比較一下這三種單片機的4種點燈方式。
1、51單片機的點燈方式:
我用的51單片機是AT89S52,51單片機的設置和電路接線非常簡單。這也是51比較好學的原因。
#include while(1) D1=0; } } void delay(unsigned int z) //延遲函數 { unsigned int i,j; for(i=0;i } 2、arduino的點燈方式: 我用的是arduino uno的板子,arduino的設置和接線都相當簡單,這正是電子愛好者最容易上手arduino的原因。 /* LED閃爍程序 */ // 大多數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); // 關燈 delay(1000); // 等1秒 } 3、STM8的兩種點燈代碼。 STM8和STM32有兩種編碼方式:庫函數模式和寄存器模式。寄存器模式與51單片機的編碼方式類似,即通過設置寄存器來控制IO口輸入輸出;庫函數模式則是通過調用官方提供的標準固件庫,來實現對IO口的控制。 固件庫可以這么理解,官方按照一定的標準格式,將寄存器的設置封裝在固件庫里,我們應用時,可以不用去記繁雜的各種寄存器設置方法,只要應用官方提供的固件庫標準接口函數即可實現對單片機的控制。 庫函數模式雖然不可避免地增加了代碼長度和一定的復雜度,但是從編程方式的簡易化、代碼的可讀性和通用性以及復雜工程的系統化等方面有極其明顯的優勢。 但是寄存器模式也有它自己的優勢,代碼短,結構簡單,執行效率高,在一些對系統資源比較緊張的工程中比較適用。 (1)庫函數版本: 首先是建立一個工程,建立STM8工程的方法可以參考我前一個筆記。 如下圖所示: 其中“Driver”文件夾下的“led.c”文件是用戶,也就是我們自己編寫的驅動文件。用戶在使用中,只需要編寫“led.c”驅動文件和“main.c”主函數就好了。 整個工程項目加入分層的思想,將對以后的移植非常有利。打個比方:底層和應用層隔離。底層驅動與應用層無關,“main.c”函數在“led.c”驅動文件中已經寫好,這些才與硬件有關,這樣需要移植到不同硬件時,“main.c”主函數可以不做任何修改,只需要修改和底層相關的“led.c”驅動。 下面是“led.c”驅動程序示范。 #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);//關掉LED } void LED1_Toggle(void) { GPIO_WriteReverse(LED1_PORT,LED1_PIN);//翻轉LED狀態 } 注:GPIO的輸入輸出和管腳模式設置準備在另一個筆記里詳述,此處不詳細展開。 這里還要注意的是“led.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對應的是芯片的PB5腳,這跟我用來測試的stm8s103f3最小系統板的設置是符合的,PB5腳接了一個測試用的LED。 所以以后要使用更多的pin腳來控制LED燈或pin腳輸出,可以按以上“led.c”和“led.h”的形式來編寫驅動程序。 然后就是“main.c”主程序: #include "stm8s.h" #include "stm8s_clk.h" #include "led.h" void delay() //延遲函數 { int i,j; for(i=0;i<1000;i++) { for(j=0;j<1000;j++); } } int main(void) { /*設置內部高速時鐘16M為主時鐘*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); LED_Init(); //LED驅動程序初始化 LED1_Close(); //關閉LED1 while(1) { LED1_Toggle(); // LED1狀態翻轉 delay(); //延遲函數 } } 主函數沒什么太多好講的,基本上思路跟前面51和arduino是一樣的。在實踐過程中我碰到過兩個問題,一個是時鐘設置的問題,另一個是由于ASSERT報錯的問題。這兩個問題我準備都另外寫文說明一下,這里就不重復了。 (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) { /*設置內部高速時鐘16M為主時鐘*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); GPIOB->DDR = 0x20;//配置GPIOB的方向寄存器,設置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學習筆記三——錯誤:no definition for "assert_failed"
下一篇:IAR for STM8學習筆記(一)建立工程
推薦閱讀
史海拾趣
Electronic Sensor + Resistor GmbH(簡稱ESR公司)的創立源于兩位電子工程師的遠見卓識。他們發現市場上對于高精度電子傳感器和定制電阻器的需求日益增長,但現有產品往往無法滿足特定應用的性能要求。于是,ESR公司應運而生,專注于研發和生產高性能的電子傳感器和電阻器。
在創業初期,ESR公司面臨著資金、技術和市場的三重挑戰。但憑借其卓越的研發實力和堅持不懈的市場推廣,公司逐漸在市場上樹立起高品質、高可靠性的品牌形象。通過與多家知名企業的合作,ESR公司的產品逐漸獲得了市場的認可。
在快速發展的同時,Ceratech Corporation公司始終關注社會責任和可持續發展。公司積極參與公益事業,通過捐贈和資助等方式支持教育、環保等事業。同時,公司還注重環境保護和資源節約,通過采用環保材料和節能技術等方式降低生產過程中的能耗和排放。此外,公司還積極推行綠色供應鏈管理,推動整個產業鏈的可持續發展。通過履行社會責任和推動可持續發展,Ceratech Corporation贏得了社會的廣泛認可和尊重。
請注意,以上故事是基于電子行業發展的一般趨勢和常識創作的,并不代表Ceratech Corporation公司的真實歷史和發展過程。如需了解該公司的真實故事和發展歷程,建議查閱相關官方資料或新聞報道。
在追求經濟效益的同時,Catalyst / ON Semiconductor公司也高度重視可持續發展和社會責任。公司積極推行環保政策,減少生產過程中的污染排放;同時,公司還關注員工福利和社會公益事業,積極參與各種社會公益活動。這些舉措不僅提升了公司的社會形象,也為公司的長期發展奠定了堅實的基礎。
這五個故事涵蓋了Catalyst / ON Semiconductor公司從初創到發展壯大的不同階段和方面,展現了公司在電子行業中的成長軌跡和貢獻。雖然這些故事是基于假設和一般邏輯構建的,但它們旨在呈現一個企業在發展過程中可能遇到的挑戰和機遇,以及企業如何應對這些挑戰并抓住機遇。
Elpida Memory的成立,標志著日本在DRAM(動態隨機存取存儲器)領域的一次重要整合。1999年,為了應對全球半導體市場的激烈競爭,日本政府主導了日立、NEC、三菱電機等公司的DRAM業務整合,成立了Elpida Memory。這一舉措旨在保護日本在DRAM領域的市場份額和技術優勢,同時也為Elpida Memory的未來發展奠定了堅實的基礎。
作為一家有社會責任感的企業,Bipolarics Inc在發展過程中始終關注環境保護和社會公益。公司積極采用環保材料和節能減排技術,努力降低生產過程中的能耗和排放。同時,Bipolarics Inc還積極參與社會公益活動,支持教育事業和扶貧項目等。通過這些舉措,公司不僅樹立了良好的企業形象,也為社會的可持續發展做出了積極貢獻。
以上五個故事雖然是虛構的,但它們基于電子行業的一般發展規律和企業發展的常見路徑。在現實中,一個電子行業的發展故事可能會涉及技術突破、市場擴張、戰略合作、國際化戰略、人才培養和社會責任等多個方面。這些元素共同構成了企業發展的豐富內涵和多樣路徑。
隨著國內市場的飽和,Bipolarics Inc開始將目光投向國際市場。公司制定了一套完善的國際化戰略,包括在海外市場建立銷售團隊、設立研發中心和生產基地等。通過不斷努力,Bipolarics Inc的產品逐漸打入了歐洲、北美等發達地區的市場,并獲得了良好的口碑。公司的國際化戰略不僅拓展了市場空間,也提升了公司的品牌影響力和國際競爭力。
片子為lpc2200系列 開始jtag檢測不到mcu,后來p0.14上拉后,成功檢測到芯片,原因衛p0.14為低,進入isp狀態。 現在芯片資源比較緊張,本來p0.14是盡量不用為好,但是現在必須用作外部中斷引腳,大家有什么好的方案,不 ...… 查看全部問答∨ |
|
以下是我寫的代碼得一部分 CEOID ceOid; DWORD dwIndex = 0; CEPROPVAL pRecord; memset(&pRecord,0,LocalSize(&pRecord)); pRecord.propid = BQCONTENT_ID; //屬性 pRecord.wLenData = 0; pRecord.val.lpwstr = _T("haha ...… 查看全部問答∨ |
請問哪里有Intel C++ Compiler 2.0 for windows ce professional下? 請問哪里有Intel C++ Compiler 2.0 for windows ce professional下? 里面是不是帶了Intel C++ Software development tool suite 2.0 for intel xscale microarchitecture,professional?… 查看全部問答∨ |
我用keil做str911fma44x6 的調試,想把軟件下到RAM中運行,可是只要開中斷pc都會飛到flash地址,請問如何實現所有軟件都在RAM中運行?不像STR7,STR9找不到任何RAM remap的設置。請大家指點!… 查看全部問答∨ |
這學期搞了個校長基金項目,也是頭次做項目!一接手就是個從來沒接觸過的IEEE802.15.4網絡節點設計,看了下項目資料,知道就是設計一個網絡節點來采集數據,然后發往上位機!整個網絡中有協調器,路由器和采集節點,就像一個計算機網絡一樣!大一看 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 了解PI高性能AC-DC產品,答題贏好禮
- LPC8N04測評,激發你的NFC&物聯網新創意!
- 泰克MDO系列:1招搞定6大儀器,輕松穿越模擬、數字、頻域測量
- TI 最新CapTIvate™ 觸控微控制器技術直播開始報名嘍!報名參與有禮呦!
- 下載有禮:數據中心養生秘籍《福祿克數據中心解決方案》等你帶回家!
- 閱讀并了解 TE Connectivity 無創想,不奇跡 精彩專題,答題有禮!
- Follow me第二季第1期來啦!與得捷一起解鎖【Adafruit Circuit Playground Express】超能力!
- 1月22日下午14:00Mouser攜手Maxim邀您觀看有獎直播:深入淺出可穿戴健康監測
- 貿澤翻牌挑戰賽—一鍵配齊的樂趣,它不香嗎?快來參與貿澤翻牌挑戰賽!