学习stc 发表于 2025-1-8 20:55:53

打卡复习《Ai8051U教学视频》

第一讲





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

Flash芯片的读写功能提升IIS的功能浮点运算单精度浮点DMA功能 Stc8051 到AI8051   
看到了8080并口的LCD,屏显刷新很快,不知道串口如何?希望能有一个实验板试试
兼容89C52,相当于更强大的8H8K64U

学习stc 发表于 2025-1-8 21:37:11


第二讲







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

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

主芯片是AI8051ULQFP48封装

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

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

Isp现在最新版本6.95E

C251软件包


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




32-bit   不是8-bit

学习stc 发表于 2025-1-10 22:18:10



完成下载
安装成功

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


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


void main(void)
{   

学习stc 发表于 2025-1-10 22:18:44

不会贴图晕

学习stc 发表于 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;       
        }

}

学习stc 发表于 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 printfSEG7_ShowString
#elif defined PRINTF_HID || defined PRINTF_USB
#define printfprintf_usb

#endif

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

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










学习stc 发表于 2025-1-14 21:13:31

第六讲关于GPIO

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


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

按键的检测




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),少一个=,


如果变量和函数的命名有个统一规范就好了

学习stc 发表于 2025-1-15 21:46:18

第七讲 定时器



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


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;       
       
}






课后小练

学习stc 发表于 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;
        }
       
        //③第三步:行列组合一下就可以判断出是哪个按键按下了。

}


页: [1]
查看完整版本: 打卡复习《Ai8051U教学视频》