欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 小白請(qǐng)教單片機(jī)測(cè)量?jī)蓚(gè)脈沖產(chǎn)生前后間隔問題,請(qǐng)大神們指點(diǎn) [打印本頁(yè)]

作者: lhpm641    時(shí)間: 2020-5-30 19:12
標(biāo)題: 小白請(qǐng)教單片機(jī)測(cè)量?jī)蓚(gè)脈沖產(chǎn)生前后間隔問題,請(qǐng)大神們指點(diǎn)
大家好,我最近自學(xué)51單片機(jī),新手小白一個(gè)。我想用89C52實(shí)現(xiàn)下面功能:利用單89C52兩個(gè)外部中斷測(cè)輸入的兩個(gè)先后產(chǎn)生的單脈沖發(fā)生產(chǎn)間隔,也就是圖中CH1輸入脈沖到CH2輸入脈沖的間隔時(shí)間,利用數(shù)碼管顯示出來,兩個(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í)間。試了好久也沒成功。請(qǐng)大神們指點(diǎn),最好有代碼。我是小白一個(gè),在網(wǎng)上找了一些代碼試了試了也沒成功,請(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)  //開位碼
  {
   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;   //開啟外部中斷
}
}
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;
}

2020-5-30 18-55-49.png (40.31 KB, 下載次數(shù): 77)

2020-5-30 18-55-49.png

作者: zjjhtony    時(shí)間: 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;
}
作者: zjjhtony    時(shí)間: 2020-5-31 12:03
1、采用的共陽(yáng)極數(shù)碼管,P1是段碼,P2是位選。
2、檢測(cè)INT0,INT1的下降沿間隔。輸出數(shù)字,100us輸出100,使用定時(shí)器0檢測(cè)間隔時(shí)間。最大檢測(cè)65535us
作者: lhpm641    時(shí)間: 2020-5-31 21:43
zjjhtony 發(fā)表于 2020-5-31 12:03
1、采用的共陽(yáng)極數(shù)碼管,P1是段碼,P2是位選。
2、檢測(cè)INT0,INT1的下降沿間隔。輸出數(shù)字,100us輸出100, ...

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

2020-5-31 21-23-42.png (20.65 KB, 下載次數(shù): 73)

2020-5-31 21-23-42.png





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1