标题: 51单片机光电传感器通过检测是否有物体通过,通过中断计数 求帮助 [打印本页]

作者: 寒山寺小生    时间: 2019-6-28 16:29
标题: 51单片机光电传感器通过检测是否有物体通过,通过中断计数 求帮助
引脚定义
#define uchar unsigned char
#define uint unsigned int

sbit BEEP=P3^7;
sbit guang=P1^0;
sbit jidianqi=P0^0;
uint c=0;

实现代码
void exint0() interrupt 0      
{
  c=0;
        jidianqi = 0;
}
void exint1() interrupt 2         
{

        c++;
        delay1ms(200);
}



void main()
{
         
   IT0 = 1;                     
   EX0 = 1;                    
   IT1 = 1;               
   EX1 = 1;                           
         EA = 1;
   BEEP=1;
         jidianqi=0;
     while(1)
     {
                        switch(c)
                        {
                                case 1:jidianqi=1;break;
                          case 2:jidianqi=1;P0=0;break;
                        }
     }
}


作者: 51hei团团    时间: 2019-6-28 18:13
具体是什么问题?
作者: 寒山寺小生    时间: 2019-6-28 20:54
就是光电传感器读到数据,感觉他就直接跳到第二个switch语句执行了

作者: 寒山寺小生    时间: 2019-6-28 20:57
51hei团团 发表于 2019-6-28 18:13
具体是什么问题?

然后偶尔执行了一下switch case 1 他第二次就直接执行到case 2了
作者: lwh999995    时间: 2019-6-29 03:35
  1. #include<xxxx.h>  //头文件未知,需要改
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit BEEP = P3^7;                //STC单片机P3内部有上拉电阻
  5. sbit guang = P1^0;                //STC单片机P1内部有上拉电阻
  6. sbit jidianqi = P0^0;         //STC单片机P0内部无上拉电阻,需要外部加
  7. uint c=0;
  8. //
  9. void exint0() interrupt 0      
  10. {
  11.         EX0 = 0;                // 关闭中断,防止误动作
  12.         c=0;
  13.         jidianqi = 0;
  14.         EX0 = 1;                // 打开中断
  15. }
  16. //
  17. void exint1() interrupt 2         
  18. {
  19.         EX1 = 0;                   // 关闭中断,防止误动作
  20.         c++;
  21.         if(c==3) c=0;         // c值超出范围值清0,也可以设置其它值,例如c=1,看需求,不用就删除此行吧
  22.         delay1ms(200);
  23.         EX1 = 1;                // 打开中断
  24. }
  25. //
  26. void main()
  27. {
  28.         IT0 = 1;                     
  29.         EX0 = 1;                    
  30.         IT1 = 1;               
  31.         EX1 = 1;                           
  32.         EA  = 1;
  33.         BEEP = 1;
  34.         jidianqi = 0;   // 如果是继电器,应该用PNP管驱动继电器,触发信号低电平,
  35.                                         // 如果jidianqi = 0;是继电器关闭,最好改一改电路,防止STC类单片机启动复位IO高电平误动作
  36.         delay1ms(200);        // 稍微延个时,稳定一下
  37.        
  38.         while(1)
  39.         {
  40.                 switch(c)
  41.                 {
  42.                         case 1:  jidianqi=1; break;
  43.                         case 2:  jidianqi=1; P0=0; break;
  44.                         default: break;  // 如果c不在范围值之内,执行,可添加其它功能
  45.                 }
  46.         }
  47. }
复制代码







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1