temmvkss 发表于 2025-1-15 18:07:53

AI8051u学习打卡(感悟)

(AI8051U简介)


对比前代大幅度增强


支持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
硬件乘除,单精度浮点,三角函数

,


temmvkss 发表于 2025-1-15 18:45:25

二(开发所需硬件及工具介绍)

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




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

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



keil软件配置截图


temmvkss 发表于 2025-1-15 19:02:48

三(点亮LED)

下面是常规的新建工程

新建工程选项

选择文件夹,输入工程名

选择芯片型号


添加main函数



添加头文件

写主循环固定格式代码

接下来就是点亮LED主程序



参考数据手册的IO口说明





主程序如下



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

temmvkss 发表于 2025-1-16 10:15:27

四(USB不停电下载)


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

修改stcisp软件设置
这是未设置;

设置成这样;


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

软件工具,库函数

这个usb库文件跟官网视频不同,官网视频库函数和示例代码是分开的
但是应该是改了,现在只需要下载一次就可以

下图是文件下载后的压缩包

我们用的是轮询模式CDC
所以库函数和示例代码全部用轮询CDC



下一步导入例程和库文件

找到32位的例程打开


查看寄存器配置





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

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


然后打开之前的代码
修改和融合后变成这样


下载后就可以实现想要的无按键下载

temmvkss 发表于 2025-1-16 10:42:22






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

下图是函数原型解释


此处需要根据注释调整函数重定向


改完定义就可以直接使用printf函数


下一个就是类型转换


下图是函数类型转换的解释



以上是CDC串口相干

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

下图是进制转换相关图表

数据长度和容量图表

运算符图表










temmvkss 发表于 2025-1-16 11:11:35

六(GPIO输入输出)



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


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

手册中有详细的端口触发电压介绍


端口模式介绍







IO口相关寄存器介绍



端口施密特触发器寄存器介绍




端口上下拉电阻寄存器介绍



端口模式配置寄存器介绍


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


电路部分

程序直接读取按键的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松开
                               
                        }
                }

temmvkss 发表于 2025-1-16 14:22:20

七(定时器中断)



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


官方手册中定时器的寄存器介绍




以定时器0举例看手册

定时器控制寄存器TCON
定时器0就需要找TF0和TR0

定时器模式控制寄存器



定时器0计数寄存器



定时器中断请求寄存器


定时器0模式0框图已经配置说明

下图是配置说明以及计算方法

这里不得不提,中文版的寄存器手册太方便了,哈哈


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


当然还有手册中中断入口函数的说明


带注释的配置
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;
}




页: [1]
查看完整版本: AI8051u学习打卡(感悟)