一天:51單片機從入門到一個動態數位管顯示數字控制

来源:https://www.cnblogs.com/ghostwu/archive/2018/06/03/9130177.html
-Advertisement-
Play Games

最近進的公司是一個做路由器的。。很多嵌入式工程師。有個項目( 智能空調控制)是跟嵌入式工程師對接,我做APP+PHP。。他做伺服器。我們用MQTT(由於emqtt是用erlang寫的,所以我也學了點erlang,後期有時間分享一下,這個語言很好,很強大。特別抽象)。這個項目激發了我對嵌入式的興趣,於 ...


最近進的公司是一個做路由器的。。很多嵌入式工程師。有個項目( 智能空調控制)是跟嵌入式工程師對接,我做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();    
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內容轉自網路(具體轉載哪裡忘記了,有知道的) 前言 代碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於代碼的運行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海裡面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被喂飽了。代碼優化也是 ...
  • 以下是 基類 Form1 // 委托、事件是 public 和全局的 public delegate void ButtonClickdHandle(object sender, EventArgs e);//定義委托 public event ButtonClickdHandle UserCont ...
  • 轉發請註明出處:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 實在沒有找到Unity容器的AOP應用程式示例的說明,在微軟官網找到了教程(https://docs.microsoft.com/zh-cn/previous-versions ...
  • 在接下來的這篇文章中,我將向大家介紹.NET中的線程API,怎麼樣用C#創建線程,啟動和停止線程,設置優先順序和狀態.在.NET中編寫的程式將被自動的分配一個線程.讓我們來看看用C#編程語言創建線程並且繼續學習線程的知識。我們都知道.NET的運行時環境的主線程由Main ()方法來啟動應用程式,而且. ...
  • 講一下echarts的用法,列舉了兩個圖表,一個是單柱圖,一個是多柱圖,至於餅狀圖,只許更改echarts的類型就好了 一、首先是要兩個div,用來存放兩個圖表 二、需要用js從後臺獲取json數據(可以從cs頁面獲取,也可以通過一般處理程式,這裡用的一般處理程式) <%--單個柱狀圖--%> <s ...
  • mvc_study StudyStartup Program code explain construction 即若需要使用startup的有參構造,則需要在configureappconfiguration中進行配置相應處理類 請求走向: 初始:Run --> ConfigureServices ...
  • MATLAB是美國MathWorks公司出品的商業數學軟體,主要用於演算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和互動式環境,是一款優秀而又強大的數學軟體。 本文基於 Deepin 15.5 進行 MATLAB2016b 的安裝,其他操作系統及 MATLAB 版本類似。 一、下載“C ...
  • ### 這幾天開始搗鼓lnmp的環境搭建,很多東西還是得自己去經歷,才會印象深刻,有所體會,有所收穫與成長! 但是,偶爾會遇到一些意想不到問題! Xshell ,Xftp 遠程連接的時候出現中文亂碼的問題! ### 1. Xshell 顯示中文亂碼問題解決: 在工具欄 -- 文件 -- 屬性(alt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...