神农鼎 发表于 2025-7-14 21:34:29

//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-07-07) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>


#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件


//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>


BOOL fPrintfBusy;


////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
    printf("Hello World !\n");
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    CLK_Init();             //时钟模块初始化
    TIMER0_Init();          //定时器0初始化
    TIMER2_Init();          //定时器2初始化
    UART1_Init();         //串口1初始化
    EXTI0_Init();         //INT0初始化
    EXTI1_Init();         //INT1初始化
    EXTI2_Init();         //INT2初始化
    EXTI3_Init();         //INT3初始化

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

    EnableGlobalInt();      //使能全局中断
}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
    us /= 16;
    while (us--)
    {
      NOP(18);
    }
}


////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc * (1 + EN6T) / 96000;
      while (--i);
    } while (--ms);
}

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    //<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_CLOCK_INITIAL_END>>
}

////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_RELOAD               (65536 - (float)SYSCLK * (1 + EN6T) / 12 * 2 / 1000)

    TIMER0_TimerMode();               //设置定时器0为定时模式
    TIMER0_Mode1();                     //设置定时器0为模式1 (16位不自动重载模式)
    TIMER0_DisableGateINT0();         //禁止定时器0门控
    TIMER0_SetIntPriority(3);         //设置中断为最高优先级
    TIMER0_EnableInt();               //使能定时器0中断
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                     //定时器0开始运行

    //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_TIMER0_INITIAL_END>>
}

////////////////////////////////////////
// 定时器2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_Init(void)
{
#define T2_RELOAD               (65536 - (float)SYSCLK * (1 + EN6T) / 12 * 5 / 1000)

    TIMER2_TimerMode();               //设置定时器2为定时模式
    TIMER2_SetIntPriority(0);         //设置中断为最低优先级
    TIMER2_EnableInt();               //使能定时器2中断
    TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
    TIMER2_Run();                     //定时器2开始运行

    //<<AICUBE_USER_TIMER2_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_TIMER2_INITIAL_END>>
}

////////////////////////////////////////
// 串口1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART1_Init(void)
{
#ifdef BAUDRATE
#undef BAUDRATE
#endif
#define BAUDRATE                (115200)
#define T1_RELOAD               (256 - (SYSCLK * (1 + EN6T) / BAUDRATE / 12 + 8) / 16)

    UART1_Timer1BRT();                  //选择定时器1作为串口1波特率发生器
    UART1_BaudrateX2();               //串口1波特率加倍
    TIMER1_TimerMode();               //设置定时器1为定时模式
    TIMER1_Mode2();                     //设置定时器1为模式2 (8位自动重载模式)
    TIMER1_SetReload8(T1_RELOAD);       //设置定时器1的8位重载值
    TIMER1_Run();                     //定时器1开始运行

    UART1_EnableRx();                   //使能串口1接收数据
    UART1_Mode1();                      //设置串口1为模式1 (8位数据可变波特率)
    UART1_SetIntPriority(0);            //设置中断为最低优先级
    UART1_EnableInt();                  //使能串口1中断

    fPrintfBusy = 0;                  //清除发送数据忙标志

    //<<AICUBE_USER_UART1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_UART1_INITIAL_END>>
}

////////////////////////////////////////
// 重写printf字符发送重定向函数
// 入口参数: dat (printf函数待打印的字符)
// 函数返回: 需要返回入口参数的数据
////////////////////////////////////////
char putchar (char dat)               //将串口1和printf函数绑定
{
    while (fPrintfBusy);
    UART1_SendData(dat);
    fPrintfBusy = 1;

    return dat;
}

////////////////////////////////////////
// 外部中断INT0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_Init(void)
{
    INT0_FallingInt();          //设置外部中断为下降沿中断
    INT0_SetIntPriority(3);   //设置中断为最高优先级
    INT0_EnableInt();         //使能外部中断

    //<<AICUBE_USER_EXTI0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI0_INITIAL_END>>
}

////////////////////////////////////////
// 外部中断INT1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_Init(void)
{
    INT1_FallingInt();         //设置外部中断为下降沿中断
    INT1_SetIntPriority(2);      //设置中断为较高优先级
    INT1_EnableInt();            //使能外部中断

    //<<AICUBE_USER_EXTI1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI1_INITIAL_END>>
}

////////////////////////////////////////
// 外部中断INT2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI2_Init(void)
{
    INT2_FallingInt();                  //设置外部中断为下降沿中断
    INT2_SetIntPriority(1);             //设置中断为较低优先级
    INT2_EnableInt();                   //使能外部中断

    //<<AICUBE_USER_EXTI2_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI2_INITIAL_END>>
}

////////////////////////////////////////
// 外部中断INT3初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI3_Init(void)
{
    INT3_FallingInt();                  //设置外部中断为下降沿中断
    INT3_SetIntPriority(0);             //设置中断为最低优先级
    INT3_EnableInt();                   //使能外部中断

    //<<AICUBE_USER_EXTI3_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI3_INITIAL_END>>
}


////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
    TIMER0_SetReload16(T0_RELOAD);//重置定时器0的16位重载值      

    //<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    //<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
}

////////////////////////////////////////
// 定时器2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_ISR(void) interrupt TMR2_VECTOR
{
    //<<AICUBE_USER_TIMER2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码                                          
    if (TIMER2_CheckFlag())   //判断定时器中断
    {
      TIMER2_ClearFlag();   //清除中断标志
    }

    if (EXF2_CheckFlag())       //判断定时器外部中断
    {
      EXF2_ClearFlag();       //清除外部中断标志
    }
    //<<AICUBE_USER_TIMER2_ISR_CODE1_END>>
}

////////////////////////////////////////
// 串口1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART1_ISR(void) interrupt UART1_VECTOR
{
    //<<AICUBE_USER_UART1_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码                              
    if (UART1_CheckTxFlag())   //判断串口发送中断
    {
      UART1_ClearTxFlag();   //清除串口发送中断标志

      fPrintfBusy = 0;         //清除printf发送忙标志
    }

    if (UART1_CheckRxFlag())   //判断串口接收中断
    {
      UART1_ClearRxFlag();   //清除串口接收中断标志
    }
    //<<AICUBE_USER_UART1_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_ISR(void) interrupt INT0_VECTOR
{
    //<<AICUBE_USER_EXTI0_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    //<<AICUBE_USER_EXTI0_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_ISR(void) interrupt INT1_VECTOR
{
    //<<AICUBE_USER_EXTI1_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    //<<AICUBE_USER_EXTI1_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI2_ISR(void) interrupt INT2_VECTOR
{
    //<<AICUBE_USER_EXTI2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码                     
    //<<AICUBE_USER_EXTI2_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT3中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI3_ISR(void) interrupt INT3_VECTOR
{
    //<<AICUBE_USER_EXTI3_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    //<<AICUBE_USER_EXTI3_ISR_CODE1_END>>
}


//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>



batcd 发表于 2025-7-14 21:42:14

越来越牛逼

神农鼎 发表于 2025-7-14 22:17:47

AI8051U, STC32G12K128, STC8H8K64U 等主流系列教学视频,我们论坛是全的
并且,正在加强对经典机型 STC15F2K60S2系列 / STC89C52RC 系列的全方位支持

神农鼎 发表于 2025-7-14 23:25:54

可以先用最新的 STC-ISP 软件 AiCube-ISP-V6.95Y 中的
AiCube 来图形化程序自动生成,帮助起步阶段

神农鼎 发表于 2025-7-14 23:27:58

在STC最新官网 STCAI 的技术论坛搜索:
传统51开发板学习资料汇总

即可无密码下载这些资料


从STC最新版ISP及图形化程序自动生成工具软件,
AiCube-ISP-V6.95Y 或更高版本软件的
【资料下载 | 传统51开发板学习资料汇总】栏目
可以下载到这些资料




ercircle 发表于 2025-7-16 11:26:00

844

Ai_Std_25 发表于 2025-7-21 10:14:06

赞,收藏
页: 1 2 [3]
查看完整版本: 传统51开发板学习资料汇总,2025/15