日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月19日(星期六)

2021年07月19日 | 51單片機(五)—— GPIO點亮一個LED

發(fā)布者:Blissful444 來源: eefocus關(guān)鍵字:51單片機  GPIO  LED 手機看文章 掃描二維碼
隨時隨地手機看文章

一、LED控制介紹

發(fā)光二極管半導體二極管的一種,可以把電能轉(zhuǎn)化成光能,常簡寫為LED。發(fā)光二極管與普通二極管一樣是由一個PN結(jié)組成,也具有單向?qū)щ娞匦?。當給發(fā)光二極管加上正向電壓時就會發(fā)光,光的強弱與工作電流成正比。一般情況下,LED的正向工作電流在10mA左右,如果電流過大就會燒壞LED,因此使用時必須串聯(lián)限流電阻以控制通過二極管的電流。


普通發(fā)光二極管的正向飽和壓降為1.6V~2.1V。發(fā)光二極管的特點是:工作電壓很低(有的僅一點幾伏);工作電流很小(有的僅零點幾毫安即可發(fā)光);抗沖擊和抗震性能好,可靠性高,壽命長;通過調(diào)制通過的電流強弱可以方便地調(diào)制發(fā)光的強弱。由于有這些特點,發(fā)光二極管在一些光電控制設備中用作光源,并廣泛應用于各種電子電路、家電、儀表等設備中。


本文使用的開發(fā)板上設計了8個發(fā)光二極管,其中有2個紅色、2個黃色、2個綠色和2個藍色。發(fā)光二極管部分的原理圖如下圖所示。R21是470歐姆的8位阻排,LED1~LED8是8個發(fā)光二極管,阻排的公共端與5V電源VCC相連,發(fā)光二極管的正極與阻排相連,負極與插針J21相連,J21經(jīng)過杜邦線可以連接到需要使用的I/O口。連接好后,單片機輸出低電平時對應的LED燈點亮,高電平時對應的LED燈熄滅。

我們來了解下I/O口的工作原理。I/O口即輸入和輸出口,單片機的I/O口既可以作為輸入信號端、也可以作為輸出信號端。圖中,J21可以接5V、懸空、也可以接地。以LED1為例,我們將LED1的等效電路單獨畫出來,如下圖所示。

圖中VCC是5V的電源,當電路的右側(cè)接5V或者懸空時,電路沒有電流通過,LED燈的狀態(tài)是熄滅的;當電路的右側(cè)接地時,兩端壓差是5V,所以LED燈被點亮。在數(shù)字電路中,接+5V為電平“1”,接地為“0”。


所以在設計中,將LED連接到單片機的I/O口,此時我們只需要控制單片機的I/O口為“1”或者為“0”就可以控制LED燈的亮滅了。


二、例程測試

在這個實驗中我們用兩種不同的方法對一個LED燈進行控制,在測試之前需要將上邊J21的1引腳與單片機的P00用杜邦線連接起來。


方法1:

實現(xiàn)的代碼如下所示


#include 

 

sbit LED=P0^0;   

  

void main (void)

{

LED=0;            //將P00口賦值0,對外輸出低電平

for(;;);          //死循環(huán),原地等待

}


將這個代碼編譯之后將Hex文件燒寫到單片機中,可以看到LED1點亮。


1、在上面的代碼中,#include這是一個預處理命令,所謂的預處理命令就是在程序編譯之前進行的命令。預處理命令以“#”開始,“include”是文件包含命令。除了文件包含命令,常見的預處理命令還有:宏定義和條件編譯。在C語言中,頭文件被大量使用。頭文件是一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,C程序的頭文件以“.h”為后綴。一般在一個應用開發(fā)體系中,功能的真正邏輯實現(xiàn)是以硬件層為基礎,在驅(qū)動程序、功能層程序以及用戶的應用程序中完成的。頭文件的主要作用在于調(diào)用庫功能,對各個被調(diào)用函數(shù)給出一個描述,其本身不包含程序的邏輯實現(xiàn)代碼,它只起描述性作用,告訴應用程序通過相應途徑尋找相應功能函數(shù)的真正邏輯實現(xiàn)代碼。用戶程序只需要按照頭文件中的接口聲明來調(diào)用庫功能,編譯器會從庫中提取相應的代碼。#include這一句的含義就是這個工程包含了reg52.h這個文件中的內(nèi)容。reg52.h這個文件中的內(nèi)容如下所示。


#ifndef __REG52_H__

#define __REG52_H__

 

/*  BYTE Registers  */

sfr P0    = 0x80;

sfr P1    = 0x90;

sfr P2    = 0xA0;

sfr P3    = 0xB0;

sfr PSW   = 0xD0;

sfr ACC   = 0xE0;

sfr B     = 0xF0;

sfr SP    = 0x81;

sfr DPL   = 0x82;

sfr DPH   = 0x83;

sfr PCON  = 0x87;

sfr TCON  = 0x88;

sfr TMOD  = 0x89;

sfr TL0   = 0x8A;

sfr TL1   = 0x8B;

sfr TH0   = 0x8C;

sfr TH1   = 0x8D;

sfr IE    = 0xA8;

sfr IP    = 0xB8;

sfr SCON  = 0x98;

sfr SBUF  = 0x99;

 

/*  8052 Extensions  */

sfr T2CON  = 0xC8;

sfr RCAP2L = 0xCA;

sfr RCAP2H = 0xCB;

sfr TL2    = 0xCC;

sfr TH2    = 0xCD;

 

 

/*  BIT Registers  */

/*  PSW  */

sbit CY    = PSW^7;

sbit AC    = PSW^6;

sbit F0    = PSW^5;

sbit RS1   = PSW^4;

sbit RS0   = PSW^3;

sbit OV    = PSW^2;

sbit P     = PSW^0; //8052 only

 

/*  TCON  */

sbit TF1   = TCON^7;

sbit TR1   = TCON^6;

sbit TF0   = TCON^5;

sbit TR0   = TCON^4;

sbit IE1   = TCON^3;

sbit IT1   = TCON^2;

sbit IE0   = TCON^1;

sbit IT0   = TCON^0;

 

/*  IE  */

sbit EA    = IE^7;

sbit ET2   = IE^5; //8052 only

sbit ES    = IE^4;

sbit ET1   = IE^3;

sbit EX1   = IE^2;

sbit ET0   = IE^1;

sbit EX0   = IE^0;

 

/*  IP  */

sbit PT2   = IP^5;

sbit PS    = IP^4;

sbit PT1   = IP^3;

sbit PX1   = IP^2;

sbit PT0   = IP^1;

sbit PX0   = IP^0;

 

/*  P3  */

sbit RD    = P3^7;

sbit WR    = P3^6;

sbit T1    = P3^5;

sbit T0    = P3^4;

sbit INT1  = P3^3;

sbit INT0  = P3^2;

sbit TXD   = P3^1;

sbit RXD   = P3^0;

 

/*  SCON  */

sbit SM0   = SCON^7;

sbit SM1   = SCON^6;

sbit SM2   = SCON^5;

sbit REN   = SCON^4;

sbit TB8   = SCON^3;

sbit RB8   = SCON^2;

sbit TI    = SCON^1;

sbit RI    = SCON^0;

 

/*  P1  */

sbit T2EX  = P1^1; // 8052 only

sbit T2    = P1^0; // 8052 only

             

/*  T2CON  */

sbit TF2    = T2CON^7;

sbit EXF2   = T2CON^6;

sbit RCLK   = T2CON^5;

sbit TCLK   = T2CON^4;

sbit EXEN2  = T2CON^3;

sbit TR2    = T2CON^2;

sbit C_T2   = T2CON^1;

sbit CP_RL2 = T2CON^0;

#endif


從這個文件的定義可以看出,這個文件主要定義了單片機的端口和特殊功能寄存器。程序中包含了頭文件之后,就可以直接使用定義過的標志符。例如:P0口的寄存器地址是0x80,其中0x表示它后邊的數(shù)值是16進制的。如果對P0口進行操作,我們直接使用P0這個標志符就行了,而不需要了解P0口寄存器的物理地址和內(nèi)部結(jié)構(gòu)。


2、sfr和sbit,reg52.h中可以看到這兩個關(guān)鍵字?!皊fr P0= 0x80;”這一句的含義是將單片機內(nèi)部地址為0x80的寄存器重新起名為P0,以后我們在程序中就可以直接操作P0,就相當于對單片機內(nèi)部的0x80地址處的寄存器進行操作。實際上,通過sfr關(guān)鍵字的定義,讓Keil編譯器在單片機和用戶之間搭建了一條可以進行溝通的橋梁,我們操作P0口,而單片機并不知道什么是P0口,但它知道知道它內(nèi)部的地址0x80是什么。


“sbit CY= PSW^7;”這一句的意思是將PSW這個寄存器的第7位重新命名為CY,所以在需要單獨操作PSW寄存器第7位時,可以直接操作CY。


在程序中有一句“sbit LED=P0^0;” 這一句的意思是將P0口寄存器的第0位,也就是最低位定義為LED,因此程序中操作LED時相當于操作P0口寄存器的第0位。例如:LED=0; 相當將0賦值給P0口寄存器的第0位。


3、main()函數(shù),主函數(shù)就是main函數(shù),是程序的入口,程序一旦執(zhí)行的時候就會從這個入口開始,任何一個程序中有且只有一個主函數(shù)。


4、for(;;)。for()循環(huán)是C語言中一種基本的循環(huán)方式,當條件為真時,進入循環(huán)體,條件不滿足時,跳出。


for()循環(huán)的標準格式為


for(表達式1;表達式2;表達式3)


{語句(內(nèi)部可以為空)}


我們來看一下下邊這段程序。


              unsigned char i;


              for(i=2;i>0;i++)


              {      }


這段程序首先定義了一個無符號字符型變量i,然后指向for語句。i=2;i>0;i++這三個表達式中,表達式1是給i賦一個初值2,表達式2判斷i>0是真還是假,表達式3是i每個周期減1。我們來分析一下這個for循環(huán)的執(zhí)行過程。


第一步:給i賦初值2,此時i=2。


第二步:因為2>0,條件成立,所以其值為真,那么執(zhí)行for循環(huán)下邊大括號中的內(nèi)容。由于大括號中為空,所以什么也不執(zhí)行。


第三步:i自減1,即i=i-1=2-1=1。


第四步:跳回到第二步,因為1>0,條件成立,所以其值為真,那么執(zhí)行for循環(huán)下邊大括號中的內(nèi)容。由于大括號中為空,所以什么也不執(zhí)行。


第五步:i自減1,即i=i-1=1-1=0。


第六步:跳回到第二步,因為0>0,條件不成立,所以其值為假,那么結(jié)束for循環(huán),程序從for循環(huán)中跳出。


“for(;;);”這個語句中for的三個表達式都為空,這個for語句是無限循環(huán)。


本例中,進入main函數(shù)對LED燈進行操作,之后進入for循環(huán),并一直在循環(huán)中等待,不進行任何操作,因此LED燈的狀態(tài)也不會發(fā)生變化。


該程序雖然簡單,但是包含C語言最基礎的知識,后面的程序會在此基礎上增加新的內(nèi)容。


5、程序的注釋,//和/* */這兩種符號表示注釋。注釋語句雖然不對程序的運行產(chǎn)生任何影響,但必要的注釋是程序的重要組成部分。對于一個程序員來說,及時加注釋是一個好的習慣。上述兩個注釋的區(qū)別在于://是行注釋,換行無效;/* */中間的內(nèi)容都是注釋,換行有效。注釋可以根據(jù)大家的習慣,沒有具體要求。


方法二:

實現(xiàn)代碼如下所示


#include 

#define LED  P0    //宏定義關(guān)鍵字,定義LED到單片機的P0口

 

void main (void)

{

LED=0xfe;         //將P0口賦值0xfe,

                  //0xfe轉(zhuǎn)換為二進制為 1111 1110,即P0口的最低位輸出低電平,其它位輸出高電平。

for(;;);          //死循環(huán),原地等待

}


在這個實驗中,對LED控制的命令與方法一是不同的,主要知識點如下:


1、宏定義,宏定義又稱為宏代換、宏替換,簡稱“宏”。


宏定義的格式:


#define 標識符 字符串


其中的標識符就是所謂的符號常量,也稱為“宏名”。預處理(預編譯)工作也叫做宏展開,將宏名替換為字符串。掌握“宏”概念的關(guān)鍵是“換”。一切以換為前提、做任何事情之前先要換,準確理解之前就要“換”。即在對相關(guān)命令或語句的含義和功能作具體分析之前就要換。


例如程序中#define  LED  P0


表示LED燈定義在P0口上。因此對P0口進行操作,我們可以直接用LED來代替,LED=0xfe;就相當于P0=0xfe;


2、進制轉(zhuǎn)換,這個實驗與第一個實驗不同,直接對P0口整體進行操作。P0口的寬度是8位,用二進制表示是xxxx xxxx。單片機常用的進制是:二進制、八進制、十進制和十六進制,0x前綴表示十六進制,如:0xFF。0xFF與0xff相同,C語言中數(shù)值不區(qū)分大小寫。這幾種進制形式不同,但是可以相互轉(zhuǎn)換。


本實驗中同樣是點亮了LED1。但是對P0口進行整體賦值的方法,將0xfe賦給了P0,0xfe轉(zhuǎn)換成2進制就是11111110,也就是將P0口的高7位拉高,最低位拉低,這樣LED1就可以點亮了,其余的燈熄滅。


關(guān)鍵字:51單片機  GPIO  LED 引用地址:51單片機(五)—— GPIO點亮一個LED

上一篇:51單片機(六)—— GPIO控制多路LED
下一篇:51單片機(四)—— 51單片機仿真芯片的使用

推薦閱讀

據(jù)報道,近日,北京郵政在門頭溝齋堂郵政支局舉辦了無人機投遞試飛儀式。據(jù)悉,這架無人機引入由中郵科技有限責任公司自主研發(fā)的最新版無人機應用平臺,能通過簡易的操作實現(xiàn)無人機全程自動化飛行。無人機這一全新投遞手段可以提升京西山區(qū)地區(qū)郵政服務效率,為深山地區(qū)政府及百姓提供更加便捷、準確、迅速的郵政服務。
由表可知,芯片內(nèi)部的外設資源除了跟stm32f103后面的第一個字母有關(guān)外,還和flash的大小有關(guān)。上面的表中只有一部分,具體的可以參考Keil的芯片型號選擇部分。下面是stm32f103c8t6的資源: TIM1_BRK_IRQn = 24, TIM1_UP_IRQn = 25, TIM1_TRG_COM_IRQn = 26, TI...
STM8 CAN外部時鐘控制寄存器(CLK_CANCCR)地址偏移值:0x0B復位值:0x00位7:3保留。始終為0。位2:0CANDIV[2:0]:外部CAN時鐘分頻值由軟件寫入,用于指定外部CAN時鐘的分頻值。詳情請參見章節(jié)23.9000:外部CAN時鐘=fHSE/1(復位值)001:外部CAN時鐘=fHSE/2010:外部CAN時鐘=fMASTER/4…111:外部CAN時鐘=fMASTER/8
一、開發(fā)環(huán)境安裝能夠進行51單片機的集成開發(fā)環(huán)境比較多,比較常用的是Keil C51,可以從相應的網(wǎng)站上下載,如下圖所示為Keil C51的安裝文件點擊“Setup.exe”,出現(xiàn)如下圖所示的窗口。點擊上圖中的“Full Version”,出現(xiàn)如下圖所示的窗口點擊“Next”,出現(xiàn)如下圖所示的窗口。點擊“Yes”,出現(xiàn)如下圖所示的窗口這個頁面用來設置Keil的安裝位置,默認...

史海拾趣

問答坊 | AI 解惑

e芯電子技術(shù)交流4群開始啟用35871678!

本帖最后由 paulhyde 于 2014-9-15 09:25 編輯 e芯電子技術(shù)交流4群開始啟用35871678!謝謝支持  …

查看全部問答∨

泰克的AM503B電流探頭放大器有人用過嗎?碰到問題了

開機的時候那個消磁按鈕上的紅色指示燈不停的閃,按一下會進行消磁動作,但好像不能完成消磁,數(shù)碼管顯示364一閃一閃的。 有時候開機一段時間后能消磁成功,有時候開機幾個小時也不行。用過的DD指導一下,是有故障還是我使用問題?…

查看全部問答∨

如何進行編程可以減少程序的bug?

如題,這個恐怕是大家經(jīng)常遇到的問題吧? 一種方法是: 在任何時候都把“程序規(guī)模”限制在你所能夠掌控的范圍內(nèi)。 那如果超過范圍咋辦?模塊化——合理劃分和封裝細節(jié)。其實如果是自上而下的設計(通常如此),模塊化設計是非常自然的事(因為 ...…

查看全部問答∨

常見分辨率的簡稱

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 Name Resolution Aspect Ratio QUXGA 3200×2400 4:3 QSXGA+ 2800×2100 4:3 QSXGA 2560×2048 5:4 WQXGA 2560×1600 16:10 QXGA 2048×1536 4:3 WUXGA ...…

查看全部問答∨

有關(guān)屏蔽電阻的問題。。。。

最近看了一個電路,就是在觸摸屏的四根線上,分別接了4個屏蔽電阻下拉接地。 想請教一下: 1。為什么觸摸屏那四根線要下拉?我看很多觸摸屏的電路,沒有下拉使用也很正常??! 2。為什么要用屏蔽電阻?普通電阻不行嗎?會造成什么樣的影響? 麻 ...…

查看全部問答∨

如何CString 類型轉(zhuǎn)換為INT?

        CString strDefault=111; 我要把111付值給int a;怎么做那?我用atoi不好使 …

查看全部問答∨

VHDL中如何將兩個模塊中的inout互聯(lián)????

VHDL中如何將兩個模塊中的inout互聯(lián)?…

查看全部問答∨

單片機不能接收到PC發(fā)過來的數(shù)據(jù)

#include \"msp430x54x.h\" void main(void){ WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT  P5SEL |=BIT6+BIT7;    &nbs ...…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved