找回密码
 立即注册
楼主: 神农鼎

能按教学规律,按知识点,生成 AI8051U的大学教学 PPT给老师用吗

[复制链接]
已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
 楼主| 发表于 2026-8-25 10:58:39 | 显示全部楼层

好的,继续输出第8讲。这一讲是综合实验,让学生将前7讲学到的知识综合应用,完成一个完整的项目。


📚 第8讲:综合实验(6学时)

【PPT 第1页】封面

  • 课程名:单片机原理与应用 —— AI8051U 教学版
  • 本讲:第8讲 综合实验
  • 主讲人:__________________

【PPT 第2页】本讲目标

课件要点:

  • 综合运用I/O口、中断、定时器、串口通信等知识
  • 完成一个多功能电子钟项目
  • 完成一个串口控制LED项目
  • 培养模块化编程思想
  • 掌握综合调试方法

实验项目:

  • 实验A:多功能电子钟(LED数码管显示时分秒)
  • 实验B:串口控制LED(PC通过串口控制单片机LED)

【PPT 第3页】实验A:多功能电子钟——功能需求

课件要点:

  • 使用定时器产生1秒定时
  • 使用LED数码管显示时/分/秒
  • 使用按键调整时间
  • 使用串口输出时间信息

功能需求:

  1. 上电后显示 00:00:00
  2. 定时器中断每分钟(或每秒)更新显示
  3. 按键1:切换显示模式(时/分/秒/完整时间)
  4. 按键2:加1(调整当前选中项)
  5. 串口每秒输出当前时间字符串

【PPT 第4页】实验A:硬件连接

课件要点:

┌─────────────────────────────────────────┐
│            Ai8051U 接线图                 │
│                                         │
│  P0.0~P0.7 ──→ 数码管段选(abcdefg+dp)   │
│  P2.0~P2.3 ──→ 数码管位选(4位)          │
│  P1.0 ──→ 按键1(切换模式)              │
│  P1.1 ──→ 按键2(加1)                  │
│  P3.0/P3.1 ──→ 串口通信(9600)         │
└─────────────────────────────────────────┘

说明:

  • LED数码管采用共阴极(低电平点亮段选)
  • 位选采用扫描方式(轮流点亮各位,利用视觉暂留)
  • 按键一端接I/O口,一端接GND

【PPT 第5页】实验A:整体程序设计思路

课件要点:

  • 模块化设计:将功能拆分为多个函数
  • 主程序负责初始化
  • 定时器中断负责计时
  • 主循环负责显示扫描和按键处理

软件架构:

┌────────────────────────────┐
│        main() 主循环         │
│  ┌──────────────────────┐  │
│  │  初始化各外设        │  │
│  └──────────────────────┘  │
│  ┌──────────────────────┐  │
│  │  while(1)           │  │
│  │   ├─ 显示扫描       │  │
│  │   ├─ 按键检测       │  │
│  │   └─ 串口输出       │  │
│  └──────────────────────┘  │
└────────────────────────────┘
       ↑
       │ 定时器中断(1ms)
       └── 更新时间计数

【PPT 第6页】实验A:完整参考代码(第一部分)

课件要点:展示完整的电子钟程序

// 多功能电子钟(综合实验A)
// 测试工作频率为11.0592MHz
#include "Ai8051U.H"
#include "intrins.h"

// 数码管段码表(共阴极:0~9)
code unsigned char seg_table[] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F   // 9
};

unsigned char hour = 0;      // 时
unsigned char minute = 0;    // 分
unsigned char second = 0;    // 秒
unsigned int ms_count = 0;   // 毫秒计数
unsigned char disp_index = 0; // 显示扫描索引

// 延时函数
void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 1000; j++);
}

// 串口初始化
void Uart1_Init()
{
    P_SW1 &= 0x3F;         // S1_S=00,串口1用P3.0/P3.1
    P3M0 &= ~0x03;
    P3M1 &= ~0x03;
    SCON = 0x50;           // 方式1,允许接收
    TMOD &= 0x0F;
    TMOD |= 0x20;          // 定时器1模式2
    TH1 = 0xEE;            // 9600 @ 11.0592MHz
    TL1 = 0xEE;
    AUXR |= 0x40;          // T1x12=1, 1T模式
    TR1 = 1;
}

// 串口发送字符串
void Uart1_SendString(unsigned char *s)
{
    while (*s != '\0')
    {
        SBUF = *s;
        while (!TI);
        TI = 0;
        s++;
    }
}

// 定时器0初始化(1ms中断)
void Timer0_Init()
{
    TMOD &= 0xF0;          // 清除T0相关位
    AUXR |= 0x80;          // T0x12=1, 1T模式
    TH0 = 0xD4;            // 1ms @ 11.0592MHz
    TL0 = 0xCD;
    ET0 = 1;               // 使能定时器0中断
    TR0 = 1;               // 启动定时器0
}

// 数码管显示一个数字
void Display_Digit(unsigned char pos, unsigned char num)
{
    P0 = seg_table[num];   // 输出段码
    P2 = ~(0x01 << pos);   // 选中位(低有效)
}

// 数值转字符串并发送
void Send_Time()
{
    // 发送时间字符串 HH:MM:SS
    unsigned char buf[16];
    buf[0] = '0' + hour / 10;
    buf[1] = '0' + hour % 10;
    buf[2] = ':';
    buf[3] = '0' + minute / 10;
    buf[4] = '0' + minute % 10;
    buf[5] = ':';
    buf[6] = '0' + second / 10;
    buf[7] = '0' + second % 10;
    buf[8] = '\0';
    Uart1_SendString(buf);
}

// 定时器0中断服务程序(1ms)
void timer0_isr() interrupt 1
{
    ms_count++;
    if (ms_count >= 1000)      // 1秒
    {
        ms_count = 0;
        second++;
        if (second >= 60)      // 满60秒
        {
            second = 0;
            minute++;
            if (minute >= 60)  // 满60分
            {
                minute = 0;
                hour++;
                if (hour >= 24) // 满24小时
                {
                    hour = 0;
                }
            }
        }
    }
  
    // 数码管扫描(在中断中每1ms切换一位)
    disp_index = (disp_index + 1) % 4;  // 0~3循环
    Display_Digit(disp_index, (disp_index == 0) ? (hour / 10) :
                  (disp_index == 1) ? (hour % 10) :
                  (disp_index == 2) ? (minute / 10) : (minute % 10));
}

void main()
{
    // 配置I/O口为推挽输出(数码管需要较大驱动电流)
    P0M0 = 0xFF;           // P0推挽
    P0M1 = 0x00;
    P2M0 = 0xFF;           // P2推挽(位选)
    P2M1 = 0x00;
    P1M0 = 0x00;           // P1准双向(按键)
    P1M1 = 0x00;
  
    Uart1_Init();          // 串口初始化
    Timer0_Init();         // 定时器初始化
  
    EA = 1;                // 开总中断
  
    while (1)
    {
        // 每秒通过串口发送时间
        Send_Time();
        delay_ms(1000);
    }
}

依据:AI8051U手册「I/O口」「定时器/计数器」「2组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验」


【PPT 第7页】实验A:核心知识点回顾

课件要点:

使用的知识点 对应章节 作用
I/O口四种模式 第3讲 配置数码管/按键/串口管脚
定时器0中断 第5讲 产生1ms~1s的精确计时
中断系统 第4讲 定时器0中断处理时间更新
串口通信 第6讲 发送时间信息到PC
数码管扫描 第3讲 多路复用显示(视觉暂留)

数码管扫描原理:

1ms扫描一位 → 4ms完成一个周期(4位全部扫完)
→ 每秒刷新250次 → 人眼看到连续显示

【PPT 第8页】实验B:串口控制LED——功能需求

课件要点:

  • PC通过串口发送命令控制单片机LED
  • 支持多种命令格式

功能需求:

  1. PC通过串口(9600)发送命令
  2. 命令格式:LED:ON / LED:OFF / LED:B(控制P1.0~P1.7的8个LED)
  3. 单片机收到命令后执行对应操作
  4. 单片机回复确认信息

命令格式:

  • LED:A → 点亮P1.0~P1.7全部LED
  • LED:B → 熄灭P1.0~P1.7全部LED
  • LED:C → 流水灯模式启动
  • LED:D → 流水灯模式停止

【PPT 第9页】实验B:完整参考代码

课件要点:串口接收中断 + 命令解析 + LED控制

// 串口控制LED(综合实验B)
// 测试工作频率为11.0592MHz
#include "Ai8051U.H"
#include "intrins.h"

unsigned char rx_buf[16];       // 接收缓冲区
unsigned char rx_index = 0;     // 接收索引
bit rx_complete = 0;            // 接收完成标志
bit running = 0;                // 流水灯运行标志
unsigned char led_pattern = 0x00; // LED模式
unsigned int flow_count = 0;    // 流水灯计数

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

// 串口初始化
void Uart1_Init()
{
    P_SW1 &= 0x3F;
    P3M0 &= ~0x03;
    P3M1 &= ~0x03;
    SCON = 0x50;           // 方式1,允许接收
    TMOD &= 0x0F;
    TMOD |= 0x20;
    TH1 = 0xEE;            // 9600 @ 11.0592MHz
    TL1 = 0xEE;
    AUXR |= 0x40;
    TR1 = 1;
    ES = 1;                // 使能串口中断
}

// 串口发送字符串
void Uart1_SendString(unsigned char *s)
{
    while (*s != '\0')
    {
        SBUF = *s;
        while (!TI);
        TI = 0;
        s++;
    }
}

// 串口中断服务程序(接收)
void uart1_isr() interrupt 4
{
    if (RI)
    {
        unsigned char dat;
        dat = SBUF;
        RI = 0;
      
        if (dat == '\n' || dat == '\r')  // 收到结束符
        {
            rx_buf[rx_index] = '\0';
            rx_complete = 1;
            rx_index = 0;
        }
        else if (rx_index < 15)          // 防溢出
        {
            rx_buf[rx_index++] = dat;
        }
    }
    if (TI)
    {
        TI = 0;
    }
}

// 处理串口命令
void Process_Command()
{
    // 使用比较字符串的方式处理
    if (rx_buf[0] == 'L' && rx_buf[1] == 'E' && rx_buf[2] == 'D')
    {
        if (rx_buf[3] == ':' && rx_buf[4] == 'A')
        {
            P1 = 0x00;                 // 全部点亮
            Uart1_SendString("OK:ALL ON\r\n");
        }
        else if (rx_buf[3] == ':' && rx_buf[4] == 'B')
        {
            P1 = 0xFF;                 // 全部熄灭
            Uart1_SendString("OK:ALL OFF\r\n");
        }
        else if (rx_buf[3] == ':' && rx_buf[4] == 'C')
        {
            running = 1;               // 启动流水灯
            Uart1_SendString("OK:FLOW START\r\n");
        }
        else if (rx_buf[3] == ':' && rx_buf[4] == 'D')
        {
            running = 0;               // 停止流水灯
            P1 = 0xFF;
            Uart1_SendString("OK:FLOW STOP\r\n");
        }
        else
        {
            Uart1_SendString("ERR:UNKNOWN\r\n");
        }
    }
    rx_complete = 0;
}

void main()
{
    unsigned char i;
  
    // 配置P1口为推挽输出(LED)
    P1M0 = 0xFF;
    P1M1 = 0x00;
    P1 = 0xFF;             // 初始全灭
  
    Uart1_Init();
    EA = 1;
  
    Uart1_SendString("READY\r\n");   // 上电提示
  
    while (1)
    {
        if (rx_complete)              // 有命令到达
        {
            Process_Command();
        }
      
        if (running)                  // 流水灯模式
        {
            flow_count++;
            if (flow_count >= 3000)   // 约300ms切换
            {
                flow_count = 0;
                P1 = ~(0x01 << (i % 8));  // 轮流点亮
                i++;
            }
        }
    }
}

依据:AI8051U手册「2组USART-LIN/SPI,同步/异步串口通信,硬件奇偶校验」「I/O口」


【PPT 第10页】串口命令交互流程

课件要点:

PC串口助手 → 发送命令 → Ai8051U串口中断接收
                    ↓
             存入rx_buf,设置rx_complete=1
                    ↓
        主循环检测rx_complete
                    ↓
        解析命令→执行LED控制→回复确认
                    ↓
        串口回复 "OK:..." 或 "ERR:..."

串口助手设置:

  • 波特率:9600
  • 数据位:8位
  • 校验位:无
  • 停止位:1位
  • 发送模式:文本/ASCII

【PPT 第11页】综合实验调试技巧

课件要点:

调试方法:

  1. 逐步验证:先验证串口能否正常工作,再验证LED,最后综合
  2. 串口打印调试:在关键位置用串口输出调试信息
  3. 断点调试:使用Keil软件仿真或硬件仿真
  4. 观察时序:用逻辑分析仪/示波器观察定时器时序

常见问题排查:

问题 可能原因 解决方法
串口无输出 波特率不对/引脚未配置 检查TH1/TL1值、P_SW1设置
LED不亮 I/O口模式未配置/驱动不足 检查PxM0/PxM1、改用推挽
数码管闪烁 扫描频率太低/消隐不足 增加扫描频率、添加消隐
时间不准 定时器初值计算错误 重新计算TH0/TL0

【PPT 第12页】实验报告要求

课件要点:
学生需提交实验报告,包括:

  1. 实验目的:描述本实验要掌握的知识点
  2. 实验原理:解释定时器、中断、串口等原理
  3. 硬件连接:绘制接线图
  4. 程序代码:附上完整代码(含注释)
  5. 实验现象:描述实验结果(截图/照片)
  6. 问题与解决:描述遇到的问题及解决方案
  7. 思考与总结:总结收获,提出改进方案

【PPT 第13页】本讲小结与思考题

课件要点:

  • 综合运用了I/O口、定时器、中断、串口等知识
  • 理解了模块化编程思想
  • 掌握了综合调试技巧

思考题:

  1. 实验中数码管扫描频率是多少?为什么这个频率合适?
  2. 如果串口波特率改为115200,需要修改哪些参数?
  3. 如何实现通过串口发送命令设置电子钟的时间?
  4. 综合实验中,中断服务程序如何处理才能保证实时性?

信息来源:


第8讲内容已完整输出。

当前已完成:

  • ✅ 第1讲:单片机基础与AI8051U认识(4学时)
  • ✅ 第2讲:开发环境搭建与程序烧录(4学时)
  • ✅ 第3讲:I/O口与最小系统(6学时)
  • ✅ 第4讲:中断系统(6学时)
  • ✅ 第5讲:定时器/计数器(6学时)
  • ✅ 第6讲:串口通信(6学时)
  • ✅ 第7讲:存储器与特殊功能寄存器(4学时)
  • ✅ 第8讲:综合实验(6学时)

待输出:

  • 🔜 第9讲:课程总结与扩展(6学时)

请问需要继续输出第9讲(课程总结与扩展)吗?这是最后一讲。


🔍 搜索 "继续输出第8讲(综合实验)"

📌 相关论坛讨论

  1. 能按教学规律,按知识点,生成 AI8051U的大学教学 PPT给老师用吗
  2. 视频教学:《32位8051单片机原理及应用》,一等奖2万, 送实验箱; 冲哥版
  3. 进取者 STC15开发板入门教学精讲——含文档视频

⏱️ 查找用时 1.2s | 总回答用时 40.5s

回复

使用道具 举报 送花

已绑定手机

32

主题

446

回帖

2867

积分

金牌会员

积分
2867
发表于 2026-8-25 20:57:57 | 显示全部楼层
AI生成以分钟计算,人工审核要以小时来计算。
明显是机器在欺负人。
学习MCU
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 12:22 , Processed in 0.065144 second(s), 42 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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