z371322 发表于 2025-3-23 14:04:49

学习官方Ai8051U实验箱|学习打卡

感谢官方 免费+包邮 的 Ai8051U 实验箱。
借此实验箱学习一下 Ai8051U 的进阶操作,
在本贴记录一下学习过程。


第一集 序言


哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前

8051U强在哪里?

1.屏幕显示和视频播放(flash编程器)2.IIS录放音3.PWM_DMA4.频谱分析仪(上位机)5.手写计算器6.QSPI,PWM移相,硬件乘除,单精度浮点Ai8051U-LQFP48比普通 M0/M3,比 32F103C8T6 强太多的地方:1,Ai8051U有TFPU@120MHz, 算力比他强, uS级硬件三角函数/浮点运算器;2,Ai8051U的抗干扰比他强;3,Ai8051U的内部复位是专业级的复位电路,彻底省外部复位;4,Ai8051U的内部时钟完全满足串口通信要求,4组串口;5,Ai8051U-LQFP48有 QSPI, i8080/M6800-TFT 接口,32F103C8T6没有;6,Ai8051U的PWM支持硬件移相@120MHz7,Ai8051U是 34K SRAM, DMA 支持 外设直接到外设,P2P8,Ai8051U是 自带硬件USB, 1个芯片就能直接USB连接电脑仿真/下载,全球唯一



国芯人工智能 发表于 2025-3-23 14:08:00

感谢STC官方提供的免费且包邮的Ai8051U实验箱,这为开发者提供了宝贵的学习资源。Ai8051U作为一款高性能单片机,具备多项先进功能,如屏幕显示、视频播放、IIS录放音、PWMDMA、频谱分析仪、手写计算器、QSPI、PWM移相、硬件乘除以及单精度浮点运算等。其TFPU@120MHz的性能显著优于普通M0/M3及32F103C8T6,展现了其在处理复杂任务时的强大能力。通过此实验箱,开发者可以深入探索Ai8051U的进阶操作,提升技术实力,为未来的项目开发奠定坚实基础。期待后续的学习打卡记录,共同见证技术进步。

[本文内容由国芯人工智能辅助生成,仅供参考]

z371322 发表于 2025-3-23 14:24:43

第二集 硬件及工具介绍
实验箱由透明外壳、集成元器件的PCB主板、连接线缆及短路帽等构成。PCB主板为焊接完成的电路板,短路帽用于开发调试。
正面接口包括:

USB Type-A:连接电脑烧录程序;
USB Link ED:直接接入调试工具;
USB Type-C:兼容手机数据线下载。
背面接口含双串口转换芯片(支持串口实验)及TF卡槽(用于文件系统操作)。

试验箱支持双通道输出(立体声接口/耳机接口)及麦克风录音。
配备OLED屏、SPI/I2C接口、八位数码管及并口TFT彩屏接口,可执行点灯实验、时钟实验及动态画面展示。八路流水灯与4×2矩阵键盘
背面组件包括:

无源晶振:高精度RTC时钟源;
24C02芯片:非易失存储关键数据;
DS18B20:高精度温度检测;
SP3485:485通信支持;
无源蜂鸣器:声音信号输出。

其它一些物料按需自行选购,已从网上下单部分元件。
CR1220电池
LCD1602 (3.3V)
LCD12864(ST7920-M6800接口)
LCD12864(ST7565R)
2.4寸TFT 320*240(ILI9325)
3.5寸TFT (ILI9486)
1.3寸TFT 240*240 (ST7789)
OLED12864 (SSD1306)

需安装以下工具:

KEIL C251:用以编译32位程序。KEIL C51,可以编译8位程序。双核芯片开发方便。
STC-ISP(V6.94Y+):通过官网下载,烧录程序至单片机。

z371322 发表于 2025-3-23 14:33:57

第三集
新建8051U工程
打开开发软件(如Keil或STC-ISP)
点击菜单栏"File → New Project"
在弹出窗口选择项目存放路径(示例:D:\demo)
输入工程名(建议英文如"LED_Test")
选择单片机型号:STC AI8051U(注意选择32位版本)


添加源代码
右键工程 → New File → 保存为main.c
双击工程目录的"Source Group" → 添加main.c到工程
推荐创建以下基础代码框架:


配置工程参数
右击工程选择"Options"
在"Target"选项卡:
Memory Model选"xsmall"(小项目)或"Large 64K"(大项目)
在"Output"选项卡:
勾选"Create HEX File"
HEX格式选择"Intel-HEX"
添加头文件技巧
从STC官网下载最新头文件包
解压后复制AI8051U.h到工程根目录
在代码中使用绝对路径包含:
#include "D:/demo/AI8051U.h"
(或使用相对路径#include "AI8051U.h")


#include "ai8051.h"

void main(void)
{
       
        P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0xff;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
       
        P40=0;
        while(1)
        {
        P00=0;
        }
}

z371322 发表于 2025-3-23 14:43:19

第四集
学习USB不停电下载,

在STC官网(stcar.com)找到软件工具库函数中的USB库文件,下载该文件至本地电脑。下载完成后解压至特定文件夹,并确认文件中包含适合8系列和32G系列带硬件USB芯片的库文件。根据所选单片机的位数(8位或32位),选择相应的库文件进行移植和使用。

复制新下载的库文件到新创建的示例代码文件夹中,确保新文件与原有的C语言源文件(.c文件)和头文件(.h文件)等配套资源在同一目录下。然后,在上一节课的源代码基础上,添加新的头文件,以便利用新库文件中的功能。最后,对整合后的代码进行编译,确保移植的库文件与原有代码无冲突,且能正常运行。

复制所需的头文件(.h)和库文件(.lib)至项目目录下的指定文件夹(如slowC)下。这样做的目的是确保这两个文件能够被稳定且高效地调用,同时由于.lib文件是加密的,这样也便于防止代码被篡改,保证USB功能正常使用。

为了方便观察我复制里一段延迟代码,做了个闪烁的LED灯进行观察代码如下:
#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"

#define MAIN_Fosc      24000000UL

voiddelay_ms(u8 ms);

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      u8 i=0;
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0xff;   //设置为推挽输出
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
    P40=0;
      
      while(1)
      {
                if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
      }
                i++;
                if(i%128==0)
                {
                        P00=!P00;
                }
                delay_ms(5);
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

z371322 发表于 2025-3-23 15:23:08

第五集 C语言基础

按照教程做结果编译报警告,printf打印结果不正常。

搞了半天重新从例程里复制了#include "stdio.h"头文件解决


#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc      24000000UL

#define u8 unsigned char
#define u16 unsigned int
      
u8 X=20;
u8 Y=11;
voiddelay_ms(u8 ms);

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      u8 i=0;
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0xff;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
      IE2|=0x80;
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
    P40=0;
      
      while(1)
      {
                if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
//            printf("STC YYDS\r\n");
                        printf("X / Y = %u \r\n",(u16)(X/Y));
                        printf("X %% Y = %u \r\n",(u16)(X%Y));
                        if(X>Y)
                        {
                              printf("条件为真\r\n");
                        }
                        else
                        {
                              printf("条件为假\r\n");
                        }
            usb_OUT_done();
      }
                i++;
                if(i%128==0)
                {
                        P20=!P20;
                }
                delay_ms(10);
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

z371322 发表于 2025-3-23 15:27:52

第六集,IO输入输出,学习很简单,跟着视频做很容易就能学会,我用的延迟函数是之前从例程里面复制的很好用,不用到ISP里面生成了,很方便。
#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc      24000000UL

#define u8 unsigned char
#define u16 unsigned int
      
u8 state=1;

voiddelay_ms(u8 ms);

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      u8 i=0;
      
      WTST = 0;                                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                                 //提高访问XRAM速度
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0xff;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
      IE2|=0x80;
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
    P40=0;
      
      while(1)
      {
                if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                  usb_OUT_done();
      }      
                        //            printf("STC YYDS\r\n");
               
                        //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
//                        if(P32==0)                                                                        //判断P32按钮是否按下
//                        {
//                              P07=0;
//                        }
//                        else
//                        {
//                              P07=1;
//                        }
                     
                     
                        //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
//                        if(P32==0)                                                                        //判断P32按钮是否按下
//                        {
//                              P07=1;
//                        }
//                        else
//                        {
//                              P07=0;
//                        }
                     
                     
                        //任务3:按一下灯亮,按一下灯灭
                        if(P32==0)                                                                        //判断P32按钮是否按下
                        {
                              delay_ms(20);
                              if(P32==0)
                              {
                                        state=!state;
                                        P07=state;
                                        if(state)
                                        {
                                                printf("灯灭了 %u \r\n",state);
                                        }
                                        else
                                        {
                                                printf("灯亮了 %u \r\n",state);
                                        }
                                        while(P32==0);
                              }
                        }      
      
                i++;
                if(i%128==0)
                {
                        P00=!P00;
                }
                delay_ms(5);
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

z371322 发表于 2025-3-23 15:32:53

第六集 IO输入输出课后练习1,
要求按下P32一边4个灯亮,再按下P32换另外4颗灯亮。我发现P0端口和89c52一样,可以操作一组8个端口,这样就很方便了,只要给P0赋值0x0f,再或0xf0即可。

#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc      24000000UL

#define u8 unsigned char
#define u16 unsigned int
      
u8 state=1;

voiddelay_ms(u8 ms);

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
//      u8 i=0;
      
      WTST = 0;                                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                                 //提高访问XRAM速度
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
      IE2|=0x80;
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
    P40=0;
      
      while(1)
      {
                if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                  usb_OUT_done();
      }      
                        //            printf("STC YYDS\r\n");
               
                        //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
//                        if(P32==0)                                                                        //判断P32按钮是否按下
//                        {
//                              P07=0;
//                        }
//                        else
//                        {
//                              P07=1;
//                        }
                     
                     
                        //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
//                        if(P32==0)                                                                        //判断P32按钮是否按下
//                        {
//                              P20=1;
//                        }
//                        else
//                        {
//                              P27=0;
//                        }
                     
                     
                        //任务3:按一下灯亮,按一下灯灭
                        if(P32==0)                                                                        //判断P32按钮是否按下
                        {
                              delay_ms(20);
                              if(P32==0)
                              {
                                        state=!state;
                                       
                                        if(state)
                                        {
                                                P0=0xf0;
                                                printf("右边灯亮 %u \r\n",state);
                                        }
                                        else
                                        {
                                                P0=0x0f;
                                                printf("左边灯亮 %u \r\n",state);
                                        }
                                        while(P32==0);
                              }
                        }      
      
//                i++;
//                if(i%128==0)
//                {
//                        P00=!P00;
//                }
//                delay_ms(10);
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

z371322 发表于 2025-3-23 15:40:03

第六集 IO输入输出课后练习2,
要求按下P32亮一颗灯,再按一下亮两颗灯,直到全亮。
这里用到的方法是左移一位再或1,00000001左移一位,等于00000010|00000001=00000011。代码前面加了个if判断,如果变量state加到0xff之后将变量state置零。
这里需要注意的是,如果将state变量直接赋值给P2端口,这样的效果是按一下LED除P20之外全量,因为此时的值是00000001,此时可以将变量取反后赋值给P2端口。
这里我犯了一个错误,我将取反写成了P2=!state;这当然是错的,因为state结果不为零,取反后P2为0x00,此时灯全亮。
正确的用法是P2=~state; "~"这个符号是按位取反符。
此时结果正确,为了区分我加了一个变量LED_state来观察取反后的数值,然后用printf打印。


#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc      24000000UL

#define u8 unsigned char
#define u16 unsigned int
      
u8 state=0;
u8 LED_state=0;

voiddelay_ms(u8 ms);

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      
      WTST = 0;                                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                                 //提高访问XRAM速度
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
      IE2|=0x80;
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
    P40=0;
      
      while(1)
      {
                if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                  usb_OUT_done();
      }      
                        
                     
                        //任务:亮一颗灯,再按一下亮两颗灯,直到全亮。
                        if(P32==0)                                                                        //判断P32按钮是否按下
                        {
                              delay_ms(20);
                              if(P32==0)                                                                //再次判断P32确实被按下
                              {
                                        if(state==0xff)
                                        {
                                        state=0;
                                        }
                                        state=(state<<1)|1;
                                        LED_state=~state;
                                        P0=LED_state;
                                       
                                        printf("移位变量状态 %u \r\n",state);
                                        printf("LED变量状态 %u \r\n",LED_state);
                                        while(P32==0);
                              }
                        }      
      
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

z371322 发表于 2025-3-23 16:03:44

第七集 定时器中断,本集主要学习什么是中断,AI5081U 中断的配置方法,并且使用ISP软件的定时器配置工具配置中断。
以下程序为本集课后练习的程序。
课后小练
                电子功德箱
                1:按下按钮1,串口显示”双倍功德时间“,再次按下显示”单倍功德时间“
                2:按下按钮2,双倍功德时间下串口显示”功德+2 当前功德:xxx“
                3:按下按钮2,单倍功德时间下串口显示”功德+1 当前功德:xxx“
                4:功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
                5:功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
               

#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc      24000000UL

#define u8 unsigned char
#define u16 unsigned int
      
u8 state=1;

voiddelay_ms(u8 ms);
void Timer0_Init_1(void);
void Timer0_Init_2(void);


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
      u8 i=0;
      u16 y=0;
      WTST = 0;                                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                                 //提高访问XRAM速度
      
      P_SW2 |= 0x80;
      
      P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
      usb_init();                                     //USB CDC 接口配置
      IE2|=0x80;
    EA = 1;
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

      
      while(1)
      {
                if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                  usb_OUT_done();
      }      
                //课后小练
                /*电子功德箱
                1:按下按钮1,串口显示”双倍功德时间“,再次按下显示”单倍功德时间“
                2:按下按钮2,双倍功德时间下串口显示”功德+2 当前功德:xxx“
                3:按下按钮2,单倍功德时间下串口显示”功德+1 当前功德:xxx“
                4:功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
                5:功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
               
                if(P32==0)
                {
                        delay_ms(20);
                        if(P32==0)
                        {      
                */
                              state=!state;
                              if(state)
                              {
                                        printf("双倍功德时间\r\n");
                                        }
                              else
                              {
                                        printf("单倍功德时间\r\n");
                              }
                              while(P32==0);
                        }
                }
               
                if(P33==0)
                {
                        delay_ms(20);
                        if(P33==0)
                        {      
                              if(state)
                              {
                                        y=y+2;
                                        P27=0;
                                        printf("功德+2 当前功德 %u \r\n",y);
                                        Timer0_Init_2();
                              }
                              else
                              {
                                        y++;
                                        printf("功德+1 当前功德 %u \r\n",y);
                                        P27=0;
                                        Timer0_Init_1();
                              }
                              while(P33==0);
                        }
                }               
      
                i++;
                if(i%64==0)
                {
                        P20=!P20;
                }
                delay_ms(5);
               
      }
}

voiddelay_ms(u8 ms)
{
   u16 i;
   do{
          i = MAIN_Fosc / 6000;
          while(--i);
   }while(--ms);
}

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

void Timer0_Init_2(void)                //2秒@24.000MHz
{
      TM0PS = 0x3D;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0xFC;                              //设置定时初始值
      TH0 = 0x03;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断
}
void Timer0_Isr(void) interrupt 1
{
      P27=1;
      TR0 = 0;
}
页: [1] 2
查看完整版本: 学习官方Ai8051U实验箱|学习打卡