找回密码
 立即注册
查看: 205|回复: 1

Ai8051学习感悟

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:647
  • 最近打卡:2026-02-11 00:52:50

6

主题

320

回帖

2913

积分

金牌会员

积分
2913
发表于 2026-1-17 16:54:30 | 显示全部楼层 |阅读模式

第一集 - 序言

学习感悟:综合讲述了Ai8051的强大之处,通过以下实例讲解
1.屏幕显示和视频播放。
2.IIS录放音。
3.PWM_DMA
4.频谱分析仪。
5.手写计算器。
6.QSPI,PWM移相,硬件乘除,单精度浮点计算。
通过讲解了解了Ai8051功能的强大,激发了我对学习的热情。


第二集 - 硬件及工具介绍

学习感悟:学习并掌握了开发所需的工具。
1.讲解了实验箱的板载器件。

试验箱.png

2.软件及工具的下载
软件下载.png

下载最新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

添加库.png

2.添加代码:

ScreenShot_2026-01-23_205151_162.png

ScreenShot_2026-01-23_205229_026.png

添加头文件

ScreenShot_2026-01-23_205303_081.png

第四课的配套程序下载地址: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. 算术运算符:用于执行基本的数学运算,如加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
  2. 赋值运算符:用于将值赋给变量,最基本的赋值运算符是=。此外,还有复合赋值运算符,如+=、-=、*=、/=、%=等。
  3. 关系运算符:用于比较两个值,包括大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)和小于等于(<=)。
  4. 逻辑运算符:用于执行逻辑操作,包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。
  5. 位运算符:用于对二进制位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、左移(<<)和右移(>>)。
  6. 自增自减运算符:用于将变量的值增加1(++)或减少1(–)。
  7. 条件运算符:也称为三元运算符,用于根据条件返回两个值中的一个,语法为:条件 ? 结果1 : 结果。
  8. 逗号运算符:用于将多个表达式组合在一起,依次计算每个表达式的值,并返回最后一个表达式的值。
  9. 特殊运算符:包括sizeof运算符,用于计算数据类型或变量的大小。

第六集 IO口的输入输出

  1. 什么是IO口,就是通用输入输出端口,也就是可读可写的端口,他可能是低电平或高电平,也可能是模拟量,这里暂时不讨论。
  2. 什么是高电平?答:接近于VCC电压的电压称作为高电平,低电平相反它更接近于GND也就是0V。
  3. 讲解了IO口的四种模式:
  • 准双向IO口
  • 推挽模式
  • 开漏模式
  • 高阻模式

IO口.png


第七集 定时器中断

  • 主要讲了定时器的重要性,归纳一下:

单片机的定时器中断是单片机系统中核心的外设功能之一,其重要性体现在它能打破单片机 “顺序执行指令” 的固有逻辑,让系统具备精准的时间管理、异步事件响应、资源高效利用的能力,是实现实时控制、多任务调度、精准时序操作的基础,没有定时器中断,单片机的大部分工业、嵌入式应用都会无法实现。

简单来说,单片机本身是按指令周期逐条执行程序的,若仅靠 “延时函数”(软件延时)实现时间相关操作,会占用 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)
 {

  }
}

效果如下:

定时器0.gif


第八集 定时器周期性调度任务

这个功能主要有定时器配合数组完成,第一步:初始化定时器,每次间隔一毫秒中断一次,在定时器服务函数里每次中断向数组里每个成员加一。第二步:在主函数里每个任务分别查询数组成员是否到达了定时值,然后执行该程序,最后清空数组成员自己写的代码:

#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;
	}
   }
}

效果如下:

6a1ae46e07f64a5b523f79247a4a1e5700_00_00--00_00_20.gif


第九集 数码管

  1. 什么是数码管,就是将LED封装在一起可以做成显示任何颜色的数字或者符号的显示器件。
  2. 数码管的分类,数码管可以分为共阴极和共阳极两种。
  3. 数码管的驱动方式,数码管去动可以是静态扫描显示,也可以是动态扫描显示。

ScreenShot_2026-01-25_200301_132.png

一位数码管

ScreenShot_2026-01-25_200353_987.png

四位数码管

ScreenShot_2026-01-25_200440_467.png

特殊符号数码管

数码管.png

数码管连接方式

编写程序前先进行取模,利用AiCube-ISP软件进行取模:

取模1.jpg

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

取模2.png

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

取模3.png

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

取模4.png

第四步:选择和自己数码管一样的参数进行取模。

我这里有个三位数码管就用它做实验,程序源码:

#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);
  }
}

实验现象,通过定时器不停的加数,让数码管做动态扫描显示效果如下:

93f7d01455dda6d7d17b84e2c1a7097200_00_00--00_00_20.gif

回复

使用道具 举报 送花

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

14

主题

125

回帖

924

积分

版主

积分
924
发表于 2026-1-19 08:35:49 | 显示全部楼层

要 做到 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不停电下载, 演示视频链接

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:02 , Processed in 0.102036 second(s), 47 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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