找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2161

积分

0

好友

303

主题
发表于 2025-12-25 09:48:52 | 查看: 29| 回复: 0

图片

学习单片机编程通常被划分为四个循序渐进的阶段:

  • 第一阶段(新手入门):了解单片机的基本概念、应用领域,并掌握必要的电子基础与编程知识。
  • 第二阶段(基础实践):选择合适的单片机型号(如51系列)与开发板,搭建开发环境,开始进行LED控制、按键检测等基础项目实践。
  • 第三阶段(能力进阶):学习模数转换(ADC)、I2C/SPI通信协议、液晶显示屏驱动等中级应用。
  • 第四阶段(高阶应用):掌握实时操作系统(RTOS)、多传感器数据融合、Wi-Fi/蓝牙等无线通信技术。

你现在正处于哪个阶段?对于初学者而言,研究并参考大量的现成实例代码,是快速上手并完成个人项目的有效途径。下面整理了涵盖单片机C语言编程的80个经典实例,供大家学习与实践。

80个单片机编程实例索引

  1. 使用P3口流水点亮8位LED
  2. 通过对P3口地址的操作流水点亮8位LED
  3. 用不同数据类型控制灯闪烁时间
  4. 用单片机控制第一个灯亮
  5. 用单片机控制一个灯闪烁:认识单片机的工作频率
  6. 将 P1口状态分别送入P0、P2、P3口:认识I/O口引脚功能
  7. 用P0口、P1 口分别显示加法和减法运算结果
  8. 用P0、P1口显示乘法运算结果
  9. 用P1、P0口显示除法运算结果
  10. 用自增运算控制P0口8位LED流水花样
  11. 用P0口显示逻辑“与”运算结果
  12. 用P0口显示条件运算结果
  13. 用P0口显示按位“异或”运算结果
  14. 用P0显示左移运算结果
  15. “万能逻辑电路”实验
  16. 用右移运算流水点亮P1口8位LED
  17. 用if语句控制P0口8位LED的流水方向
  18. 用switch语句控制P0口8位LED的点亮状态
  19. 用for语句控制蜂鸣器鸣笛次数
  20. 用while语句控制LED
  21. 用do-while语句控制P0口8位LED流水点亮
  22. 用字符型数组控制P0口8位LED流水点亮
  23. 用P0口显示字符串常量
  24. 用P0 口显示指针运算结果
  25. 用指针数组控制P0口8位LED流水点亮
  26. 用数组的指针控制P0 口8 位LED流水点亮
  27. 用P0 、P1口显示整型函数返回值
  28. 用有参函数控制P0口8位LED流水速度
  29. 用数组作函数参数控制流水花样
  30. 用指针作函数参数控制P0口8位LED流水点亮
  31. 用函数型指针控制P1口灯花样
  32. 用指针数组作为函数的参数显示多个字符串
  33. 字符函数ctype.h应用举例
  34. 内部函数intrins.h应用举例
  35. 标准函数stdlib.h应用举例
  36. 字符串函数string.h应用举例
  37. 宏定义应用举例1
  38. 宏定义应用举例2
  39. 宏定义应用举例3

(中断与定时器部分)

  1. 用定时器T0查询方式控制P2口8位LED闪烁
  2. 用定时器T1查询方式控制单片机发出1KHz音频
  3. 将计数器T0计数的结果送P1口8位LED显示
  4. 用定时器T0的中断控制1位LED闪烁
  5. 用定时器T0的中断实现长时间定时
  6. 用定时器T1中断控制两个LED以不同周期闪烁
  7. 用计数器T1的中断控制蜂鸣器发出1KHz音频
  8. 用定时器T0的中断实现“渴望”主题曲的播放
    50-1. 输出50个矩形脉冲
    50-2. 计数器T0统计外部脉冲数
  9. 定时器T0的模式2测量正脉冲宽度
  10. 用定时器T0控制输出高低宽度不同的矩形波
  11. 用外中断0的中断方式进行数据采集
    54-1. 输出负脉宽为200微秒的方波
    54-2. 测量负脉冲宽度
  12. 方式0控制流水灯循环点亮

(串口通信部分)
56-1. 数据发送程序
56-2. 数据接收程序
57-1. 数据发送程序
57-2. 数据接收程序

  1. 单片机向PC发送数据
  2. 单片机接收PC发出的数据

(数码管显示部分)

  1. 用LED数码管显示数字5
  2. 用LED数码显示器循环显示数字0~9
  3. 用数码管慢速动态扫描显示数字“1234”
  4. 用LED数码显示器伪静态显示数字1234
  5. 用数码管显示动态检测结果
  6. 数码秒表设计
  7. 数码时钟设计
  8. 用LED数码管显示计数器T0的计数值
  9. 静态显示数字“59”

(键盘应用部分)

  1. 无软件消抖的独立式键盘输入实验
  2. 软件消抖的独立式键盘输入实验
  3. CPU控制的独立式键盘扫描实验
  4. 定时器中断控制的独立式键盘扫描实验
  5. 独立式键盘控制的4级变速流水灯
  6. 独立式键盘的按键功能扩展:“以一当四”
  7. 独立式键盘调时的数码时钟实验
  8. 独立式键盘控制步进电机实验
  9. 矩阵式键盘按键值的数码管显示实验
  10. 矩阵式键盘按键音
  11. 简易电子琴
  12. 矩阵式键盘实现的电子密码锁

部分实例代码详解

实例1:使用P3口流水点亮8位LED

#include <reg51.h> // 包含单片机寄存器的头文件

// 函数功能:延时
void delay(void) {
    unsigned char i, j;
    for(i=0; i<250; i++)
        for(j=0; j<250; j++);
}

// 主函数
void main(void) {
    while(1) {
        P3 = 0xfe; // 1111 1110,第一个灯亮
        delay();
        P3 = 0xfd; // 1111 1101,第二个灯亮
        delay();
        P3 = 0xfb; // 1111 1011,第三个灯亮
        delay();
        P3 = 0xf7; // 1111 0111,第四个灯亮
        delay();
        P3 = 0xef; // 1110 1111,第五个灯亮
        delay();
        P3 = 0xdf; // 1101 1111,第六个灯亮
        delay();
        P3 = 0xbf; // 1011 1111,第七个灯亮
        delay();
        P3 = 0x7f; // 0111 1111,第八个灯亮
        delay();
    }
}

实例5:用单片机控制一个灯闪烁(认识工作频率)

#include <reg51.h>

void delay(void) {
    unsigned int i;
    for(i=0; i<20000; i++);
}

void main(void) {
    while(1) {
        P1 = 0xfe; // P1.0输出低电平,灯亮
        delay();
        P1 = 0xff; // P1.0输出高电平,灯灭
        delay();
    }
}

实例45:用定时器T0的中断控制1位LED闪烁

#include <reg51.h>
sbit D1 = P2^0; // 定义LED引脚

void main(void) {
    EA = 1;   // 开总中断
    ET0 = 1;  // 允许定时器T0中断
    TMOD = 0x01; // 定时器0,模式1
    TH0 = (65536-46083)/256; // 装入初值,约50ms
    TL0 = (65536-46083)%256;
    TR0 = 1;  // 启动定时器0
    while(1); // 等待中断
}

// 定时器T0中断服务函数
void Time0(void) interrupt 1 {
    D1 = ~D1; // LED状态取反
    TH0 = (65536-46083)/256; // 重装初值
    TL0 = (65536-46083)%256;
}

这个例子很好地展示了中断机制在单片机中的实际应用。

实例66:数码时钟设计(综合应用)

#include <reg51.h>
unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 0-9段码
unsigned char int_time = 0; // 中断计数
unsigned char second = 0, minute = 0, hour = 0; // 时、分、秒

void delay(void){ unsigned char j; for(j=0;j<200;j++); }

// 显示函数(部分)
void DisplayHour(unsigned char h) {
    P2 = 0xfe; P0 = Tab[h/10]; delay(); // 显示十位
    P2 = 0xfd; P0 = Tab[h%10]; delay(); // 显示个位
}
// ... 类似地实现DisplayMinute, DisplaySecond

void main(void) {
    TMOD = 0x01;
    TH0 = (65536-46083)/256; // 50ms定时
    TL0 = (65536-46083)%256;
    EA = 1; ET0 = 1; TR0 = 1;
    while(1) {
        DisplayHour(hour);
        DisplayMinute(minute);
        DisplaySecond(second);
    }
}

// 定时器中断,更新时间
void interserve(void) interrupt 1 {
    int_time++;
    if(int_time == 20) { // 1秒到
        int_time = 0;
        second++;
        if(second == 60) { second = 0; minute++; }
        if(minute == 60) { minute = 0; hour++; }
        if(hour == 24) { hour = 0; }
    }
    TH0 = (65536-46083)/256; // 重装初值
    TL0 = (65536-46083)%256;
}

这个数码时钟项目综合运用了定时器中断、数码管动态扫描和时间逻辑处理,是很好的综合练习。

实例77:矩阵键盘扫描与显示

#include <reg51.h>
sbit P14 = P1^4; sbit P15 = P1^5; // ... 定义行线列线
unsigned char keyval = 0;
unsigned char code Tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

// 显示函数
void display(unsigned char k) {
    P2 = 0xbf; P0 = Tab[k/10]; delay(); // 显示十位
    P2 = 0x7f; P0 = Tab[k%10]; delay(); // 显示个位
}
// 键盘扫描函数(在中断中调用)
void key_scan(void) {
    P1 = 0xf0; // 列线置高,行线置低
    if((P1 & 0xf0) != 0xf0) { // 有键按下
        delay20ms(); // 消抖
        P1 = 0xfe; // 扫描第一行
        if(P14==0) keyval=1; if(P15==0) keyval=2; // ... 判断键值
        // ... 扫描其他行
    }
}
// 主函数与中断服务程序略

此例展示了矩阵键盘的扫描原理,是人机交互的经典实现。

图片

通过这80个从易到难的实例,学习者可以系统性地掌握51单片机C语言编程的核心知识,包括I/O控制、定时器/中断、串口通信、显示与键盘接口等。每个实例都配有可运行的代码,建议在开发板上逐一实践,并尝试修改和扩展功能,以加深理解。

图片

部分配套学习资料图示




上一篇:C语言数组与指针详解:内存布局、sizeof差异与实战应用
下一篇:软件开发脚手架指南:核心概念解析与主流工具实战
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-12 02:46 , Processed in 0.256484 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表