大家好,我最近自学51单片机,新手小白一个。我想用89C52实现下面功能:利用单89C52两个外部中断测输入的两个先后产生的单脉冲发生产间隔,也就是图中CH1输入脉冲到CH2输入脉冲的间隔时间,利用数码管显示出来,两个脉冲的间隔时间大概在0.1ms-1s之间。基本原理是利用定时器定时100us,CH1脉冲输入后,INT0中断,启动定时器,并对产生100us定时次数进行计数,CH2输入脉冲后,停止定时器,统计计数次数,也就是发生多少个100us,计算出两个脉冲产生的间隔时间。试了好久也没成功。请大神们指点,最好有代码。我是小白一个,在网上找了一些代码试了试了也没成功,请大神们帮忙看看,先谢谢大神们。
下面是我改的代码,但是不能实现,连显示都不正常
----------------------------
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P10=P2^4;
sbit P11=P2^5; //位码口
sbit P12=P2^6;
sbit P13=P2^7;
unsigned char code Duan[]={
//0x3F,0x06,0x5b,0x4f,0x66,
//0x6D,0x7D,0x07,0x7F,0x6F
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
}; //对应0-9
unsigned char Data_buffer[4]=//{0xff,0xff,0xff,0xff};
{0,0,0,0}; //存放统计数据,单位为(100us)
uint time=0;
void fenge() //分割数据,以便于统计较大间隔
{
Data_buffer[0]=time/1000;
Data_buffer[1]=time/100%10;
Data_buffer[2]=time/10%10;
Data_buffer[3]=time/10;
}
void display() //用于四个数码管显示数据,
{
uchar Bit=0;
while(1)
{
Bit++;
if(Bit>=4)
Bit=0;
P0=Duan[Data_buffer[Bit]];
switch(Bit) //开位码
{
case 0:P10=0;break;
case 1:P10=1;break;
case 2:P10=2;break;
case 3:P10=3;break;
}
}
}
void main()
{
EX0=0;
EA=1;
IT0=0; //低电平有效
TMOD=0x02; //设置为自动重载方式
TH0=0x92; //设置为100us的计数
TL0=0x92;
TR0=0;
while(1)
{
fenge();
display();
time=0; //当前显示完毕后,清当前time的值
EX0=1; //开启外部中断
}
}
void zhongduan1()interrupt 0
{
TF0=1;
if(TF0==1)//100us定时器溢出
{
time++;//统计两个脉冲的时间
TH0=0;
}
EX0=0;
EX1=1;
}
void zhongduan2()interrupt 2
{
TR0=0;
EX0=1;
EX1=0;
}
|