打卡AI8051学习
第一集入门今天完整学完第一集,冲哥的讲解完全超出预期,把 “入门必懂的核心问题” 拆解得细致又透彻。比如大家常问的 “汇编和 C 语言该选哪个”,他没有简单下结论,而是结合客户实际开发场景分析:汇编适合对代码效率要求极高的简单控制(比如仅需点亮 LED、按键检测的极简项目),但后期维护难;C 语言更适配复杂项目(比如带数码管显示、ADC 测温的综合功能),代码可读性强,调试也方便,还举例说 “现在工业上 80% 的 51 项目都用 C 语言”,让我瞬间明确了学习方向。 推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4
上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
学习了课程的第二集,
首先了解了开发板的外设,布局,以及相关芯片。对开发板有了一定的熟悉。
其次下载了开发软件并配置好了环境,下载了烧录软件,
并且学会了程序的烧录方法!继续加油。 看了第四集,知道了如何进行USB不停电下载,这一过程包括下载软件资源,添加头文件等,实现了这一操作之后,能够极大地提高效率。
USB不停电下载
下载所需文件(STC官网-软件工具-库函数-USB库文件)
移植关键部分到工程
添加头文件
USB初始化函数(Hib+.h库实现)
添加库文件
命令参数
打开P SW2寄存器和IE2寄存器(只打开一个位!) 之前用过一些应用类的开发,没想到时隔多年,库里居然有printf()
这下调试程序,计算再也不容易出错了,
以前用51经常出错变量类型计算指针 搞着搞着就容易出错,排查要好久
这下轻松了 printf()一个输出,直接搞定。
一个搞不定那就多整几个,总有一个Printf函数解决 跟着冲哥打卡第五集 C语言基础 完成
C语言USB-CDC串口之printf趣数的实现
1.打开USB库中的PRINTF.HIQ宏定义(去掉//)
2.理解PRINTF的函数原型的定义 #define printf printf_hid int printf_hid (const char *fmt; ...);
参数fmt --是格式控制字符串,包含了两种类型的对象:普通字符和转换说明普通字符:在输出时,普通字符将原样不动地复制到标准输出。
转换说明简介
1.类型:根据不同的fmt字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了fmt参数中指定的每个%标签。关子附加参数,既可以是变量,也可以是常量。
2.位置: printf()函数的普通字符和转换说明放在""双引号内,附加参数放在双引号外,每个附加参数之间用逗号隔开。
3.数量:printf()的附加参数与转换说明符是。一对应关系,如果有n个转换说明符;,printf)的参数就应该有n+1个。如果参数个数少于对应的转换说明符,printf(可能会输出内存中的任意值。 跟着冲哥学习8051U打卡第六集
I/O输入输出
四种模式,常用准双向模式 第七集学习打卡
中断过程中学习从开始如何定义中断,配置参数,中断执行过程等老师都说的很详细。配合图形很容易记忆。第七集还是51的基础——定时器中断的使用,这是每一个学过51的人应该具备的基础。AI8051U跟传统51单片机不一样的地方在于,它的定时器是有预分频的,可能是由于内部时钟的频率比较高,加了一个分频寄存器后,定时器的定时时长就更灵活了。8位预分频+16位自动重装,T0-T4、T11六个定时器,这个配置太香了! 第八集-定时器周期性调度任务— 实验一:LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次
Ai8051U确实强大!接之前的学习打卡,按照冲哥的视频中的实验步骤把一些代码及注意事项打出来。
#include"ai8051u.h"
#include"ai_usb.h"
#define MAIN_FOSC24000000UL
u8 LED1_state = 0;
u8 LED2_state = 0;
u8 LED3_state = 0;
u16 count_300 = 0;
u16 count_600 = 0;
u16 count_900 = 0;
void Timer0_Init(void);
void main()
{
EAXFR = 1;
WTST = 0;
CKCON = 0;
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();
EUSB = 1;
Timer0_Init();
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
P40 = 0; // 打开LED供电
while(1)
{
if (bUsbOutReady)
{
usb_OUT_done();
}
if(count_300>=300)
{
count_300 = 0;
LED1_state = !LED1_state;
P00 = LED1_state;
}
if(count_600>=600)
{
count_600 = 0;
LED2_state = !LED2_state;
P01 = LED2_state;
}
if(count_900>=900)
{
count_900 = 0;
LED3_state = !LED3_state;
P02 = LED3_state;
}
}
}
void Timer0_Isr(void) interrupt 1
{
count_300++;
count_600++;
count_900++;
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x40; //设置定时初始值
TH0 = 0xA2; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
页:
[1]