两段代码的对比
一、不正常的
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、代码
#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信号,取自示波器自身):

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