打卡!跟着冲天哥学习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.开始实验(由于手上没有板子,只能模拟一下步骤)
打卡!跟着冲天哥学习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
打卡!跟着冲天哥学习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
打卡!跟着冲天哥学习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
打卡!跟着冲天哥学习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
[*]
[*] }
[*]}
[*]
打卡!跟着冲天哥学习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;
[*]}
[*]
打卡!跟着冲天哥学习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]