//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2026-01-14) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默认已包含stdio.h、intrins.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码
//<<AICUBE_USER_PREINITIAL_CODE_END>>
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口为准双向口模式
PORT4_Init(); //P4口初始化
delay_ms(1);
USBLIB_Init(); //USB库初始化
delay_ms(1);
//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_INITIAL_CODE_END>>
EnableGlobalInt(); //使能全局中断
}
////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(34); //(MAIN_Fosc + 500000) / 1000000 - 6
} while (--us);
}
////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;
do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
}
////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nInitLevelHigh(PIN_ALL); //设置P4初始化电平
SetP4nQuasiMode(PIN_7 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //设置P4.7,P4.5,P4.4,P4.3,P4.2,P4.1,P4.0为准双向口模式
SetP4nPushPullMode(PIN_6); //设置P4.6为推挽输出模式
DisableP4nPullUp(PIN_ALL); //关闭P4内部上拉电阻
DisableP4nPullDown(PIN_ALL); //关闭P4内部下拉电阻
DisableP4nSchmitt(PIN_ALL); //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL); //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL); //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL); //使能P4数字信号输入功能
//<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_PORT4_INITIAL_END>>
}
////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(3); //设置中断为最高优先级
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令
//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_USBLIB_INITIAL_END>>
}
////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)
}
////////////////////////////////////////
// USB设备接收数据中断回调程序
// 入口参数: 无
// 函数返回: 无
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Callback(void)
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
// USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
// 在此处添加用户处理接收数据的代码
if (UsbOutBuffer == 6)
printf_usb("Hello World !\r\n"); //接收到数据6后打印“Hello World !”
else if (UsbOutBuffer == 7)
printf_usb("China !\r\n"); //接收到数据7后打印“China !”
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>> 补充楼上! 补充楼上! 补充学习第一、二集的心得,学习和使用 AI8051U 单片机,让我深刻感受到了它在硬件和工具方面的强大之处。硬件上,1T 内核带来的性能提升和丰富的外设资源,使得 AI8051U 能够胜任各种复杂的应用场景;工具上,Keil C51 和 STC-ISP 等开发工具的便捷性和高效性,极大地提高了开发效率。同时,AI8051U 还具有成本低、功耗低、抗干扰性强等优点,是一款非常适合初学者和项目开发的单片机。通过对 AI8051U 的学习,我不仅掌握了单片机的基本原理和开发方法,还提高了自己的实践能力和解决问题的能力,为今后的学习和工作打下了坚实的基础。 学习了第四集不掉电下载,USB不停电下载,太方便了今后不用每次都去麻烦的操作,以下是简单的示范
#include <AI8051U.H>
#include "ai_usb.h"
sbit k3 = P3^2;
sbit k4 = P3^3;
sbit led0 = P2^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();
EA = 1;
while(1)
{
if(k3 == 0)
{
led0 = 0;
}
else{
led0 = 1;
}
}
} 学习了第五集完这门 C 语言基础课程后,我又一次深刻感受到了这门语言的魅力与强大。它不仅是计算机科学的基石,更是通往编程世界的必经之路。虽然已经在学校学过了,但无疑又是一次深刻的理解,又有了新的收获。以下是我对课程内容的学习感悟和具体收获。比如如何根据数据的性质和用途选择合适的数据类型,如 int、float、char 等。理解了不同数据类型在内存中占用的空间大小和取值范围,这对于编写高效的程序至关重要。#include <stdio.h>
int main() {
// 定义不同类型的变量
int age = 25; // 整型变量,存储年龄
float height = 1.75f;// 浮点型变量,存储身高,注意后缀f
char initial = 'J'; // 字符型变量,存储姓名首字母
// 使用printf函数输出变量的值
printf("年龄: %d\n", age);
printf("身高: %.2f米\n", height); // %.2f表示保留两位小数
printf("姓名首字母: %c\n", initial);
return 0;
}
又比如C 语言丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。理解了运算符的优先级和结合性,这对于正确构建表达式至关重要。#include <stdio.h>
int main() {
int a = 10, b = 3;
// 算术运算
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b); // 整数除法,结果为3
printf("a %% b = %d\n", a % b); // 取余运算,结果为1
// 关系运算和逻辑运算
int is_greater = (a > b);
int is_equal = (a == b);
int logical_and = (a > 5) && (b < 5); // 逻辑与
int logical_or = (a > 15) || (b < 5); // 逻辑或
printf("a > b 吗? %d\n", is_greater); // 1表示真,0表示假
printf("a == b 吗? %d\n", is_equal);
printf("(a > 5) && (b < 5) = %d\n", logical_and);
printf("(a > 15) || (b < 5) = %d\n", logical_or);
return 0;
} 学习了第六集I/O口输入输出,AI8051U 单片机 I/O 口输入输出的过程,是我从 “理论认知” 走向 “实践应用” 的关键一步。通过课程学习与项目实践,我不仅掌握了 I/O 口的配置方法、工作模式、时序控制等核心技能,更深入理解了 AI8051U 的硬件特性与嵌入式开发的底层逻辑。从引脚复用、驱动能力、抗干扰设计到与外设的协同工作,每一个知识点都在实践中得到了验证与深化。#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h" //d调用头文件
#define u8unsigned char //8位无符号变量(0-255)
#define u16 unsigned int //16位无符号变量(0-65535)
u8 state = 0; //初始状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void) //@24.000MHzDelay20ms();
{
unsigned long edata i;
_nop_();
_nop_();
i = 119998UL;
while (i) i--;
}
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
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;
P40 = 0;
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松开
}
}
}
}AI8051U 的 I/O 口就像一把 “钥匙”,为我打开了嵌入式系统与外部世界交互的大门 —— 它让我明白,嵌入式开发不是孤立的代码编写,而是硬件与软件的深度融合。未来在拓展宠物喂食器的蓝牙远程控制、重量检测等功能时,我也将基于本次所学的 I/O 口操作逻辑,结合 AI8051U 的串口、ADC 等外设,继续探索 “硬件配置→软件实现→功能拓展” 的全流程开发,在实践中不断提升自己的嵌入式系统设计能力。
页:
1
[2]