找回密码
 立即注册
楼主: MJBZ

Ai8051U学习打卡

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 4 天前 | 显示全部楼层
usb不断电下载真是一个非常实用的功能,跟着冲哥的《Ai8051U深度学习》教学视频一步一步来,就能实现。只是Lib库文件里有这句代码://char *USER_STCISPCMD ="@STCISP#"; 如果不注释掉就产生重定义报错。我感觉在Ai8051U的加持下,我在单片机的学习和开发能力能大幅度提高和加快。十分感谢STC公司
#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h"                                        //不断电下载头文件

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD ="@STCISP#";    //这句注释掉是因为Lib库文件里有,这句存在就重定义了

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
    P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
                                    
    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;       //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
    usb_init();                     //USB CDC 接口配置
          IE2 |=0x80;                                                                                  //使能USB中断                                                               
                EA = 1;

          while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
               
    P40 = 0;                        //打开LED部分的供电
    while(1)                        
    {   
                if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }


                                                                                                                                          //LED循环自动闪烁部分
//        P2 = ~P2;                   //对P0端口取反
                                P0 = ~P0;                //对单个端口取反
        Delay500ms();               //调用延时函数,延时0.5s
    }
}


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 3 天前 | 显示全部楼层
今天抽空仔细阅读了给的Ai8051U的文档,
看到使用最新版本的Lib文件就包含下面三句代码,所以Keil中不用再写下面的三句代码。这就解释为啥main.c中有char *USER_STCISPCMD ="@STCISP#"; 会出现重定义报错
原来答案就在哪里,是我没去看。
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD ="@STCISP#";    //这句注释掉是因为Lib库文件里有,这句存在就重定义了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 3 天前 | 显示全部楼层
今天实际操作了USB-CDC方式控制Ai8051U进行LED电灯
使用了文档中的代码和USB不停电下载的代码,在ISP软件中控制P2口LED灯的亮和灭,感觉打开了新世界的大门
#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h"                                        //不断电下载头文件

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

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
  BYTE dat;                                                                                                //定义变量保存接收的数据  
        EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
//  P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
                                    
    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;       //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
    usb_init();                     //USB CDC 接口配置
          IE2 |=0x80;                                                                                  //使能USB中断                                                               
                EA = 1;

          while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
               
    P40 = 0;                        //打开LED部分的供电
    while(1)                        
    {   
                if (bUsbOutReady)
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            dat = UsbOutBuffer[0];                        //保存接收的数据
                                                P2=dat;                                                                                        //讲接收的数据送到P0口显示
                                          LED40_SetPort(0,dat);                                //使用AiCube-ISP软件菜单“调试仿真接口”中的
                                                                                                                                                                //“擎天柱-LED-DIP40”进行模拟显示P0口
                                       
            usb_OUT_done();
        }


                                                                                                                                          //LED循环自动闪烁部分
//        P20 = ~P20;                   //对P0端口取反
//                                P0 = ~P0;                //对单个端口取反
//        Delay500ms();               //调用延时函数,延时0.5s
    }
}

截图202510301700246736.jpg
截图202510301700404541.jpg
截图202510301700537508.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 3 天前 | 显示全部楼层
今天实操了2.7.2 流水灯 看到每个灯独立延时很繁琐,又看到例子最后注释的程序很简单于是尝试了一下
#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h"                                        //不断电下载头文件

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

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
          int cnt=0;
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
//  P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
                                    
    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;       //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
    usb_init();                     //USB CDC 接口配置
          IE2 |=0x80;                                                                                  //使能USB中断                                                               
                EA = 1;
   
          while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
               
    P40 = 0;                        //打开LED部分的供电
    while(1)                        
    {   
                if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }


                                                                                                                                          //LED循环自动闪烁部分
        P2 = ~(1<<(cnt%8));           //将对应亮起的位赋值给P2口
                                cnt++;                                                //每次步进1
        Delay500ms();               //调用延时函数,延时0.5s
    }
}

cnt初始值=1时,程序最开始运行P20不亮,cnt=0就正常了
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 7 小时前 | 显示全部楼层
今天学习了2.9.1节P33、P32按键中断点亮led的程序
根据Ai8051U指导书学习程序,用Ai做了修改,比如最开始led不亮,是中断设置错了,而且led量灭之间的_nop_();时间太短,肉眼观察不到,所以改为延时。
#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h"                                        //不断电下载头文件

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD ="@STCISP#";
bit int0_flag=0;
bit int1_flag=0;

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
    //P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                       //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
                                    
    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x25; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;
        //P3M0 = 0x00; P3M1 = 0xff;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;
                P3PU=0x0c;                                                                                                                                //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
    usb_init();                     //USB CDC 接口配置
          IE2 |=0x80;                                                                                  //使能USB中断                                                               
                EA = 1;

          while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
               
    P40 = 0;                        //打开LED部分的供电
   
                IT0=1;
                //IT0=1;
                EX0=1;
               
                //IT1=0;
                IT1=1;
                EX1=1;
               
                IE0=0;
                IE1=0;
               
                EA=1;
                P40=0;
               
                int0_flag=0;
                int1_flag=0;
               
               
               
               
               
               
               
               
               
                while(1)                        
    {   
                if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }

                                if(int0_flag)
                                {
                                        int0_flag=0;
                                        _nop_();
                                        _nop_();
                                }
                                if(int1_flag)
                                {
                                        int1_flag=0;
                                        _nop_();
                                        _nop_();
                                }
                       

                       
    }
}

void int0_isr(void) interrupt INT0_VECTOR
{
        int0_flag=1;
       
        if(INT0)
        {
                P20=0;
                Delay500ms();
                P20=1;
        }
        else
        {
                P25=0;
                Delay500ms();
                P25=1;
        }
}

void int1_isr(void) interrupt INT1_VECTOR
{
        int1_flag=1;
        P22=0;
        Delay500ms();
        P22=1;
}


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-11-02 12:33:51
已绑定手机

1

主题

34

回帖

111

积分

注册会员

积分
111
发表于 7 小时前 | 显示全部楼层
这是按键中断点亮led的图片
截图202511021235362000.jpg
截图202511021235473954.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-2 20:20 , Processed in 0.125216 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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