找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1748|回复: 3
打印 上一主题 下一主题
收起左侧

小白请教单片机测量两个脉冲产生前后间隔问题,请大神们指点

[复制链接]
跳转到指定楼层
楼主
大家好,我最近自学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;
}

2020-5-30 18-55-49.png (40.31 KB, 下载次数: 53)

2020-5-30 18-55-49.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:18297 发表于 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;
}
回复

使用道具 举报

板凳
ID:18297 发表于 2020-5-31 12:03 | 只看该作者
1、采用的共阳极数码管,P1是段码,P2是位选。
2、检测INT0,INT1的下降沿间隔。输出数字,100us输出100,使用定时器0检测间隔时间。最大检测65535us
回复

使用道具 举报

地板
ID:104797 发表于 2020-5-31 21:43 | 只看该作者
zjjhtony 发表于 2020-5-31 12:03
1、采用的共阳极数码管,P1是段码,P2是位选。
2、检测INT0,INT1的下降沿间隔。输出数字,100us输出100, ...

你好,谢谢大神的代码,我学习一下代码,有几个问题想请教一下:
1.void zhongduan1()interrupt 0 函数中的time_count=0是作什么用的?
2.void zhongduan2()interrupt 2函数中的TL0=1;是作什么用的?
3.void main()函数中的time=1234;是作什么用的,是测试显示用的吗?
4.我想测量1s的时间,应该怎样做,大神给个思路
再弱弱的问一下:void disp_change(uint data_change) 函数中的data_change是怎样和time联系起来
的?
我用proteus仿真了一下,为什么显示出来的数字是一个一个的跳出来,我应该修改哪里?
问题有点多,请大神谅解。我刚接触不久,还弄不太明白。谢谢!

2020-5-31 21-23-42.png (20.65 KB, 下载次数: 45)

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表