李奇 发表于 2025-8-26 00:51:34

学习第1集序言

学习第1集序言
8051U强在哪里?
1.屏幕显示和视频播放(flash编程器)
2.IS录放音
3.PWM DMA
4.频谱分析仪(上位机)
5.手写计算器
6.QSPI,PWM移相,硬件乘除,单精度浮点
为什么选择8051?
作为全球销量超10亿片的经典架构,8051不仅是嵌入式开发的“启蒙教材”,更是理解计算学习ARM、STM32等高级平台奠定坚实基础。
本课程突破的难点
·硬件层面:解剖8051核心模块(CPU时序、存储器分配、IO口工作模式)
“.软件层面:从汇编语言到C语言的编程过渡,掌握延时、中断、定时器等关键功能·
实践层面:通过LED流水灯、数码管显示、矩阵键盘等经典案例,建立“硬件-代码
学习建议
1.动手优先:每节课后完成1个硬件实验,用万用表/示波器验证理论;
2.代码迭代:从“点亮一个LED”开始,逐步增加功能模块(如加入按键控制);
3.问题溯源:遇到程序跑飞时,用仿真器单步调试,定位是硬件接触不良还是软件逻
课程目标
通过本系列学习:
·独立搭建51单片机最小系统;
.编写并调试基于寄存器操作的汇编程序;●使用Keil C51开发环境完成C语言项目开发;
·设计简单的智能控制终端(如温度报警器、智能小车)。
学习心得:
这堂序言课远不止是一个简单的开场,它是一次成功的“思想动员” 。它为我指明了方向,点燃了热情,并让我以正确的心态开启这段充满挑战与乐趣的单片机学习之旅。我已经准备好工具,满怀好奇,准备正式踏入嵌入式世界的大门了。

32位8051-AI 发表于 2025-8-26 09:57:16

推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4

李奇 发表于 2025-8-26 23:42:32

学习第二集 硬件及工具介绍
1. 核心硬件:AI8051开发板详解
主控芯片:通常为STC8系列STC8H8K64U),支持1T模式,内置高精度IRC时钟、大容量Flash和SRAM。
· 基础外设:
· GPIO口:支持多种模式(准双向、推挽、高阻输入),驱动能力强。
· 电源电路:USB-TypeC供电设计,集成稳压芯片(如AMS1117)。
· 调试接口:UART转USB芯片(如CH340)实现一键下载和串口通信。
· 扩展功能:
· 板载LED、按键、数码管等基础输入输出设备。
· 预留ADC、PWM、I²C、SPI等外设接口,方便连接传感器模块。

2. 关键软件工具

· Keil μVision:
· 功能:集成开发环境(IDE),支持C51编译、调试和代码烧录。
· 配置要点:需安装C51器件库,正确设置芯片型号和晶振频率。
· STC-ISP下载工具:
· 功能:通过串口将程序烧录至单片机,支持自动冷启动。
· 操作步骤:选择芯片型号→加载HEX文件→设置串口号→点击下载后重启开发板。

3. 辅助工具与仪器

· 万用表:用于测量电压、通断检测,排查电源和连接问题。
· 逻辑分析仪(可选):捕获时序信号(如I²C、SPI波形),辅助调试通信协议。
· 杜邦线:连接开发板与外部模块,注意线序和接触可靠性。

4. 硬件连接规范

· 电源安全:确认电压匹配(常用5V/3.3V),避免反接或短路。
· 信号隔离:高速信号线(如时钟线)需远离模拟电路,减少干扰。
· 接地共地:确保所有模块共地,避免电平不匹配导致通信失败。
心得体会:第二集将第一集的抽象概念转化为具体工具和操作,突出了嵌入式开发中“软硬结合”的特质。通过亲手连接电路、配置软件,我认识到硬件设计约束软件行为,而软件能力又扩展硬件功能。

李奇 发表于 7 天前

学习第三集点亮第一颗LED
1. 核心原理:GPIO(通用输入输出)控制

· 工作模式:学习并配置GPIO为准双向口(Standard Bi-Directional)模式,这是最常用的模式,能够提供一定的输出驱动能力和输入上拉。
· 电流路径:理解单片机通过控制GPIO输出高电平(+3.3V/5V)或低电平(0V)来控制LED的亮灭。典型电路为:VCC → 限流电阻 → LED → GPIO引脚。当引脚输出低电平时,形成电流回路,LED点亮。

2. 硬件电路分析

· 限流电阻计算:根据LED的工作电压(通常1.8-2.2V)和期望电流(通常5-20mA),使用欧姆定律计算并选择合适的限流电阻(常用330Ω-1kΩ)。例如:(5V - 2V) / 0.01A = 300Ω → 选择330Ω标准电阻。
· 共阳/共阴区别:本集通常使用“低电平点亮”的共阳接法(阳极接VCC,阴极接GPIO),需注意与“高电平点亮”的共阴接法在代码逻辑上的区别。

3. 软件编程实践

· 寄存器配置:学习并操作特殊功能寄存器(SFRs)来控制GPIO:
· PxM0 和 PxM1(端口模式寄存器):用于设置端口的4种工作模式。
· Px(端口数据寄存器):用于输出高低电平或读取输入状态。
· 代码实现:
```c
#include "STC8H.H" // 包含STC8H系列头文件

void main()
{
      P3M0 = 0x00;   // 设置P3口为准双向口模式
      P3M1 = 0x00;

      while(1)      // 主循环
      {
          P37 = 0;   // 输出低电平,点亮连接在P3.7引脚上的LED
          // P37 = 1; // 输出高电平,熄灭LED
      }
}
```

4. 开发全流程实操

· 创建工程:在Keil中新建项目,选择正确的芯片型号(如STC8H8K64U)。
· 编写代码:输入上述程序并保存。
· 编译生成:点击编译,确保无错误后生成HEX文件。
· 程序烧录:打开STC-ISP软件,选择正确的串口和HEX文件,点击“下载/编程”后给开发板重新上电(冷启动),完成程序下载。
· 观察现象:成功看到指定的LED被点亮。
心得体会:
第三集是整个学习的第一个重要里程碑。它看似简单,却承载着极其重要的意义。它让我真正“触摸”到了单片机,理解了软件如何指挥硬件,并完整实践了开发流程。

李奇 发表于 7 天前

学习内容:AI8051单片机第二集·硬件及工具介绍

1. 核心硬件:AI8051开发板详解

· 主控芯片:通常为STC8系列(如STC8H8K64U),支持1T模式,内置高精度IRC时钟、大容量Flash和SRAM。
· 基础外设:
· GPIO口:支持多种模式(准双向、推挽、高阻输入),驱动能力强。
· 电源电路:USB-TypeC供电设计,集成稳压芯片(如AMS1117)。
· 调试接口:UART转USB芯片(如CH340)实现一键下载和串口通信。
· 扩展功能:
· 板载LED、按键、数码管等基础输入输出设备。
· 预留ADC、PWM、I²C、SPI等外设接口,方便连接传感器模块。

2. 关键软件工具

· Keil μVision:
· 功能:集成开发环境(IDE),支持C51编译、调试和代码烧录。
· 配置要点:需安装C51器件库,正确设置芯片型号和晶振频率。
· STC-ISP下载工具:
· 功能:通过串口将程序烧录至单片机,支持自动冷启动。
· 操作步骤:选择芯片型号→加载HEX文件→设置串口号→点击下载后重启开发板。

3. 辅助工具与仪器

· 万用表:用于测量电压、通断检测,排查电源和连接问题。
· 逻辑分析仪(可选):捕获时序信号(如I²C、SPI波形),辅助调试通信协议。
· 杜邦线:连接开发板与外部模块,注意线序和接触可靠性。

4. 硬件连接规范

· 电源安全:确认电压匹配(常用5V/3.3V),避免反接或短路。
· 信号隔离:高速信号线(如时钟线)需远离模拟电路,减少干扰。
· 接地共地:确保所有模块共地,避免电平不匹配导致通信失败。
心得体会:
第二集将第一集的抽象概念转化为具体工具和操作,突出了嵌入式开发中“软硬结合”的特质。通过亲手连接电路、配置软件,我认识到硬件设计约束软件行为,而软件能力又扩展硬件功能。

李奇 发表于 7 天前

学习第四集 USB不停电下载
1. 传统下载方式的弊端
· 冷启动(Cold Reset):传统方式需要先点击下载软件上的“下载”按钮,然后再给开发板上电。操作繁琐,且频繁拔插电源或串口线易损坏接口。
· 依赖外部串口芯片:需要CH340、PL2302等USB转TTL串口芯片作为中介。
2. USB下载的工作原理
· 内置USB功能:新一代AI8051芯片(如STC8H8K64U)内部直接集成了USB控制器和PHY电路,可以通过Type-C口直接与电脑通信,无需外部转换芯片。
· HID协议或CDC协议:芯片通过USB口模拟成一个人体学输入设备(HID)或虚拟串口(CDC),从而实现与PC端下载软件的通信。HID设备的优势是无需安装额外驱动,系统普遍自带。
· 软件协同:STC-ISP下载软件通过USB口向芯片发送特定的下载命令序列。芯片内置的ISP引导程序(Bootloader)在收到命令后,会自动擦除旧程序并进入下载模式,等待接收新的程序代码(HEX文件)。
3. 硬件连接要求
· Type-C接口:开发板上需集成一个Type-C接口,其D+和D-数据线直接连接到芯片的专用USB引脚(如P3.0, P3.1或其他,需查数据手册)。
· 供电:USB线同时为开发板提供5V电源。
4. 软件配置与操作步骤
1. 安装驱动(如有需要):若为CDC模式,可能需要安装虚拟串口驱动;HID模式通常免驱。
2. 选择芯片型号:在STC-ISP中正确选择目标芯片(如STC8H8K64U)。
3. 选择USB方式:在“端口”设置处,选择识别到的USB-HID或USB-CDC设备,而非传统的COM串口。
4. 点击下载:打开工程编译生成的HEX文件,直接点击“下载/编程”按钮。
5. 自动下载:无需任何物理操作,程序会自动开始下载,STC-ISP会显示下载进度条。下载完成后,程序自动开始运行。
心得体会:
第四集的学习让我从“能用”进入到了“好用”的阶段。USB不停电下载不仅是学会了一个新功能,更是打开了一扇窗,让我看到了现代单片机是如何通过硬件与软件的协同设计,极大地优化开发者体验的。这种便捷性极大地激发了我继续探索和调试的兴趣,因为我知道,每一次代码修改都能快速地在硬件上看到结果。

李奇 发表于 5 天前

学习第五集C语言基础
1. C语言程序的基本结构
· 头文件包含(#include):
· 引入了针对特定芯片的头文件(如 #include "STC8H.H")。这个文件定义了芯片内部所有特殊功能寄存器(SFR)的地址和可位寻址的位名称,是软件和硬件之间的桥梁。
· 主函数(main函数):
· 程序执行的入口点。单片机上电后,就从main函数的开始处执行。
· 强调了 while(1) 或 for(;;) 无限循环的重要性,因为单片机程序需要持续运行,永不停止。
· 注释:讲解了单行(//)和多行(/* ... */)注释的用法,强调良好注释对代码可读性和后期调试的重要性。
2. 单片机编程的核心:变量与数据类型
· 基础数据类型:重点讲解了单片机环境下最常用且最关键的类型:
· bit: 位变量,用于表示标志位(如 bit flag = 0;),占用1个位,效率极高。
· unsigned char / uint8_t: 无符号字符型(0-255),占用1字节,是处理8位端口和计数最常用的类型。
· unsigned int / uint16_t: 无符号整型,占用2字节,用于定时器重装值等。
· 为什么强调“无符号”(unsigned): 因为单片机操作寄存器、端口数据时,通常都是正数,使用无符号类型可以避免不必要的符号位干扰,并能表示更大的正数范围。
3. 对硬件操作的关键:特殊功能寄存器(SFR)的访问
· 字节操作:直接对整个端口寄存器赋值。
· 例如:P3 = 0xFE; // 将P3口的低位置0,其余位置1。
· 位操作:利用C51扩展的 sbit 关键字来定义和操作寄存器的某一位。
· 例如:sbit LED = P3^7; // 将P3.7引脚定义为名为LED的位变量
· LED = 0; // 给P3.7引脚输出低电平
· if (KEY == 0) {...} // 读取P3.2引脚的电平状态
4. 流程控制
· 判断语句(if...else...): 用于根据输入条件(如按键状态)执行不同代码。
· 循环语句(for, while):
· 用于实现软件延时(通过执行空循环消耗CPU时间)。
· 用于重复执行某些操作(如扫描数码管显示)。
5. 函数
· 函数的定义与调用: 学习了如何将一段功能代码封装成函数,以便重复调用,使主程序结构清晰。
· 示例: 将延时功能封装成 void DelayMS(unsigned int ms) 函数,在主函数中直接调用 DelayMS(500);。
心得体会:
第五集是真正意义上编程的起点。它让我摆脱了只会复制粘贴代码的状态,开始能够根据自己的硬件电路和理解去编写、修改程序。虽然只是基础,但就像学会了加减乘除,为后续学习更复杂的“函数”(通信协议、中断服务程序)打下了坚实的基础。我已经准备好,用C语言这门“母语”去更自如地与单片机对话了。

李奇 发表于 5 天前

学习第六集·I/O输入输出
1. 深入理解GPIO的工作模式
· 模式回顾与对比:系统学习了准双向口(弱上拉)、推挽输出、高阻输入和开漏输出四种模式的工作原理、驱动能力及典型应用场景。
· 模式配置寄存器:通过操作 PxM0 和 PxM1 寄存器来设置每个端口的具体模式。例如,配置P3.1为推挽输出:P3M0 |= 0x02; P3M1 &= ~0x02;。
2. 输出功能进阶应用
驱动不同负载:学习了如何利用推挽输出模式(强驱动)直接驱动LED、蜂鸣器或继电器,而准双向口适合驱动数字芯片或用于总线。
· 模拟信号生成:通过软件延时和控制IO口高低电平变化,模拟生成简单的方波信号,为学习PWM波打下基础。
3. 输入功能的核心:读取外部信号
· 按键检测:学习了按键的硬件连接电路(共阳/共阴接法,加上拉/下拉电阻)。
· 软件消抖:理解了机械按键抖动现象及其对电路的影响,掌握了通过延时检测(如检测到按下后延时10-20ms再判断)的软件消抖方法。
```c
if (KEY == 0) {    // 首次检测到按键按下
      DelayMS(15);   // 延时跳过抖动期
      if (KEY == 0) { // 再次确认按键是否确实按下
          // 执行按键操作
          while(!KEY); // 等待按键释放(可选)
      }
}
```
4. 综合实验:输入控制输出
· 实验目标:实现通过按键控制LED灯的亮灭或状态切换(翻转)。
· 编程逻辑:主循环中不断检测按键状态,一旦检测到有效按键动作,就改变LED引脚的电平状态。
```c
sbit LED = P3^7;
sbit KEY = P3^2;

void main() {
      P3M0 = 0x80; // 设置P3.7为推挽输出,其他为准双向口
      P3M1 = 0x00;

      while(1) {
          if (KEY == 0) {
            DelayMS(15);
            if (KEY == 0) {
                  LED = !LED; // 按键按下一次,LED状态翻转一次
                  while(!KEY); // 等待按键松开,防止连续触发
            }
          }
      }
}
心得体会:
第六集是我从“控制硬件”到“与硬件交互”的转折点。它让我设计的程序不再是自说自话,而是开始能够响应外部世界的变化。I/O输入输出是单片机与物理世界连接的桥梁,掌握了它,就意味着我拿到了开启绝大多数单片机应用大门的钥匙。接下来,我期待学习中断,让按键检测变得更高效。

李奇 发表于 5 天前

学习第七集·定时器中断
1. 核心概念:定时器与中断
定时器(Timer):单片机内部一个独立自主的计数器,基于系统时钟进行计数,无需CPU参与。达到设定值后会自动产生溢出,并可配置为触发中断。
· 中断(Interrupt):一种打破CPU正常执行流程的机制。当特定事件(如定时器溢出、外部引脚电平变化)发生时,CPU会暂停当前任务,转去执行预先编写好的中断服务函数(ISR),执行完毕后自动返回原任务继续执行。
2. 定时器的工作模式
模式1(16位自动重装):最常用模式。定时器从初值开始计数到65535溢出,溢出后硬件自动将预置的重装值(保存在TLx/THx或TMLx/TMHx)再次装入,开始新一轮定时,从而实现精准的周期性定时。
· 时钟源选择:可选择系统时钟(SysClk)或分频后的时钟作为计数脉冲源。AI8051(如STC8系列)的定时器时钟可配置为1T(不分频)或12T(12分频),从而实现更宽范围的定时周期。
3. 相关功能寄存器配置
定时器寄存器:
· TLx / THx 或 TMLx / TMHx:用于设置定时器的初值或重装值。
· TCON:包含定时器运行控制位(TRx)和溢出标志位(TFx)。
· TMOD 或 AUXR:用于设置定时器的工作模式和时钟源。
· 中断寄存器:
· IE(中断使能寄存器):总中断开关(EA)和定时器中断使能位(ETx)。
· IP(中断优先级寄存器):用于设置多个中断源的优先级。
4. 定时器中断开发流程
1. 初始化定时器:选择工作模式(如模式1)、计算并设置定时初值、选择时钟源。
2. 使能中断:打开总中断(EA=1)和特定定时器中断(ET0=1)。
3. 启动定时器:将运行控制位置1(TR0=1)。
4. 编写中断服务函数(ISR):
   · 使用 interrupt 关键字和正确的中断号(如定时器0是 interrupt 1)来声明函数。
   · 在函数内编写需要周期性执行的任务(如翻转LED、扫描按键)。
   · 编译器会自动完成现场保护和恢复。

示例代码:使用定时器0实现1ms定时

```c
#include "STC8H.H"

#define FOSC 24000000UL // 定义系统时钟频率24MHz
#define T1MS (65536 - (FOSC / 1000)) // 计算1ms定时所需的初值

sbit LED = P3^7;
unsigned int ms_count = 0; // 毫秒计数变量

void Timer0_Init(void)
{
    TMOD = 0x00;      // 设置定时器0为16位自动重装模式
    TML0 = T1MS;      // 设置定时初值低字节
    TMH0 = T1MS >> 8;   // 设置定时初值高字节
    ET0 = 1;            // 使能定时器0中断
    TR0 = 1;            // 启动定时器0
    EA = 1;             // 打开总中断
}

void main()
{
    Timer0_Init();
    while(1)
    {
      // 主循环可以执行其他任务,定时由中断自动处理
      if (ms_count >= 500) // 每500ms
      {
            ms_count = 0;
            LED = !LED;   // 翻转LED,实现闪烁
      }
    }
}

// 定时器0中断服务函数
void Timer0_ISR(void) interrupt 1
{
    ms_count++; // 在中断中安全地递增计数
}
心得体会:
第七集是单片机编程能力的一次质的飞跃。它让我摆脱了低效的轮询等待,进入了高效的事件驱动世界。理解了定时器中断,就相当于为单片机系统安上了一个“精准的心脏”和“高效的神经系统”。它不仅是实现多功能复杂项目的技术前提,更是一种重要的嵌入式系统设计思想的启蒙。我已经开始思考如何用这个强大的工具去重构我之前写的按键和LED程序,让它们变得更高效。
页: [1]
查看完整版本: 学习第1集序言