- 打卡等级:以坛为家I
- 打卡总天数:359
- 最近打卡:2026-03-23 10:04:15
已绑定手机
金牌会员
- 积分
- 1433
|
我想用定时器0和外部中断1做一个红外接收模块,但是发现一个问题,在主频40mhz下,定时器0 16位自动重载,采用12T模式下,计数值加1表示计时0.3us,用软件延时测试,15ms加15us延时,定时器能正常计时,显示15015.主要代码如下,但是使用外部中断1进行计时测试时,发现计时不正确,如下第二段测试代码
#include <Ai8h.H>
#include <INTRINS.H>
/**
* @brief 定时器0初始化
* @param 无
* @retval 无
*/
void Timer0_Init(void) //@40.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0不计时
}
/**
* @brief 定时器计时开关控制
* @param SwitchFlag:开关控制, 0:定时器0开始计时
1:定时器0停止计时
* @retval 无
*/
void Timer_CntSwitch(unsigned char SwitchFlag)
{
if(SwitchFlag){TR0=1;}//定时器0开始计时
else{TR0=0;}//定时器0停止计时
}
/**
* @brief 定时器计数值清零
* @param 无
* @retval 无
*/
void Timer_CntClear(void)
{
TL0 = 0x00; //设置定时初始值清0
TH0 = 0x00; //设置定时初始值清0
TF0 = 0;//清除TF0标志
}
/**
* @brief 获取定时器计时us值
* @param 无
* @retval 返回计时的时间,单位us
*/
unsigned int Timer_ReadCnt(void)
{
unsigned int cnt;
unsigned int th0=(unsigned int)TH0;
unsigned int tl0=(unsigned int)TL0;
cnt=(th0<<8) | (tl0 & 0xFF);//获取计数值
cnt=(unsigned int)(cnt*0.3);//将计数值转换为us数
return cnt;
}
void Delay15ms(void) //@40.000MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 4;
j = 12;
k = 50;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay15us(void) //@40.000MHz
{
unsigned char data i;
i = 198;
while (--i);
}
//软件延时测试
void main()
{
IO_INIT();
IR_Init();
St7735s_Init();
P26=0;
St7735s_DisplayInversion(1);
St7735s_ShowLattice(0,0,160,80,black);//tft显示点阵
while(1)
{
Timer_CntSwitch(1);
Delay15ms();
Delay15us();
Timer_CntSwitch(0);
St7735s_ShowNum(0,0,Timer_ReadCnt(),5,white,8,cover);
}
}
//外部中断测试
unsigned char x=0;
unsigned char temp=0;
void INT1_Isr(void) interrupt 2
{
if(!temp){
Timer_CntClear();//先清零0
Timer_CntSwitch(1);//开始计数
temp=1;
}
else
{
x=Timer_ReadCnt();
Timer_CntSwitch(0);
temp=0;
}
}
void Ext_Init(void)
{
IT1 = 1; //INT1(P3.3)下降沿中断
EX1 = 1; //使能INT1中断
EA=1;
IP|=0x04;
IPH|=0x04;
}
在P33外部中断1引脚产生脉冲,计时值不正确,请各位大佬能给予批评指正
|
|