陈笑笑 发表于 2025-1-4 09:01:44

陈笑笑 发表于 2024-11-23 23:51
打卡!跟着冲天哥学习AI8051U的第Day 2!

知识点:


任务:点亮一颗LED


1.准备工作:新建一个工程


1.1.打开keil
1.2.选择 project    new project
1.3.选择“AI8051U”型号
1.3.新建源文件“Main.c”

2.设置CPU模式



3.添加头文件
知识点:(<>表示从keil目录查找添加,""表示从工程目录查找添加)

4.开始实验(由于手上没有板子,只能模拟一下步骤)




AI-32位8051 发表于 2025-1-6 10:35:51

打卡!跟着冲天哥学习AI8051U的第Day 3!

任务:点亮一颗LED
1.准备工作:新建一个工程
https://www.stcaimcu.com/data/attachment/forum/202411/24/103409ujj1wu4u0wwqrw41.png

1.1.打开keil
1.2.选择 project    new project
1.3.选择“AI8051U”型号
1.3.新建源文件“Main.c”

2.设置CPU模式
https://www.stcaimcu.com/data/attachment/forum/202411/24/105026nedz2s0b4akw3y2l.png
3.添加头文件
知识点:(<>表示从keil目录查找添加,""表示从工程目录查找添加)

4.开始实验(由于手上没有板子,只能模拟一下步骤)
https://www.stcaimcu.com/data/attachment/forum/202411/24/111500bj4ae0zoz4ejxjni.png

https://www.stcaimcu.com/data/attachment/forum/202411/24/111517btrh1bohdppboh1a.png

AI-32位8051 发表于 2025-1-6 10:36:38

打卡!跟着冲天哥学习AI8051U的第Day 4!

1.USB不停电下载配置步骤
https://www.stcaimcu.com/data/attachment/forum/202411/25/222337n292qq2vw6id9qjp.png


2.学习步骤
https://www.stcaimcu.com/data/attachment/forum/202411/25/231937htu5073n44u37cut.png


3.交作业
3.1知识点:(STC_USB_CDC 功能可以实现不停电下载,不用再去冷启动下载,很方便!很实用的功能!)
3.2代码: https://www.stcaimcu.com/static/image/filetype/zip.gif 2-STC_USB.7z

AI-32位8051 发表于 2025-1-6 10:53:07

打卡!跟着冲天哥学习AI8051U的第Day 5!

C语言学习


1.知识点
https://www.stcaimcu.com/data/attachment/forum/202411/27/165458xpbpj3ocyxcojy77.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/170155fj78kqbo7oduefu9.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/171038jf76fffy9z6y9zy5.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/171225qoqb94rb9fvwwv9e.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/171504k8zlabmoma91o14m.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/171651t119gp3cc5p11awa.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/171745m04u4tr66av2uwp7.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/180008prn9zphppw6jcccp.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/180512rhyhak6qcqnzc3nf.png

https://www.stcaimcu.com/data/attachment/forum/202411/27/180918w0lzsg73wl3k73fm.png

2.总结:(注意点:变量的运算要注意位数,不然会溢出)

[*]#include <AI8051U.H>      //AI8051U头文件
[*]#include "STC32_STC8_USB.H"      //TSC_USB头文件
[*]
[*]/* 8 位无符号变量,范围:(0-255) */
[*]#define uint8_t unsigned               char
[*]/* 16位无符号变量,范围:(0-65535) */
[*]#define uint16_t unsigned short int
[*]/* 32位无符号变量,范围:(0-4294967295) */
[*]#define uint32_t unsigned longint
[*]
[*]char *USER_DEVICEDESC = NULL;
[*]char *USER_PRODUCTDESC = NULL;
[*]char *USER_STCISPCMD = "@STCISP#";
[*]
[*]void main(void)                        //主函数
[*]{
[*]      //只执行一次
[*]
[*]      /* 允许访问扩展特殊功能寄存器 */
[*]      P_SW2 |= 0x80;
[*]
[*]      /* 配置GPIO 模式 */
[*]      P0M0 = 0X00;      P0M1 = 0X00;
[*]      P4M1 = 0X00;      P4M1 = 0X00;
[*]
[*]      /* 打开流水灯供电 */
[*]      P40 = 0;
[*]
[*]      /* 初始化USB */
[*]      usb_init();
[*]
[*]      /* 开启USB中断 */
[*]      IE2 |= 0x80;
[*]
[*]      /* 开启全局总中断 */
[*]      EA = 1;
[*]
[*]      /* 等待USB完成配置 */
[*]      while(DeviceState != DEVSTATE_CONFIGURED);
[*]
[*]      while(1)
[*]      {
[*]      //LOOP
[*]
[*]                /* 判断USB是否接收到了数据 */
[*]                if(bUsbOutReady)
[*]      {
[*]                        /* 发送数据缓冲区,长度(接收数据原样返回, 用于测试) */
[*]                        //USB_SendData(UsbOutBuffer,OutNumber);
[*]
[*]                        /* 通过USB返回数据 */
[*]                        printf("STC_USB_TEXT\r\n");
[*]
[*]                        usb_OUT_done();
[*]      }
[*]
[*]                /* 打开P00的LED */
[*]                P00 = 0;
[*]      }
[*]}
3.推荐一个学习C语言的PDF
https://www.stcaimcu.com/static/image/filetype/pdf.gif 13万字C语言保姆级教程(极客江南出品).pdf

AI-32位8051 发表于 2025-1-6 10:53:57

打卡!跟着冲天哥学习AI8051U的第Day 6!

学习AI8051U的GPIO!


1.任务点
https://www.stcaimcu.com/data/attachment/forum/202412/03/233103ec7icx6h8b76136w.png

1.1.什么是GPIO
https://www.stcaimcu.com/data/attachment/forum/202412/03/233524dl0l50ylyk0505zp.png

1.2.GPIO模式
https://www.stcaimcu.com/data/attachment/forum/202412/03/233959g10hv7w8m419i770.png

1.3.GPIO端口的施密特触发器
https://www.stcaimcu.com/data/attachment/forum/202412/03/234328vvesbfm5q4q57n4i.png

1.4.按键输入检测
https://www.stcaimcu.com/data/attachment/forum/202412/03/234636i9ztwrr3cxxr9cwd.png

1.5.按键抖动(一般抖动在20ms以内)
https://www.stcaimcu.com/data/attachment/forum/202412/04/002553gnapv8ppa3q8m66q.png

https://www.stcaimcu.com/data/attachment/forum/202412/04/003316k06wn7rkk3ri067f.png

2.交作业

[*]#include <AI8051U.H>      //AI8051U头文件
[*]#include "STC32_STC8_USB.H"      //TSC_USB头文件
[*]#include <intrins.h>
[*]
[*]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)                        //主函数
[*]{
[*]      //只执行一次
[*]
[*]      unsigned chari = 0;
[*]
[*]      /* 允许访问扩展特殊功能寄存器 */
[*]      //P_SW2 |= 0x80;
[*]
[*]      /* 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快 */
[*]      WTST = 0;
[*]
[*]      /* 扩展寄存器(XFR)访问使能 */
[*]    EAXFR = 1;
[*]
[*]      /* 提高访问XRAM速度 */
[*]    CKCON = 0;
[*]
[*]      /* 配置 GPIO 模式 */
[*]      P0M0 = 0X00;      P0M1 = 0X00;
[*]      P3M0 = 0X00;      P3M1 = 0X00;
[*]      P4M1 = 0X00;      P4M1 = 0X00;
[*]
[*]      /* 初始化USB */
[*]      usb_init();
[*]
[*]      /* 开启USB中断 */
[*]      IE2 |= 0x80;
[*]
[*]      /* 开启全局总中断 */
[*]    EA = 1;
[*]
[*]      /* 等待USB完成配置 */
[*]      while(DeviceState != DEVSTATE_CONFIGURED);
[*]
[*]      /* 打开总LED电源 */
[*]      P40 = 0;
[*]
[*]      while(1)
[*]      {
[*]      //LOOP
[*]
[*]                if(bUsbOutReady)
[*]      {
[*]                        /* 发送数据缓冲区,长度(接收数据原样返回, 用于测试) */
[*]                        USB_SendData(UsbOutBuffer,OutNumber);
[*]
[*]                        usb_OUT_done();
[*]      }
[*]#if 0               
[*]                /* 判断P32按键是否为0 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0) { P00 = 0; }
[*]                else                  { P00 = 1; }
[*]#endif
[*]
[*]#if 0               
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 1) { P00 = 0; }
[*]                else                  { P00 = 1; }
[*]#endif
[*]
[*]#if 0               
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0) { P00 = !P00; }
[*]                /* 等待P32松开 */
[*]                while(!P32);
[*]#endif
[*]
[*]#if 0               
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0)
[*]                {
[*]                        /* 消抖 */
[*]                        Delay20ms();
[*]
[*]                        if(P32 == 0)
[*]                        {
[*]                              /* 对P00进行取反 */
[*]                              P00 = !P00;
[*]
[*]                              /* 等待P32松开 */
[*]                              while(!P32);
[*]                        }
[*]                }
[*]
[*]#endif
[*]
[*]#if 0               
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0)
[*]                {
[*]                        /* 消抖 */
[*]                        Delay20ms();
[*]
[*]                        if(P32 == 0)
[*]                        {
[*]                              /* 亮 */
[*]                              P00 = 0;
[*]
[*]                              /* 等待P32松开 */
[*]                              while(!P32);
[*]                        }
[*]                }
[*]
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P33 == 0)
[*]                {
[*]                        /* 消抖 */
[*]                        Delay20ms();
[*]
[*]                        if(P33 == 0)
[*]                        {
[*]                              /* 灭 */
[*]                              P00 = 1;
[*]
[*]                              /* 等待P32松开 */
[*]                              while(!P33);
[*]                        }
[*]                }
[*]#endif
[*]
[*]#if 1      
[*]                P0 = 0XFF;
[*]
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0)
[*]                {
[*]                        /* 消抖 */
[*]                        Delay20ms();
[*]
[*]                        if(P32 == 0)
[*]                        {
[*]                              /* 每次LED进行加一 */
[*]                              P0 = (P0<<1);
[*]
[*]                              /* 等待P32松开 */
[*]                              while(!P32);
[*]                        }
[*]                }
[*]
[*]#endif
[*]
[*]      }
[*]}
[*]

AI-32位8051 发表于 2025-1-6 10:55:43

打卡!跟着冲天哥学习AI8051U的第Day 7!

学习AI8051U的定时器!

1.定时器的介绍
https://www.stcaimcu.com/data/attachment/forum/202412/07/045433ecjt8zttzksghc8w.png


2.定时器的作用
https://www.stcaimcu.com/data/attachment/forum/202412/07/045543spptu7cm9ppmcxmk.png


3.用ISP生成定时器配置代码(注意一定要勾选定时器中断)
https://www.stcaimcu.com/data/attachment/forum/202412/07/050843dk5zebz4b41phc1y.png


4.定时器的应用
https://www.stcaimcu.com/data/attachment/forum/202412/07/052329suy4zcy3nczycepp.png


5.函数的声明定义调用
https://www.stcaimcu.com/data/attachment/forum/202412/07/053427gj1ds57a118dn5z5.png


6.交作业

[*]#include <AI8051U.H>      //AI8051U头文件
[*]#include "STC32_STC8_USB.H"      //TSC_USB头文件
[*]#include <intrins.h>
[*]
[*]char *USER_DEVICEDESC = NULL;
[*]char *USER_PRODUCTDESC = NULL;
[*]char *USER_STCISPCMD = "@STCISP#";
[*]
[*]bit Run_State = 0;
[*]
[*]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)                        //主函数
[*]{
[*]      //只执行一次
[*]
[*]      unsigned chari = 0;
[*]
[*]      /* 允许访问扩展特殊功能寄存器 */
[*]      //P_SW2 |= 0x80;
[*]
[*]      /* 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快 */
[*]      WTST = 0;
[*]
[*]      /* 扩展寄存器(XFR)访问使能 */
[*]    EAXFR = 1;
[*]
[*]      /* 提高访问XRAM速度 */
[*]    CKCON = 0;
[*]
[*]      /* 配置 GPIO 模式 */
[*]      P0M0 = 0X00;      P0M1 = 0X00;
[*]      P3M0 = 0X00;      P3M1 = 0X00;
[*]      P4M1 = 0X00;      P4M1 = 0X00;
[*]
[*]      /* 初始化定时器0 */
[*]      //Timer0_Init();
[*]
[*]      /* 初始化USB */
[*]      usb_init();
[*]
[*]      /* 开启USB中断 */
[*]      IE2 |= 0x80;
[*]
[*]      /* 开启全局总中断 */
[*]    EA = 1;
[*]
[*]      /* 等待USB完成配置 */
[*]      while(DeviceState != DEVSTATE_CONFIGURED);
[*]
[*]      /* 打开总LED电源 */
[*]      P40 = 0;
[*]
[*]      while(1)
[*]      {
[*]      //LOOP
[*]
[*]                if(bUsbOutReady)
[*]      {
[*]                        /* 发送数据缓冲区,长度(接收数据原样返回, 用于测试) */
[*]                        USB_SendData(UsbOutBuffer,OutNumber);
[*]
[*]                        usb_OUT_done();
[*]      }
[*]
[*]#if 1      
[*]                P0 = 0XFF;
[*]
[*]                /* 判断P32按键是否为1 '0'灯亮,'1'灯灭 */
[*]                if(P32 == 0)
[*]                {
[*]                        /* 消抖 */
[*]                        Delay20ms();
[*]
[*]                        if(P32 == 0)
[*]                        {
[*]                              Run_State = !Run_State;
[*]
[*]                              if(Run_State == 1)
[*]                              {
[*]                                        Timer0_Init();
[*]                              }
[*]                              else
[*]                              {
[*]                                        /* 关闭定时器 */
[*]                                        TR0 = 0;
[*]                                        P00 = 1;
[*]                                        P01 = 1;
[*]                              }
[*]
[*]//                              /* 灯亮 */
[*]//                              P00 = 0;
[*]//                              
[*]//                              /* 开启定时器 */
[*]//                              TR0 = 0;
[*]
[*]                              /* 等待P32松开 */
[*]                              while(!P32);
[*]                        }
[*]                }
[*]
[*]#endif
[*]
[*]      }
[*]}
[*]
[*]void Timer0_Isr(void) interrupt 1
[*]{
[*]      P00 = !P00;
[*]      P01 = !P00;
[*]      //P00 = !P00;
[*]
[*]      /* 关闭定时器 */
[*]      //TR0 = 0;
[*]}
[*]

AI-32位8051 发表于 2025-1-6 10:56:15

打卡!跟着冲天哥学习AI8051U的第Day 8!

学习AI8051定时器任务调度方法!

1.周期性任务介绍
https://www.stcaimcu.com/data/attachment/forum/202501/04/025651veu8ncc5etpbtnct.png

https://www.stcaimcu.com/data/attachment/forum/202501/04/031709yjqqi05840j8yypg.png


2.(.c/.h)文件创建
https://www.stcaimcu.com/data/attachment/forum/202501/04/032150gyiqriqyqnbhrqjx.png


3.结构体数组的周期性任务调度(重点!)
https://www.stcaimcu.com/data/attachment/forum/202501/04/053345eejdy6n8haday16u.png


Task.c

[*]static TASK_COMPONENTS Task_Comps[]=
[*]{
[*]//状态计数周期函数
[*]    {0, 1,   1,   Sample_Display},      /* task 1 Period: 1ms */
[*]    {0, 10,10,Sample_MatrixKey},    /* task 2 Period: 10ms */
[*]    {0, 10,10,Sample_adcKey},       /* task 3 Period: 10ms */
[*]    {0, 300, 300, Sample_NTC},          /* task 4 Period: 300ms */
[*]    {0, 500, 500, Sample_RTC},          /* task 5 Period: 500ms */
[*]    /* Add new task here */
[*]};
[*]
[*]u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
[*]
[*]//========================================================================
[*]// 函数: Task_Handler_Callback
[*]// 描述: 任务标记回调函数.
[*]// 参数: None.
[*]// 返回: None.
[*]// 版本: V1.0, 2012-10-22
[*]//========================================================================
[*]void Task_Marks_Handler_Callback(void)
[*]{
[*]    u8 i;
[*]    for(i=0; i<Tasks_Max; i++)
[*]    {
[*]      if(Task_Comps.TIMCount)      /* If the time is not 0 */
[*]      {
[*]            Task_Comps.TIMCount--;   /* Time counter decrement */
[*]            if(Task_Comps.TIMCount == 0) /* If time arrives */
[*]            {
[*]                /*Resume the timer value and try again */
[*]                Task_Comps.TIMCount = Task_Comps.TRITime;
[*]                Task_Comps.Run = 1;      /* The task can be run */
[*]            }
[*]      }
[*]    }
[*]}
[*]
[*]//========================================================================
[*]// 函数: Task_Pro_Handler_Callback
[*]// 描述: 任务处理回调函数.
[*]// 参数: None.
[*]// 返回: None.
[*]// 版本: V1.0, 2012-10-22
[*]//========================================================================
[*]void Task_Pro_Handler_Callback(void)
[*]{
[*]    u8 i;
[*]    for(i=0; i<Tasks_Max; i++)
[*]    {
[*]      if(Task_Comps.Run) /* If task can be run */
[*]      {
[*]            Task_Comps.Run = 0;      /* Flag clear 0 */
[*]            Task_Comps.TaskHook();   /* Run task */
[*]      }
[*]    }
[*]}
[*]

复制代码Task.h

[*]#ifndef __TASK_H_
[*]#define __TASK_H_
[*]
[*]#include "config.h"
[*]
[*]//========================================================================
[*]//                               本地变量声明
[*]//========================================================================
[*]
[*]typedef struct
[*]{
[*]      u8 Run;               //任务状态:Run/Stop
[*]      u16 TIMCount;         //定时计数器
[*]      u16 TRITime;          //重载计数器
[*]      void (*TaskHook) (void); //任务函数
[*]} TASK_COMPONENTS;
[*]
[*]//========================================================================
[*]//                           外部函数和变量声明
[*]//========================================================================
[*]
[*]void Task_Marks_Handler_Callback(void);
[*]void Task_Pro_Handler_Callback(void);
[*]
[*]#endif

页: 1 [2]
查看完整版本: 打卡!跟着冲天哥学习AI8051U的第Day 1!