Ai8051学习感悟
<p><strong>第一集 - 序言</strong></p><p><strong>学习感悟:综合讲述了Ai8051的强大之处,通过以下实例讲解</strong><br />
1.屏幕显示和视频播放。<br />
2.IIS录放音。<br />
3.PWM_DMA<br />
4.频谱分析仪。<br />
5.手写计算器。<br />
6.QSPI,PWM移相,硬件乘除,单精度浮点计算。<br />
通过讲解了解了Ai8051功能的强大,激发了我对学习的热情。</p>
<hr />
<p><strong>第二集 - 硬件及工具介绍</strong></p>
<p><strong>学习感悟:学习并掌握了开发所需的工具。</strong><br />
1.讲解了实验箱的板载器件。</p>
<p><img src="https://www.stcaimcu.com/data/attachment/forum/202601/22/221459lvss2nnh8zhh9212.png" alt="试验箱.png" title="试验箱.png" /></p>
<p><strong>2.软件及工具的下载</strong><br />
<img src="data/attachment/forum/202601/22/222332tyv5sjjjsl4bazwb.png" alt="软件下载.png" title="软件下载.png" /></p>
<p><strong>下载最新Ai8051u数据手册</strong></p>
<p><a href="https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf">https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf</a></p>
<p><strong>AiCube-ISP-V6.96O 版</strong></p>
<p>AiCube辅助开发,图形配置界面自动生成配置代码与程序框架;远程现场升级APP发布;单片机在线升级仿真调试平台软件;ISP下载地址:<a href="https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.96O.zip">https://www.stcaimcu.com/data/download/Tools/AiCube-ISP-v6.96O.zip</a></p>
<p><strong>Keil 中断拓展插件</strong></p>
<p>keil C51/C251 编译器只支持31以内中断号,超过31编译报错。热心网友提供的简单拓展工具,可将中断号拓展到254下载地址:</p>
<p><a href="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">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</a></p>
<p><strong>AI8051U实验箱1.2</strong></p>
<p>主控芯片使用AI8051U,可以做示波器、波形发生器、音频播放、TFT彩屏显示、OLED 12864、LCD 12864 等,20250715版本下载地址:</p>
<p><a href="https://www.stcaimcu.com/data/download/DemoCode/AI8051U-DEMO-CODE-V1.2.zip">https://www.stcaimcu.com/data/download/DemoCode/AI8051U-DEMO-CODE-V1.2.zip</a></p>
<hr />
<p><strong>第三集 - 点亮第一个LED</strong></p>
<p>学习感悟:学习了点亮一个LED灯。</p>
<p>1.创建一个空工程代码如下:</p>
<pre><code>#include<ai8051u.h>
void main (void) //主函数
{
while(1) //无限循环
{
}
}
</code></pre>
<p>2.点亮第一个LED灯代码如下:</p>
<pre><code>#include<ai8051u.h>
#define LED P00
void main (void) //主函数
{
P0M0 = 0X00;
P0M1 = 0X00;
while(1) //无限循环
{
LED = 0; //点亮LED
}
}
</code></pre>
<hr />
<p><strong>第四节-USB不停电下载</strong></p>
<p>1.利用上次工程,在工程中添加LIB库,LIB库的下载地址是:</p>
<p><a href="https://www.stcaimcu.com/data/download/Library/STC_USB_LIBRARY.zip">https://www.stcaimcu.com/data/download/Library/STC_USB_LIBRARY.zip</a></p>
<p><img src="data/attachment/forum/202601/23/204739khgs4gvil4ckkkhh.png" alt="添加库.png" title="添加库.png" /></p>
<p>2.添加代码:</p>
<p><img src="data/attachment/forum/202601/23/205300uy7pwwlw27jqc7dh.png" alt="ScreenShot_2026-01-23_205151_162.png" title="ScreenShot_2026-01-23_205151_162.png" /></p>
<p><img src="data/attachment/forum/202601/23/205300uc0cuw2cnz20uhyw.png" alt="ScreenShot_2026-01-23_205229_026.png" title="ScreenShot_2026-01-23_205229_026.png" /></p>
<p>添加头文件</p>
<p><img src="data/attachment/forum/202601/23/205300txjz3s9vsj7rnxjs.png" alt="ScreenShot_2026-01-23_205303_081.png" title="ScreenShot_2026-01-23_205303_081.png" /></p>
<p>第四课的配套程序下载地址:<a href="https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgyNzR8ZTQ1NWZkZmZ8MTc2OTE3MDQ1N3wxMTYzMHwxMTkwMg%3D%3D">https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgyNzR8ZTQ1NWZkZmZ8MTc2OTE3MDQ1N3wxMTYzMHwxMTkwMg%3D%3D</a></p>
<hr />
<p><strong>第五集 C语言的基础</strong></p>
<p>1.讲述了#define的用法,这个用法很多这里只是讲解了最简单的用法,以前就会,就大体的看了下。</p>
<p>2.进制讲解,二进制,十六进制,八进制,十进制。我多年的开发经验告诉我,C语言开发中除了八进制不常用 其他的都很重要,可以用windows计算器进行转换。</p>
<p>3.数据类型:无符号类型有 unsigned char,unsigned int,unsigned short有符号类型有 char ,int ,short浮点类型有:float ,double等。</p>
<p>取值范围:</p>
<ul>
<li>signed char(有符号字符): [-128, 127]</li>
<li>unsigned char(无符号字符): </li>
<li>short / short int / signed short(有符号短整型): [-32768, 32767]</li>
<li>unsigned short / unsigned short int(无符号短整型): </li>
<li>int / signed int(有符号整型): [-32768, 32767]</li>
<li>unsigned int(无符号整型): </li>
</ul>
<p>4.C语言常用运算符:</p>
<ol>
<li><strong>算术运算符</strong>:用于执行基本的数学运算,如加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。</li>
<li><strong>赋值运算符</strong>:用于将值赋给变量,最基本的赋值运算符是=。此外,还有复合赋值运算符,如+=、-=、*=、/=、%=等。</li>
<li><strong>关系运算符</strong>:用于比较两个值,包括大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)和小于等于(<=)。</li>
<li><strong>逻辑运算符</strong>:用于执行逻辑操作,包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。</li>
<li><strong>位运算符</strong>:用于对二进制位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、左移(<<)和右移(>>)。</li>
<li><strong>自增自减运算符</strong>:用于将变量的值增加1(++)或减少1(–)。</li>
<li><strong>条件运算符</strong>:也称为三元运算符,用于根据条件返回两个值中的一个,语法为:条件 ? 结果1 : 结果。</li>
<li><strong>逗号运算符</strong>:用于将多个表达式组合在一起,依次计算每个表达式的值,并返回最后一个表达式的值。</li>
<li><strong>特殊运算符</strong>:包括sizeof运算符,用于计算数据类型或变量的大小。</li>
</ol>
<hr />
<p>第六集 IO口的输入输出</p>
<ol>
<li>什么是IO口,就是通用输入输出端口,也就是可读可写的端口,他可能是低电平或高电平,也可能是模拟量,这里暂时不讨论。</li>
<li>什么是高电平?答:接近于VCC电压的电压称作为高电平,低电平相反它更接近于GND也就是0V。</li>
<li>讲解了IO口的四种模式:</li>
</ol>
<ul>
<li>准双向IO口</li>
<li>推挽模式</li>
<li>开漏模式</li>
<li>高阻模式</li>
</ul>
<p><img src="data/attachment/forum/202601/23/220032revvfvun6nvvnfl3.png" alt="IO口.png" title="IO口.png" /></p>
<hr />
<p><strong>第七集 定时器中断</strong></p>
<ul>
<li>主要讲了定时器的重要性,归纳一下:</li>
</ul>
<p>单片机的定时器中断是单片机系统中<strong>核心的外设功能之一</strong>,其重要性体现在它能打破单片机 “顺序执行指令” 的固有逻辑,让系统具备<strong>精准的时间管理、异步事件响应、资源高效利用</strong>的能力,是实现实时控制、多任务调度、精准时序操作的基础,没有定时器中断,单片机的大部分工业、嵌入式应用都会无法实现。</p>
<p>简单来说,单片机本身是按指令周期逐条执行程序的,若仅靠 “延时函数”(软件延时)实现时间相关操作,会占用 CPU 全部资源,且延时精度受指令执行、外部干扰影响;而<strong>定时器中断</strong>是由硬件定时器精准计时后主动触发的中断请求,CPU 响应后会暂停当前程序、执行中断服务函数,完成后再回到原程序继续运行,既保证了时间精度,又解放了 CPU。</p>
<ul>
<li>讲解了配置寄存器的步骤,因为没有试验箱用自己的板子配置了下:</li>
</ul>
<pre><code>#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;
}
}
voidIO_init (void) //GPIO口初始化
{
P5M0 =0X00;
P5M1 =0X00;
}
void main (void) //主函数
{
IO_init ();
tim0_init();
while (1)
{
}
}
</code></pre>
<p>效果如下:</p>
<p><img src="data/attachment/forum/202601/23/224002h1l666w6qfezi5f5.gif" alt="定时器0.gif" title="定时器0.gif" /></p>
<hr />
<p><strong>第八集 定时器周期性调度任务</strong></p>
<p>这个功能主要有定时器配合数组完成,第一步:初始化定时器,每次间隔一毫秒中断一次,在定时器服务函数里每次中断向数组里每个成员加一。第二步:在主函数里每个任务分别查询数组成员是否到达了定时值,然后执行该程序,最后清空数组成员自己写的代码:</p>
<pre><code>#include <stc8h.h>
#define led1 P54
#define led2 P32
#define led3 P33
unsigned int time_delay={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 chara ;
for (a=0;a<3;a++)
{
time_delay++;
}
}
voidIO_init (void)
{
P3M0 = 0X00; P3M1 = 0X00;
P5M0 = 0X00; P5M1 = 0X00;
}
void main (void)
{
IO_init ();
tim0_init();
while (1)
{
if (time_delay>=100)
{
led1 = ~led1;
time_delay = 0;
}
if (time_delay>=200)
{
led2 = ~led2;
time_delay = 0;
}
if (time_delay>=300)
{
led3 = ~led3;
time_delay = 0;
}
}
}
</code></pre>
<p><strong>效果如下:</strong></p>
<p><img src="data/attachment/forum/202601/25/194152dwlviz474wtqw6it.gif" alt="6a1ae46e07f64a5b523f79247a4a1e5700_00_00--00_00_20.gif" title="6a1ae46e07f64a5b523f79247a4a1e57.gif" /></p>
<hr />
<p><strong>第九集 数码管</strong></p>
<ol>
<li>什么是数码管,就是将LED封装在一起可以做成显示任何颜色的数字或者符号的显示器件。</li>
<li>数码管的分类,数码管可以分为共阴极和共阳极两种。</li>
<li>数码管的驱动方式,数码管去动可以是静态扫描显示,也可以是动态扫描显示。</li>
</ol>
<p><img src="data/attachment/forum/202601/25/200438qclvilzc4f47vtt0.png" alt="ScreenShot_2026-01-25_200301_132.png" title="ScreenShot_2026-01-25_200301_132.png" /></p>
<p><strong>一位数码管</strong></p>
<p><img src="data/attachment/forum/202601/25/200557gpzdjjexydj6ibch.png" alt="ScreenShot_2026-01-25_200353_987.png" title="ScreenShot_2026-01-25_200353_987.png" /></p>
<p><strong>四位数码管</strong></p>
<p><img src="data/attachment/forum/202601/25/200746i3cy8y143y4yff8r.png" alt="ScreenShot_2026-01-25_200440_467.png" title="ScreenShot_2026-01-25_200440_467.png" /></p>
<p><strong>特殊符号数码管</strong></p>
<p><img src="data/attachment/forum/202601/25/200841itzj1m1fj3f0mij3.png" alt="数码管.png" title="数码管.png" /></p>
<p><strong>数码管连接方式</strong></p>
<p>编写程序前先进行取模,利用<strong>AiCube-ISP软件进行取模:</strong></p>
<p><img src="data/attachment/forum/202601/25/203918o35p82mccpt23585.jpg" alt="取模1.jpg" title="取模1.jpg" /></p>
<p>第一步:打开<strong>AiCube-ISP</strong>点击工具</p>
<p><img src="data/attachment/forum/202601/25/204017my35q4aeewaijick.png" alt="取模2.png" title="取模2.png" /></p>
<p>第二步:点击字库生成工具</p>
<p><img src="data/attachment/forum/202601/25/204144nbzyp77p4irj4y00.png" alt="取模3.png" title="取模3.png" /></p>
<p>第三步:在弹出的窗口中点击像“8”的符号</p>
<p><img src="data/attachment/forum/202601/25/204319y931qqpqlpptqg9q.png" alt="取模4.png" title="取模4.png" /></p>
<p>第四步:选择和自己数码管一样的参数进行取模。</p>
<p>我这里有个三位数码管就用它做实验,程序源码:</p>
<pre><code>#include <stc8h.h>
unsigned int dsp_data =0;
unsigned char Loc ={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 chara =0;
a++;
if (a==100)
{
a=0;
dsp_data++;
if (dsp_data==1000)
dsp_data =0;
}
}
voidIO_init (void)
{
P5M0 = 0X00;
P5M1 = 0X00;
P3M0 = 0X38;
P3M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
}
void display(unsigned int number)
{
unsigned char *p,i;
Loc = number/100;
Loc = number%100/10;
Loc = 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);
}
}
</code></pre>
<p>实验现象,通过定时器不停的加数,让数码管做动态扫描显示效果如下:</p>
<p><img src="data/attachment/forum/202601/25/222642ebpeba1td26rjtk8.gif" alt="93f7d01455dda6d7d17b84e2c1a7097200_00_00--00_00_20.gif" title="93f7d01455dda6d7d17b84e2c1a70972.gif" /></p>
要 做到 USB不停电下载;
要 尝试 AiCube 图形化自动配置生成程序工具;
推荐优先看的:
printf_usb("Hello World !\r\n")及
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html
下载 最新的 AiCube-ISP-V6.96O 或以上版本软件 !
深圳国芯人工智能有限公司-工具软件
下载 最新的 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
推荐优先看的 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
页:
[1]