51单片机定时器中断问题,想实现的是用单片机检测模块发出的电平信号

2025-03-10 16:42:59
推荐回答(3个)
回答1:

看了你问他们的追问,我猜你是要用超声波模块吧,外部中断和定时器中断用法是一样的,就是把外部中断打开。EA=1;EX0=1;IT0=1;interrupt 1;就可以了。再送你个超声波模块程序,测出的距离会用串口显示。(别说不会用串口啊不会再问我吧)。用不着外部中断。把分数给我吧!程序我自己写的,很精准的。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit TRIG = P0^0 ;
sbit ECHO = P0^1 ;
uint u,h;

/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)
{
TMOD = 0x21;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //波特率9600
TL1 = 0xFd;
TR1 = 1;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1; //总中断
ES=1; //串口中断

}
void time(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
{
for(y=110;y>0;y--)
{;}
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
float S; //距离变量
TIM0init(); //初始化定时器0

while(1)
{
TRIG=1; //触发信号是高电平脉冲,宽度大于10us
time(10);
TRIG=0;
while(u==0) //等待高电平
{
if(ECHO==1)
{TR0=1;u=1;}
}
while(h==0) //等待低电平
{
if(ECHO==0)
{
TR0=0;h=1;
}
}
S=TH0*256+TL0;//取出定时器值高8位和低8位合并
S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
TH0=0;
TL0=0; //清除定时器0寄存器中的值
ES=0;
TI=1;
printf("S=%f CM ",0);
printf("_____________________________________\n");
printf("*************************************\n");
while(!TI);
TI=0;
time(20); //延时决定采样速度

}
}

/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr() interrupt 1
{
TH0=0x00;
TL0=0x00;
ECHO=0;
}

/*==========================================================================================================*/
/*===========================================================================================================*/

/*===========================================================================================================*/

回答2:

那你应该用外部中断0来触发中断,而不是定时器来触发。可以将外部中断信号设为电平触发。

回答3:

模块出来的是什么信号,urt,spi,iic?有中断信号没?