|
|
大家好,我最近自學(xué)51單片機(jī),新手小白一個(gè)。我想用89C52實(shí)現(xiàn)下面功能:利用單89C52兩個(gè)外部中斷測(cè)輸入的兩個(gè)先后產(chǎn)生的單脈沖發(fā)生產(chǎn)間隔,也就是圖中CH1輸入脈沖到CH2輸入脈沖的間隔時(shí)間,利用數(shù)碼管顯示出來(lái),兩個(gè)脈沖的間隔時(shí)間大概在0.1ms-1s之間。基本原理是利用定時(shí)器定時(shí)100us,CH1脈沖輸入后,INT0中斷,啟動(dòng)定時(shí)器,并對(duì)產(chǎn)生100us定時(shí)次數(shù)進(jìn)行計(jì)數(shù),CH2輸入脈沖后,停止定時(shí)器,統(tǒng)計(jì)計(jì)數(shù)次數(shù),也就是發(fā)生多少個(gè)100us,計(jì)算出兩個(gè)脈沖產(chǎn)生的間隔時(shí)間。試了好久也沒(méi)成功。請(qǐng)大神們指點(diǎn),最好有代碼。我是小白一個(gè),在網(wǎng)上找了一些代碼試了試了也沒(méi)成功,請(qǐng)大神們幫忙看看,先謝謝大神們。
下面是我改的代碼,但是不能實(shí)現(xiàn),連顯示都不正常
----------------------------
#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
}; //對(duì)應(yīng)0-9
unsigned char Data_buffer[4]=//{0xff,0xff,0xff,0xff};
{0,0,0,0}; //存放統(tǒng)計(jì)數(shù)據(jù),單位為(100us)
uint time=0;
void fenge() //分割數(shù)據(jù),以便于統(tǒng)計(jì)較大間隔
{
Data_buffer[0]=time/1000;
Data_buffer[1]=time/100%10;
Data_buffer[2]=time/10%10;
Data_buffer[3]=time/10;
}
void display() //用于四個(gè)數(shù)碼管顯示數(shù)據(jù),
{
uchar Bit=0;
while(1)
{
Bit++;
if(Bit>=4)
Bit=0;
P0=Duan[Data_buffer[Bit]];
switch(Bit) //開(kāi)位碼
{
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; //設(shè)置為自動(dòng)重載方式
TH0=0x92; //設(shè)置為100us的計(jì)數(shù)
TL0=0x92;
TR0=0;
while(1)
{
fenge();
display();
time=0; //當(dāng)前顯示完畢后,清當(dāng)前time的值
EX0=1; //開(kāi)啟外部中斷
}
}
void zhongduan1()interrupt 0
{
TF0=1;
if(TF0==1)//100us定時(shí)器溢出
{
time++;//統(tǒng)計(jì)兩個(gè)脈沖的時(shí)間
TH0=0;
}
EX0=0;
EX1=1;
}
void zhongduan2()interrupt 2
{
TR0=0;
EX0=1;
EX1=0;
}
|
|