找回密码
 立即注册
楼主: 电子DIY小家

《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套

   火... [复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-05-04 11:26:34
已绑定手机

1

主题

60

回帖

291

积分

中级会员

积分
291
发表于 2025-1-20 22:03:26 | 显示全部楼层
乐*** 发表于 2025-1-20 17:37
第十一集 矩阵键盘 课后小练

看到了,我已经不是第一个了。有人已经捷足先登了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-25 23:19:01
已绑定手机

2

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-1-20 22:07:24 | 显示全部楼层
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件

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

void main(void)
{
        P_SW2 |= 0x80;
        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 接口配置
        EA=1;
        IE2|=0x80;
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
        }
        P40=0;
        P00=0;
        }
}

USB不停电下载程序,可以减少断电下载程序的作用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:107
  • 最近打卡:2025-05-04 00:21:51
已绑定手机

0

主题

36

回帖

512

积分

高级会员

积分
512
发表于 2025-1-21 11:07:20 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:139
  • 最近打卡:2025-05-04 00:08:25
已绑定手机

4

主题

65

回帖

802

积分

高级会员

积分
802
发表于 2025-1-21 11:58:55 | 显示全部楼层
看到更新13集啦,好开心!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-25 23:19:01
已绑定手机

2

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-1-21 21:13:26 | 显示全部楼层
C语言基础,需要注意数据类型,不要超出范围,以及学习各个运算符号。
#include"ai8051u.h"
#include"stc32_stc8_usb.h" //调用头文件

#define u8 unsigned char //8位无符号数 0-255
#define u16 unsigned int //16位无符号数 0-65535
u8 X = 20;
u8 Y = 10;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
        P_SW2 |= 0x80;
        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 接口配置
        EA=1;
        IE2|=0x80;
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                if (bUsbOutReady)
        {
                        if(X>Y)
                        {
                          PRINTF("条件为真");
                        }
                        else
                        {
                                PRINTF("条件为假");
                        }
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
         //   printf("X/Y=%u\r\n",(u16)(X/Y));
                //        printf("X%%Y=%u\r\n",(u16)(X%Y));
        //  usb_OUT_done();
        }
        P40=0;
        P00=0;
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-25 23:19:01
已绑定手机

2

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-1-21 22:21:19 | 显示全部楼层
I/O输入、输出,注意电气方面硬件的电路电压不要弄错;
按键程序注意消抖,
单片机执行速度很快,要注意某些程序会多次执行。特别是根据按键输入的情况。

练习代码如下
#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
{
        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 接口配置
        EA=1;
        IE2|=0x80;
        P40=0;
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                if (bUsbOutReady)
        {
                       
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
         //   printf("X/Y=%u\r\n",(u16)(X/Y));
                //        printf("X%%Y=%u\r\n",(u16)(X%Y));
          usb_OUT_done();
        }
                         //按下P32灯亮,松开灯灭
//                if(P32==0)
//                {
//                P00=0;
//                }
//                else
//                {
//                        P00=1;
//                }
               
                if(P32==0)
                {
                        Delay20ms();
                        if(P32==0)
                {
                state=!state;
                P00=state;
                while(P32=0);
                }
        }
                }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-25 23:19:01
已绑定手机

2

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-1-21 23:44:17 | 显示全部楼层
定时器设计注意,时钟周期的设置,相比经典8051单片机多了一些寄存器。算法有一些区别,但定时时间可以更长;
注意需要精确定时时,还需自己计算一下时间,可能有误差,可以再手动增加一下空操作,让定时更准一些。

代码如下
#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;
u8 Run_state=0;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

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

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


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=1;
         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 接口配置
        EA=1;
        IE2|=0x80;
        Timer0_Init();     //定时器初始化
        P40=0;
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        while(1)
        {
                if (bUsbOutReady)
        {
                       
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
         //   printf("X/Y=%u\r\n",(u16)(X/Y));
                //        printf("X%%Y=%u\r\n",(u16)(X%Y));
          usb_OUT_done();
        }
               
//                if(P32==0)
//                {
//                        Delay20ms();
//                        if(P32==0)
//                {
//                        printf("按键按键次数\xfd:%d 次\r\n",(int)count);
//                        count++;
//                while(P32=0);
//                }
//        }
//                //任务2
//                if(P32==0)
//                {
//                        Delay20ms();
//                        if(P32==0)
//                {
//               //printf("按键按键次数\xfd:%d 次\r\n",(int)count);
//               //count++;
//                        P00=0;
//                       
//                       
//                       
//                while(P32=0);
//                }
//        }
               
                //任务3
                if(P32==0)
                {
                        Delay20ms();
                        if(P32==0)
                {
               //printf("按键按键次数\xfd:%d 次\r\n",(int)count);
               //count++;
                       
                        Run_state=!Run_state;
                        if(Run_state=1)
                        {
                        Timer0_Init();
                               
                        }
                                else
                                {
                                TR0=0;
                                P00=1;
                                P01=1;
                                       
                                }
                       
                       
                while(P32=0);
                }
        }
               
                }
}

void Timer0_Isr(void) interrupt 1
{
        state=!state;
        //        P00=state;
        P00=state;
        P01=!state;
        //TR0 = 0;   //关闭定时器
       
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-01-25 23:19:01
已绑定手机

2

主题

12

回帖

53

积分

注册会员

积分
53
发表于 2025-1-21 23:53:54 | 显示全部楼层
AI8051U外设确实比较强,价格也便宜,关键是国产的,必须支持;
外部触发中断方式也增强了不少,上升沿;下降沿均可触发;
单片机,运行速度够快
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-05-03 22:30:36

6

主题

278

回帖

1118

积分

金牌会员

积分
1118
发表于 2025-1-22 00:30:08 | 显示全部楼层
为什么没有上升沿中断和高电平中断,低电平中断了???
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-05-03 22:30:36

6

主题

278

回帖

1118

积分

金牌会员

积分
1118
发表于 2025-1-22 00:30:49 | 显示全部楼层
需要用到上升沿中断怎么处理啊??
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 04:10 , Processed in 0.156610 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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