找回密码
 立即注册
查看: 232|回复: 8

打卡复习《Ai8051U教学视频》

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-8 20:55:53 | 显示全部楼层 |阅读模式
第一讲


截图202501082053369785.jpg 截图202501082054021998.jpg


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

截图202501082055029174.jpg
Flash芯片的读写功能提升
IIS的功能
浮点运算  单精度浮点
DMA功能
Stc8051 AI8051   

看到了8080并口的LCD,屏显刷新很快,不知道串口如何?希望能有一个实验板试试

兼容89C52,相当于更强大的8H8K64U


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-8 21:37:11 | 显示全部楼层

第二讲







USB LINK 1D接口,下载、烧录、调试
USB转双串口  STC自己的芯片,10m速度
带示波器接口
还有录放音

OLED  流水灯  8位数码管   TFT  屏  并口/串口?

主芯片是AI8051U  LQFP48封装

RTC电池维持时间的继续,存储flash的芯片,动画的实现

软件的安装下载,比较详细

Isp现在最新版本  6.95E

C251软件包  


按照顺序下载安装 ISP\头文件\中断插件\代码****就可以试验了




32-bit   不是8-bit  

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-10 22:18:10 | 显示全部楼层


完成下载
安装成功

Isp软件 把头文件安装在keil路径


软件设置
Small 128RAM,xsmall 2k不容易超


void main(void)
{   
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-10 22:18:44 | 显示全部楼层
不会贴图  晕
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-12 22:17:54 | 显示全部楼层
第4讲  usb不停电下载
1,比较了每次按键下载和不停电下载,理解了这节课的意义
2.下载stc的usb库函数,并拷贝到自己的文件夹里
3 keil软件内加入#include  “stc-cdc-usb.h”  ,采用查询方式
4 USB-init()函数的初始化,P-SW2,IE2寄存器的应用,|=的技巧
5,设置相关参数,以及ISP软件的设置
范例程序
#include "stc32g.h"
#include "stc32_stc8_usb.h"

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

void main()
{
    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;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

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


下面是我参照讲座编的keil 软复制如下

#include "ai8051u.h"         // 头文件
#include "stc32_stc8_usb.h"


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";  //根据isp软件命名

void main(void)
{   
                                                //仅执行一次
        P_SW2 |= 0x80;
       
        P0M0=0X00;                        // 准双向口
        P0M1=0X00;       
        P4M0=0X00;
        P4M1=0X00;       
       
        usb_init();                       //USB CDC 接口配置
   
    IE2 |=1;                                            //EA = 1;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

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

}
  
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-13 21:29:22 | 显示全部楼层
第五讲  c语言的知识点

1,#include "stc32_stc8_usb.h"
  //#define PRINTF_HID            //printf输出直接重定向到USB口(早期命名方式)

#define PRINTF_USB            //printf输出直接重定向到USB口(避免误解修改的命名方式,与PRINTF_HID效果一样)

这个里面的定义是已经改过的程序



#if defined PRINTF_SEGLED
#define printf  SEG7_ShowString
#elif defined PRINTF_HID || defined PRINTF_USB
#define printf  printf_usb

#endif

2.printf("  ");应用在串口输出上,关键字符  %  、\r  \n  %d等待

3.c语句的计算符号和逻辑运算符号,重新复习一下
截图202501132133343273.jpg   


截图202501132134265093.jpg






回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-14 21:13:31 | 显示全部楼层
第六讲  关于GPIO

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

掌握00 准双向口,01 推挽输出,拉电流大,10 高阻状态,11  开漏模式

按键的检测
截图202501142034146026.jpg



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

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


ISP产生的软件延时程序,务必把WTST初始化为0

#include "ai8051u.h"         // 头文件
#include "stc32_stc8_usb.h"
#include "strins.h"                // _nop()_ 指令


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";  //根据isp软件命名



#define u8 unsigned char
#define u16 unsigned int
       
u8 led_state=0;
               
void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

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



void main(void)
{   
                                                //仅执行一次
        //P_SW2 |= 0x80;    // EAXFR=1; 一样功能
       
        WTST=0;                        //设置程序指令延时参数
        EAXFR=1;                // 扩展寄存器反应能力
        CKCON=0;                //提高访问XRAM速度
       
        P0M0=0X00;                        // 准双向口
        P0M1=0X00;       
        P3M0=0X00;
        P3M1=0X00;
        P4M0=0X00;
        P4M1=0X00;       
       
        usb_init();                       //USB CDC 接口配置
   
    IE2 |=1;                                            //EA = 1;
   
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

        P40=0;       
       
        while(1)
        {
           if (bUsbOutReady)                        //接收准备
        {
           // USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
                        printf ("led_state \r\n",(int)led_state);
            usb_OUT_done();
        }   
               
            if (p32=0)
                {
                        Delay20ms(void);
                    if (p32=0)
                        {        
                                 led_state=!led_state;
                              P00=led_state;                //按一次键状态p00灯改变一次
                     while(p32=0);
                        }
                }       
               
        }

}


上面的程序看是简单,出现几个问题
;;;分号不能在汉字状态下输入,会出错
P32 是大写的P,  p32编译出错
(p32=0)应该为 (P32==0),少一个=,


如果变量和函数的命名有个统一规范就好了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-1-15 21:46:18 | 显示全部楼层
第七讲 定时器
截图202501152144483717.jpg


THO TL0,TH1TL1,后面的命名就是T2H T2L......
保持了原来51的命名规则,后面是新的命名
截图202501152050425134.jpg

isp自动产生定时程序


        //任务3:按一下交替灯亮,按一下灯灭
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                led_state=!led_state;
                               
                                if(led_state==1)                // 状态为1时,交换亮灯
                                {
                                  Timer0_Init( );                //延时       
                                                               
                                }
                                else
                                {
                                 TR0=0;
                                 P00 = 0;               
                     P01 = 0;       //全部关掉               
                                }
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }
       
               
        }
}

void Timer0_Isr(void) interrupt 1
{
        led_state = !led_state;                                                //变量取反 0 1 0 1 0 1,3秒P00状态改变一次
        P00 = led_state;               
        P01 = !led_state;       
       
}


截图202501152145266418.jpg

截图202501152145558125.jpg

课后小练
截图202501152033011236.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-26 08:58:05

13

主题

12

回帖

387

积分

中级会员

积分
387
发表于 2025-2-9 21:33:05 | 显示全部楼层
按键矩阵的学习
行列编程顺序
1.按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
③第三步:行列组合一下就可以判断出是哪个按键按下了。

void Task_1(void)
{
        //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
        COL1 = 0;
        COL2 = 0;
        COL3 = 0;
        COL4 = 0;
        ROW1 = 1;
        ROW2 = 1;
       
        if(( ROW1 == 0 ) || ( ROW2 == 0 ))                //如果行按键有按下
        {
                if(( ROW1 ==0 ) && ( ROW2 ==0 ))        //如果两行都有按键按下,不处理
                {
                       
                }
                else if((( ROW1 ==1 )&&( ROW2 ==0 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))        //如果有按键按下,而且只有一颗
                {
                        if( ROW1 ==0 )                                //判断哪一行,输出行开始的序号
                                key_num = 0;
                        else if( ROW2 ==0 )
                                key_num = 4;
                               
                        //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
                        COL1 = 1;
                        COL2 = 1;
                        COL3 = 1;
                        COL4 = 1;
                        ROW1 = 0;
                        ROW2 = 0;
                       
                        if( COL1 ==0 )                                //判断哪一列,叠加按键的序号
                        {
//                                key_num = key_num ;
                        }
                        else if( COL2 ==0 )
                        {
                                key_num = key_num + 1;
                        }
                        else if( COL3 ==0 )
                        {
                                key_num = key_num + 2;
                        }
                        else if( COL4 ==0 )
                        {
                                key_num = key_num + 3;
                        }
                }
                COL1 = 0;
                COL2 = 0;
                COL3 = 0;
                COL4 = 0;
                ROW1 = 1;
                ROW2 = 1;               
        }
        else
        {
                key_num = 0xff;
        }
       
        //③第三步:行列组合一下就可以判断出是哪个按键按下了。

}


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 01:17 , Processed in 0.125993 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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