一天:51微控制器從入門到一個動態數碼管顯示數字控制
最近進的公司是一個做路由器的。。很多嵌入式工程師。有個專案( 智慧空調控制)是跟嵌入式工程師對接,我做APP+PHP。。他做伺服器。我們用MQTT(由於emqtt是用erlang寫的,所以我也學了點erlang,後期有時間分享一下,這個語言很好,很強大。特別抽象)。這個專案激發了我對嵌入式的興趣,於是乎。開始從51微控制器搞起了。。所以就有了這篇文章。。。今天搞得東西挺多。我最近都是筆記形式,不想以前寫的那麼詳細。。。因為學的東西太多,白天在公司搞專案,沒時間寫太具體。。。
今天學了什麼呢?
>keil安裝和使用,下載程式到開發板
>點亮第一個led燈,這個很簡單。給微控制器的p0口 的最低位,輸入一個高電平,就可以點亮一個動態數碼管【當然下載程式之後,要連線】
#include <reg52.h> sbit led1 = P0^0; void main(){ led1 = 1; }
>在點亮led之後,再加點程式控制,讓led閃爍。。。閃爍的思路也簡單: 一下高電平。然後延時,再低電平。。再延時。。就OK了。。延時多少秒合適? 可以通過keil軟體模擬算出。模擬的時候,記得把晶振調整跟開發板一樣。我的開發板是12M
#include <reg52.h> sbit led = P0^0; typedef unsigned char u8; typedef unsigned int u16;void delay( u16 i ){ while( i-- ); } void main (){ while( 1 ) { led = 1; //delay( 5000 ); // 通過軟體模擬得出 執行5000次迴圈 需要45ms delay( 50000 ); led = 0; //delay( 5000 ); delay( 50000 ); } }
>點亮led之後,再來一個流水燈,思路就是迴圈設定一個數碼管的某一段 為 高電平。其他段為低電平。。然後,延時迴圈。就可以達到流水燈的效果
#include <reg52.h> #include <intrins.h> #include <stdio.h> #define led P0 typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i-- ); } void main (){ u8 i = 0; //led = 0x01; //p0的 最低位為高電平 0x01( p0埠的第8位為1 即,高電平 ) led = 0x80; while( 1 ) { /* 方法一: 不用庫函式 for( i = 0; i < 8; i++ ){ led = ( 0x01 << i ); //迴圈移位, 把p0埠從p0.0--->p0.7迴圈設定為高電平 delay( 50000 ); } */ //方法二,使用庫函式 /* for( i = 0 ; i < 8; i++ ){ led = _crol_( led, 1 ); //每次向左移動1位 delay( 50000 ); } */ for( i = 0 ; i < 8; i++ ){ led = _cror_( led, 1 ); //每次向右移動1位 delay( 50000 ); } } }
>再然後,控制蜂鳴器。。我的開發板是無源蜂鳴器靠頻率驅動。把頻率換算成周期: F = 1 / T,週期通過延時函式實現。 然後改變高低電平的佔空比,可以實現蜂鳴器的聲音大小。頻率改變的是蜂鳴器
的音色。
#include <reg52.h> #define led P0 typedef unsigned char u8; typedef unsigned int u16; sbit beep = P1^5; //用p1口的第5位 void delay( u16 i ){ while( i-- ); } void main (){ //無源蜂鳴器靠頻率驅動, 假設10k能驅動, 那麼T = 1 / 10k, T = 0.1 毫秒 //之前的測試是迴圈50000次 = 450 ms(毫秒 ) 那0.1 ms = 12.8次 while( 1 ) { beep = ~beep; //~:取反操作 delay( 50 ); //改變高低電平的佔空比(比例) 控制蜂鳴器聲音大小 beep = 1; delay( 50 ); beep = 0; delay( 5 ); } }
>在然後,控制一個繼電器。這個很簡單。跟點亮led燈同樣的思路
#include <reg52.h> #define led P0 typedef unsigned char u8; typedef unsigned int u16; //繼電器控制 sbit relay = P1^4; //用p1口的第4位 void main (){ relay = 0; //給一個低電平 繼電器開啟 while( 1 ) { } }
>再然後,在靜態數碼管上做了個迴圈顯示0~F的程式,思路就是 1~F 怎麼在靜態數碼管上表示? 因為我的開發板靜態數碼管是共陽數碼管。要用低電平才能點亮對應的段。然後把每一位數字(0~F)對應的
二進位制算出對應的十六進位制,就是我程式中定義的那個陣列表示的就是( 0 ~ F).
#include <reg52.h> #define led P0 typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i-- ); } void main (){ u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92, 0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83, 0xC6 , 0xA1 , 0x86 , 0x8E}; int i = 0; while( 1 ) { for( i = 0; i < 16; i++ ){ led = character[i]; delay( 50000 ); delay( 50000 ); } } }
>在然後,在8個動態數碼上顯示1~8,用到38譯碼器模組的輸入,輸出,我的第一版(傻瓜版程式)
#include <reg52.h> sbit A1 = P2^2; sbit B1 = P2^3; sbit C1 = P2^4; #define led P0 typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i-- ); } void main (){ while( 1 ){ A1 = 0x0; B1 = 0x0; C1 = 0x0; //0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 0x07 , 0x7f led = 0x06; delay( 100 ); A1 = 0x1; B1 = 0x0; C1 = 0x0; led = 0x5b; delay( 100 ); A1 = 0x0; B1 = 0x1; C1 = 0x0; led = 0x4f; delay( 100 ); A1 = 0x1; B1 = 0x1; C1 = 0x0; led = 0x66; delay( 100 ); A1 = 0x0; B1 = 0x0; C1 = 0x1; led = 0x6d; delay( 100 ); A1 = 0x1; B1 = 0x0; C1 = 0x1; led = 0x7d; delay( 100 ); A1 = 0x0; B1 = 0x1; C1 = 0x1; led = 0x07; delay( 100 ); A1 = 0x1; B1 = 0x1; C1 = 0x1; led = 0x7f; delay( 100 ); } }
然後經過封裝改造的程式:
#include <reg52.h> sbit A1 = P2^2; sbit B1 = P2^3; sbit C1 = P2^4; #define led P0 typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i-- ); } u8 digital[16] = { 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c, 0x39 , 0x5e , 0x79 , 0x71 }; void showDigital(){ int i = 0; for ( i = 0; i < 8; i++ ) { switch( i ) { case 0: //位選第一個數碼管 A1 = 0x0; B1 = 0x0; C1 = 0x0; break; case 1: A1 = 0x1; B1 = 0x0; C1 = 0x0; break; case 2: A1 = 0x0; B1 = 0x1; C1 = 0x0; break; case 3: A1 = 0x1; B1 = 0x1; C1 = 0x0; break; case 4: A1 = 0x0; B1 = 0x0; C1 = 0x1; break; case 5: A1 = 0x1; B1 = 0x0; C1 = 0x1; break; case 6: A1 = 0x0; B1 = 0x1; C1 = 0x1; break; case 7: A1 = 0x1; B1 = 0x1; C1 = 0x1; break; } led = digital[ i ]; delay( 100 ); } } void main (){ while( 1 ){ showDigital(); } }
相關推薦
一天:51微控制器從入門到一個動態數碼管顯示數字控制
最近進的公司是一個做路由器的。。很多嵌入式工程師。有個專案( 智慧空調控制)是跟嵌入式工程師對接,我做APP+PHP。。他做伺服器。我們用MQTT(由於emqtt是用erlang寫的,所以我也學了點erlang,後期有時間分享一下,這個語言很好,很強大。特別抽象)。這個專案激發了我對嵌入式的興趣,於是乎。開始
基於51微控制器的電子時鐘(數碼管顯示)
此次對於數碼管進行一個簡單的應用,同時可以設計一個電子小時鐘,增加趣味性。 首先我們先進行原理圖的講解,這裡我們直接使用的開發板,其原理連線圖如下: 其中D(0~1)是連線在微控制器的P0口上的。 從圖中,我們可
嵌入式程式設計(一):51微控制器如何將函式 定義到指定程式地址
開發十年,就只剩下這套架構體系了! >>>
51微控制器之外設——玩轉數碼管
這篇博文,將對數碼管進行介紹和驅動,與之所關聯的晶片,亦是前面所講的74HC138譯碼器、74HC02或非門、74HC573鎖存器,所用的 I/O 口,依然是11個——P2.5P.6P2.7以及P0~P7。 首先,什麼是數碼管? 數碼管是由多個發光二極體封裝
一個Ext JS開發人員的一天:問與答
在最近的《一個Ext JS開發人員的一天》的網路研討會上,我們回答了一些技術問題,如Ext JS如何快速入門、技巧和最佳實踐。在問與答環節異常活躍,因此,我們決定在這裡分享一下這些討論。我們將在3月22日星期四的PDT時間上午10點繼續相同的網路研討會,如果
51微控制器入門之五:數碼管顯示(動態)
本文旨在介紹微控制器入門的基礎知識,為初接觸或即將接觸單片的新手提供一個入門指導。本文章會陸續推出,隔幾天一個章節。所使用微控制器為ATMEL公司的AT89C52,軟體為PROTEUS和KEIL;只提供原理圖和KEIL環境下的註釋,希望對廣大即將接觸微控制器的人有所幫助,
推薦一本書:《ECMAScript 6入門》
書籍本書力爭覆蓋ES6與ES5的所有不同之處,對涉及的語法知識給予詳細介紹,並給出大量簡潔易懂的示例代碼。本書為中級難度,適合已有一定JavaScript語言基礎的讀者,用來了解這門語言的最新發展;也可當作參考手冊,查尋新增的語法點。推薦一本書:《ECMAScript 6入門》
WebSocket協議:5分鐘從入門到精通
eric tps mis 時間 客戶 mozilla doc sin local 一、內容概覽 WebSocket的出現,使得瀏覽器具備了實時雙向通信的能力。本文由淺入深,介紹了WebSocket如何建立連接、交換數據的細節,以及數據幀的格式。此外,還簡要介紹了針對W
第158天:面向對象入門
約定 圖片 大寫 xxx 引用 排列 2個 重復利用 封裝 什麽是對象 我們先來看高程三中是如何對對象進行定義的 "無序屬性的集合,其屬性可以包括基本值、對象或者函數",對象是一組沒有特定順序的的值。對象的沒個屬性或方法都有一個俄名字,每個名字都映射到一個值。 簡單來理
python學習第七十一天:django2與1的差別和視圖
端口 ddd put res 127.0.0.1 正則 pass 什麽 服務 django1與2路由的差別 在django1中的url在django2中為re_path django2中新增了path 1.from django.urls import path
《我的第①本c語言程式設計書:C語言從入門到精通》掃描版.pdf
書籍簡介: 《C語言從入門到精通》以零基礎講解為宗旨,用例項引導讀者深入學習,採取“基礎知識→核心技術→趣味題解→專案實戰”的講解模式,深入淺出地講解C語言的各項技術及實戰技能。《C語言從入門到精通》第1篇【基礎知識】主要講解步入C的世界、常量與變數、資料型別、運算子和表示式、程式控制結構
51微控制器---點亮一個LED燈
1 程式原始碼 #include <REGX52.H> `包含51微控制器的標頭檔案` sbit led = P0^0; int main(void) { while(1) { led = 1; } return 0; } 1.1 C語言常用的預
Spring學習筆記(一):眼見為實,先上一個簡單例子
概述 所謂眼見為實,Spring雖然是一個輕量級的框架,但涉及眾多的概念,理解起來並不容易,因此,先參考資料寫一個簡單的Demo,從中洞見Spring的大體工作流程,為後面深入學習做鋪墊。 本文的Demo很簡單:模擬圖書資料訪問服務,即向資料庫中新增圖書資訊,涉及IBoo
【譯】你不知道的 Chrome 除錯工具技巧 第十一天:style editors continued(樣式編輯器後續)
特別宣告 本文是作者 Tomek Sułkowski 釋出在 medium 上的一個系列。據作者透露一共有 24 篇,一直更新到 12 月 24 日 版權歸原作者所有。 作者在Twitter上推薦我們的中文翻譯啦,截圖在最後 譯者在翻譯前已經和作者溝通得到了翻譯整個系列的許可。 為了不影響大家閱讀,許可
運維的一天:架構設計、故障處理、人員離職…
高效運維社群致力於陪伴您的職業生涯,與您一起愉快的成長。 作者簡介: 韓曉光 DevOps Master、資訊系統專案管理師、ITIL Foundation、RHCE。GOPS金牌講師、金牌作者。著有《系統運維全面解析:技術、管理與實踐》一書。 本文導讀: 本文以敘事形式濃縮了很多運維場景、技術與
10年web前端工程師自白:前端如何從入門到不放棄
首先前端開發的發展這兩年的確冷卻了不少,但是冷卻的並不是行業本身,只能說是技術在沉澱。發展是事物的本質,淘汰陳舊的,與這個時代進步脫節的東西是永恆不變的趨勢。web前端開發由網頁製作演變而來,隨著web2.0的發展,網頁不再只是承載單一的文字和圖片,各種豐富媒體讓網頁的內容更
【譯】你不知道的 Chrome 除錯工具技巧 第二十一天:Snippets(程式碼塊)
特別宣告 本文是作者 Tomek Sułkowski 釋出在 medium 上的一個系列。據作者透露一共有 24 篇,一直更新到 12 月 24 日 版權歸原作者所有。 作者在 Twitter 上推薦我們的中文翻譯啦,截圖在最後 譯者在翻譯前已經和作者溝通得到了翻譯整個系列的授權。 為了不影響大家閱讀,
Android studio中NDK開發(一):CMakeLists.txt編寫入門
自定義變數 主要有隱式定義和顯式定義兩種。 隱式定義的一個例子是PROJECT指令,它會隱式的定義< projectname >_BINARY_DIR和< projectname >_SOURCE_DIR兩個變數;顯式定義使用SE
Android基礎(一):四大元件與另一個重要元件Intent的簡單認識
與其他系統應用程式不同,Android應用程式沒有為應用程式提供一個單獨的應用程式入口(如同沒有mian方法)而是為系統依照需求例項化提供了基本的元件,這就是我之後要講到的Android的四大元件和另
IFE第二十到第二十一天:讓你和頁面對話
test1 <!DOCTYPE html> <html> <head> <meta charset="UTF-8">