首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

51單片機控制8顆LED燈閃爍實驗代碼詳解

     編輯:關於C

經典的 51 單片機入門實驗:控制 P2 口 8 顆 LED 交替閃爍。本文提供完整代碼、延時原理分析、硬體連接說明與常見問題排查。

完整代碼

//----------8個LED燈閃爍------------//
//----------------------------------//
//-----------杭哥工作室------------//
//-----------設計者:呂杭劍--------//
//-----------QQ:984966845----------//
//---------------------------------//
#include <reg51.h>

void delay(unsigned int d_time);

void main(void)
{
    while(1)
    {
        P2 = 0x00;          // 全亮(共陰極)或全滅(共陽極)
        delay(20000);
        P2 = 0xFF;          // 全滅(共陰極)或全亮(共陽極)
        delay(20000);
    }
}

void delay(unsigned int d_time)
{
    for(; d_time > 0; d_time--);
}

代碼逐行解析

代碼說明
#include <reg51.h>51 系列單片機寄存器定義頭文件
P2 = 0x00P2 口輸出低電平(8 位全 0)
P2 = 0xFFP2 口輸出高電平(8 位全 1)
delay(20000)軟體延時,約 20ms@12MHz
while(1)無限循環,嵌入式主迴圈標準寫法

延時函數原理分析

void delay(unsigned int d_time)
{
    for(; d_time > 0; d_time--);
}
  • 空循環,每次迴減 1 直到 0
  • 12MHz 晶振下,機器週期 1μs,指令週期 1~2 機器週期
  • d_time=20000 理論約 20~40ms(視編譯器優化)
  • 缺點:受編譯器優化影響大,時序不精確

改進版:精確延時

// 12MHz 下約 1ms
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 123; j++);  // 經校準常數
}

// 或使用定時器 T0 中斷(推薦)
void timer0_init() {
    TMOD = 0x01;      // 模式 1:16 位定時器
    TH0 = 0xFC;       // 1ms@12MHz: 65536-1000=64536=0xFC18
    TL0 = 0x18;
    ET0 = 1; EA = 1;
    TR0 = 1;
}

硬體連接說明

共陰極接法(常見)

  • LED 陽極接 P2.0~P2.7,串聯限流電阻 (220Ω~1kΩ)
  • LED 陰極接地
  • P2=0x00 → 低電平 → LED 亮
  • P2=0xFF → 高電平 → LED 滅

共陽極接法

  • LED 陰極接 P2 口,陽極接 VCC
  • 邏輯相反:0x00 滅、0xFF 亮

進階擴展:流水燈、呼吸燈

// 流水燈(左移)
void flow_left() {
    P2 = 0xFE;  // 1111 1110
    delay(50000);
    for(int i=0; i<7; i++) {
        P2 = (P2 << 1) | 0x01;
        delay(50000);
    }
}

// 呼吸燈(PWM 模擬)
void breathe() {
    for(int duty=0; duty<255; duty++) {
        for(int k=0; k<10; k++) {
            P2 = 0xFF; delay_us(duty);
            P2 = 0x00; delay_us(255-duty);
        }
    }
    // 漸滅同理反向
}

常見問題排查

總結

這是單片機學習的「Hello World」。掌握 GPIO 輸出、延時、邏輯控制三大基礎,即可展開更複雜的外設驅動開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象可能原因解決
LED 不亮極性接反、電阻過大、IO 口損壞檢查原理圖、換電阻、測量電壓
亮度不均電阻值不一、LED 批次差異統一電阻、恆流驅動
閃爍太快/慢晶振頻率不符、延時參數錯確認晶振、校準延時
只亮一顆P2 口配置錯、程式邏輯錯檢查 P2 輸出模式、單步調試