找回密码
 立即注册
楼主: 垂柳工作室

AI8051U单片机学用打卡 | 到这步可直接要 【免费+包邮送】的AI8051U实验箱

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-10-02 07:15:49

25

主题

119

回帖

317

积分

中级会员

积分
317
发表于 2025-9-22 17:38:07 | 显示全部楼层
新学期伊始,不忘助力国产替代初心,手头没有试验箱,先用“擎天柱”带领大一同学,跟随冲哥视频,学用STC AI8051U芯片讲义。
第六节 学用调试仿真接口7段数码管,温习浮点数存储
本节课主要任务是用擎天柱配合烧录工具cdc/hid串口助手,调用7段数码管接口,温习IEEE754标准
一、准备验证工作。
拷贝上节课代码,连接擎天柱到电脑上,打开烧录工具,鼠标点击菜单“调试仿真接口”找到并鼠标左键点击打开“接口协议及帮助”,再鼠标左键点击“调试仿真接口”菜单“接口协议及帮助”,鼠标左键点击打开“7段数码管接口”,学习功能3和功能4
二、学用7段数码管接口功能4指令。
在数码管上直接显示所给的段码命令格式:
图片1.png
STC工程师封装函数名SEG7_ShowCode,可直接调用,函数只有一个参数,是装载数码管8个段状态值的数组。本节课直接调用,配合擎天柱让虚拟数码管显示流动数字。
1. 定义变量。在task.c文件中定义一个变量和一个数组:
u8 NixieTube_index = 0;
u8 NixieTube_code[8];
2. 在task.c文件中定义一个任务回调函数:
void Show_NixieTube(void)
    {
     NixieTube_code[0] = t_display[NixieTube_index];
      if(NixieTube_index + 1 > 9)
         {
             NixieTube_code[1] = t_display[NixieTube_index-9];
         }
          else
          {
                NixieTube_code[1] = t_display[NixieTube_index+1];
            }
           if(NixieTube_index + 2 > 9)
           {
               NixieTube_code[2] = t_display[NixieTube_index-8];
           }
            else
          {
                NixieTube_code[2] = t_display[NixieTube_index+2];
             }
           if(NixieTube_index + 3 > 9)
            {
                NixieTube_code[3] = t_display[NixieTube_index-7];
            }
           else
            {
               NixieTube_code[3] = t_display[NixieTube_index+3];
           }
           if(NixieTube_index + 4 > 9)
          {
             NixieTube_code[4] = t_display[NixieTube_index-6];
            }
            else
            {
                 NixieTube_code[4] = t_display[NixieTube_index+4];
            }
           if(NixieTube_index + 5 > 9)
          {
              NixieTube_code[5] = t_display[NixieTube_index-5];
            }
             else
             {
                   NixieTube_code[5] = t_display[NixieTube_index+5];
             }
             if(NixieTube_index + 6 > 9)
            {
                NixieTube_code[6] = t_display[NixieTube_index-4];
           }
          else
          {
              NixieTube_code[6] = t_display[NixieTube_index+6];
            }
          if(NixieTube_index + 7 > 9)
          {
           NixieTube_code[7] = t_display[NixieTube_index-3];
           }
         else
        {
            NixieTube_code[7] = t_display[NixieTube_index+7];
         }
           SEG7_ShowCode(NixieTube_code);
            if(++NixieTube_index >9)  NixieTube_index = 0;
}
3. task.c文件中TASK_COMPONENTS Task_Comps函数内添加一行任务代码:{0, 5000, 5000, Show_NixieTube}
4. 在task.h文件中申明一下任务回调函数
void Show_NixieTube(void);
5. 编译烧录到擎天柱,打开烧录工具CDC/HID串口助手和虚拟数码管,欣赏流水数字。
三、温习浮点数存储
虚拟数码管功能3使用说明提到了IEEE754格式,有同学问为何3.14159存储数据是40H  49H  0FH  D0H
1.单精度浮点数IEEE 754标准存储概述。
单精度浮点数在计算机内存中的表示遵循 IEEE 754标准,使用 32位(4字节) 来表示,这32位被划分为三个部分:
A、符号位 (Sign): 最高位(第31位),1位。0表示正数,1表示负数。
B、指数位 (Exponent): 中间8位(第30位到第23位)。为了能表示负指数,引入了偏移码,其实际值 =无符号整数值-127。
C、尾数位 (Fraction/Significand): 最低23位(第22位到第0位)。存储的是小数部分,整数部分的1被隐含,称为“隐含的1”。
2.转换计算
40H  49H  0FH  D0H
第一步:用计算器程序员模式将上述十六进制转换为完整的32位二进制:
0100 0000 0100 1001 0000 1111 1101 0000
第二步:划分IEEE 754的三个部分
符号位 S (第31位): 0 (正数)
指数位 Exp (第30-23位): 1000 0000
尾数位 Frac (第22-0位): 1001 0010 0001 1111 1010 000
第三步:计算指数
将指数位Exp: 1000 0000 转换为十进制:128
减去偏移量 127:128 - 127 = 1
实际指数 E = 1
第四步:还原完整的尾数
规范化形式的二进制科学计数法有一个隐含的1,将隐含的1和23位尾数位组合起来,完整的尾数
M =1.10010010000111111010000
第五步:计算十进制数值
计算原理: 数值 = (符号) * (完整尾数M的十进制值) * (2 ^ 指数E)
计算完整尾数 M 的十进制值:
整数部分: 1 = 1
小数部分:
1st digit: 1 * (1/2) = 0.5
2nd digit: 0 * (1/4) = 0
3rd digit: 0 * (1/8) = 0
4th digit: 1 * (1/16) = 0.0625
5th digit: 0 * (1/32) = 0
6th digit: 0 * (1/64) = 0
7th digit: 1 * (1/128) = 0.0078125
8th digit: 0 * (1/256) = 0
9th digit: 0 * (1/512) = 0
10th digit: 0 * (1/1024) = 0
11th digit: 0 * (1/2048) = 0
12th digit: 1 * (1/4096) = 0.000244140625
13th digit: 1 * (1/8192) = 0.0001220703125
14th digit: 1 * (1/16384) = 0.00006103515625
15th digit: 1 * (1/32768) = 0.000030517578125
16th digit: 1 * (1/65536) = 0.0000152587890625
17th digit: 0 * (1/131072) =0.00000762939453125
18th digit: 1 * (1/262144) = 0
19th digit: 1 * (1/524288) =0.0000019073486328125
20th digit: 0 * (1/1048576) = 0
21th digit: 1 * (1/2097152) = 0
22th digit: 0 * (1/4194304) = 0
22th digit: 0 * (1/8388608) = 0
将上述所有值相加
1+0.5+0.0625+0.0078125+0.000244140625+0.0001220703125+0.00006103515625+0.000030517578125+0.0000152587890625+0.00000762939453125+0.0000019073486328125=1.5707950592041015625
1.5707950592041015625×2=3.141590118408203125
同学们好学可赞,不过了解一下即可,没必要花太多时间研究。

06学用调试仿真接口7段nixietube.zip

475.57 KB, 下载次数: 1

学用STC公司AI8051U芯片讲义6.docx

47.14 KB, 下载次数: 2

虚拟数码管显示流动数字.mp4

1.3 MB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-10-02 07:15:49

25

主题

119

回帖

317

积分

中级会员

积分
317
发表于 2025-9-25 15:48:47 | 显示全部楼层
新学期伊始,不忘助力国产替代初心,手头没有试验箱,先用“擎天柱”带领大一同学,跟随冲哥视频,学用STC AI8051U芯片讲义。
第七节 学用PWM驱动擎天柱LED
本节课主要任务是学习PWM相关寄存器及配置产生PWM方波,动态改变方波占空比,驱动擎天柱P2端口LED,展示呼吸效果。
一、学习了解PWM相关寄存器
芯片手册第二十九章介绍PWMSTC AI8051U内部集成了8通道16位高级PWM定时器,分PWMAPWMB两组,其中PWMA可配置4组互补/对称STC AI8051U芯片/死区控制的PWM或者捕捉外部信号。PWMBPWMA唯一区别是PWMA可带死区的互补对称PWM,其他功能一样,所以我们只学习好PWMA即可。
PWMA时钟频率可以用系统时钟或外部计时,PWMA时基单元包含,16位计数器、16位自动重载寄存器、重复计数器、预分频器。
图片1.png
其时钟频率是经过设置PWMA_PSCRHPWMA_PSCRL,进行分频(值1-65535);配置输入输出的引脚寄存器PWMA_ENO;配置PWMA_CCMR1PWMA_CCER1PWMA_BKR,打开PWMA_CR1计数,产生PWM信号输出。
二、配置PWM相关寄存器
1.时钟源选择, 这里选用系统时钟,默认40Mhz
2.时基单元选择
PWMA_PSCR
图片2.png
//设置周期时间
PWMA_ARR
图片3.png
//设置捕获比较寄存器
PWMA_CCR//设置占空比时间
图片4.png
3.输入输出的引脚配置
//使能PWM1n通道输出
PWMA_ENO
图片5.png
//选择PWMP2引脚输出
PWMA_PS
擎天柱LED灯接P2端口,所以要配置PWMP2端口输出
图片6.png
4.输入输出模式设置
//配置通道输出使能和极性
PWMA_CCER
图片7.png
//通道PWM模式配置
PWMA_CCMR
图片8.png
//使能主输出
PWMA_BKR = 0X80;
图片9.png
//使能ARR预装载,启动计数器
PWMA_CR1
图片10.png
三、定义相关变量和任务函数
1. 定义9个变量,4个变量记录占空比,4个记录状态翻转LED灯亮度,1个编辑记录周期。
占空比:PWM1_DutyPWM2_DutyPWM3_DutyPWM4_Duty
翻转状态:PWM1_FlagPWM2_FlagPWM3_FlagPWM4_Flag
计数周期:PWM_PERIOD
2. 定义一个动态改变占空比函数。
void ChangePWM (void)
{
if(!PWM1_Flag)
    {
        PWM1_Duty++;
        if(PWM1_Duty > PWM_PERIOD) PWM1_Flag = 1;
    }
    else
    {
        PWM1_Duty--;
        if(PWM1_Duty <= 0) PWM1_Flag = 0;
    }
    if(!PWM2_Flag)
    {
        PWM2_Duty++;
        if(PWM2_Duty > PWM_PERIOD) PWM2_Flag = 1;
    }
    else
    {
        PWM2_Duty--;
        if(PWM2_Duty <= 0) PWM2_Flag = 0;
    }
    if(!PWM3_Flag)
    {
        PWM3_Duty++;
        if(PWM3_Duty > PWM_PERIOD) PWM3_Flag = 1;
    }
    else
    {
        PWM3_Duty--;
        if(PWM3_Duty <= 0) PWM3_Flag = 0;
    }
    if(!PWM4_Flag)
    {
        PWM4_Duty++;
        if(PWM4_Duty > PWM_PERIOD) PWM4_Flag = 1;
    }
    else
    {
        PWM4_Duty--;
        if(PWM4_Duty <= 0) PWM4_Flag = 0;
    }   
   
    PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
    PWMA_CCR1L = (u8)(PWM1_Duty);
    PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
    PWMA_CCR2L = (u8)(PWM2_Duty);
    PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
    PWMA_CCR3L = (u8)(PWM3_Duty);
    PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //设置占空比时间
    PWMA_CCR4L = (u8)(PWM4_Duty);
}
3. 编译烧录
拷贝上一节课代码,在task.c文件任务计划函数添加一行:{0,5,5,ChangePWM},为了避免LED亮灯冲突,要注释掉test_DemoP2=t_display[display_index]这一行代码。
新建一个pwm.c文件和pwm.h文件,并添加到项目中,创建PWM_config初始化函数和ChangePWM任务回调函数。
编译烧录,在欣赏过程中,建议捋清楚pwm配置过程,最好按手册中流程图记忆,这样方便日后配置。

07学用PWM_Drive_LED.rar

468.85 KB, 下载次数: 1

学用STC公司AI8051U芯片讲义7.docx

1.7 MB, 下载次数: 1

擎天柱呼吸灯效果.mp4

2.62 MB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-10-02 07:15:49

25

主题

119

回帖

317

积分

中级会员

积分
317
发表于 昨天 21:15 | 显示全部楼层
新学期伊始,不忘助力国产替代初心,AI8051U试验箱刚收到,结合“擎天柱”带领大一同学,跟随冲哥视频,学用STC AI8051U芯片讲义。
第八节、学用实验箱内芯片74HC595
本节课主要任务是学习芯片74HC595,点亮实验箱数码管。
一、学习了解移位寄存器74HC595
1.芯片概述:74HC595是一款8CMOS移位寄存器。8位并行输出端口为可控的三态输出,一个串行输出端口,可以实现多级芯片串行控制,组成 8n 位(n 为芯片数量)并行输出。
2.芯片管脚定义:管脚1-7158引脚为QAQH八位数据并行输出端;第八脚GND电源地;第九脚QH是串行数据输出管脚;第十脚RESET移位寄存器清零端;第十一脚SCK数据输入时钟端;第十二脚RCK输出存储器锁存时钟端;第十三脚EN输出使能端;第十四脚DATA数据输入端;第十六脚VCC电源端。
3.芯片真值表
输入管脚
输出管脚
14
12
11
10
13
SER
RCK
SCK
RESET
EN
X
X
X
X
H
QA~QH 输出端高阻态
X
X
X
X
L
QA~QH 输出端输出有效值 L 或 H
X
X
X
L
L
移位寄存器清零, Q'H=0
L
X
H
L
移位寄存器存储 L 值, Q'H输出 Qn-1
H
X
H
L
移位寄存器存储 H 值, Q'H输出 Qn-1
X
X
H
L
移位寄存器状态保持不变
X
X
H
L
8 位锁存移位寄存器中的状态值并行输出
X
X
H
L
存储器输出状态保持不变
二、实验箱数码管接法
1. 数码管电气连接:实验箱使用两块74HC595芯片,A74HC595芯片输出接数码管位码,B74HC595芯片输出接数码管段码(每个数码管abcdefgh合称段码),数据是从A级联到B;所以数据是要先传数码管段码再传位码。
图片1.png
三、实验箱代码学习
void Send_595(u8 dat)    //74HC595芯片发送数据函数
{
    u8  i;
    for(i=0; i<8; i++)
    {
        dat <<= 1;
        P_HC595_SER   = CY;  //P_HC595_SER = P3^4;  芯片第14引脚
        P_HC595_SRCLK = 1;  //P_HC595_SRCLK = P3^2; 芯片第11引脚
        P_HC595_SRCLK = 0;
    }
}
dat <<= 1 左移1位后,被移出去数存在CY寄存器中,P_HC595_SER = CY即数据从14脚输入,根据上面的真值表,可以知道,芯片第11引脚SCK电平上升沿即移位寄存器存储输入数据,超出8位数据从芯片第九引脚输出,级联到下一块74HC595芯片。
void DisplayScan(void)  //74HC595芯片读取数据函数
{
    Send_595(t_display[LED8[display_index]]);     //输出段码
    Send_595(~T_COM[display_index]);             //输出位码
    P_HC595_RCLK = 1;  //P_HC595_RCLK  = P3^5;芯片第12引脚
    P_HC595_RCLK = 0;
    if(++display_index >= 8)    display_index = 0;    //8位结束回0
}
实验箱的74HC595芯片AB12引脚接在一起,由P3^5统一控制,根据上面的真值表,可以知道,单片机P3^5引脚输出高电平,74HC595芯片AB输出数码管段码和位码。

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-3 06:59 , Processed in 0.111061 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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