找回密码
 立即注册
搜索
热搜: STM32
查看: 36|回复: 0

【经典】51 单片机完全教程 - 从入门到精通

[复制链接]

28

主题

0

回帖

102

积分

注册会员

积分
102
发表于 2026-3-21 18:19:35 |中国| 显示全部楼层 |阅读模式
【经典】51 单片机完全教程


1. 51 单片机简介

51 单片机是 Intel 公司 1980 年推出的 MCS-51 系列单片机,至今仍在广泛应用。

主要特点:
- 8 位 CPU
- 4KB ROM(片内)
- 128B RAM(片内)
- 4 个 8 位 I/O 口
- 2 个 16 位定时器
- 1 个串口
- 5 个中断源

常见型号:
- AT89C51:经典款
- AT89S52:增强款
- STC89C52:国产增强
- STC12C5A60S2:高速款

2. 内部结构

51 单片机内部包含:
- CPU(运算器 + 控制器)
- ROM(程序存储器)
- RAM(数据存储器)
- I/O 端口(P0-P3)
- 定时器/计数器(T0、T1)
- 串行口(UART)
- 中断系统
- 时钟电路

3. 引脚说明

40 引脚 DIP 封装:
- VCC(40 脚):电源正极
- GND(20 脚):电源负极
- P0-P3(32 个 I/O 口)
- RST(9 脚):复位引脚
- ALE(30 脚):地址锁存
- EA(31 脚):外部访问允许
- PSEN(29 脚):程序存储允许
- XTAL1/XTAL2(19/18 脚):晶振连接

4. 开发环境搭建

4.1 硬件准备
- 51 单片机最小系统板
- USB-TTL 下载器
- 杜邦线若干
- 5V 电源

4.2 软件工具
- Keil C51:开发环境
- STC-ISP:程序下载
- Proteus:仿真软件

5. 第一个程序:LED 闪烁

#include <reg52.h>

void delay(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 114; j++);
}

void main() {
    while(1) {
        P1 = 0x00;    // LED 亮
        delay(500);
        P1 = 0xFF;    // LED 灭
        delay(500);
    }
}

6. 中断系统

51 单片机中断源:
1. 外部中断 0(INT0)
2. 定时器 0 中断(T0)
3. 外部中断 1(INT1)
4. 定时器 1 中断(T1)
5. 串口中断(UART)

中断优先级:
- 默认优先级:INT0 > T0 > INT1 > T1 > UART
- 可通过 IP 寄存器设置

中断服务函数示例:
void Timer0_ISR() interrupt 1 {
    TH0 = 0xFC;    // 重装初值
    TL0 = 0x18;
    // 中断处理代码
}

7. 定时器应用

定时器工作模式:
- 模式 0:13 位定时器
- 模式 1:16 位定时器(常用)
- 模式 2:8 位自动重装
- 模式 3:双 8 位定时器

定时器初始化:
void Timer0_Init() {
    TMOD &= 0xF0;      // 清除 T0 配置
    TMOD |= 0x01;      // 模式 1,16 位
    TH0 = 0xFC;        // 1ms@12MHz
    TL0 = 0x18;
    ET0 = 1;           // 使能 T0 中断
    EA = 1;            // 使能总中断
    TR0 = 1;           // 启动 T0
}

8. 串口通信

串口配置:
- 波特率:9600/115200
- 数据位:8
- 停止位:1
- 校验位:无

串口初始化:
void UART_Init() {
    TMOD |= 0x20;      // T1 模式 2
    TH1 = 0xFD;        // 9600bps@11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;           // 启动 T1
    REN = 1;           // 允许接收
    SM0 = 0;
    SM1 = 1;           // 模式 1
    ES = 1;            // 使能串口中断
    EA = 1;
}

串口发送:
void UART_SendByte(unsigned char data) {
    SBUF = data;
    while(!TI);
    TI = 0;
}

9. ADC 应用

外部 ADC 芯片(如 PCF8591):
- I2C 接口
- 8 位分辨率
- 4 路模拟输入

10. 项目实战

推荐项目:
1. 电子时钟
2. 数字电压表
3. 温度控制器
4. 步进电机驱动
5. LCD 显示系统

11. 学习建议

1. 理解基本架构
2. 掌握 C51 编程
3. 熟悉外设使用
4. 多动手实践
5. 阅读数据手册

学习资源:
- 51 单片机数据手册
- Keil C51 用户指南
- 1024la 单片机板块

欢迎大家交流 51 单片机开发经验!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2026-4-5 20:51 , Processed in 0.047191 second(s), 19 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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