找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4687|回复: 5
收起左侧

单片机通过两个固定的光电开关测量匀速运动物体的速度,程序问题

[复制链接]
ID:128279 发表于 2019-3-12 21:49 | 显示全部楼层 |阅读模式
本人想通过两个固定的光电开关(两个传感器间距离已固定)作为触发传感器,来测量匀速运动物体的速度。通过定时器0来及时,怎么获取物体经过两个传感器间的时间?
#include <reg52.h>
#include <math.h>
/*********************************/
unsigned char i=0;
unsigned char j=0;
sbit sk1=P3^2;                  //sk1为第一个位置传感器
sbit sk2=P3^3;                  //sk2为第二个位置传感器
bit flag1;
bit flag2;
/*********************************/
void ZD_initial();

/*********************************/
void ZD_initial()                 //定时器0初始化函数
{
  TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;                         //定时器1打开
}
/*********************************/

void main()                     //主函数
{
if(flag1=!sk1)
  {
     flag1=sk1;
     if(flag1==0)     //下降沿
       {
        ZD_initial();
        while(1)
                {
                t++;                  //以50ms累计计时
               if(TR0==0)break;
                }
               t=t*20             //单位为秒
       }
      
  }

}

/********************************/
void timer0() interrupt 1      //定时器0中断函数
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
   if(flag2=!sk2)
      {
      flag2=sk2;
      if(flag2==0)             //下降沿
          {
          TR0=0;
          }   
      }
}
回复

使用道具 举报

ID:617449 发表于 2019-11-8 15:42 | 显示全部楼层
001.png

003.png


004.png


实物.png

回复

使用道具 举报

ID:560467 发表于 2019-11-8 14:44 | 显示全部楼层
光电门不是有物体输出低电平么,你可以使用两个光电门接在单片机的外部中断口上利用外部中断0执行开启计时器,利用外部中断1关闭定时器。注意定时器就不要开启中断了,你直接使用查询的方式就好了
回复

使用道具 举报

ID:603160 发表于 2019-11-7 14:03 | 显示全部楼层
兄弟,这个问题解绝了吗?
回复

使用道具 举报

ID:234075 发表于 2019-3-14 00:50 | 显示全部楼层
1、使用定时器0作为计时,初始化时不要启动定时器;
2、设置外部中断0(第1个传感器P32=外部中断0),被触发后,在外部中断0服务函数中启动定时器0,累加计时;
3、设置外部中断1(第2个传感器P33=外部中断1),被触发后,在外部中断1服务函数中停止定时器0,读取计时数据;
回复

使用道具 举报

ID:164602 发表于 2019-3-13 08:42 | 显示全部楼层
给你一个思路:
设置定时器工作方式为1,如定时器0:TMOD=0x01;初值为0
当物体经过第一个光电开关时,打开TR0=1,即打开定时器
当物体经过第二个光电开关时,关闭TR)=0,即关闭定时器
此时,定时器的TH0、TL0的值,就是物体通过两开关的时间,这个时间是以微秒为单位的。

大致的程序可以这样写:
                while(!GDKG1);//光电开关1被触发时为高电平,此语句在等待被触发
                TR0=1;//一但光电开关1被触发,就开定时器
                while(!GDKG2);//等待光电开关2被触发
                TR0=0;//一但光电开关2被触发,就关定时器
                time=TH0*256+TL0;//此时定时器0的数据就是以us为单位的时间——注意:时间的多少与晶振
                                             //的值有关,我这里是以12M晶振、单片机12分频而得到的值。看你的程序
                                            //是51单片机,可能是一样的吧。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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