找回密码
 立即注册
查看: 399|回复: 6

AI8051u学习打卡(感悟)

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-15 18:07:53 | 显示全部楼层 |阅读模式
(AI8051U简介)

AI8051U.png
对比前代大幅度增强


支持32位和8位指令集, RMB2.3
管脚兼容89C52RC,  12C5A60S2
兼容 8位8051指令集,  可以用 Keil C51/IAR/SDCC 编译器
兼容 32位8051指令集,可以用 Keil C251 编译器,双核兼容设计





QSPI优化完善,屏幕显示增强
IIS优化
PWM_DMA,支持PWM硬件移项,DMA_P2P优化,支持外设to外设DMA
硬件乘除,单精度浮点,三角函数

,


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-15 18:45:25 | 显示全部楼层
二(开发所需硬件及工具介绍)

!!!最重要的实验箱!!!

硬件实验箱.png
硬件实验箱2.png

试验箱在手,基本不需要另外买其他硬件。

软件方面:
Keil软件,芯片手册,官方代码包,stcisp
keil安装配置后需要通过stcisp添加头文件,中断拓展插件

批注 2025-01-15 182026.png

keil软件配置截图
批注 2025-01-15 182850.png
批注 2025-01-15 182906.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-15 19:02:48 | 显示全部楼层
三(点亮LED)

下面是常规的新建工程
屏幕捕获_2025_01_15_18_51_38_818.png
新建工程选项
屏幕捕获_2025_01_15_18_52_00_542.png
选择文件夹,输入工程名
屏幕捕获_2025_01_15_18_52_33_997.png
选择芯片型号
屏幕捕获_2025_01_15_18_52_38_605.png
屏幕捕获_2025_01_15_18_52_49_523.png
添加main函数
屏幕捕获_2025_01_15_18_52_56_880.png
屏幕捕获_2025_01_15_18_52_59_192.png
屏幕捕获_2025_01_15_18_53_09_517.png
添加头文件
屏幕捕获_2025_01_15_18_53_15_312.png
写主循环固定格式代码
屏幕捕获_2025_01_15_18_54_17_389.png
接下来就是点亮LED主程序
屏幕捕获_2025_01_15_18_54_29_402.png


参考数据手册的IO口说明
屏幕捕获_2025_01_15_19_01_31_282.png
屏幕捕获_2025_01_15_19_01_34_968.png
屏幕捕获_2025_01_15_19_01_47_492.png
屏幕捕获_2025_01_15_19_01_52_725.png

主程序如下



#include "ai8051u.h"                //调用头文件


void main(void)
{

//端口配置
        P0M0 = 0;                //P0端口(P00-P07)为准双向口
        P0M1 = 0;
       
        P4M0 = 0;                //P4端口为准双向口
        P4M1 = 0;       
       
        while(1)
        {
                P40 = 0;        //P40端口输出0V
                P00 = 0;        //P00端口输出0V
                P01 = 0;        //P01端口输出0V
        }
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-16 10:15:27 | 显示全部楼层
四(USB不停电下载)


STC的单片机下载程序必须要手动按下按钮才可以,操作比较繁琐
现在有一个可以解放双手的办法,不需要再去按按钮

修改stcisp软件设置
这是未设置;
屏幕捕获_2025_01_16_09_47_06_925.png
设置成这样;
屏幕捕获_2025_01_16_09_48_55_933.png

首先需要到stc官网下载例程和库

软件工具,库函数
屏幕捕获_2025_01_16_09_55_15_891.png
这个usb库文件跟官网视频不同,官网视频库函数和示例代码是分开的
但是应该是改了,现在只需要下载一次就可以
屏幕捕获_2025_01_16_09_51_14_348.png
下图是文件下载后的压缩包
屏幕捕获_2025_01_16_09_53_12_281.png
我们用的是轮询模式CDC
所以库函数和示例代码全部用轮询CDC
屏幕捕获_2025_01_16_09_53_25_546.png
屏幕捕获_2025_01_16_09_53_33_466.png

下一步导入例程和库文件

找到32位的例程打开
屏幕捕获_2025_01_16_10_09_17_109.png

查看寄存器配置

屏幕捕获_2025_01_16_10_12_28_282.png
屏幕捕获_2025_01_16_10_12_36_93.png
屏幕捕获_2025_01_16_10_12_43_122.png

主要是配置中断寄存器使能

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;            //使能总中断


然后打开之前的代码
修改和融合后变成这样
屏幕捕获_2025_01_16_10_10_16_578.png

下载后就可以实现想要的无按键下载
屏幕捕获_2025_01_16_09_59_17_602.png
屏幕捕获_2025_01_16_10_02_19_453.png
屏幕捕获_2025_01_16_10_03_08_535.png
屏幕捕获_2025_01_16_10_03_24_843.png
屏幕捕获_2025_01_16_10_05_58_73.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-16 10:42:22 | 显示全部楼层





USB-CDC串口printf函数
串口对于调试来说非常重要,这是所有单片机入门必须要会的

下图是函数原型解释
屏幕捕获_2025_01_16_10_23_07_712.png

此处需要根据注释调整函数重定向
屏幕捕获_2025_01_16_10_25_46_396.png

改完定义就可以直接使用printf函数
屏幕捕获_2025_01_16_10_29_25_884.png

下一个就是类型转换


下图是函数类型转换的解释
屏幕捕获_2025_01_16_10_32_18_388.png
屏幕捕获_2025_01_16_10_32_37_564.png
屏幕捕获_2025_01_16_10_32_45_730.png
以上是CDC串口相干

下面是C语言相关的基础知识

下图是进制转换相关图表
屏幕捕获_2025_01_16_10_38_59_436.png
数据长度和容量图表
屏幕捕获_2025_01_16_10_39_09_137.png
运算符图表
屏幕捕获_2025_01_16_10_39_19_650.png
屏幕捕获_2025_01_16_10_39_25_602.png
屏幕捕获_2025_01_16_10_39_34_567.png
屏幕捕获_2025_01_16_10_39_42_549.png
屏幕捕获_2025_01_16_10_39_53_866.png
屏幕捕获_2025_01_16_10_39_59_260.png




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-16 11:11:35 | 显示全部楼层
六(GPIO输入输出)



GPIO(General Purpose I/O Ports)通用输入/输出端口


GPIO的本质就是对引脚输出电平的控制和引脚输入电平的读取

手册中有详细的端口触发电压介绍
屏幕捕获_2025_01_16_10_49_35_571.png

端口模式介绍
屏幕捕获_2025_01_16_10_53_47_822.png
屏幕捕获_2025_01_16_10_53_50_618.png
屏幕捕获_2025_01_16_10_53_53_148.png
屏幕捕获_2025_01_16_10_53_57_939.png
屏幕捕获_2025_01_16_10_54_21_589.png
屏幕捕获_2025_01_16_10_54_33_118.png

IO口相关寄存器介绍
屏幕捕获_2025_01_16_11_05_13_484.png


端口施密特触发器寄存器介绍
屏幕捕获_2025_01_16_11_02_43_879.png
屏幕捕获_2025_01_16_11_00_21_828.png


端口上下拉电阻寄存器介绍
屏幕捕获_2025_01_16_10_54_38_788.png
屏幕捕获_2025_01_16_10_54_41_756.png

端口模式配置寄存器介绍
屏幕捕获_2025_01_16_10_58_50_110.png

以上配置寄存器已经全部了解
以下是代码实现原理


电路部分
屏幕捕获_2025_01_16_11_06_12_459.png
程序直接读取按键的IO的电平


软件部分
主循环代码以及注释;

                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        P00 = 0;
                }
                else
                {
                        P00 = 1;
                }
               
               
               
                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
                if( P32 == 1 )                                                                //判断P32按钮是否按下
                {
                        P00 = 0;
                }
                else
                {
                        P00 = 1;
                }
               
                //任务3:按一下灯亮,按一下灯灭
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                state = !state;                                                //变量取反 0 1 0 1 0 1
                                P00 = state;
                                printf("state:%d\r\n",(int)state);
                               
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-27 16:33:18
已绑定手机

1

主题

8

回帖

43

积分

新手上路

积分
43
发表于 2025-1-16 14:22:20 | 显示全部楼层
七(定时器中断)



定时器作用:
用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
替代长时间的Delay,提高程序的运行效率和处理速度(中断可以打断主循环)


官方手册中定时器的寄存器介绍
屏幕捕获_2025_01_16_13_34_14_238.png
屏幕捕获_2025_01_16_13_40_24_459.png
屏幕捕获_2025_01_16_13_40_27_739.png

以定时器0举例看手册

定时器控制寄存器TCON
定时器0就需要找TF0和TR0
屏幕捕获_2025_01_16_13_41_41_363.png
定时器模式控制寄存器
屏幕捕获_2025_01_16_13_41_51_985.png
屏幕捕获_2025_01_16_13_42_00_41.png

定时器0计数寄存器
屏幕捕获_2025_01_16_13_53_19_888.png


定时器中断请求寄存器
屏幕捕获_2025_01_16_13_51_23_980.png

定时器0模式0框图已经配置说明
屏幕捕获_2025_01_16_13_55_25_991.png
下图是配置说明以及计算方法
屏幕捕获_2025_01_16_14_04_42_977.png
这里不得不提,中文版的寄存器手册太方便了,哈哈


这里的寄存器配置即便是中文版的,也是有缺陷的,比如翻找手册太慢了,再比如自己计算很容易出错
所以stc官方的stcisp软件已经有了全自动的配置生成工具
下面放配置截图
屏幕捕获_2025_01_16_14_08_46_540.png

当然还有手册中中断入口函数的说明
屏幕捕获_2025_01_16_14_21_34_180.png

带注释的配置
void Timer0_Isr(void) interrupt 1
这个函数是中断入口,使能中断以后必须要有入口
一些简单的比如io反转可以直接放进去,
这也是开启定时器中断的最终目的,把会阻塞主循环的简单功能放到定时器中断,这样主循环会空出时间做一些实时需要处理的问题,比如按键检测

下面放上测试代码



void Timer0_Init(void);                //3秒@24.000MHz                //函数声明

void main(void)
{
       
    P0M1 = 0x00;   P0M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    Timer0_Init();                                                                        //定时器初始化
       

       
        while(1)
        {
               if( P32 == 0 )       
               {
                     p01=0;
               }                                               
        {
}
       


void Timer0_Init(void)                //3秒@24.000MHz        函数定义
{
        TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x3F;                                //设置定时初始值
        TH0 = 0x01;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        EA = 1;                                //使能总中断                               
}


void Timer0_Isr(void) interrupt 1                //3秒执行一次
{
        state = !state;               
       
        P00 = state;
}




回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-6 16:24 , Processed in 0.135856 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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