1. 程式人生 > >一天:51微控制器從入門到一個動態數碼管顯示數字控制

一天: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">