AI8051U
AI8051U 功能强大,今天开始学习评估车规级工作温度
车规级工作温度 要 做到 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
CNUEFJ 发表于 2026-1-13 10:24
车规级工作温度
第一集 序言
AI8051U 优势
1、LCD 显示和Video 播放(Flash 编程)
2、IIS 录放音
3、PWM DMA
4、频谱分析
5、计算器
6、QSPI,PWM 移相,硬件乘除,单精度浮点 CNUEFJ 发表于 2026-1-13 10:24
车规级工作温度
第二集开发板(工具箱硬件配置)
CNUEFJ 发表于 2026-1-13 14:21
第二集开发板(工具箱硬件配置)
第三集 点亮LED
经典程序 ,温故知新{:ciya:}
CNUEFJ 发表于 2026-1-13 14:54
第三集 点亮LED
经典程序 ,温故知新
第四集 USB 不断电下载
1、传统方式 在代码重编译后生成HEX 文件,需要每次断电-->上电进入下载模式,操作费时
2、用USB 不断电下载,非常方便
CNUEFJ 发表于 2026-1-13 15:05
第四集 USB 不断电下载
1、传统方式 在代码重编译后生成HEX 文件,需要每次断电-->上电进入下载模式,操 ...
第五集 C 语言基础
C 语言基础核心总结
一、程序基本结构(入门基石)
[*]核心组成:C 程序以main()函数为唯一入口,整体结构为:预处理指令 → 全局声明 → 主函数 → 自定义函数。c
运行
#include <stdio.h>// 预处理指令:引入头文件int main() { // 主函数:程序入口,int表示返回整型 // 核心代码逻辑 printf("Hello C\n");// 功能语句:分号结尾 return 0; // 返回值:0表示程序正常结束}
[*]关键规则:所有语句以;结尾;注释分单行//和多行/* ... */;代码区分大小写。
二、数据处理基础(变量 / 常量 / 类型)
[*]核心数据类型(强类型语言,变量必须先定义后使用):
类型用途格式化符示例
int存储整数%dint age=18;
float单精度小数(精度低)%ffloat score=95.5;
double双精度小数(常用)%lfdouble pi=3.14159;
char单个字符(单引号)%cchar ch='A';
bool布尔值(需<stdbool.h>)%dbool flag=true;
[*]变量与常量:
[*]变量:值可修改,定义格式类型 变量名 = 初始值;(如int num=10;);
[*]常量:值不可改,两种定义方式:
[*]#define 常量名 值(无类型,预处理替换,如#define PI 3.14);
[*]const 类型 常量名 = 值(有类型,编译限制,如const int MAX=100;)。
[*]输入输出:
[*]输出:printf("格式化字符串", 变量),核心格式化符见上表;
[*]输入:scanf("格式化字符串", &变量),注意&取地址符(字符串数组名无需加&)。
三、运算符(程序运算核心)
按用途分类,核心常用运算符:
类别核心运算符说明
算术运算+、-、*、/、%%仅用于整数取余
赋值运算=、+=、-=、*=a+=5等价于a=a+5
关系运算>、<、>=、<=、==、!=返回 1(真)/0(假)
逻辑运算`&&(与)、(或)、!(非)`短路求值(一假则与运算结束)
四、流程控制(程序逻辑分支)
[*]分支结构:
[*]if-else:处理复杂条件(如范围判断),格式:c
运行
if (条件) { 语句1; } else if (条件2) { 语句2; } else { 语句3; }
[*]switch:处理固定值匹配(如菜单选择),格式:c
运行
switch (表达式) { case 常量1: 语句1; break; // break避免穿透 case 常量2: 语句2; break; default: 语句3;}
[*]循环结构:
[*]for:已知循环次数(如遍历 1-100),格式:for(初始化; 条件; 步长) { 循环体; };
[*]while:未知循环次数(如用户输入正确值为止),格式:while(条件) { 循环体; };
[*]do-while:至少执行一次循环,格式:do { 循环体; } while(条件);;
[*]循环控制:break终止整个循环,continue跳过本次循环剩余语句。
五、数组(批量存储同类型数据)
[*]一维数组:定义类型 数组名[长度];(如int arr = {1,2,3,4,5};),通过下标访问(下标从 0 开始);
[*]字符数组:存储字符串,以\0结尾(如char name = "Tom";),可通过%s整体输入输出。
六、函数(代码复用核心)
[*]基本格式:返回值类型 函数名(参数列表) { 函数体; return 返回值; };
[*]无返回值用void,无参数可写void;
[*]示例:int add(int a, int b) { return a+b; }。
[*]调用规则:函数需先声明(或定义)后调用,声明格式:返回值类型 函数名(参数类型列表);(如int add(int, int);)。
总结
[*]C 语言是结构化、强类型语言,程序入口固定为main()函数,语句必须以分号结尾;
[*]数据处理核心是「类型 + 变量 / 常量」,输入输出依赖printf/scanf,需匹配对应格式化符;
[*]程序逻辑由「分支(if/switch)+ 循环(for/while)」控制,函数是代码复用的核心方式。
CNUEFJ 发表于 2026-1-13 15:12
第五集 C 语言基础
第六集 GPIO
1、GPIO 定义 (gernral purpose IO Ports ),通用输入/输出端口
2、典型例程:
// 8051寄存器定义头文件,不同编译器(如Keil C51)需确保该头文件存在#include <reg52.h>// 引脚定义:简化代码可读性sbit LED = P1^0; // 定义P1.0为LED控制引脚sbit KEY = P3^2; // 定义P3.2为按键输入引脚// 延时函数:软件延时,约100ms(晶振11.0592MHz)void delay_100ms(void) { unsigned int i, j; for(i = 1000; i > 0; i--) for(j = 110; j > 0; j--);}// 主函数:程序入口void main(void) { LED = 1; // 初始化LED为熄灭状态(假设LED共阳接法,高电平灭) while(1) { // 死循环,程序持续运行 // 检测按键是否按下(按键低电平有效) if(KEY == 0) { delay_100ms();// 消抖:延时避开按键机械抖动 if(KEY == 0) {// 再次确认按键按下 LED = 1; // 强制熄灭LED // 等待按键松开 while(KEY == 0); } } else { // 按键未按下,LED正常闪烁 LED = ~LED; // 翻转LED状态(亮→灭/灭→亮) delay_100ms();// 延时,控制闪烁频率 } }}
CNUEFJ 发表于 2026-1-13 15:16
第六集 GPIO
第七集 定时器中断
AI8051U 完全兼容传统 8051 的定时器 / 中断架构,核心差异仅在于晶振配置或寄存器地址(实际开发中基本通用),下面以定时器 0 工作在模式 1(16 位定时器) 为例,实现 LED 每 1 秒精准闪烁
例程
// AI8051U寄存器头文件(兼容reg52.h,无差异可直接使用)#include <reg52.h>// 引脚定义:P1.0控制LEDsbit LED = P1^0; // 全局变量:中断计数(定时器0每10ms中断1次,累计100次即为1秒)unsigned int interrupt_cnt = 0;// 定时器0初始化函数:配置16位定时器,11.0592MHz晶振,定时10msvoid Timer0_Init(void) { // 1. 配置定时器模式:模式1(16位定时器/计数器) TMOD &= 0xF0;// 清空定时器0的模式位(低4位) TMOD |= 0x01;// 设置定时器0为模式1(M1=0, M0=1) // 2. 设置定时器初值:11.0592MHz晶振,定时10ms // 计数周期 = 1/11059200 * 12 = 1.085μs/个机器周期 // 10ms需要计数次数:10000μs / 1.085μs ≈ 9216 次 // 16位定时器最大值65536,初值 = 65536 - 9216 = 56320 = 0xDC00 TH0 = 0xDC; // 高8位初值 TL0 = 0x00; // 低8位初值 // 3. 开启定时器中断和总中断 ET0 = 1; // 使能定时器0中断 EA = 1; // 使能总中断(8051核心,所有中断必须开总中断) // 4. 启动定时器0 TR0 = 1; // 定时器0开始运行}// 定时器0中断服务函数(固定函数名,不可修改)void Timer0_ISR(void) interrupt 1 { // 重新加载初值:模式1无自动重装,需手动补初值避免定时误差 TH0 = 0xDC; TL0 = 0x00; // 中断计数:每10ms中断1次,累计100次=1秒 interrupt_cnt++; if(interrupt_cnt >= 100) { interrupt_cnt = 0; // 重置计数 LED = ~LED; // 翻转LED状态(1秒闪烁1次) }}// 主函数:程序入口void main(void) { LED = 1; // 初始化LED熄灭(共阳接法) Timer0_Init(); // 初始化定时器0 while(1) { // 死循环,程序后台靠中断运行 // 主循环可执行其他任务,不影响定时器中断 }}
页:
[1]