第一集 - 序言
学习感悟:综合讲述了Ai8051的强大之处,通过以下实例讲解
1.屏幕显示和视频播放。
2.IIS录放音。
3.PWM_DMA
4.频谱分析仪。
5.手写计算器。
6.QSPI,PWM移相,硬件乘除,单精度浮点计算。
通过讲解了解了Ai8051功能的强大,激发了我对学习的热情。
第二集 - 硬件及工具介绍
学习感悟:学习并掌握了开发所需的工具。
1.讲解了实验箱的板载器件。

2.软件及工具的下载

下载最新Ai8051u数据手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf
AiCube-ISP-V6.96O 版
AiCube辅助开发,图形配置界面自动生成配置代码与程序框架;远程现场升级APP发布;单片机在线升级仿真调试平台软件;ISP下载地址:https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.96O.zip
Keil 中断拓展插件
keil C51/C251 编译器只支持31以内中断号,超过31编译报错。热心网友提供的简单拓展工具,可将中断号拓展到254下载地址:
https://www.stcaimcu.com/data/download/Tools/%E6%8B%93%E5%B1%95Keil%E7%9A%84C%E4%BB%A3%E7%A0%81%E4%B8%AD%E6%96%AD%E5%8F%B7.zip
AI8051U实验箱1.2
主控芯片使用AI8051U,可以做示波器、波形发生器、音频播放、TFT彩屏显示、OLED 12864、LCD 12864 等,20250715版本下载地址:
https://www.stcaimcu.com/data/download/DemoCode/AI8051U-DEMO-CODE-V1.2.zip
第三集 - 点亮第一个LED
学习感悟:学习了点亮一个LED灯。
1.创建一个空工程代码如下:
#include<ai8051u.h>
void main (void) //主函数
{
while(1) //无限循环
{
}
}
2.点亮第一个LED灯代码如下:
#include<ai8051u.h>
#define LED P00
void main (void) //主函数
{
P0M0 = 0X00;
P0M1 = 0X00;
while(1) //无限循环
{
LED = 0; //点亮LED
}
}
第四节-USB不停电下载
1.利用上次工程,在工程中添加LIB库,LIB库的下载地址是:
https://www.stcaimcu.com/data/download/Library/STC_USB_LIBRARY.zip

2.添加代码:


添加头文件

第四课的配套程序下载地址:https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgyNzR8ZTQ1NWZkZmZ8MTc2OTE3MDQ1N3wxMTYzMHwxMTkwMg%3D%3D
第五集 C语言的基础
1.讲述了#define的用法,这个用法很多这里只是讲解了最简单的用法,以前就会,就大体的看了下。
2.进制讲解,二进制,十六进制,八进制,十进制。我多年的开发经验告诉我,C语言开发中除了八进制不常用 其他的都很重要,可以用windows计算器进行转换。
3.数据类型:无符号类型有 unsigned char,unsigned int,unsigned short有符号类型有 char ,int ,short浮点类型有:float ,double等。
取值范围:
- signed char(有符号字符): [-128, 127]
- unsigned char(无符号字符): [0, 255]
- short / short int / signed short(有符号短整型): [-32768, 32767]
- unsigned short / unsigned short int(无符号短整型): [0, 65535]
- int / signed int(有符号整型): [-32768, 32767]
- unsigned int(无符号整型): [0, 65535]
4.C语言常用运算符:
- 算术运算符:用于执行基本的数学运算,如加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
- 赋值运算符:用于将值赋给变量,最基本的赋值运算符是=。此外,还有复合赋值运算符,如+=、-=、*=、/=、%=等。
- 关系运算符:用于比较两个值,包括大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)和小于等于(<=)。
- 逻辑运算符:用于执行逻辑操作,包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。
- 位运算符:用于对二进制位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、左移(<<)和右移(>>)。
- 自增自减运算符:用于将变量的值增加1(++)或减少1(–)。
- 条件运算符:也称为三元运算符,用于根据条件返回两个值中的一个,语法为:条件 ? 结果1 : 结果。
- 逗号运算符:用于将多个表达式组合在一起,依次计算每个表达式的值,并返回最后一个表达式的值。
- 特殊运算符:包括sizeof运算符,用于计算数据类型或变量的大小。
第六集 IO口的输入输出
- 什么是IO口,就是通用输入输出端口,也就是可读可写的端口,他可能是低电平或高电平,也可能是模拟量,这里暂时不讨论。
- 什么是高电平?答:接近于VCC电压的电压称作为高电平,低电平相反它更接近于GND也就是0V。
- 讲解了IO口的四种模式:

第七集 定时器中断
单片机的定时器中断是单片机系统中核心的外设功能之一,其重要性体现在它能打破单片机 “顺序执行指令” 的固有逻辑,让系统具备精准的时间管理、异步事件响应、资源高效利用的能力,是实现实时控制、多任务调度、精准时序操作的基础,没有定时器中断,单片机的大部分工业、嵌入式应用都会无法实现。
简单来说,单片机本身是按指令周期逐条执行程序的,若仅靠 “延时函数”(软件延时)实现时间相关操作,会占用 CPU 全部资源,且延时精度受指令执行、外部干扰影响;而定时器中断是由硬件定时器精准计时后主动触发的中断请求,CPU 响应后会暂停当前程序、执行中断服务函数,完成后再回到原程序继续运行,既保证了时间精度,又解放了 CPU。
- 讲解了配置寄存器的步骤,因为没有试验箱用自己的板子配置了下:
#include <stc8h.h>
#define led P54
void tim0_init (void)
{
TMOD&=0XF0;
AUXR|=0X80;
TH0=0;
TL0=0;
TR0=1; //打开定时器
ET0=1; //定时器开启中断
EA =1; //打开总中断
}
void tim0_service(void)interrupt 1 //定时器服务函数
{
static T0_count =0;
T0_count++;
if (T0_count==200)
{
led = ~led;
T0_count =0;
}
}
void IO_init (void) //GPIO口初始化
{
P5M0 =0X00;
P5M1 =0X00;
}
void main (void) //主函数
{
IO_init ();
tim0_init();
while (1)
{
}
}
效果如下:

第八集 定时器周期性调度任务
这个功能主要有定时器配合数组完成,第一步:初始化定时器,每次间隔一毫秒中断一次,在定时器服务函数里每次中断向数组里每个成员加一。第二步:在主函数里每个任务分别查询数组成员是否到达了定时值,然后执行该程序,最后清空数组成员自己写的代码:
#include <stc8h.h>
#define led1 P54
#define led2 P32
#define led3 P33
unsigned int time_delay[3]={0,0,0};
void tim0_init (void)
{
TMOD&=0XF0;
AUXR|=0X80;
TH0=0X77;
TL0=0x00;
TR0=1; //打开定时器
ET0=1; //定时器开启中断
EA =1; //打开总中断
}
void tim0_service(void)interrupt 1
{
unsigned char a ;
for (a=0;a<3;a++)
{
time_delay[a]++;
}
}
void IO_init (void)
{
P3M0 = 0X00; P3M1 = 0X00;
P5M0 = 0X00; P5M1 = 0X00;
}
void main (void)
{
IO_init ();
tim0_init();
while (1)
{
if (time_delay[0]>=100)
{
led1 = ~led1;
time_delay[0] = 0;
}
if (time_delay[1]>=200)
{
led2 = ~led2;
time_delay[1] = 0;
}
if (time_delay[2]>=300)
{
led3 = ~led3;
time_delay[2] = 0;
}
}
}
效果如下:
![6a1ae46e07f64a5b523f79247a4a1e57[00_00_00--00_00_20].gif 6a1ae46e07f64a5b523f79247a4a1e5700_00_00--00_00_20.gif](data/attachment/forum/202601/25/194152dwlviz474wtqw6it.gif)
第九集 数码管
- 什么是数码管,就是将LED封装在一起可以做成显示任何颜色的数字或者符号的显示器件。
- 数码管的分类,数码管可以分为共阴极和共阳极两种。
- 数码管的驱动方式,数码管去动可以是静态扫描显示,也可以是动态扫描显示。

一位数码管

四位数码管

特殊符号数码管

数码管连接方式
编写程序前先进行取模,利用AiCube-ISP软件进行取模:

第一步:打开AiCube-ISP点击工具

第二步:点击字库生成工具

第三步:在弹出的窗口中点击像“8”的符号

第四步:选择和自己数码管一样的参数进行取模。
我这里有个三位数码管就用它做实验,程序源码:
#include <stc8h.h>
unsigned int dsp_data =0;
unsigned char Loc [3]={1,2,3};
unsigned char Data[]=
{
0xC0, /*'0', 0*/
0xF9, /*'1', 1*/
0xA4, /*'2', 2*/
0xB0, /*'3', 3*/
0x99, /*'4', 4*/
0x92, /*'5', 5*/
0x82, /*'6', 6*/
0xF8, /*'7', 7*/
0x80, /*'8', 8*/
0x90, /*'9', 9*/
};
void delay (unsigned char a)
{
unsigned char b,i;
for (b=0;b<a;b++)
{
for (i=0;i<255;i++)
{}
}
}
void tim0_init (void)
{
TMOD&=0XF0;
AUXR|=0X80;
TH0=0X00;
TL0=0x00;
TR0=1; //打开定时器
ET0=1; //定时器开启中断
EA =1; //打开总中断
}
void tim0_service(void)interrupt 1
{
static unsigned char a =0;
a++;
if (a==100)
{
a=0;
dsp_data++;
if (dsp_data==1000)
dsp_data =0;
}
}
void IO_init (void)
{
P5M0 = 0X00;
P5M1 = 0X00;
P3M0 = 0X38;
P3M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
}
void display(unsigned int number)
{
unsigned char *p,i;
Loc[0] = number/100;
Loc[1] = number%100/10;
Loc[2] = number%10;
P3 = 0X08;
p = Loc;
for (i=0;i<3;i++)
{
P1 = Data[*p];
if (P12) //因为没有P1.2用P5.4代替
P54 = 1;
else
P54 = 0;
delay(10);
P1 = 0; //防鬼影
P3 <<= 1;
p++;
}
}
void main (void)
{
IO_init ();
tim0_init();
while (1)
{
display(dsp_data);
}
}
实验现象,通过定时器不停的加数,让数码管做动态扫描显示效果如下:
![93f7d01455dda6d7d17b84e2c1a70972[00_00_00--00_00_20].gif 93f7d01455dda6d7d17b84e2c1a7097200_00_00--00_00_20.gif](data/attachment/forum/202601/25/222642ebpeba1td26rjtk8.gif)