找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2218|回复: 4
收起左侧

51单片机光电传感器通过检测是否有物体通过,通过中断计数 求帮助

[复制链接]
ID:568017 发表于 2019-6-28 16:29 | 显示全部楼层 |阅读模式
引脚定义
#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;
                        }
     }
}

回复

使用道具 举报

ID:328014 发表于 2019-6-28 18:13 | 显示全部楼层
具体是什么问题?
回复

使用道具 举报

ID:568017 发表于 2019-6-28 20:54 | 显示全部楼层
就是光电传感器读到数据,感觉他就直接跳到第二个switch语句执行了
回复

使用道具 举报

ID:568017 发表于 2019-6-28 20:57 | 显示全部楼层

然后偶尔执行了一下switch case 1 他第二次就直接执行到case 2了
回复

使用道具 举报

ID:207421 发表于 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. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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