学习《Ai8051U教学视频》学习心得
感谢官方 免费+包邮 的 Ai8051U 实验箱。借此实验箱学习一下 Ai8051U 的进阶操作,
在本贴记录一下学习过程。
先来个跑马灯开工仪式:
学习《Ai8051U教学视频》学习心得
首先,衷心感谢STC官方提供的免费且包邮的Ai8051U实验箱,这为我们深入学习Ai8051U的进阶操作提供了极大的便利。借此机会,我将在此记录我的学习过程,并分享一些初步的心得体会。
1. 实验箱开箱与初步体验
收到实验箱后,首先进行了开箱检查。实验箱内包含了Ai8051U开发板、配套的电源适配器、USB数据线以及详细的使用手册。整体包装精致,配件齐全,体现了STC对用户体验的重视。
2. 跑马灯实验:开工仪式
作为学习的起点,我选择了经典的“跑马灯”实验。这一实验不仅能够帮助我们熟悉Ai8051U的基本操作,还能通过直观的LED灯闪烁效果,增强学习的趣味性。
2.1 实验步骤
1. 硬件连接:将Ai8051U开发板通过USB数据线连接到电脑,确保电源供应正常。
2. 软件环境搭建:安装STC官方提供的开发环境,并配置好编译器与调试工具。
3. 编写代码:根据实验手册,编写简单的跑马灯程序,控制开发板上的LED灯依次点亮和熄灭。
4. 程序下载与调试:将编写好的程序下载到Ai8051U开发板,观察LED灯的运行效果,并进行必要的调试。
2.2 实验结果
通过上述步骤,成功实现了跑马灯效果。LED灯按照预设的顺序依次点亮和熄灭,验证了Ai8051U的基本控制功能。
3. 学习心得
3.1 硬件与软件的协同
Ai8051U实验箱的硬件设计简洁而实用,配合STC官方提供的软件工具,能够快速搭建起开发环境。这种硬件与软件的协同,极大地提高了学习效率。
3.2 编程思维的培养
通过跑马灯实验,我深刻体会到了编程思维的重要性。从逻辑设计到代码实现,每一步都需要严谨的思考和细致的操作。这不仅锻炼了我的编程能力,也增强了我对嵌入式系统的理解。
3.3 进阶学习的展望
跑马灯实验只是Ai8051U学习的起点,接下来我计划深入学习其更高级的功能,如定时器、中断、串口通信等。通过不断实践和探索,我相信能够掌握Ai8051U的更多应用技巧,为未来的项目开发打下坚实的基础。
4. 结语
再次感谢STC官方提供的Ai8051U实验箱,这为我提供了一个宝贵的学习平台。通过跑马灯实验,我不仅熟悉了Ai8051U的基本操作,也激发了我对嵌入式系统学习的热情。期待在接下来的学习中,能够有更多的收获和成长。
后续学习计划:
深入学习Ai8051U的定时器与中断功能
探索串口通信的实现与应用
结合实际项目,进行综合应用开发
希望通过不断的学习与实践,能够将Ai8051U的强大功能发挥到极致,为未来的技术发展贡献自己的力量。
[本文内容由国芯人工智能辅助生成,仅供参考] #include <AI8051U.H>
#include "ai_usb.h"
u8 ucLed = 0xfe;
void Led_Disp(u8 ucLed)
{
P40 = 0;
P0 = ucLed;
}
void Delay1ms(void) //@40.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 9998UL;
while (i) i--;
}
void delay(u16 xms)
{
u16 i;
for(i = xms; i > 0; i--)
{
Delay1ms();
}
}
void main()
{
EAXFR = 1;
WTST = 0;
CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init();
EA = 1;
while(1)
{
if(bUsbOutReady)
{
usb_OUT_done();
}
Led_Disp(ucLed);
ucLed = _crol_(ucLed,1);
delay(1000);
}
}
学习心得:
1 硬件与软件的协同
Ai8051U实验箱的硬件设计简洁而实用,配合STC官方提供的软件工具,能够快速搭建起开发环境。这种硬件与软件的协同,极大地提高了学习效率。
2 编程思维的培养
通过跑马灯实验,我深刻体会到了编程思维的重要性。从逻辑设计到代码实现,每一步都需要严谨的思考和细致的操作。这不仅锻炼了我的编程能力,也增强了我对嵌入式系统的理解。
3 进阶学习的展望
跑马灯实验只是Ai8051U学习的起点,接下来我计划深入学习其更高级的功能,如定时器、中断、串口通信等。通过不断实践和探索,我相信能够掌握Ai8051U的更多应用技巧,为未来的项目开发打下坚实的基础。 第六课练习程序#include <AI8051U.H>
#include "ai_usb.h"
u8 ucLed[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
u8 Key_Num = 0;
void Led_Disp(u8 ucLed)
{
P40 = 0;
P0 = ucLed;
}
//void Delay1ms(void) //@40.000MHz
//{
// unsigned long edata i;
// _nop_();
// _nop_();
// _nop_();
// i = 9998UL;
// while (i) i--;
//}
//void delay(u16 xms)
//{
// u16 i;
// for(i = xms; i > 0; i--)
// {
// Delay1ms();
// }
//}
void main()
{
EAXFR = 1;
WTST = 0;
CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init();
EA = 1;
while(1)
{
if(bUsbOutReady)
{
usb_OUT_done();
}
// 任务1:按下P32按钮灯亮,松开P32按钮灯灭;
// if(P32 == 0)
// {
// Led_Disp(0x00);
// }
// else
// {
// Led_Disp(0xff);
// }
// 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
// if(P32 == 0)
// {
// Led_Disp(0xff);
// }
// else
// {
// Led_Disp(0x00);
// }
// 课后小练1:按一下灯亮,按一下灯灭;
// if(P32 == 0)
// {
// delay(20);
// if(P32 == 0)
// {
// while(P32 == 0);
// ucLed = ~ucLed;
// }
// }
// Led_Disp(ucLed);
// 课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)
if(P32 == 0)
{
delay(20);
if(P32 == 0)
{
while(P32 == 0);
if(++Key_Num > 8)Key_Num = 0;
Led_Disp(ucLed);
}
}
}
}
第7课定时器程序,主要完成LED三秒取反一次,期间任意按下按钮,串口打印次数#include <AI8051U.H>
#include "ai_usb.h"
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0x00;
u8 Key_Count = 0;
void Led_Disp(u8 ucLed)
{
P40 = 0;
P0 = ucLed;
}
void Delay20ms(void) //@40.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 199998UL;
while (i) i--;
}
void Timer0_Init(void) //3秒@40.000MHz
{
TM0PS = 0x98; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB1; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main()
{
EAXFR = 1;
WTST = 0;
CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init();
Timer0_Init();
EA = 1;
while(1)
{
if(bUsbOutReady)
{
usb_OUT_done();
}
if(P32 == 0)
{
Delay20ms();
if(P32 == 0)
{
while(P32 == 0);
Key_Count++;
printf_usb("按键次数\xfd %d",(int)Key_Count);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
state = ~state;
Led_Disp(state);
} 为什么使用AiCube框架生成的CDC无法实现不掉电下载呢 今天学习了RTC,非常棒////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2025-04-19) 创建文件
////////////////////////////////////////
#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
bit t0_flag = 0;
bit t1_flag = 0;
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
SYS_Init();
P40 = 0;
while (1)
{
if(t0_flag)
{
t0_flag = 0;
printf_usb("Timer0!\r\n");
}
if(t1_flag)
{
t1_flag = 0;
printf_usb("Timer1!\r\n");
}
USBLIB_OUT_Done(); //查询方式处理USB接收的数据
}
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式
P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式
TIMER0_Init(); //定时器0初始化
TIMER1_Init(); //定时器1初始化
USBLIB_Init(); //USB库初始化
EnableGlobalInt(); //使能全局中断
}
////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
}
////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
P00 = ~P00;
t0_flag = 1;
}
////////////////////////////////////////
// 定时器1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_ISR(void) interrupt TMR1_VECTOR
{
P07 = ~P07;
t1_flag = 1;
}
////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
}
////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}
////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
if (bUsbOutReady) //查询是否有接收到USB主机发送数据
{
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
usb_OUT_done(); //当前包的数据处理完成,通知USB主机可以发送下一包数据
}
}
////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR 102
#define T0_RELOAD (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 2 / 1)
TIMER0_TimerMode(); //设置定时器0为定时模式
TIMER0_12TMode(); //设置定时器0为12T模式
TIMER0_Mode0(); //设置定时器0为模式0 (16位自动重载模式)
TIMER0_DisableGateINT0(); //禁止定时器0门控
TIMER0_SetIntPriority(0); //设置中断为最低优先级
TIMER0_EnableInt(); //使能定时器0中断
TIMER0_SetPrescale(T0_PSCR); //设置定时器0的8位预分频
TIMER0_SetReload16(T0_RELOAD); //设置定时器0的16位重载值
TIMER0_Run(); //定时器0开始运行
}
////////////////////////////////////////
// 定时器1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_Init(void)
{
#define T1_PSCR 25
#define T1_RELOAD (65536 - (float)SYSCLK / 12 / (T1_PSCR + 1) * 500 / 1000)
TIMER1_TimerMode(); //设置定时器1为定时模式
TIMER1_12TMode(); //设置定时器1为12T模式
TIMER1_Mode0(); //设置定时器1为模式0 (16位自动重载模式)
TIMER1_DisableGateINT1(); //禁止定时器1门控
TIMER1_SetIntPriority(0); //设置中断为最低优先级
TIMER1_EnableInt(); //使能定时器1中断
TIMER1_SetPrescale(T1_PSCR); //设置定时器1的8位预分频
TIMER1_SetReload16(T1_RELOAD); //设置定时器1的16位重载值
TIMER1_Run(); //定时器1开始运行
}
页:
[1]