STC89C52RC系列各功能模块之AiCube程序自动生成@ISP-V6.95W
建议大家,使用强大的 AiCube单片机程序自动生成器@ISP-V6.95X,
来学习《单片机原理及应用》的应用部分
STC89C52RC系列各功能模块之AiCube程序自动生成@ISP-V6.95X
AiCube V1.00S@AIapp-ISP Ver6.95X 软件发布,又名 STC-ISP Ver6.95X
AiCube工具 已支持STC89C52RC系列的各功能模块自动配置及程序框架自动生成
AiCube工具 已支持STC15F2K60S2系列的各功能模块自动配置及程序框架自动生成
AiCube工具 已支持STC15W4K32S4系列的各功能模块自动配置及程序框架自动生成
AiCube工具 已支持Ai8051U系列的各功能模块自动配置及程序框架自动生成
AiCube工具 已支持STC8H8K64U系列的各功能模块自动配置及程序框架自动生成
AiCube工具 已支持STC32G12K128系列的各功能模块自动配置及程序框架自动生成
===管脚少的型号,可以用 同系列 管脚多的 型号 来配置,自动生成程序
选择MCU型号,需要 自动生成各功能模块程序的 MCU型号:
自动配置好 后续 KEIL C51编译器 的编译及连接选项:
根据实际情况输入:
24MHz, 22.1184MHz,12MHz, 11.0592MHz等
后续才好 自动计算生成【定时器,串行口,软件延时】的程序
通知 AiCube 外部晶振频率 是 22.1184MHz:
设置 外部中断 0:
设置 外部中断 1:
设置 外部中断 2:
设置 外部中断 3:
设置可16位自动重载的定时器 2:
设置 16位不自动重载的定时器 0:
注意中断服务程序入口处,
要添加下次从哪开始计数的程序
设置 串口 1,
用只能8位自动重载的定时器1做波特率发生器
不浪费 16位自动重载 的定时器 2 的性能:
一路 设置下来,最后点击 那个 播放键,
自动产生 需要的 Keil C51 项目
深圳国芯人工智能有限公司-工具软件
STC89C52RC-RD+.pdf
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2025-07-04) 创建文件
////////////////////////////////////////
//<<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();
printf("Hello World !\n");
//<<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)
{
CLK_Init(); //时钟模块初始化
TIMER0_Init(); //定时器初始化
TIMER2_Init(); //定时器初始化
UART1_Init(); //串口初始化
EXTI0_Init(); //INT初始化
EXTI1_Init(); //INT初始化
EXTI2_Init(); //INT初始化
EXTI3_Init(); //INT初始化
//<<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);
}
////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
//<<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>>
}
////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
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 * 5 / 1000)
TIMER0_TimerMode(); //设置定时器为定时模式
TIMER0_Mode1(); //设置定时器为模式1 (16位不自动重载模式)
TIMER0_DisableGateINT0(); //禁止定时器门控
TIMER0_SetIntPriority(3); //设置中断为最高优先级
TIMER0_EnableInt(); //使能定时器中断
TIMER0_SetReload16(T0_RELOAD); //设置定时器的16位重载值
TIMER0_Run(); //定时器开始运行
//<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_TIMER0_INITIAL_END>>
}
////////////////////////////////////////
// 定时器2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER2_Init(void)
{
#define T2_RELOAD (65536 - (float)SYSCLK * (1 + EN6T) / 12 * 10 / 1000)
TIMER2_TimerMode(); //设置定时器为定时模式
TIMER2_SetIntPriority(0); //设置中断为最低优先级
TIMER2_EnableInt(); //使能定时器中断
TIMER2_SetReload16(T2_RELOAD); //设置定时器的16位重载值
TIMER2_Run(); //定时器开始运行
//<<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作为串口波特率发生器
UART1_BaudrateX2(); //串口1波特率加倍
TIMER1_TimerMode(); //设置定时器1为定时模式
TIMER1_Mode2(); //设置定时器1为模式2 (8位自动重载模式)
TIMER1_SetReload8(T1_RELOAD); //设置定时器1的8位重载值
TIMER1_Run(); //定时器1开始运行
UART1_EnableRx(); //使能串口接收数据
UART1_Mode1(); //设置串口为模式1 (8位数据可变波特率)
UART1_SetIntPriority(3); //设置中断为最高优先级
UART1_EnableInt(); //使能串口中断
fPrintfBusy = 0; //清除发送数据忙标志
//<<AICUBE_USER_UART1_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_UART1_INITIAL_END>>
}
////////////////////////////////////////
// 重写printf字符发送重定向函数
// 入口参数: dat (printf函数待打印的字符)
// 函数返回: 需要返回入口参数的数据
////////////////////////////////////////
char putchar (char dat) //将串口和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>>
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
自动配置外设及生成程序框架,
STC89C52RC@AiCube各个截图,给了完整的名称
见 附件 压缩包
页:
[1]