
学习单片机编程通常被划分为四个循序渐进的阶段:
- 第一阶段(新手入门):了解单片机的基本概念、应用领域,并掌握必要的电子基础与编程知识。
- 第二阶段(基础实践):选择合适的单片机型号(如51系列)与开发板,搭建开发环境,开始进行LED控制、按键检测等基础项目实践。
- 第三阶段(能力进阶):学习模数转换(ADC)、I2C/SPI通信协议、液晶显示屏驱动等中级应用。
- 第四阶段(高阶应用):掌握实时操作系统(RTOS)、多传感器数据融合、Wi-Fi/蓝牙等无线通信技术。
你现在正处于哪个阶段?对于初学者而言,研究并参考大量的现成实例代码,是快速上手并完成个人项目的有效途径。下面整理了涵盖单片机C语言编程的80个经典实例,供大家学习与实践。
80个单片机编程实例索引
- 使用P3口流水点亮8位LED
- 通过对P3口地址的操作流水点亮8位LED
- 用不同数据类型控制灯闪烁时间
- 用单片机控制第一个灯亮
- 用单片机控制一个灯闪烁:认识单片机的工作频率
- 将 P1口状态分别送入P0、P2、P3口:认识I/O口引脚功能
- 用P0口、P1 口分别显示加法和减法运算结果
- 用P0、P1口显示乘法运算结果
- 用P1、P0口显示除法运算结果
- 用自增运算控制P0口8位LED流水花样
- 用P0口显示逻辑“与”运算结果
- 用P0口显示条件运算结果
- 用P0口显示按位“异或”运算结果
- 用P0显示左移运算结果
- “万能逻辑电路”实验
- 用右移运算流水点亮P1口8位LED
- 用if语句控制P0口8位LED的流水方向
- 用switch语句控制P0口8位LED的点亮状态
- 用for语句控制蜂鸣器鸣笛次数
- 用while语句控制LED
- 用do-while语句控制P0口8位LED流水点亮
- 用字符型数组控制P0口8位LED流水点亮
- 用P0口显示字符串常量
- 用P0 口显示指针运算结果
- 用指针数组控制P0口8位LED流水点亮
- 用数组的指针控制P0 口8 位LED流水点亮
- 用P0 、P1口显示整型函数返回值
- 用有参函数控制P0口8位LED流水速度
- 用数组作函数参数控制流水花样
- 用指针作函数参数控制P0口8位LED流水点亮
- 用函数型指针控制P1口灯花样
- 用指针数组作为函数的参数显示多个字符串
- 字符函数
ctype.h应用举例
- 内部函数
intrins.h应用举例
- 标准函数
stdlib.h应用举例
- 字符串函数
string.h应用举例
- 宏定义应用举例1
- 宏定义应用举例2
- 宏定义应用举例3
(中断与定时器部分)
- 用定时器T0查询方式控制P2口8位LED闪烁
- 用定时器T1查询方式控制单片机发出1KHz音频
- 将计数器T0计数的结果送P1口8位LED显示
- 用定时器T0的中断控制1位LED闪烁
- 用定时器T0的中断实现长时间定时
- 用定时器T1中断控制两个LED以不同周期闪烁
- 用计数器T1的中断控制蜂鸣器发出1KHz音频
- 用定时器T0的中断实现“渴望”主题曲的播放
50-1. 输出50个矩形脉冲
50-2. 计数器T0统计外部脉冲数
- 定时器T0的模式2测量正脉冲宽度
- 用定时器T0控制输出高低宽度不同的矩形波
- 用外中断0的中断方式进行数据采集
54-1. 输出负脉宽为200微秒的方波
54-2. 测量负脉冲宽度
- 方式0控制流水灯循环点亮
(串口通信部分)
56-1. 数据发送程序
56-2. 数据接收程序
57-1. 数据发送程序
57-2. 数据接收程序
- 单片机向PC发送数据
- 单片机接收PC发出的数据
(数码管显示部分)
- 用LED数码管显示数字5
- 用LED数码显示器循环显示数字0~9
- 用数码管慢速动态扫描显示数字“1234”
- 用LED数码显示器伪静态显示数字1234
- 用数码管显示动态检测结果
- 数码秒表设计
- 数码时钟设计
- 用LED数码管显示计数器T0的计数值
- 静态显示数字“59”
(键盘应用部分)
- 无软件消抖的独立式键盘输入实验
- 软件消抖的独立式键盘输入实验
- CPU控制的独立式键盘扫描实验
- 定时器中断控制的独立式键盘扫描实验
- 独立式键盘控制的4级变速流水灯
- 独立式键盘的按键功能扩展:“以一当四”
- 独立式键盘调时的数码时钟实验
- 独立式键盘控制步进电机实验
- 矩阵式键盘按键值的数码管显示实验
- 矩阵式键盘按键音
- 简易电子琴
- 矩阵式键盘实现的电子密码锁
部分实例代码详解
实例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控制、定时器/中断、串口通信、显示与键盘接口等。每个实例都配有可运行的代码,建议在开发板上逐一实践,并尝试修改和扩展功能,以加深理解。

部分配套学习资料图示