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

Ai8051U 学习 打卡

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-15 19:06:54 | 显示全部楼层 |阅读模式
非常感谢STC官方 主讲人冲哥

《第一集 序言》学习笔记


“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”


32位机、16位机甚至8位机 我们都不难理解 那么这里的1位机应该说的就是 特殊寄存器(SFR、ebdata)的位寻址方式

两个最重要网址:
STC官网:www.STCAI.com
STC论坛:www.STCAIMCU.com

两个重要文件:
Ai8051U单片机原理及应用:AI8051U.pdf
Ai8051U实验箱使用说明书:AI8051U实验箱V1.2使用说明书.pdf

Ai8051U 强在哪里 用以下几个实例分别表述
1、屏幕显示和视频播放(flash编程器)
    1.高帧率 汉字显示 界面旋转效果等 手写效果演示(精度很高 反应灵敏)
    2.视频级动画效果显示
      使用AIapp-ISP 的串行Flash编程器工具 根据提供的Flash型号和数据起始地址直接写入数据
      动画播放流畅
2、IIS录放音
   单片机直接驱动Microphone和喇叭实现录放功能 较以往需要外部模块的方式方便和简单
3、PWN_DMA
   实现了WS2812点阵屏电子钟 该方式可以直接驱动1000多颗2812灯珠 且不会有任何干扰
4、频谱分析仪(上位机)
   主要演示音频信号的频谱分析功能 利用了IIS录音以及高速运算能力实现FFT(快速傅里叶变换)
5、手写计算器
   名字中Ai的体现 可以对手写表达式识别和计算 经过优化的模型 速度快且准确
6、QSPI,PWM移相,硬件乘除,单精度浮点
   
Ai8051单片主要参数

1、USB型1T 8051 支持32位和8位指令集 34K SRAM(2K edata,32K xdata),64K Flash
2、价格 RMB 2.3元
3、管脚兼容89C52RC 12C5A60S2(可以直接利用51单片机最小系统板
4、可以用Keil C51/IAR/SDCC 开发 8位8051程序 相当于增强版的8H8K64U
5、可以用Keil C251开发32位8051程序 相当于增强版32G12K128、32G8K64
6、TFPU@120MHz,硬件浮点、硬件三角函数运算
7、DMA支持PWM,DMA支持外设直接到外设 P2P
8、120MHz-PWM支持硬件移相,16位PWM 真12位ADC
9、USB,4组串口,轨到轨比较器 QSPI SPI I2S I2C TFT-i8080/M6800接口
10、封装 PDIP40,LQFP44,LQFP48

附带学习 基本的程序下载方式
软件:AIapp-ISP V6.94X

ISP下载流程图.PNG
根据流程图可以看到既可以串口下载也可以USB口下载 (USB型8051)串口(TXD,RXD)USB口(D+ D-)Ai8051U直接处理


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



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-15 19:16:28 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第二集 硬件及工具介绍》学习笔记


“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”

一、AI8051U实验箱 介绍 (组件:系统板、 外壳、 跳线帽)
实验箱布局图.PNG
要点:
正面(从左下角开始顺时针方向解释)
                 1、USB-Type A、USB-Type C 的USB接入
                 2、USB转双串口的串口接入(STC公司自研替换CH340芯片 最高波特率可达10M)
                 3、USB Link 1D STC官方下载、烧录调试工具 接口
                 4、TF卡支持 示波器输入(板载波形调整电容)录、放音接口
                 5、显示屏 OLED SPI I2C 8/7线接口 板载贴片LED(点灯程序 流水灯程序) 8位数码管 TFT彩屏接口(并口)
                 6、掉电检测电压调节
                 7、红外接收、红外发射
                 8、矩阵键盘(4行两列 6个单片机引脚控制8个按键) ADC键盘(8行两列 1个单片机引脚控制16个按键)T0 T1 INT0 INT1独立按键
                 9、MCU Ai8051U LQFP48      
                 10、复位按键 电源按键(单片机断电上电)
                 11、Flash(QSPI) 片外数据存储芯片(AIapp-ISP 可以直接写入数据)
                 12、LCD对比度调节电位器
                 13、RTC电池 提供掉点后MCU内部计时器工作电压
                 14、跳线接口 若干
实验箱布局图背面.PNG
背面(从左上角开始逆时针解释)
                 1、32768Hz无源晶振
                 2、24C02 EEPROM (重要单片机数据存储器)
                 3、DS18B20 温度传感器
                 4、无源蜂鸣器
                 5、SP3485(485协议芯片)
                 6、AI8H2K12U USB转双串口芯片
                 7、(TP2604S)( 74HC4051、TP2604S)(LMV358)(TLLV320AIC23B I2S DAC)后续章节重点介绍

二、开发软件和工具介绍

1、开发软件: Keil C251 (Keil 官方网站)(如果希望 Keil C251 51 MDK共存 可参考手册6.1.2节)
2、下载ISP软件:AIapp-ISP 最新版(STC官网)www.stcai.com AI8051U手册 AIapp-ISP软件最新版下载(目前最新版 V6.95E )
3、添加头文件:AIapp-ISP软件内操作
4、Keil插件:Keil中断拓展
5、AI8051U实验箱代码包和手册

关键步骤:1、按住P3.2 按电源按键并松开 可以发现HID1 USB-Writer 设备
                2、IRC频率选择 (程序源代码main.c 有声明)
               
实验部分:1、下载安装Keil C251安装包,AIapp-ISP 下载烧录工具
                2、头文件注入
                3、下载并运行 跑马灯 例程






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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-16 00:02:33 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第三集 点亮第一颗LED》学习笔记


“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”

仔细阅读 《Ai8051U 单片机原理及应用》第六章相关内容 重点阅读 6.4节 6.5节(工程项目生成和必要设置)


要点:
       1、创建工程,选择单片机型号(STC单片机由AIapp-ISP软件注入)
       2、添加main.c文件
       3、Target设置
                  CPU Mode:Source(251 native)
            Memory Model:XSmall
            Code Rom Size:  Large:64K program(代码超过64K则选择 Huge:64Kfunctions,16M progr 并且设置 External Memory:#1 ROM start:0xFE0000 Size:0x20000 注意:设置的是ROM区域)

           Output设置
              勾选Create HEX File 生成单片机下载需要的.hex文件
              HEX Format:程序空间<64K HEX-80  程序空间>64K HEX-386
       4、头文件的添加
            <>和“” 引用头文件的区别
            <> 在系统路径查找头文件
            “” 在当前目录和系统路径查找头文件
             ai8051u.h头文件 可以通过AIapp-ISP 注入

手动输入如下代码:
        #include “ai8051u.h”  //单行注释写在这里
       void main(void)
       {
           //此处代码执行一次
          while(1)
          {
           //重复执行此处代码
          }
       }

联想:Arduino 程序结构


void setup() {
  // put your setup code here, to run once://执行一次

}

void loop() {
  // put your main code here, to run repeatedly://重复执行

}


修改上述代码如下 点亮板载LED

        #include “ai8051u.h”  
       void main(void)
       {
           P0M1=0x00;P0M0=0x00; //设置P0端口为准双向口

           P4M1=0x00;P4M0=0x00; //设置P4端口为准双向口
         
          P40=0;//P4.0低电平控制打开Q2SS8550三极管LED供电

          while(1)
          {
           P00=0;//低电平点亮LED
          }
       }

   IO设置可以通过AIapp-ISP 可视化生成代码 复制 粘贴到main.c即可        
IO口可视化配置.PNG

IO口 四种模式:准双向口 推挽输出 高阻输入 开漏输出  (参考13.2节 IO口模式解释)

   熟悉二进制 十六进制 对数值的表达方式  
     BIN:0000 0000
     HEX:0x00


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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-16 10:16:22 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第四集 USB不停电下载》学习笔记

“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”

资源列表:STC官网-软件工具-库函数-USB库文件(STC_USB_LIBRARY.zip
               选择CDC(USB-CDC方式) 暂时忽略HID(USB-HID方式)和ASM(汇编语言)的库文件和头文件 (stc_usb_cdc_32.LIB、stc32_stc8_usb.h
              
模式选择:查询模式(执行到相关代码时执行,使用这种方式的库文件)、中断模式(中断触发立即执行 需要实现BOOL usb_OUT_callback()方法


需要在自己的工程中添加如下代码:
                 ......
                 #include“stc32_stc8_usb.h”
                 ......
                 char *USER_DEVICEDESC=NULL;
                 char *USER_PRODUCTDESC=NULL;
                 char *USER_STCISPCMD="@STCISP#";  //"@STCISP#"对应AIapp-ISP中相关设置
                 ......
                 void main(void)
                 {
                        P_SW2|=0x80;         //P_SW2的B7位写1,使能访问XFR 或 EAXFR=1
                        ......
                        usb_init();    //USB CDC 接口配置
                        IE2|=0x80;  //IE2的B7位写1,使能USB中断 或 EUSB=1 USB中断小开关  最新Demo 已移除此行
                        EA=1;       //IE的B7位写1,位寻址 或者 IE|=0x80 打开中断总开关
                        while(DeviceState!=DEVSTATE_CONFIGURED)//等待USB完成配置
                        ......
                        while(1)
                        {
                               ......
                               if (bUsbOutReady)
                               {
                                      USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

                                      usb_OUT_done();
                               }
                              ......
                        }
               }


小提示:可在Options for Target 'Target1'-L251Misc-disable Warning Numbers:中添加57 禁用UNCALLED FUNCTION,警告信息


哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-16 11:41:57 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第五集 C语言基础》学习笔记

“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”

复习C语言相关基础知识


1.C语言 USB-CDC串口之printf函数的实现
    ①stc32_stc8_usb.h中去掉#define PRINTF_HID 前的//注释
    ②printf_hid()的实现
          #define printf  printf_hid
          int printf_hid (const char *fmt, ...);//参数fmt 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明
格式控制符列表:
截图202501161115366412.jpg
ASCII字符代码表:
截图202501161116525489.jpg
   
      USB-CDC方式模拟的串口波特率设置任意 实际上是USB口的通讯
2.数的进制:2进制、10进制、16进制(8进制)
截图202501161118329615.jpg

3.数据的基本类型
截图202501161120072039.jpg
若要使用64位变量 #pragma float64


4.C语言常用运算符

截图202501161138491413.jpg
截图202501161139591691.jpg
截图202501161140399308.jpg

此课复习了以前学习C语言相关内容 加深印象

哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!!!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-16 12:43:07 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第六集 I/O输入输出》学习笔记

“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”


GPIO(General Purpose I/O Ports):通用输入/输出端口。
通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。

高低电平:
                高电平 输出VCC电压
                低电平 输出GND电压
截图202501161151092256.jpg
IO口
截图202501161151339677.jpg
截图202501161151509816.jpg
VDD=3.3V时 高电平 低电平 允许范围见下表
截图202501161152517595.jpg
施密特触发器相关寄存器设置见下表
截图202501161153514140.jpg
截图202501161156016337.jpg

按键输入检测
没按下是高电平 按下是低电平 代码中用逻辑运算符“==”判断 1代表高电平 0代表低电平

完成三个任务


任务1:按下P32按钮灯亮,松开P32按钮灯灭;
任务2:按下P32按钮灯灭,松开P32按钮灯亮;
任务3:按一下灯亮,按一下灯灭;



代码如下:
#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //调用头文件  不要忘记添加

#define u8  unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)        
        
u8 state = 0;                                        //初始状态

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

void Delay20ms(void)        //@24.000MHz  Delay20ms();
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}


void main(void)
{
    WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
        
    P0M1 = 0x00;   P0M0 = 0x00;
    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;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
        
        P40 = 0;
        
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
        
        while(1)
        {
               
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
        }
               
//                //任务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松开
                                
                        }
                }
        
               
        }
}


按键抖动和防抖
截图202501161203522278.jpg


WTST = 0;  //设置程序指令延时参数,
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度


截图202501161204497932.jpg

期待实验箱的到来就可以愉快的做实验了
课后任务1:按一下P32按钮灯亮,按一下P33按钮灯灭;

#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //调用头文件  不要忘记添加

#define u8  unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)        

u8 state = 0;                                        //初始状态

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

void Delay20ms(void)        //@24.000MHz  Delay20ms();
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}


void main(void)
{
    WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;
    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;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;

        P40 = 0;

        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {

        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
        }


                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                P00 = 0;
                                printf("state:%s\r\n","灯亮");

                                while( P32 == 0 );                                        //等待P32松开

                        }
                }

                if( P33 == 0 )                                                                //判断P33按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P33 == 0 )
                        {
                                P00 = 1;
                                printf("state:%s\r\n","灯灭");

                                while( P33 == 0 );                                        //等待P33松开

                        }
                }



        }
}

课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)


#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //调用头文件  不要忘记添加

#define u8  unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)        

u8 state = 0xfe;                                        //初始状态

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

void Delay20ms(void)        //@24.000MHz  Delay20ms();
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}


void main(void)
{
    WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;
    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;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;

        P40 = 0;

        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {

        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
        }

               P0=0xff;
                if( P32 == 0)                                                        //判断P32按钮按下
                {
                        Delay20ms();                                                //延时20ms消抖
                        if( P32 == 0 )                                                
                        {
                                if( P0 == 0x00 )
                                {
                                        state = 0xfe ;
                                        P0 = 0xff;
                                }
                                else
                                {
                                        P0 = state;
                                    state <<=1;
                                }

                        while( P32 == 0);                                //等待P32松开
                        }
                }


        }
}

期待实验箱的到来就可以愉快的做实验了
哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!!!  
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-01-26 21:49:54
已绑定手机

1

主题

6

回帖

42

积分

新手上路

积分
42
发表于 2025-1-16 13:32:47 | 显示全部楼层
非常感谢STC官方 主讲人冲哥

《第七集 定时器中断》学习笔记


“Ai8051U 系列是32位8051 也是优秀的16位机 更是兼容8位机的最强悍的1位机”

单核MCU,同一时间只能执行一个事情,没有特殊情况不能被打断。

这里就要引入定时器中断


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

利用AIapp-ISP 定时器计算器 生成代码

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中断
}


void Timer0_Isr(void) interrupt 1                //3秒执行一次
{

}
注意\xfd问题 详见 手册 附录J 关于Keil软件中 0xFD 问题的说明
printf("按键按下次数\xfd:%d 次\r\n",(int)count);
截图202501161304586471.jpg

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


定时器实现机制:
截图202501161307441296.jpg
截图202501161308029631.jpg
截图202501161309104153.jpg
截图202501161310017437.jpg
截图202501161310259239.jpg
截图202501161310432890.jpg
截图202501161310569154.jpg
截图202501161311521257.jpg
截图202501161312125324.jpg
截图202501161312538077.jpg
截图202501161313281538.jpg

   TM0PS = 91
   AUXR&=0x7F(12T模式)        /12
   THO-TL0 = 319


定时器计算公式
截图202501161321197363.jpg 截图202501161321344457.jpg

函数的定义、声明、调用


返回值类型 函数名(入口参数)
    {
        // 函数体
        // 函数执行的代码
        return 返回值;
    }



定义:包含返回值,函数名和入口参数,并定义了函数具体功能。


函数的名称应当能够描述函数的功能,便于代码的阅读和理解。
    函数名称应当使用有意义的英文单词或者组合的英文单词,避免使用特殊字符或数字。
    函数名称不能与C语言的关键字同名。


返回值类型 函数名(入口参数);
声明:在头文件或者被调用之前使用,注意末尾要加分号

函数名(入口参数);

调用:在需要调用的地方直接使用函数名,加上括号和分号。如果有入口参数的,需要在括号的多个参数之间加逗号隔开。



电子功德箱:
     1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
      2.按下按键2,双倍功德时间下串口显示“功德+2  当前功德:xxx”;      
      3.按下按键2,单倍功德时间下串口显示“功德+1  当前功德:xxx”;·
      4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
      5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮,


  • #include <AI8051U.H>
  • #include "stc32_stc8_usb.h"
  • #include <intrins.h>
  • char *USER_DEVICEDESC = NULL;
  • char *USER_PRODUCTDESC = NULL;
  • char *USER_STCISPCMD = "@STCISP#";
  • u8 Count_GD = 0;        //功德计数
  • u8 State_GD = 0;        //功德状态
  • u8 State_Delay = 1;                //延时状态
  • void Delay20ms(void)        //@24.000MHz
  • {
  •         unsigned long edata i;
  •         _nop_();
  •         _nop_();
  •         i = 119998UL;
  •         while (i) i--;
  • }
  • void Timer1_Isr(void);
  • void Timer1_Init(void)                //1秒@24.000MHz
  • {
  •         TM1PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  •         AUXR &= 0xBF;                        //定时器时钟12T模式
  •         TMOD &= 0x0F;                        //设置定时器模式
  •         TL1 = 0xFC;                                //设置定时初始值
  •         TH1 = 0x03;                                //设置定时初始值
  •         TF1 = 0;                                //清除TF1标志
  •         TR1 = 1;                                //定时器1开始计时
  •         ET1 = 1;                                //使能定时器1中断
  • }
  • void main()                                                                                                //按键1为P33按键,按键2为P35按键,在实验箱的右下角两个键。
  • {
  •         EAXFR = 1;                                                                                        //打开扩展特殊功能寄存器,等同:P_SW2 |= 0x80;
  •         CKCON = 0;                                                                                        //提高访问XRAM速度
  •         WTST = 0;                                                                                        //设置程序指令延时参数
  •         P0M0 = 0x00; P0M1 = 0x00;                                                         //初始化各个端口为准双向口模式
  •     P1M0 = 0x00; P1M1 = 0x00;
  •     P2M0 = 0x00; P2M1 = 0x00;
  •     P3M0 = 0x00; P3M1 = 0x00;
  •     P4M0 = 0x00; P4M1 = 0x00;
  •     P5M0 = 0x00; P5M1 = 0x00;
  •     P6M0 = 0x00; P6M1 = 0x00;
  •     P7M0 = 0x00; P7M1 = 0x00;
  •         usb_init();                                                                                        //USB口初始化配置
  •         IE2 |= 0x80;                                                                                //EUSB位置位,打开USB
  •         EA = 1;                                                                                                //总中断置位,打开中断
  •         P40 = 0;                                                                                        //使能LED总开关
  •         while(DeviceState != DEVSTATE_CONFIGURED);                        //等待USB完成配置
  •         while(1)
  •         {
  •                 if(P33 == 0)                                                                        //按下P33触发程序
  •                 {
  •                         Delay20ms();                                                                //延时消抖
  •                         if(P33 == 0)                                                                //确实按下按钮
  •                         {
  •                                 switch(State_GD)                                        //判断功德状态        1=单倍功德;2=双倍功德
  •                                 {
  •                                         case 0:
  •                                               break;
  •                                         case 1:
  •                                                 TR1 = 0;                                                //停止定时器1计时
  •                                                 printf("单倍功德时间\r\n");
  •                                                 P00 = 0;                                                //点亮P00
  •                                                 State_GD = 1;                                //功德状态设为1
  •                                                 Timer1_Init();                                        //开始延时
  •                                                 State_GD = 2;                                //功德状态设为2
  •                                                 break;
  •                                         case 2:
  •                                                 TR1 = 0;                                                //停止定时器1计时
  •                                                 printf("双倍功德时间\r\n");
  •                                                 P00 = 0;                                                //点亮P00
  •                                                 Timer1_Init();                                        //开始延时
  •                                                 State_GD = 1;                                //功德状态设为1
  •                                                 break;
  •                                 }
  •                                 while(P33 == 0);                                                //等待按键恢复
  •                         }
  •                 }
  •                 if(P35 == 0)                                                                        //按下P35触发程序
  •                 {
  •                         Delay20ms();                                                                //延时消抖
  •                         if(P35 == 0)                                                                //确实按下按钮
  •                         {
  •                                 switch(State_GD)                                        //判断功德状态
  •                                 {
  •                                         case 0:
  •                                                 break;
  •                                         case 2:                                                                //注意这个模式2是指的P33按键进入单倍功德状态
  •                                                 Count_GD++;                                        //功德计数加1
  •                                                 printf("功德+1 当前功德:%d\r\n",Count_GD);
  •                                                 break;
  •                                         case 1:                                                                //注意这个模式1是指的P33按键进入双倍功德状态
  •                                                 Count_GD += 2;                                //功德计数加2
  •                                                 printf("功德+2 当前功德:%d\r\n",Count_GD);
  •                                                 break;
  •                                 }
  •                                 while(P35 == 0);                                                //等待按键恢复
  •                         }
  •                 }
  •         }
  • }
  • void Timer1_Isr(void) interrupt 3                                                //定时器1回调函数,每秒调用一次
  • {
  •         switch(State_GD)
  •         {
  •                 case 2:                                                                                        //注意这个模式2是指的P33按键进入单倍功德状态
  •                         P00 = 1;                                                                        //关闭P00
  •                         TR1 = 0;                                                                        //停止定时器1计时
  •                         State_GD = 0;                                                        //功德置0
  •                         break;
  •                 case 1:                                                                                        //注意这个模式1是指的P33按键进入双倍功德状态
  •                         if(State_Delay == 1)                                                //判断是否是第一次循环
  •                         {
  •                                 State_Delay++;
  •                                 break;
  •                         }
  •                         else
  •                         {
  •                                 P00 = 1;                                                                //关闭P00
  •                                 TR1 = 0;                                                                //停止定时器1计时
  •                                 State_GD = 0;                                                //功德置0
  •                                 State_Delay = 1;                                                //重新置1
  •                                 break;
  •                         }
  •         }
  • }


哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!!!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-6 15:30 , Processed in 0.130523 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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