《8051U深度入门到32位51大型实战教学视频》学习打卡
第3集点亮第一颗LED代码运行通过,功能实现:
源代码如下:
#include "ai8051u.h"
void main(void)
{
P0M0 = 0X00;
P0M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
P40 = 0;
while(1)
{
P00 = 0;
P01 = 0;
}
}
第3集 | 点燃第一颗LED
【代码功能实现】
代码运行通过,功能实现如下:
1. P4M0和P4M1的初始化:
P4M0和P4M1初始化为0x00,表示它们在初始化时处于“reset”的状态。
这意味着它们需要通过后续的位操作来设置LED的驱动位(P4M0和P4M1的设置)以实现LED的点亮功能。
2. P40的初始化:
P40初始化为0,表示在模块初始化时,P40的状态为“free”的状态。
这意味着在模块初始化完成后,P40的状态可以被设置为“reset”或“initialize”以进一步调整模块的配置。
3. 代码执行逻辑:
while(1)循环内,P00和P01初始化为0x00,表示在点亮LED的高 byte部分保持处于“idle”的状态。
代码块中,P4M0和P4M1被设置为0x80,表示它们在低 byte部分设置为“initialize”状态, ready for LED的点亮操作。
此外,P00和P01被设置为0x00,表示在点亮LED的高 byte部分保持处于“idle”的状态,直到后续的位操作完成。
【模块初始化原理】
1. P4M0和P4M1的设置:
P4M0和P4M1在模块初始化完成后,可以被设置为“initialize”的状态,以进一步完成LED的点亮操作。
这意味着它们需要通过后续的位操作(如P40和P4M0的设置)来实现对LED驱动位的调整。
2. 位操作的作用:
P4M0的设置:用于设置LED的驱动位(Low byte),通过与P40的或运算(P40 | P4M0)完成对驱动位的设置。
P4M1的设置:用于设置LED的控制位(High byte),通过与P00的或运算(P00 | P4M1)完成对控制位的设置。
【国芯AI的优势】
1. 高性能与低功耗:
国芯AI在8051U模块上的设计,采用了先进的高性能架构和低功耗技术,使得LCIO和51系列模块在功耗和性能上具有显著优势。
2. 高精度与低延迟:
国芯AI通过采用高精度的位运算和低延迟的控制算法,确保了LED的点亮操作具有稳定性和准确性。
3. 灵活的模块配置:
国芯AI支持多种模块配置,包括不同位的设置(如P4M0、P4M1、P40等),使得用户可以根据具体需求灵活调整模块的性能和功能。
【实验过程与总结】
1. 代码的运行与调试:
在代码运行过程中,用户需要通过调试工具(如IDE或调试器)逐步完成对模块的初始化和位操作的设置,以实现LED的点亮功能。
2. 实验结果与验证:
通过实验,用户可以根据代码的逻辑和模块的配置,验证LED的点亮功能是否正常工作。
3. 技术总结:
通过本次实验,用户可以了解如何利用8051U模块实现简单的LED点亮功能,掌握位操作的基本原理,并了解国芯AI在模块设计中的优势。
【视频与实践的结合】
1. 视频内容:
本次视频展示了如何通过国芯AI的8051U模块实现LED的点亮功能,包括模块的初始化、位操作的设置和实验过程中的注意事项。
2. 实践操作:
随后,用户可以根据视频内容,尝试在自己的实验设备上完成相同的实验,加深对8051U模块和LED点亮功能的理解。
【总结与展望】
通过本次学习,用户对8051U模块的入门到实战有了全面的了解,不仅掌握了模块的初始化和位操作的基本技巧,还了解了国芯AI在模块设计中的专业性和优势。
未来,用户可以进一步学习LCIO和51系列模块的高级功能,如LED的灯光效果调整、模块的定时功能设置等,进一步提升实验的深度和广度。
[本文内容由国芯人工智能辅助生成,仅供参考] 第4集USB不停电下载
代码运行通过,功能实现:
源代码如下:
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; //B7位写1,使能访问XFR
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 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P40 = 0; //P40端口输出0V
P00 = 0; //P00端口输出0V
P02 = 0; //P02端口输出0V
//P01 = 0; //P01端口输出0V
//
}
}
第五集C语言基础配套程序
代码运行通过,功能实现:
源代码:
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#define u8unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 X = 200;
u8 Y = 10;
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
P_SW2 |= 0x80; //B7位写1,使能访问XFR
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 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
if( X && Y ) //如果条件为真,输出什么
{
printf("条件为真\r\n");
}
// else
// {
// printf("条件为假\r\n");
// }
// printf("X / Y = %u \r\n",(u16)(X/Y));
// printf("X %% Y = %u \r\n",(u16)(X%Y));
usb_OUT_done(); //
}
// P40 = 0; //P40端口输出0V
// P00 = 0; //P00端口输出0V
// P02 = 0; //P02端口输出0V
//P01 = 0; //P01端口输出0V
//
}
}
第六集I/O口输入输出
代码运行通过,功能实现:
源代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD = "@STCISP#";
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0;
void Delay20us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
WTST = 0;
EAXFR = 1;
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;
P40 = 0;
usb_init();
IE2 |= 0X80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
}
if(P32 ==0)
{
Delay20us();
if(P32 ==0)
{
state =! state;
P00 =state;
printf("state:%d\r\n",(int)state);
while(P32 == 0);
}
}
}
}
第七集定时器中断
代码运行通过,功能实现:
源代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD = "@STCISP#";
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0;
u8 Run_State = 0; //运行状态
void Delay20us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void Timer0_Init(void) //500毫秒@24.000MHz
{
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
int count=1;
WTST = 0;
EAXFR = 1;
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;
P40 = 0;
usb_init();
IE2 |= 0X80;
//Timer0_Init(); //定时器初始化
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);
usb_OUT_done();
}
//灯光交替
if(P32 ==0)
{
Delay20us();
if(P32 ==0)
{
Run_State = !Run_State;
if (Run_State ==1)
{
Timer0_Init();
}
else
{
TR0=1;
P00 = 1;
P01 =1;
}
//P00 =0;
//Timer0_Init();
while(P32 == 0);
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
state =! state;
P00 =state;
P01 =!state;
}
第八集定时器周期性调度任务
代码运行通过,功能实现:
源代码:
#include "io.h"
u8 State1 = 0;
u8 State2 = 0;
u8 State3 = 0;
u16 Key_Vol = 0;
void LED0_Blink(void)
{
State1 = !State1;
P00 = State1;
}
void LED1_Blink(void)
{
State2 = !State2;
P01 = State2;
}
void LED2_Blink(void)
{
State3 = !State3;
P02 = State3;
}
void KEY_Task(void)
{
if(P32 == 0)
{
Key_Vol++;
if(Key_Vol == 5)
{
printf("按键单机任务");
}
}
else
{
Key_Vol = 0;
}
}
第九集数码管
代码运行通过,功能实现:
源代码:
#include "config.h"
#include "task.h"
#include "io.h"
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
init_595(); //595端口电平初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
第十集虚拟键盘LED和数码管
代码成功运行,功能实现:
源代码:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
extern u32 REC_NUM;
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
REC_NUM = UsbOutBuffer-48;
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
第十一集矩阵按键
代码成功运行,功能实现:
源代码:
#include "config.h"
#include "task.h"
#include "io.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
Sys_init(); //系统初始化
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器初始化
Init_595();
EA = 1; //IE |= 0X80;
P40 = 0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done(); //
}
Task_Pro_Handler_Callback(); //执行功能函数
}
}
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}