找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序想实现光电测速传感器来测被挡光的时间,哪里有问题?感觉中断没启动

[复制链接]
跳转到指定楼层
楼主
ID:663645 发表于 2019-12-14 12:03 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我想用这个程序测量光电测速传感器被挡住的时间,此光电测速传感器没遮挡时输出低电平,挡住时输出高电平,但感觉中断没启动。我想用来做一个光电门,测量挡光的时间

单片机源程序如下:
  1. #include<reg52.h>

  2. unsigned long int cnt;
  3. unsigned long int t;//长整型,时间

  4. sbit in=P3^2;     //信号输入口

  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. unsigned char code table_du[]={
  8. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  9. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  10. 0x39,0x5e,0x79,0x71};
  11. unsigned char code table_we[]={
  12. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

  13. unsigned char disnum[6];



  14. delay(unsigned char x)
  15. {
  16.         unsigned char a,b;
  17.         for(a=x;a>0;a--)
  18.                 for(b=200;b>0;b--);

  19. }

  20. timedis(void)
  21. {
  22.    
  23.         disnum[0]=t/10000000;
  24.         disnum[1]=(t%10000000)/1000000;
  25.         disnum[2]=(t%1000000)/100000;
  26.         disnum[3]=(t%100000)/10000;
  27.         disnum[4]=(t%10000)/1000;
  28.         disnum[5]=(t%1000)/100;
  29.         

  30. }
  31. display()
  32. {
  33.         unsigned char i;
  34.         for(i=0;i<6;i++)
  35.         {
  36.                 P0=0xff;
  37.                 wela=1;
  38.                 wela=0;
  39.                 P0=table_du[disnum[i]];
  40.                 dula=1;
  41.                 dula=0;
  42.                 P0=table_we[i];
  43.                 wela=1;
  44.                 wela=0;
  45.                 delay(5);
  46.         }
  47. }


  48. void int0() interrupt 0
  49. {
  50.         t=cnt;
  51.     cnt=0;
  52.         
  53. }

  54. void timer0 () interrupt 1
  55. {
  56.     TH0=(65536-100)/256;
  57.     TL0=(65536-100)%256;
  58.         cnt++;
  59. }


  60. void main()
  61. {
  62.         TMOD=0x09;
  63.     TH0=(65536-100)/256;
  64.     TL0=(65536-100)%256;
  65.         TR0=0;  
  66.     ET0=1;
  67.         
  68.     IT0=1;
  69.         EX0=1;
  70.         EA=1;        
  71.         
  72.     while(1)
  73.         {
  74.                 if(in==0)
  75.                 {
  76.             TR0=1;
  77.         }
  78.         timedis();
  79.                 display();
  80.         }
  81. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-12-14 16:43 | 只看该作者
如果程序没问题,应该是从挡住光到不挡光会发生中断,如果要挡住光发生中断,需把信号反相(可用非门或单个三极管),目前不知道你传感器是如何接入P32的,程序中看不出
回复

使用道具 举报

板凳
ID:648281 发表于 2019-12-14 17:27 | 只看该作者
你好!把 in 为高的时候,作为结束,算出期间经过的时间;以前做过小球下落时间检测的实物。。。












回复

使用道具 举报

地板
ID:663645 发表于 2019-12-14 19:49 来自手机 | 只看该作者
csmyldl 发表于 2019-12-14 16:43
如果程序没问题,应该是从挡住光到不挡光会发生中断,如果要挡住光发生中断,需把信号反相(可用非门或单个三极 ...

谢谢你的指导,光电传感器的输出直接接p3.2口的,我是想用定时器TMOD 0x09模式(Gate=1),先TR0=0,不启动定时器,然后在while循环中检测in是否为低电平,再TR0=1,等in为高电平时才会开启定时器,等高电平变为低电平时由外部中断(设置为下降沿触发)读取时间,这个逻辑是否行得通?
回复

使用道具 举报

5#
ID:663645 发表于 2019-12-14 20:42 来自手机 | 只看该作者
QQ搜3205931140 发表于 2019-12-14 17:27
你好!把 in 为高的时候,作为结束,算出期间经过的时间;以前做过小球下落时间检测的实物。。。



谢谢您的指导
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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