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

Ai8051U学习打卡

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-10-29 13:27:19 | 显示全部楼层
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
    }
}


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-10-30 17:01:07 | 显示全部楼层
今天实际操作了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
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-10-30 17:38:19 | 显示全部楼层
今天实操了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就正常了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-2 12:33:51 | 显示全部楼层
今天学习了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;
}


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-2 12:36:16 | 显示全部楼层
这是按键中断点亮led的图片
截图202511021235362000.jpg
截图202511021235473954.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-4 00:17:18 | 显示全部楼层
今天实操第七课第一节 中断点灯 本来想做一个P00-P05流水灯,然后通过中断控制P07灯3秒亮 3秒灭,但是本人技术不行,没有实现,所以就复现学习视频第七节第一个任务。
#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#";
u8 state=0;
void Delay20us(void)        //@24.000MHz
{
        unsigned long edata i;

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

                                    //上面延时函数部分代码可使用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 main(void)
{
        //int count;   //按键计数变量
    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中断                                                               
       
        Timer0_Init();                                        //定时器初始化
        EA = 1;
          
               
    P40 = 0;                        //打开LED部分的供电
       
        while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
    while(1)                        
    {   
                if (bUsbOutReady)
        {
           // USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
//任务1 按下P32按钮灯亮松开P32灯灭
                if(P32==0)
                {
                        Delay20us();
                        if(P32==0)
                        {
                        P00=0;
                        }
                        else
                        {
                                P00=1;
                        }
                       
                }
       
//                if(P32==0)
//                {
//                        Delay20us();
//                        if(P32==0)
//                        {
//                        printf("按键按下次数:%d\r\n",(int)count);
//                        count++;
//                        while(P32==0);   //等P32松开
//                }
//        }

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

void Timer0_Isr(void) interrupt 1  //3秒执行一次 在初始化配置好了
{
        state=!state;
        P07=state;
}
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-4 00:19:14 | 显示全部楼层
复现视频
截图202510291313175225.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-4 22:14:51 | 显示全部楼层
今天买的0.96寸OLED到了,插到开发板上,随便找了个OLED的DEMO程序烧上,就正常显示了,一下子就觉得没劲了,我还是继续从基础的开始学吧
截图202511042214492912.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-12-17 15:46:32
已绑定手机

1

主题

79

回帖

363

积分

中级会员

积分
363
发表于 2025-11-4 22:58:48 | 显示全部楼层
问了豆包,终于修改出我想实现的流水灯,P00-P06是流水灯,P07通过中断亮3秒,灭3秒

#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#";
u8 state=0;
u8 temp=0;
void Delay20us(void)        //@24.000MHz
{
        unsigned long edata i;

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

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

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

                                    //上面延时函数部分代码可使用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 main(void)
{
        //int count;   //按键计数变量
        int cnt;
       
    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中断                                                               
       
        Timer0_Init();                                        //定时器初始化
        EA = 1;
          
               
    P40 = 0;                        //打开LED部分的供电
       
        while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
    while(1)                        
    {   
                if (bUsbOutReady)
        {
           // USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
//任务1 按下P32按钮灯亮松开P32灯灭
//                if(P32==0)
//                {
//                        Delay20us();
//                        if(P32==0)
//                        {
//                        P00=0;
//                        }
//                        else
//                        {
//                                P00=1;
//                        }
//                       
//                }
//       
//                if(P32==0)
//                {
//                        Delay20us();
//                        if(P32==0)
//                        {
//                        printf("按键按下次数:%d\r\n",(int)count);
//                        count++;
//                        while(P32==0);   //等P32松开
//                }
//        }

                //LED循环自动闪烁部分
        temp = ~(1<<(cnt%7));
                P0 = (P0 & 0x80)|(temp & 0x7f);   //保留P07的状态,更新其他位
        cnt++;                            //每次步进1
        Delay500ms();               //调用延时函数,延时0.5s
               
    }
}

void Timer0_Isr(void) interrupt 1  //3秒执行一次 在初始化配置好了
{
        state=!state;
        P07=state;
}

8e54150bea94279feae74869f480d503.mp4

471.79 KB, 下载次数: 3

程序实现

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-18 10:30 , Processed in 0.121631 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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