找回密码
 立即注册
查看: 1391|回复: 43

《8051U深度入门到32位51大型实战视频》学习打卡贴———Abner

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-10 15:54:36 | 显示全部楼层 |阅读模式

第一集-序言

哪怕梦想让我们遍体鳞伤,这一次我们也要勇往直前,送给每一个追梦的人!

屏幕截图2024-12-23102916.png

AI8051U的特点

32位与8位指令集双兼容

flash编程

IIS音频

PWM_DMA

硬件浮点运算单元——TFPU

QSPI

最后看到坛友做的手写计算器,让我真正认识到 AI含量!

让我们好好开始学习 AI8051U吧!

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-12 16:48:29 | 显示全部楼层

第二集 硬件及工具介绍

实验箱

屏幕截图2024-12-12162101.png

实验箱板载了很多芯片和外设,包括SPI Flash、EEPROM、DS18B20、SP3485、数码管、矩阵键盘、ADC键盘、麦克风、音频输出口、TF卡插槽等等。配合demo程序可以完成示波器,视频播放等等功能。

软件

屏幕截图2024-12-12163510.png

32Bit编程需要使用KEIL C251,下载需要ISP软件。ISP软件不仅可以下载程序,还能当串口助手,仿真接口,定时器计算等等众多功能。下载有多种方式,USB下载、串口下载、USB Link 1D下载。

第二集完成。。。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-16 13:23:24 | 显示全部楼层

第三集 点亮第一颗LED

编写工程

根据AI8051U数据手册6.5新建32Bit的工程

屏幕截图2024-12-16112711.png

根据手册6.4添加32Bit头文件

屏幕截图2024-12-16113308.png

根据自己画的板子修改教程代码点亮第一颗LED

开源地址 https://oshwhub.com/abnerh/ai8051u-minimum-system-board

代码


#include "AI8051U.h"

void main(void)
{
	P0M1 = 0x00;//P00设置为准双向口
	P0M0 = 0x00;
	P00 = 0;//P00置低
	while(1)
	{

	}
}

实现效果,蓝色led点亮

微信图片_20241216132118.jpg

AI8051U第一个程序完成!

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-18 09:15:23 | 显示全部楼层

第四集 USB不停电下载

不需要按按键或者断电即可完成程序下载

屏幕截图2024-12-18085711.png

示例代码

#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
		//
	}
}

下载设置

USB-CDC不停电下载配置.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-18 09:49:14 | 显示全部楼层

第五集 C语言基础

内容摘要

屏幕截图2024-12-18092757.png

USB-CDC串口之printf函数的实现

#define printf  printf_hid	//#define  替换名  被替换名

使用define 将printf 重定向至 printf_hid

printf_hid由stc_usb库完成

printf的参数

int printf_hid (const char *format, ...);

屏幕截图2024-12-18093619.png

屏幕截图2024-12-18093808.png

屏幕截图2024-12-18093851.png

数的进制:2进制、10进制、16进制

图片1.png

数据的基本类型

想要使用64位变量,需要在程序文件里面添加申明:#pragma float64

图片2.png

C语言常用运算符

屏幕截图2024-12-18094444.png

屏幕截图2024-12-18094501.png

屏幕截图2024-12-18094734.png

屏幕截图2024-12-18094802.png

屏幕截图2024-12-18094818.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-20 16:59:30 | 显示全部楼层

第六集 I/O输入输出

什么是GPIO

GPIO(General Purpose Input Output)通用输入/输出口,简称IO口,可以控制高低电平输出。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-21 09:21:21 | 显示全部楼层

第六集 I/O输入输出

什么是GPIO

高电平——VCC

低电平——0V

端口模式

屏幕截图2024-12-21091104.png

按键输入检测

屏幕截图2024-12-21091258.png

void main(void)
{
    WTST = 0;  										//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; 										//扩展寄存器(XFR)访问使能
    CKCON = 0; 										//提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;

    usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;

	while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置

	while(1)
	{

        if (bUsbOutReady)							//如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  
            usb_OUT_done();							//
        }
		//任务1:按下P32按钮灯亮,松开P32按钮灯灭;
            if( P32 == 0 )								//判断P32按钮是否按下
		{
			P00 = 0;
                }
		else
		{
			P00 = 1;
		}



	}
}
		//任务2:按下P32按钮灯灭,松开P32按钮灯亮;
		if( P32 == 1 )								//判断P32按钮是否按下
		{
			P00 = 0;
		}
		else
		{
			P00 = 1;
		}
		//任务3:按一下灯亮,按一下灯灭
		if( P32 == 0 )								//判断P32按钮是否按下
		{
			Delay20ms();							//延时20ms消抖
			if( P32 == 0 )
			{
				state = !state;						//变量取反 0 1 0 1 0 1
				P00 = state;
				printf("state:%d\r\n",(int)state);

				while( P32 == 0 );					//等待P32松开

			}
		}

第六集结束~~~

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-23 10:40:18 | 显示全部楼层

第七集 定时器中断

摘要

1.定时器的介绍
2.定时器的应用
3.函数的定义、声明、调用

定时器的介绍

(1) 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2) 替代长时间的Delay,提高程序的运行效率和处理速度(可以打断主循环)

定时器的应用

image.png

image.png

//定时器初始化
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 Timer0_Isr(void) interrupt 1		//3秒执行一次
{
	state = !state;

	P00 = state;
	P01 = !state;
}
//任务1主循环:
if( P32 == 0 )								//判断P32按钮是否按下
{
	Delay20ms();							//延时20ms消抖
	if( P32 == 0 )
	{
		printf("按键按下次数\xfd:%d 次\r\n",(int)count);
		count++;

		while( P32 == 0 );					//等待P32松开

	}
}
//任务2:灯按一下点亮三秒后熄灭。
if( P32 == 0 )								//判断P32按钮是否按下
{
	Delay20ms();							//延时20ms消抖
	if( P32 == 0 )
	{
		P00 = 0;
		Timer0_Init();
		while( P32 == 0 );					//等待P32松开

	}
}
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2    	  表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
if( P32 == 0 )								//判断P32按钮是否按下
{
	Delay20ms();							//延时20ms消抖
	if( P32 == 0 )
	{
		Run_State = !Run_State;				//运行状态取反

		if( Run_State==1 )					//运行
		{
			Timer0_Init();
		}
		else
		{
			TR0 = 0;						//关闭定时器
			P00 = 1;
			P01 = 1;
		}
		while( P32 == 0 );					//等待P32松开

}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-05-12 23:18:06
已绑定手机

3

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-12-24 09:13:28 | 显示全部楼层

第八集定时器周期性调度任务

1.周期性任务介绍
2.文件的创建(.c和.h)
3.结构体的介绍
4.结构体数组的周期性任务调度

任务1

用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次

解法:通过一个变量计数,假设这个变量1ms自加一次,加到300即为300ms,加到600就是600ms,计数到达后重新清0。

//while循环
while(1)
{
  if(count1>=300)
  {
    state1 = !state1;//LED1的状态
    P00 = state1;
    count1 = 0;//计数清零
  }
  if(count2>=600)
  {
    state2 = !state2;//LED2的状态
    P01 = state2;
    count2 = 0;//计数清零
  }
  if(count3>=900)
  {
    state3 = !state3;//LED3的状态
    P03 = state3;
    count3 = 0;//计数清零
  }
}
//定时器初始化
void Timer0_Init(void)		//1毫秒@24.000MHz
{
	TM0PS = 0x00;			//设置定时器时钟预分频 
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x30;				//设置定时初始值
	TH0 = 0xF8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}
//定时器中断
void Timer0_Isr(void) interrupt 1		//1MS执行一次
{ 
   count1++;//计数1
   count2++;//计数2
   count3++;//计数3
}

任务2

数组点亮LED,实现流水灯

state[8] = [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80];//P0的状态
num = 0;//循环计数
//定时器中断
void Timer0_Isr(void) interrupt 1		//1MS执行一次
{ 
   count1++;//计数1
}
//while循环
while(1)
{
  if(count1>=500)//500ms变化一次
  {
    state1 = ~state[num];//LED的状态
    P0 = state1;
    count1 = 0;//计数清零
    num++;
    if(num > 7)//循环清零
    {
      num = 0;
    }
  }
}

任务3:按键1按一下,LED通过数组移动一下;

注意事项:
按键不能在通过while判断是否按下松开了
可以通过按键按下计数

state[8] = [0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80];//P0的状态
num = 0;//循环计数
//定时器中断
void Timer0_Isr(void) interrupt 1		//1MS执行一次
{ 
   count1++;//计数1
}
//while循环
while(1)
{
  if(count1>=5)//5ms检测一次
  {
    state1 = ~state[num];//LED的状态
    P0 = state1;
    count1 = 0;//计数清零
    if(P32 == 0)//按键按下检测
    {
      key_num++;//按下时间计数
      if(key_num == 10)//50ms持续按下
      {
        num++;
        if(num > 7)
        {
          num = 0;
        }
      }
    }
     else
    {
       key_num = 0;
    }
  }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-06-17 08:18:27
已绑定手机

5

主题

116

回帖

639

积分

高级会员

积分
639
发表于 2024-12-24 16:55:01 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 00:15 , Processed in 0.149926 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表