这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【STCAi8051U】错误引用头文件导致的异常

共1条 1/1 1 跳转至

【STCAi8051U】错误引用头文件导致的异常

专家
2026-03-02 14:48:17     打赏

两段代码的对比

一、不正常的

1、代码:

#include "Ai8051U.H"
#define FOSC             24000000UL  //定义主时钟
#define Timer0_Reload   (FOSC / 2000)      //Timer 0 中断频率, 2000次/秒,周期0.5微妙,IO翻转后形成1000Hz脉冲波
//========================================================================
// 函数: void Timer0_init(void)
// 描述: timer0初始化函数.
//========================================================================
void Timer0_init(void) {
    TR0 = 0;    //停止计数
    ET0 = 1;    //允许中断
  
    TMOD &= ~0x03;
    TMOD |= 0;  //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
    TMOD &= ~T0_CT;  //定时
  
    INTCLKO &= ~T0CLKO; //不输出时钟
    AUXR |= T0x12;  //1T mode
    TH0 = (unsigned char)((65536UL - Timer0_Reload) / 256);
    TL0 = (unsigned char)((65536UL - Timer0_Reload) % 256);
    TR0 = 1;    //开始运行
}
//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述:  timer0中断函数.
//========================================================================
void timer0_int (void) interrupt 1 {
    // P20电平翻转
    P20 = ~P20;
}
//========================================================================
// 函数: void main(void)
// 描述: 主函数.
//========================================================================
void main(void) {
    EAXFR = 1;  // 允许访问扩展的特殊寄存器, XFR
    //(32 位模式请使用这句,注释下一句 )
    //  P_SW2 |= 0x80;  // 允许访问扩展的特殊寄存器, XFR
    //(8 位模式请使用这句,注释上一句 )
    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;
    // 初始化定时器0,定时周期1000Hz
    Timer0_init();
    
    EA = 1;
    while (1) {
    }
}

2、示波器检测信号P20(作为对比,红色的信号为定标1KHz信号,取自示波器自身):

图片1.png



二、正常的

1、代码

#include "../comm/Ai8051U.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
#include "../comm/usb.h"     //USB调试及复位所需头文件
#define MAIN_Fosc       24000000UL  //定义主时钟
#define Timer0_Reload   (MAIN_Fosc / 2000)      //Timer 0 中断频率, 2000次/秒
//========================================================================
// 函数: void Timer0_init(void)
// 描述: timer0初始化函数.
//========================================================================
void Timer0_init(void) {
    TR0 = 0;    //停止计数
    ET0 = 1;    //允许中断
  
    TMOD &= ~0x03;
    TMOD |= 0;  //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
    TMOD &= ~T0_CT;  //定时
  
    INTCLKO &= ~T0CLKO; //不输出时钟
    AUXR |= T0x12;  //1T mode
    TH0 = (u8)((65536UL - Timer0_Reload) / 256);
    TL0 = (u8)((65536UL - Timer0_Reload) % 256);
    TR0 = 1;    //开始运行
}
//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述:  timer0中断函数.
//========================================================================
void timer0_int (void) interrupt 1 {
    P20 = ~P20;
}
//========================================================================
// 函数: void main(void)
// 描述: 主函数.
//========================================================================
void main(void) {
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    P_SW2 |= EAXFR; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度
//    RSTFLAG |= 0x04;   //设置硬件复位后需要检测P3.2的状态选择运行区域,否则硬件复位后进入USB下载模式
    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;   //设置为准双向口
    Timer0_init();
    EA = 1;     //打开总中断
    while (1) {
    }
}


2、示波器检测信号P20(作为对比,红色的信号为定标1KHz信号,取自示波器自身):

图片2.png


自己检查、修改测试,发现,这是由于引用的头文件产生的问题,不正常的那个引用了不正常的文件,导致结果异常。之前因为头文件都是从官网下来的,也没多考虑就直接使用,只是没想到会出现问题。估计前面的定时器干扰的那个帖子,也是这个原因吧。引以为戒!





关键词: 懒猫的学习笔记     Ai8051U     头文件    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]