找回密码
 立即注册
查看: 406|回复: 17

从Ai8051U由浅及深带人遨游单片机的世界

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:26:13 | 显示全部楼层 |阅读模式
打卡第1集,原来还可以这么玩。。。好多花活,
单片机实现梦想和现实的联动,看着冲哥秀操作
屏幕截图 2025-12-19 192838.png
LED灯表DIY
屏幕截图 2025-12-19 193009.png
录音的频谱
屏幕截图 2025-12-19 193026.png
手写计算器
屏幕截图 2025-12-19 193115.png

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

835

主题

1万

回帖

2万

积分

管理员

积分
22170
发表于 2025-12-16 14:33:14 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2026-02-07 11:52:53
已绑定手机

14

主题

125

回帖

924

积分

版主

积分
924
发表于 2025-12-16 09:27:47 | 显示全部楼层
请尽快发图文并茂的学习打卡贴哦,有营养一些 不然会被当水贴删除哦
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:30:07 | 显示全部楼层
打卡第2集,按视频下载程序和实验文件
屏幕截图 2025-12-19 191651.png 屏幕截图 2025-12-19 191718.png
熟悉下载程序软件
屏幕截图 2025-12-19 191552.png
熟悉程序编译软件
屏幕截图 2025-12-19 191613.png
给编译软件添加芯片型号和头文件
屏幕截图 2025-12-19 192556.png


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:32:00 | 显示全部楼层
打卡第3集,
//#include "ai8051u.h"                //调用头文件
#include "stc8h.h"                //调用头文件
//更改头文件


void main(void)
{
//        P0M0 = 0;                //P0端口(P00-P07)为准双向口
//        P0M1 = 0;
//        
//        P4M0 = 0;                //P4端口为准双向口
//        P4M1 = 0;        
//更改引脚代码
            P1M0 = 0x00; P1M1 = 0x00;     //p1(0-7)为准双向口
      P3M0 &= ~0xfc; P3M1 &= ~0xfc;    //p3(2-7)为准双向口

        
        while(1)
        {
//                P40 = 0;        //P40端口输出0V
//                P00 = 0;        //P00端口输出0V
//                P01 = 0;        //P01端口输出0V               
//更改端口及电平为高电平点亮,适配led共阴电路设计
                P35 = 1;        //P35端口输出高电平
                P11 = 1;        //P11端口输出高电平
                P10 = 1;        //P10端口输出高电平        
                P34 = 1;        //P34端口输出高电平               
        }
}

修改原程序,适配自制电路,制作点灯实验
适配现有芯片,灵活应用,
更改头文件为STC8H.H
P1-P3(2-7)设为准双向口,参考I\O口配置工具,原程序改为注释
屏幕截图 2025-12-19 185716.png 屏幕截图 2025-12-19 185651.png
参考原程序,把低电平输出更换高电平输出,适配自制共阴LED电路
经下载测试,原来PXX 就是PX.X引脚,0\1为0V和高电平,
准双向口的电压经测量为2.88V,自己上手就是不一样
下为修改后的程序截图
屏幕截图 2025-12-19 184704.png
下为点灯实验程序的效果,4个LED全亮
photo_2025-12-19_19-10-12.jpg
没有实验箱,正好手边有STC芯片,自己搞了一个点灯测试电路,
下为准备配件和焊接好的图片

photo_6_2025-12-16_09-53-36.jpg

没有实验箱也是拼了,硬整了个点灯线路,
用备用芯片搞了迷你测试板
IMG_20251217_105934.jpg

下为利用点灯程序测试个人程序视频




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:33:29 | 显示全部楼层
打卡第四集,不停电下载,
感言:下载过一回后,后续程序无此代码,都可以实现不停电下载,编译进了平常不擦除的区域,挺方便的!
正好方便测试顶顶顶
屏幕截图 2025-12-19 194029.png
移植示例文件,到之前的已配置好的点灯程序



//#include "ai8051u.h"                //调用头文件
#include "stc8h.h"                //调用头文件
//更改头文件
#include "stc32_stc8_usb.h"                //调用头文件这个是通用的


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";       //继续COPY


void main(void)
{
//        P0M0 = 0;                //P0端口(P00-P07)为准双向口
//        P0M1 = 0;
//        
//        P4M0 = 0;                //P4端口为准双向口
//        P4M1 = 0;        
//更改引脚代码
            P1M0 = 0x00; P1M1 = 0x00;     //p1(0-7)为准双向口
      P3M0 &= ~0xfc; P3M1 &= ~0xfc;    //p3(2-7)为准双向口
      
            P_SW2 |= 0x80;                //B7位写1,使能访问XFR
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
        
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
        
        
        while(1)
        {
//                P40 = 0;        //P40端口输出0V
//                P00 = 0;        //P00端口输出0V
//                P01 = 0;        //P01端口输出0V               
//更改端口及电平为高电平点亮,适配led共阴电路设计
               
                P35 = 1;        //P35端口输出高电平
                P11 = 1;        //P11端口输出高电平
                P10 = 1;        //P10端口输出高电平        
                P34 = 1;        //P34端口输出高电平               
                        if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
        }
}


下为程序截图
屏幕截图 2025-12-19 200348.png
屏幕截图 2025-12-19 200412.png
编译成功,无视警告
屏幕截图 2025-12-19 200518.png
编译程序后自动不停电下载,下为测试视频


修改连动太方便了,于我而言不用怼接头了!方便的不是一点点。
photo_2025-12-16_10-04-17.jpg




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:35:25 | 显示全部楼层
打卡第5集,
从ISP软件打开AICUBE图形编程软件

屏幕截图 2025-12-19 203410.png
软件里很丰富,可视化编程,很便捷直观

左击显示引脚支持
的功能
屏幕截图 2025-12-19 203727.png
右击修改输出模式,各种使能、中断、电平、电流,
屏幕截图 2025-12-19 203741.png
新建项目
屏幕截图 2025-12-19 204150.png
打开项目
屏幕截图 2025-12-19 204458.png
保存项目
屏幕截图 2025-12-19 205322.png
修改要用的程序选项,挺方便的,当个模板使就比外部的AIapp要更好吧,程序可以无BUG直出

生成KEIL程序代码

关闭AICUBE

创建的PRINT项目录,
屏幕截图 2025-12-19 212636.png
创建成功
屏幕截图 2025-12-19 212647.png
项目目录
屏幕截图 2025-12-19 213246.png
库文件
屏幕截图 2025-12-19 213257.png
打开创建的程序,已有main.c,usb库文件,各种必要函数
屏幕截图 2025-12-19 213530.png 屏幕截图 2025-12-19 213807.png
添加Print代码到USB查询IF子代码中
屏幕截图 2025-12-19 220134.png
分屏4个一样的窗口可以随意下拉实现全局观察
屏幕截图 2025-12-19 214306.png
连接好芯片下载程序,打开文件,此处用STC8H1K08T替代
屏幕截图 2025-12-19 221654.png
下载成功
屏幕截图 2025-12-19 222022.png
回送文本失败,明日继续,
经测试多个实验程序,确认非官方TTL的原因








回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:37:42 | 显示全部楼层
收到了官方免费邮寄的AI8051U擎天柱学习板,继续做printf实验
photo_2025-12-22_09-59-06.jpg
下载成功,成功有了COM5,USB-CDC,CDC口
屏幕截图 2025-12-22 193650.png
修改按钮,突然发现之前是设置错了,难怪之前总出错,
6是要改的按钮名,空的地方是要发送的数字,
屏幕截图 2025-12-22 194409.png
完成PRINTF实验,成功回送
屏幕截图 2025-12-22 194835.png



屏幕截图 2025-12-22 200634.png
第2个查询和第1个实质是一样的,不做重复实验


接着第3个中断实验,AICIUBE是真的方便!
屏幕截图 2025-12-22 202118.png
查询和中断是两种实现方式,选择适合自己的
屏幕截图 2025-12-22 203015.png

photo_2025-12-22_09-59-06.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:38:36 | 显示全部楼层
第6集打卡,初识高低电平
屏幕截图 2025-12-22 203945.png
拉电流和普通电流
屏幕截图 2025-12-22 204230.png
施密特触发原来是这么回事
屏幕截图 2025-12-22 204336.png
线路按钮共阳极高电平,用低电平控制
屏幕截图 2025-12-22 204620.png
用0和1代表电平状态捕捉按钮动作
屏幕截图 2025-12-22 210540.png
任务1适配擎天柱LED引脚位置
屏幕截图 2025-12-22 210831.png
任务2
屏幕截图 2025-12-22 211204.png

任务3 按一次电平反转一次,并用程序消抖,PRINTF回返状态,之后可用于测试自己程序的执行情况,赞
屏幕截图 2025-12-23 090830.png

设置状态变量,设置延时函数,设置寄存器相关
屏幕截图 2025-12-23 085736.png 屏幕截图 2025-12-23 090405.png





屏幕截图 2025-12-22 205619.png
屏幕截图 2025-12-22 212129.png
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2026-02-11 19:57:46
已绑定手机

4

主题

43

回帖

134

积分

注册会员

积分
134
发表于 2025-12-16 09:39:43 | 显示全部楼层
第7集打卡,功德双倍计数,适配擎天柱LED及按键
功德计数小练.zip (90.97 KB, 下载次数: 0) 整个试例
main.c (8.53 KB, 下载次数: 1) 仅代码


// 引入STC32G系列单片机核心寄存器定义头文件,包含寄存器地址、位定义等基础配置
#include "ai8051u.h"
// 引入STC32 USB-CDC虚拟串口驱动头文件,实现USB串口通信功能
#include "stc32_stc8_usb.h"
// 引入51单片机内置函数头文件(如_nop_等),本程序主要用于延时函数底层支撑
#include "intrins.h"

// 自定义数据类型别名,简化代码书写:u8对应无符号字符型(0-255),u16对应无符号整型(0-65535)
#define u8  unsigned char
#define u16 unsigned int

// 全局状态变量定义
bit double_flag = 0;          // 单/双倍模式标志位:0=单倍模式(+1),1=双倍模式(+2)
u16 total = 0;                // 累计功德总数,记录所有按键操作的总数值
u16 double_time_left = 0;     // 双倍模式剩余时间(单位:秒),初始为0,切换双倍时设为60
u8 LED_mode = 0;              // LED亮灯模式:0=灭,1=单倍模式亮P20,2=双倍模式亮P20+P21
u8 LED_timer = 0;             // LED亮灯计时变量(单位:0.5秒),控制LED点亮时长

// USB-CDC虚拟串口必需的配置参数(驱动底层要求,不可删除)
char *USER_DEVICEDESC = NULL;    // 设备描述符指针,CDC驱动识别设备用,此处暂不自定义
char *USER_PRODUCTDESC = NULL;   // 产品描述符指针,CDC驱动识别产品用,此处暂不自定义
char *USER_STCISPCMD = "@STCISP#";// ISP下载指令标识,STC烧录工具识别用,固定值

// 20毫秒延时函数(按键消抖专用)
// 24MHz晶振下,通过空循环实现约20ms延时,满足按键消抖的最小时间要求
void Delay20ms(void) {
    unsigned long i = 119998UL; // 延时计数常量,经实测匹配24MHz晶振下20ms延时
    while (i--);               // 空循环递减,消耗CPU时钟实现延时
}
// 定时器0初始化函数
//工作频率24MHz工作频率24MHz工作频率24MHz工作频率24MHz工作频率24MHz工作频率24MHz
// 配置定时器0为16位自动重装模式,1秒触发一次中断,用于计时和LED控制
//
void Timer0_Init(void) {
    TM0PS = 0x0F;           // 定时器0预分频系数设置为1:16(24MHz/16=1.5MHz)
    AUXR &= 0x7F;           // 关闭定时器0高速模式,使用传统12T模式(1.5MHz/12=125kHz)
    TMOD &= 0xF0;           // 清空定时器0模式位,准备配置模式
    TMOD |= 0x01;           // 定时器0设为模式1(16位定时/计数模式,需手动重装初值)
    // 计算1秒定时初值:125kHz时钟,1秒需计数125000次,拆分16位初值
    TH0 = (65536 - 125000 % 65536) / 256;  
    TL0 = (65536 - 125000 % 65536) % 256;  
    TF0 = 0;                // 清空定时器0溢出标志位,避免误触发中断
    TR0 = 1;                // 启动定时器0计数
    ET0 = 1;                // 开启定时器0中断允许位,允许触发中断
}

//帮助信息打印函数(P47按键触发)
//通过USB-CDC虚拟串口打印操作提示,方便用户了解按键功能

void print_help(void) {
    printf("按 P32 切换功德单、双倍\r\n");          // 打印P32按键功能
    printf("按 P33 加功德:1倍+1,2倍+2(2倍持续60秒)\r\n"); // 打印P33按键功能
    printf("按 P47 看提示;P27亮1倍,P26/P27亮2倍\r\n");     // 打印LED状态说明
}

// 主函数(程序入口)
// 初始化硬件、处理按键事件、循环检测状态,是程序的核心逻辑入口
void main(void) {
    WTST = 0;                // 关闭看门狗(避免程序运行中被看门狗复位)
    EAXFR = 1;               // 开启扩展RAM访问(STC32G系列特有,提升内存使用效率)
    CKCON = 0;               // 时钟控制寄存器清零,使用默认时钟配置

    // IO口模式配置:全部设为推挽输出(LED)或准双向输入(按键)
    P0M1 = 0x00; P0M0 = 0xFF;  // P0口全部设为推挽输出(备用,本程序未使用)
    P1M1 = 0x00; P1M0 = 0xFF;  // P1口全部设为推挽输出(备用,本程序未使用)
    P2M1 = 0x00; P2M0 = 0xFF;  // P2口全部设为推挽输出(控制P20/P21/P26/P27 LED)适配擎天柱LED和按键
    P3M1 = 0x00; P3M0 = 0x00;  // P3口全部设为准双向输入(检测P32/P33按键)                                同上
    P4M1 = 0x00; P4M0 = 0x00;  // P4口全部设为准双向输入(检测P47按键)                                                同上
    P5M1 = 0x00; P5M0 = 0xFF;  // P5口全部设为推挽输出(备用,本程序未使用)
    P6M1 = 0x00; P6M0 = 0xFF;  // P6口全部设为推挽输出(备用,本程序未使用)
    P7M1 = 0x00; P7M0 = 0xFF;  // P7口全部设为推挽输出(备用,本程序未使用)

    // USB-CDC虚拟串口初始化
    usb_init();               // 初始化USB控制器,启动CDC虚拟串口
    IE2 |= 0x80;              // 开启USB中断(CDC通信必需)
    EA = 1;                   // 开启总中断(允许定时器0和USB中断触发)

    // LED初始状态配置(共阳LED:0=亮,1=灭)
    P27 = 0;  // P27常亮(单倍模式指示灯)
    P26 = 1;  // P26初始灭(双倍模式指示灯)
    P20 = 1;  // P20初始灭(按键反馈LED)
    P21 = 1;  // P21初始灭(双倍模式反馈LED)

    // 等待USB-CDC虚拟串口配置完成(避免串口未就绪时打印异常)
    while (DeviceState != DEVSTATE_CONFIGURED);   

    // 初始化定时器0(启动1秒中断,用于计时和LED控制)
    Timer0_Init();

    // 主循环(程序核心,无限循环检测按键、处理状态)
    while (1) {
        // USB-CDC数据接收处理(防止串口缓冲区溢出)
        if (bUsbOutReady) {
                                        print_help();         // 调用帮助函数,若接收任何信息则发送

            usb_OUT_done();   // 清空USB接收缓冲区,准备下一次接收
        }

        // P32按键处理:切换单/双倍模式(带消抖)
        if (P32 == 0) {               // 检测P32按键按下(低电平有效)
            Delay20ms();              // 20ms消抖,排除机械抖动干扰
            if (P32 == 0) {           // 再次检测,确认按键真的按下
                double_flag = !double_flag;  // 翻转模式标志(0→1/1→0)
                if (double_flag == 1) {      // 切换到双倍模式
                    double_time_left = 60;   // 设置双倍模式时长为60秒
                    printf("双倍模式已开启!剩余%d秒\r\n", double_time_left); // 打印开启提示
                    P26 = 0;                // 点亮P26(双倍模式指示灯)
                } else {                      // 切换到单倍模式
                    double_time_left = 0;    // 清空剩余时间
                    printf("单倍模式已开启!\r\n"); // 打印开启提示
                    P26 = 1;                // 熄灭P26(双倍模式指示灯)
                }
                while (P32 == 0) Delay20ms(); // 等待按键释放,避免重复触发
            }
        }

        // P33按键处理:增加功德值(带消抖,区分单/双倍)
        if (P33 == 0) {               // 检测P33按键按下(低电平有效)
            Delay20ms();              // 20ms消抖,排除机械抖动干扰
            if (P33 == 0) {           // 再次检测,确认按键真的按下
                if (double_flag == 0) { // 单倍模式
                    total += 1;       // 功德值+1
                    printf("功德+1,当前功德%d\r\n", total); // 打印数值变化
                    LED_mode = 1;     // 设置LED模式为单倍(仅亮P20)
                    LED_timer = 2;    // LED亮2个0.5秒=1秒
                    P20 = 0;          // 点亮P20(按键反馈)
                } else {              // 双倍模式
                    total += 2;       // 功德值+2
                    printf("功德+2,当前功德%d(双倍时间)\r\n", total); // 打印数值变化
                    LED_mode = 2;     // 设置LED模式为双倍(亮P20+P21)
                    LED_timer = 4;    // LED亮4个0.5秒=2秒
                    P20 = 0;          // 点亮P20(按键反馈)
                    P21 = 0;          // 点亮P21(双倍模式反馈)
                }
                while (P33 == 0) Delay20ms(); // 等待按键释放,避免重复触发
            }
        }

        // P47按键处理:打印帮助信息(带消抖)
        if (P47 == 0) {               // 检测P47按键按下(低电平有效)
            Delay20ms();              // 20ms消抖,排除机械抖动干扰
            if (P47 == 0) {           // 再次检测,确认按键真的按下
                print_help();         // 调用帮助信息打印函数
                while (P47 == 0) Delay20ms(); // 等待按键释放,避免重复触发
            }
        }

        // 实时更新LED状态:确保P27常亮,P26跟随双倍模式标志
        P27 = 0;  // P27始终亮(单倍模式基础指示灯)
        P26 = double_flag ? 0 : 1; // 三元运算符:双倍模式亮P26,单倍模式灭
    }
}

//定时器0中断服务函数(1秒触发一次)
// 处理双倍模式计时、LED亮灯时长控制,是程序的定时核心
void Timer0_Isr(void) interrupt 1 { // interrupt 1表示定时器0中断(中断号1)
    // 手动重装定时器0初值(模式1无自动重装,需手动赋值)
    TH0 = (65536 - 125000 % 65536) / 256;
    TL0 = (65536 - 125000 % 65536) % 256;
   
    // 双倍模式剩余时间递减(仅在时间>0时执行)
    if (double_time_left > 0) {
        double_time_left--;  // 剩余时间-1秒
    }
    // 双倍模式时间耗尽,自动切回单倍模式
    if (double_time_left == 0) {
        double_flag = 0;     // 切换为单倍模式
        P26 = 1;             // 熄灭P26(双倍模式指示灯)
    }

    // LED亮灯时长控制(1秒递减两次=0.5秒/次,)
    if (LED_timer > 0) {            
        LED_timer--;                // 亮灯计时-1(0.5秒)
        if (LED_timer == 0) {       // 计时耗尽,关闭LED
            P20 = 1;                // 熄灭P20
            if (LED_mode == 2) {    // 双倍模式需额外熄灭P21
                P21 = 1;            // 熄灭P21
            }
            LED_mode = 0;           // 重置LED模式为灭
        }
    }
}


屏幕截图 2025-12-23 102845.png
屏幕截图 2025-12-23 162603.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

835

主题

1万

回帖

2万

积分

管理员

积分
22170
发表于 2025-12-16 09:42:39 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96J 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:05 , Processed in 1.570039 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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