大家好,我最近自學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;
}
|