找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2238|回復(fù): 3
收起左側(cè)

小白請教單片機測量兩個脈沖產(chǎn)生前后間隔問題,請大神們指點

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

使用道具 舉報

ID:18297 發(fā)表于 2020-5-31 12:00 | 顯示全部樓層
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
                                                                                                //        0    1    2    3    4     5   6    7    8   9  
uchar code Duan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //??0-9
uchar code wei[]={1,2,4,8};  //
uchar Data_buffer[4];
uchar disp_num=0;
uint time=0;
uint time_count=0;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
       for(y=110;y>0;y--);
}
void disp_change(uint data_change)  
{
        Data_buffer[0]=data_change/1000;
        Data_buffer[1]=data_change/100%10;
        Data_buffer[2]=data_change/10%10;
        Data_buffer[3]=data_change%10;
}
void display()  
{
        if(disp_num==0)disp_change(time);
        P1=0;
        P2=wei[disp_num];
        P1=Duan[Data_buffer[disp_num]];
        if(disp_num==3)disp_num=0;
        else disp_num++;       
}
void main()
{
        EX0=0;
        EX1=0;
        EA=1;
        IT0=1;            //
        IT1=1;
        TMOD=0x01;  //
        TH0=0x0;   //100us???
        TL0=0x0;
        TR0=0;
        time=1234;
        EX0=1;
        ET0=1;
        while(1)
        {
                display();
                delay(100);               
        }
}
void zhongduan1()interrupt 0
{
        TR0=1;
        time_count=0;
        EX0=0;
        EX1=1;
}
void zhongduan2()interrupt 2
{
        TR0=0;
        time=TH0*256+TL0-15;
        TH0=0;
        TL0=1;
        EX0=1;
        EX1=0;
}
回復(fù)

使用道具 舉報

ID:18297 發(fā)表于 2020-5-31 12:03 | 顯示全部樓層
1、采用的共陽極數(shù)碼管,P1是段碼,P2是位選。
2、檢測INT0,INT1的下降沿間隔。輸出數(shù)字,100us輸出100,使用定時器0檢測間隔時間。最大檢測65535us
回復(fù)

使用道具 舉報

ID:104797 發(fā)表于 2020-5-31 21:43 | 顯示全部樓層
zjjhtony 發(fā)表于 2020-5-31 12:03
1、采用的共陽極數(shù)碼管,P1是段碼,P2是位選。
2、檢測INT0,INT1的下降沿間隔。輸出數(shù)字,100us輸出100, ...

你好,謝謝大神的代碼,我學(xué)習(xí)一下代碼,有幾個問題想請教一下:
1.void zhongduan1()interrupt 0 函數(shù)中的time_count=0是作什么用的?
2.void zhongduan2()interrupt 2函數(shù)中的TL0=1;是作什么用的?
3.void main()函數(shù)中的time=1234;是作什么用的,是測試顯示用的嗎?
4.我想測量1s的時間,應(yīng)該怎樣做,大神給個思路
再弱弱的問一下:void disp_change(uint data_change) 函數(shù)中的data_change是怎樣和time聯(lián)系起來
的?
我用proteus仿真了一下,為什么顯示出來的數(shù)字是一個一個的跳出來,我應(yīng)該修改哪里?
問題有點多,請大神諒解。我剛接觸不久,還弄不太明白。謝謝!
2020-5-31 21-23-42.png
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表