1. 程式人生 > >【微控制器實驗】按鍵實驗(一,二,三)

【微控制器實驗】按鍵實驗(一,二,三)

按鍵實驗
目的:通過按鍵控制其他元器件
實驗一
K1~K4控制LED移位
這裡寫圖片描述

    目的:按下獨立按鍵K1~K4,可分別上下控制連線在P0,P2埠的LED移位顯示。
#include<reg51.h>//使用晶片的庫函式
#include<intrins.h>/*intrins.h,函式,C51微控制器程式設計中,使用到空指令_nop_();字元迴圈移位指令_crol_等時使用。*/
#define uint unsigned int//define巨集定義
#define uchar unsigned char

void DelayMS(uint
x)//延時函式,不同的晶片由於頻率不同而不同 { uchar i; while (x--) for (i = 0;i < 120;i++); } void Move_LED()//LED燈移動功能 //P1,按鍵引腳;P0:左流水燈;P2:右流水燈; { if ((P1 & 0x10) == 0) P0 = _crol_(P0, 1); //左邊流水燈向上移動 else if ((P1 & 0x20) == 0) P0 = _cror_(P0, 1); //左邊流水燈向下移動 else if ((P1 & 0x40
) == 0) P2 = _crol_(P2, 1); //右邊流水燈向上移動 else if ((P1 & 0x80) == 0) P2 = _cror_(P2, 1); //右邊流水燈向下移動 }

實驗二
K1~K4按鍵狀態顯示:
LED1,2和3,4,控制燈的亮滅不同。
按下K1或K2時,LED1或2亮,鬆開熄滅。按下K3或K4後釋放時,LED3或4 亮,再次按下並釋放時熄滅。
按鍵狀態

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int 

sbit LED1 = P0 ^ 0
; sbit LED2 = P0 ^ 1; sbit LED3 = P0 ^ 2; sbit LED4 = P0 ^ 3; sbit K1 = P1 ^ 0; sbit K2 = P1 ^ 1; sbit K3 = P1 ^ 2; sbit K4 = P1 ^ 3; void DelayMS(uint x) { uchar i; while (x--) for (i = 0;i < 120;i++); } void main() { P1 = 0xFF; P0 = 0xFF; while (1) { LED1 = K1; LED2 = K2; if (K3 == 0) { while (K3 == 0); LED3 = ~LED3; } if (K4 == 0) { while (K4 == 0); LED4 = ~ LED4; } DelayMS(10); } } void main() { P1 = 0xFF; P0 = 0xFF; while (1) { LED 1 = K1; //K1= 1,燈滅;K1 = 0,燈亮 //LED1,2,由按鍵直接控制,按鍵狀態即是燈的狀態 //LED3,4,由按鍵間接控制,按鍵第一次按下 if (K3 == 0)//按下K3,K3=0 { while (K3 == 0); //保持當時燈的狀態,等待釋放按鍵;釋放按鍵後,執行下一條指令,即是相反狀態 LED3 = ~LED3; //實現燈的相反狀態,兩次按鍵狀態切換 } if (K4 == 0) { while (K4 == 0) LED4 = ~LED4; } DelayMS(10); } }

重點
—while(1)和while(1);(有分號)—

    while(1){……}:是讓微控制器一直執行{……}中內容,**防止程式跑飛**,通常用於主程式主體,確保程式持續執行
    while(1);     :是一條指令,它讓微控制器停在這個位置,一般用來檢測中斷,只有cpu收到中斷指令,才會跳出while(1),進入中斷服務子程式;
    whlie(1)本質是死迴圈,while(1)中的指令會不斷重複執行,除非有中斷,while(1);可以看作while(1){//空指令},它執行的是空指令,
    *於是微控制器就停在這行程式碼處*
    很明顯:我們是高電平有效,未按下時,是高電平,為1;當K1=1時,燈是滅的;從P0,P1的引腳初始化也可以看出。

實驗三

K1~K4分組控制LED
實驗內容:在得出鍵號後分別對LED執行4種不同的操作。
K1~K4分組控制LED

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned char

void DelayMS(uint x)
{
    uchar t;
    while (--x)
        for (t = 0;t < 120;t++);
}

void main()
{
    uchar k, t, Key_State;//定義變數,以及鍵盤
    P0 = 0xFF;//初始化P0,P1引腳
    P1 = 0xFF;

    while (1)
    {
        t = P1;     //記錄P1 初值
        if (t!= 0xFF)//
        {
            DelayMS(10);
            if (t != P1) continue;//再次檢查按鍵
            Key_State = -t >> 4;//取得4位按鍵值,
            //由模式XXXX1111(X中有一位為0,其他均為1)
            //變為模式0000XXXX(X中有一位為1,其他均為0)
            k = 0;
            //檢查1所在的位置,累加獲取按鍵號K
            while (Key_State != 0)
            {
                k++;
                Key_State >>= 1;

            }
            //根據按鍵號K進行4種處理

//(當前情況是在迴圈體內,switch中的指令會多次判斷並執行)
switch (k)
        {
        case 1:if (P0 == 0x00) P0 = 0xFF;//1111 1111
                P0 <<= 1;//P0左移一位 1111 1110 左移 
                DelayMS(200);
                break;
        case 2:P0 = 0xF0;break;//點亮【上面】4只
        case 3:P0 = 0x0F;break;//點亮【下面】4只
        //涉及知識點:共陰極還是陽極,以及引腳對應問題
        case 4:P0 = 0xFF;//關閉所有
        }

        }
    }
}

重點

—引腳和值的對應關係(反序)—

P0口的8個引腳被賦值成1111,1110,就是說只有P0^0口是低電平,其餘都是高電平!8個引腳與0xfe的2進位制分別對應!
    即是1111,1110的值對應P0的7,6,5,4,3,2,1,0號引腳,不同於我們數數時01234567從左到右的邏輯,這種現象在組合語言和微控制器裡很常見

—迴圈移位和移位(CF的作用有無)—

迴圈移位:微控制器中的移位運算不同於C語言中的移位之後補零,而是分情況進行大迴圈和小迴圈(即是微機原理中的不帶進位CF的CRL和帶進位CF的ROR 迴圈移位)常使用_crol_()和_cror_()函式完成。

“`
移位:>> 右移;<<左移

    本實驗則是【未使用】迴圈移位。故在switch語句中進行

case 1:if (P0 == 0x00) P0 = 0xFF;
//若燈亮全滅
P0 <<= 1;
//(原來是ff 1111 1111 變 1111 1110,亮一個-》亮兩個,3個,四個……八個,迴圈,全滅,也是逐個,從下到上移動。

—共陽極和共陰極(燈該怎麼亮?)—

    燈亮取決於高電平還是低電平,由共陽極和共陰極決定。
共陽極:低電平0亮,(和電源形成電平差,點亮LED燈)
共陰極:高電平1亮。

後語
認真做了按鍵實驗,感覺微控制器並不簡單,需要自己好好努力,認真對待才行,各位大朋友,小朋友加油!(PS:markdown用的還有點無力,下次加油吧)

相關推薦

微控制器實驗按鍵實驗

按鍵實驗: 目的:通過按鍵控制其他元器件 實驗一 K1~K4控制LED移位 目的:按下獨立按鍵K1~K4,可分別上下控制連線在P0,P2埠的LED移位顯示。 #in

Absible學習Ansible playbook

tags 列表 最好 test list playbook ppi -m color * 簡介 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於復雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。play

OpenAI-Gym學習記錄gym安裝

前言 最近在學習強化學習( Reinforcement Learning ),自學過程包括理論學習部分與演算法學習部分。理論學習部分安利一本書籍 Richard S. Sutton 的 Reinforcement Learning : An Introduction;演算法學習主要為使用

機器學習softmax迴歸

在 softmax迴歸中,我們解決的是多分類問題(相對於 logistic 迴歸解決的二分類問題),類標  可以取  個不同的值(而不是 2 個)。因此,對於訓練集 ,我們有 。(注意此處的類別下標從 1 開始,而不是 0)。例如,在 M

Redis學習Redis筆記——特點、基礎命令和資料結構

更新時間:2018-10-13 Redis的特性 速度快 持久化(斷電不丟資料) 多種資料結構 支援多種客戶端語言 功能豐富 操作簡單 主從複製 高可用,分散式 Redis的通用命令 key

深度學習線性迴歸原理及python從0開始實現

文章目錄 線性迴歸 單個屬性的情況 多元線性迴歸 廣義線性模型 實驗資料集 介紹 相關連結 Python實現 環境 編碼

深度學習Softmax迴歸概念和原理

文章目錄 概述 Softmax Softmox迴歸模型 向量形式 Softmax運算 交叉熵損失函式 真實標籤的變換 平方損失函式 交叉熵損失函式

面試演算法——連結串列

一、連結串列 1.連結串列問題演算法難度不高,但是考察程式碼實現能力 2.連結串列和陣列都是一種線性結構 陣列是一段連續的儲存空間 連結串列空間不一定是保證連續的,為臨時分配的 3.連結串列的分類 4.連結串列問題程式碼實現的關鍵點 (1)連結串列調整函

機器學習神經網路——多類分類問題

一、問題引入 早在監督學習中我們已經使用Logistic迴歸很好地解決二類分類問題。但現實生活中,更多的是多類分類問題(比如識別10個手寫數字)。本文引入神經網路模型解決多類分類問題。 二、神經網路模型介紹 神經網路模型是一個非常強大的模型,起源於嘗試讓機

機器學習人像分類——過程總結

  這個問題其實是上學期某門課的大作業的三個題目之一。公佈題目後我就對這個內容很感興趣,然而由於種種原因,和隊友商量之後仍然選擇了看起來最簡單的句子分類,對此我不無遺憾。   這個寒假裡計劃要乾的事情其實有很多,完成這個專案是其中之一;對CS的熱門方向——如機

深度學習學習歷程緒論

學習【深度學習】一書筆記! **人工智慧**的*真正挑戰*在於解決那些對人來說很容易執行、但很難形式化描述的任務,如識別人們所說的話或影象中的臉。對於這些問題,我們人類往往可以憑藉直覺輕易地解決。 本書討論的方案,該方案可以讓計算機從經驗中學習,並根據**層次化

Unity&DragonBones紙娃娃替換身體部點陣圖片

DragonBones在2D畫素角色人物的紙娃娃系統的應用,如何替換身體部點陣圖片 UnityFactory.factory.ReplaceSlotDisplay使用方法請用如上所示連結 實現了更換部分身體部位的圖片 using System.Collec

計算機視覺深度相機--TOF總結

TOF技術採用主動光探測方式,與一般光照需求不一樣的是,TOF照射單元的目的不是照明,而是利用入射光訊號與反射光訊號的變化來進行距離測量,所以,TOF的照射單元都是對光進行高頻調製之後再進行發射,比如下圖所示的採用LED或鐳射二極體發射的脈衝光,脈衝可達到100MHz。與普通相機類似,TOF相機晶片前端需要一

讀書雜談學習閱讀

文字在人類歷史上扮演重要的角色,它可以記錄前人的思想,從而讓我們有機會站在巨人的肩膀上前進,這是我們快速進步和超越前人的基石 為什麼要學習閱讀   我們學會一項技能可以通過閱讀文章,看教學視訊(包括音訊),口頭說教,實踐學習這幾種方式。對於學習一

Jmeter系列認識Jmeter

後來 負載 監控服務器 測試性能 發送 接口 java開發 設計 jdk 一、JMeter簡介 JMeter是Apache組織開發的基於Java的壓力測試工具。JMeter 通過模擬不同強度的負載對服務器、網絡或對象進行測試,從而分析出它們的整體性能。它最初被設計用於We

讀書筆記詩詞積累

上下 讀書筆記 春遊 知乎 詩人 安排 strong 傳說 包含 一、白居易 鄰女 娉婷十五勝天仙,白日嫦娥旱地蓮。 何處閑教鸚鵡語,碧紗窗下繡床前。 留別 秋涼卷朝簟,春暖撤夜衾。 雖是無情物,欲別尚沈吟。 況與有情別,別隨情淺深。 二年歡笑意,一旦東西心。 獨留誠可念,

系統解讀SystemUI篇SystemUI啟動流程

前言        SystemUI是系統啟動中第一個使用者肉眼可見的應用,其功能包羅永珍,比如開機後看到的鎖屏介面,充電時充電介面,狀態列,導航欄,多工欄等,都是與Android手機使用者息息相關的功能。所以不止SystemUI開發者,普通的應用開發者也很有必要去了解

設計模式設計模式-- 大話設計模式讀書筆記

設計模式是面向物件的最佳實踐(程式碼無錯未必優) (適度封裝,合理繼承,結構多型)=》降耦合; 整體已維護,易複用,可擴充套件=》靈活度; 面向物件的好處:可維護,可擴充套件,可複用,靈活性好; 面向物件的標誌:依賴倒轉=》抽象不應該依賴細節,細節應該依賴於抽象=》程式中所有的依賴關係都終止於抽象類或者介面(

HDU 2602Bone Collector裸的01背包

c++ style memset its for get strong IE HA Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone C

PHP基礎PHP教程錯誤處理、異常處理

檢測 pen 沒有 border adding The 16px 之前 family 1、錯誤處理 在 PHP 中,默認的錯誤處理很簡單。一條消息會被發送到瀏覽器,這條消息帶有文件名、行號以及一條描述錯誤的消息。 在創建腳本和 web 應用程序時,錯誤處理是一個重要