《8051U深度入门到32位51大型实战教学视频》|擎天柱学习打卡
新人第一次发帖,还请各位大佬多多指教~~按照教学视频一步步学习,希望早日收到实验箱,进一步学习,目标:可以做一个示波器
第3集 擎天柱点亮LED灯
1.编译图片:
2.代码:
#include <AI8051u.h>
// #include <INTRINS.H>
// #define uint8_tunsigned char
// #define uint16_t unsigned int
// void Delay_ms(uint16_t ms);
void main(void)
{
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;
while (1)
{
P20 = 0;
P21 = 0;
// Delay_ms(100);
// P20 = 1;
// Delay_ms(100);
}
}
// void Delay_ms(uint16_t ms) //@24.000MHz
// {
//uint8_t data i, j;
// do
// {
// _nop_();
// i = 32;
// j = 40;
// do
// {
// while (--j);
// } while (--i);
// }while(--ms);
// }
3.验证图片:
第4集USB-CDC 不停电下载
1.编译照片:
2.代码:
#include <AI8051u.h>
#include <ai_usb.h>
// #define uint8_tunsigned char
// #define uint16_t unsigned int
// void Delay_ms(uint16_t ms);
void main(void)
{
P_SW2 |= 0x80;
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_SendData(UsbOutBuffer,OutNumber); // CDC 串口测试
usb_OUT_done();
}
P20 = 0;
P21 = 0;
}
}
// void Delay_ms(uint16_t ms) //@24.000MHz
// {
//uint8_t data i, j;
// do
// {
// _nop_();
// i = 32;
// j = 40;
// do
// {
// while (--j);
// } while (--i);
// }while(--ms);
// }
3.验证视频:
第5集C语言基础及USB-CDC串口
1.编译图片:
2.代码:
#include <AI8051U.h>
#include <ai_usb.h>
uint16_t a = 8;
uint16_t b = 10;
uint16_t c = 0;
uint8_t i = 0;
void main(void)
{
P_SW2 |= 0x80;
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();
IE2 |= 0x80;
EA = 1;
c = a + b;
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber);//); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// if(c == 0)
// printf("STC YYDS\r\n"); //printf 在usb.h中需重定向到 printf_usb
// else printf("c = %d + %d \r\n",a,b);
// printf("c =%d\r\n",(uint16_t)(a+b));
// for(i = 0; i<64;i++)
// printf("%d\t",(uint16_t)UsbOutBuffer);
// if(UsbOutBuffer == '0') //CDC 串口发送0,显示大写;其他显示小写
// printf("STC YYDS\r\n");
// else
// printf("stc yyds\r\n");
usb_OUT_done();
}
// P20 = 0;
// P21 = 0;
// P22 = 0;
}
}
3.验证图片:
第6集GPIO输入输出
1.编译照片:
2.代码(包括课后任务):
#include <AI8051U.h>
#include <ai_usb.h>
uint8_t state = 1;
uint8_t cnt = 0;
void Delay20ms(void) //@24.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 3;
j = 112;
k = 91;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
P_SW2 |= 0x80;
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();
IE2 |= 0x80;
EA = 1;
while (1)
{
if (bUsbOutReady)
{
usb_OUT_done();
}
// 任务1:按下P33,擎天柱P20灯亮,松开P33灯灭
// P33 == 0 ? (P20 = 0) : (P20 = 1); // "=" 优先级高于条件判断符
if(P33)
{
P20 = 1;
}
else
{
P20 = 0;
}
//任务2:按下P33,擎天柱P20灯灭,松开P33灯亮
// P33 == 1 ? (P20 = 0) : (P20 = 1); // "=" 优先级高于条件判断符
// if(!P33)
// {
// P20 = 1;
// }
// else
// {
// P20 = 0;
// }
//任务3:按一下灯亮,再按一下灯灭
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// // P20 = ~P20; // 擎天柱
// state = !state;
// P20 = state;
// printf("state = %d\r\n",(uint16_t)state);
// while(!P33);
// }
// }
// 课后任务1:按一下P32灯亮,按一下P33灯灭
// if(!P32)
// {
// Delay20ms();
// if(!P32)
// {
// state = 0;
// while(!P32);
// printf("state = %d\r\n",(uint16_t)state);
// }
// }
// else if(!P33)
// {
// Delay20ms();
// if(!P33)
// {
// state = 1;
// while(!P33);
// printf("state = %d\r\n",(uint16_t)state);
// }
// }
// P20 = state;
// 课后任务2:按一下P33亮一颗灯,直至8颗全亮
// if(!P33)
// {
// Delay20ms();
// if(!P33)
// {
// cnt++;
// if(cnt > 8)
// {
// cnt = 0;
// P2 = 0xff;
// }
// P2 = 0xff << cnt;
// printf("P2 = 0x%x\r\n",P2);
// while(!P33);
// }
// }
}
}
3.验证视频:
第7集定时器中断
1.编译照片:
2.代码(包括课后任务):
#include <AI8051U.h>
#include <ai_usb.h>
uint16_t state = 0;
uint16_t cnt = 0;
uint8_t Run_State = 0;
void Delay20ms(void); //@24.000MHz
void Timer0_Init(void); //3秒@24.000MHz
void main(void)
{
P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
WTST = 0; //设置取程序代码等待时间,0代表不等待,最快速度运行
CKCON = 0; //设置访问片内xdata速度,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();
IE2 |= 0x80; //使能usb中断
// Timer0_Init();
EA = 1;
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber);//); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
// 任务1:LED灯3秒取反一次,这期间任意时刻按下按钮,串口打印按键次数
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt);// 特殊汉字后需增加 \xfd
// }
// }
// 任务2:灯按一下点亮3秒后熄灭
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// P20 = 0;
// Timer0_Init();
// while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt);// 特殊汉字后需增加 \xfd
// }
// }
// 任务3:灯按一下P33 LED0,LED1交替闪烁,再按一下停止
if(P33 == 0)
{
Delay20ms();
if(P33 == 0)
{
Run_State = !Run_State; //运行状态取反
if (Run_State == 1)
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P20 = 1;
P21 = 1;
}
while(P33 == 0);
// printf("按键按下次数\xfd:%d次\r\n",++cnt);// 特殊汉字后需增加 \xfd
}
}
// 课后小练 功德箱:
// 1:按下P33,串口打印“双倍功德时间”,再按下显示“单倍功德时间”;
// 2:按下P32,双倍功德时间下显示“功德+2,当前功德: ”,LED点亮2秒后熄灭;单倍功德时间按下显示“功德+1,当前功德: ”,LED点亮1秒后熄灭;
// if(P33 == 0)
// {
// Delay20ms();
// if(P33 == 0)
// {
// Run_State = !Run_State; //运行状态取反
// if (Run_State == 1)
// {
// printf("双倍功德时间\r\n");
// }
// else
// {
// printf("单倍功德时间\r\n");
// }
// while(P33 == 0);
// }
// }
// if(Run_State && !P32)
// {
// Delay20ms();
// if(Run_State && !P32)
// {
// cnt += 2;
// printf("功德+2,当前功德:%d\r\n",cnt);
// P20 = 0;
// Timer0_Init();
// while(!P32);
// }
// }
// if(!Run_State && !P32)
// {
// Delay20ms();
// if(!Run_State && !P32)
// {
// cnt += 1;
// printf("功德+1,当前功德:%d\r\n",cnt);
// P20 = 0;
// Timer0_Init();
// while(!P32);
// }
// }
// if(cnt > 9)
// {
// printf("功德圆满\r\n");
// cnt = 0;
// }
}
}
void Delay20ms(void) //@24.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 3;
j = 112;
k = 91;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
// 任务1 任务2
// 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中断
// }
//任务3 500ms
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_Init(void) //1秒@24.000MHz
// {
//TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
//AUXR &= 0x7F; //定时器时钟12T模式
//TMOD &= 0xF0; //设置定时器模式
//TL0 = 0xFC; //设置定时初始值
//TH0 = 0x03; //设置定时初始值
//TF0 = 0; //清除TF0标志
//TR0 = 1; //定时器0开始计时
//ET0 = 1; //使能定时器0中断
// }
// 任务1,2
// void Timer0_Isr(void) interrupt 1
// {
// // state = !state;
// // P20 = state;
// P20 = 1;
// TR0 = 0;
// }
// 500ms 任务3
void Timer0_Isr(void) interrupt 1
{
state = !state;
P20 = state;
P21 = !state;
}
//功德箱中断
// void Timer0_Isr(void) interrupt 1
// {
// state ++;
// if( ((state == 2) && Run_State) || ((state == 1) && !Run_State))
// {
// P20 = 1;
// TR0 = 0;
// state = 0;
// }
// // if((state == 2) && Run_State)
// // {
// // P20 = 1;
// // TR0 = 0;
// // state = 0;
// // }
// // if((state == 1) && !Run_State)
// // {
// // P20 = 1;
// // TR0 = 0;
// // state = 0;
// // }
// }
3.验证照片:
第 8 集 定时器周期性任务调度
1.编译照片:
2.代码:
#include "task.h"
#include "io.h"
static TASK_COMPONENTS xdata Task_Comps[]=
{
//状态计数周期函数
{0, 300,300,LED0_Blink}, /* task 1 Period: 300ms */
{0, 600,600,LED1_Blink}, /* task 2 Period: 600ms */
{0, 900,900,LED2_Blink}, /* task 3 Period: 900ms */
{0, 10, 10, Key_Task}, /* task 4 Period: 10ms*/
};
uint8_t data Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);
//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
uint8_t data 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)
{
uint8_t data 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 */
}
}
}
3.验证视频:
第 9 集ISP 虚拟接口 LED_40 及数码管
1.编译照片:
2.代码(IO.c):
#include "io.h"
uint16_t xdata key_vol = 0;
void LED0_Blink(void)
{
P20 = !P20;
}
void LED1_Blink(void)
{
P21 = !P21;
}
void LED2_Blink(void)
{
P22 = !P22;
}
void Key_Task(void)
{
if(P32 == 0)
{
key_vol ++;
if(key_vol == 5)
{
printf("按键按下\r\n");
}
}
else
key_vol = 0;
}
uint8_t xdata state_LED = 0;
uint8_t xdata T_NUM = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//========================================================================
// ISP 调试仿真接口 擎天柱LED
// P2LED 流水灯
//========================================================================
void PLED_40(void)
{
uint8_t cod;
cod =0x0f; //开启 P0~P3
cod = ~0X01; //P0 端口
cod = ~0x01; //P1 端口
cod = ~T_NUM; //P2 端口
cod = ~0x80; //P3 端口
LED40_SendData(cod,5); //发送数据
P2 = ~T_NUM; //晴天住硬件对比
state_LED ++;
if(state_LED > 7)
state_LED = 0;
}
//========================================================================
// ISP 调试仿真接口 数码管PC
// 字模 0~9DP-G-F-E-D-C-B-A
//========================================================================
uint8_t xdata SEG_NUM[] =
{
0x3F, /*'0', 0*/
0x06, /*'1', 1*/
0x5B, /*'2', 2*/
0x4F, /*'3', 3*/
0x66, /*'4', 4*/
0x6D, /*'5', 5*/
0x7D, /*'6', 6*/
0x07, /*'7', 7*/
0x7F, /*'8', 8*/
0x6F, /*'9', 9*/
0x40, /*'-', 10*/
0x00, /*' ', 11*/
0x80, /*'.', 12*/
};
uint8_t xdata shi= 0;
uint8_t xdata fen= 0;
uint8_t xdata miao = 0;
//========================================================================
// ISP 调试仿真接口 数码管PC
// 简易时钟,秒自加 1
//========================================================================
void SEG_PC(void)
{
uint8_t cod;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
SEG7_ShowCode(cod); // 发送数据
miao ++;
if(miao > 59)
{
miao = 0;
fen ++;
if(fen > 59)
{
fen = 0;
shi ++;
if(shi > 23)
shi = 0;
}
}
}
uint8_t flag_1 = 0; //初始值标志
uint8_t flag_2 = 0; //计数启停标志
//temp = ms
//temp = s
uint8_t temp = {0};
//========================================================================
// ISP 调试仿真接口 数码管PC
// 课后小练:简易免单器
//========================================================================
void SEG7_Pra(void)
{
uint8_t cod;
if(!flag_1)
{
cod = SEG_NUM;
cod = SEG_NUM|SEG_NUM;// 0xBF;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM|SEG_NUM;// 0xBF;
cod = SEG_NUM;
cod = SEG_NUM;
SEG7_ShowCode(cod);
}
if(flag_2)
{
cod = SEG_NUM;
cod = SEG_NUM|SEG_NUM;// 0xBF;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM/10];
cod = SEG_NUM%10]|SEG_NUM;// 0xBF;
cod = SEG_NUM/10];
cod = SEG_NUM%10];
SEG7_ShowCode(cod);
temp ++;
if(temp > 99)
{
temp = 0;
temp ++;
if(temp > 99)
temp = 99;
}
}
}
void Key_SEG7_Task(void)
{
uint8_t key_cnt = 0; // ????????????flag_1??
if(P33 == 0)
{
key_vol ++;
if(key_vol == 5)
{
if(key_cnt == 0)
flag_1 = 1;
flag_2 = !flag_2;
key_cnt ++;
if(key_cnt > 254)
key_cnt = 254;
}
}
else
key_vol = 0;
}
3.验证视频:
可以直接申请 AI8051U 实验箱了,
USB用最新的库,深圳国芯人工智能有限公司-库函数
用最新的 AiCube 来自动生成 各外设如USB程序,
优先看下下面的视频
要 做到 USB不停电下载;
要 尝试 图形化配置外设;
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
从 www.STCAI.com
下载 最新的 AiCube-ISP-V6.96G 或以上版本软件 !
深圳国芯人工智能有限公司-工具软件
下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !
下载 最新的 AI8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf
下载 最新的 AI8051U 实验指导书
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf
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之图形化程序自动生成
神农鼎 发表于 2025-12-3 17:07
可以直接申请 AI8051U 实验箱了,
USB用最新的库,深圳国芯人工智能有限公司-库函数
感谢~~{:ciya:} 多发些 我们强大的 辅助工具的 实验视频
【免费 + 包邮 送】 送/申样/采购 可上班时间加 如下您对应地区分销商的客服 QQ或微信联系
加STC华南区客服司经理QQ: 2234917869 ;微信:18012226298要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服佘经理QQ: 614777595; 微信:18106296591 要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ: 1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ: 2593903262; 微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服吴经理QQ: 1463035472; 微信:19952583954要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服杨经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ; 微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服李经理QQ: 1017142298 ;微信:19952583534要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服曹经理QQ: 3897745450 ;微信:18012226281 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服吴经理QQ: 1463035472 ;微信:19952583954 要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
【免费 + 包邮 送】 送/申样/采购传统电话热线:0513-89896509,0513-55012928,0513-55012929
你好,eide插件开发ai8051u的话是不是只能8bit模式sdcc编译出来,32位eide没有251编译器 https://www.stcaimcu.com/thread-21396-1-2.html
参考这个打卡贴风格,达到这个水平,可以免费送 AI8051U实验箱
xiaocao 发表于 2025-12-6 11:18
你好,eide插件开发ai8051u的话是不是只能8bit模式sdcc编译出来,32位eide没有251编译器 ...
是的 只能8bit damon.wood 发表于 2025-12-8 13:58
是的 只能8bit
{:xiaojiujie:}
页:
[1]