找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4283|回复: 10
收起左侧

单片机红外对射进出门开关灯程序(已在厕所中使用)

  [复制链接]
ID:261025 发表于 2020-5-6 15:48 | 显示全部楼层 |阅读模式
做它的目的是提示厕所内有人  不用走近后才被里面的人提示  其他人在远处看到装在外面的灯亮了就知道里面有人 红外接收头遮挡后重新接收到38khz信号会有一个低脉冲  通过判断两个接收头遮挡的先后顺序判断进出  按键可以切换进出判断

缺点是发射的38khz信号里不含有加密数据 接收端没有解码判断 容易受到太阳光干扰造成进出不亮不灭   
进去时蜂鸣器响一声 出来响两声  如果受到太阳光干扰就沿着进或出的方向靠近接收端挥手就能开灯或关灯   灯开启后延时七八分钟自动熄灭

制作出来的实物图如下:
51hei截图20200506151758.jpg

电路原理图如下:
51hei截图20200506151610.jpg

51hei截图20200506151747.jpg 51hei截图20200506151639.jpg
单片机源程序如下:
发射38khz方波
;12MHZ

                 ORG 0000H
                 SJMP STA
                 ORG 000BH
                 LJMP T0ISR
                 ORG 0030H
STA:
        ;         MOV TMOD,#02H                   ;AT89C2051        12MHZ
        ;         MOV TL0,#0B2H;#064H        ;
        ;         MOV TH0,#0FFH;#0FFH        ;
        ;         SETB TR0
        ;         SETB ET0
        ;         SETB EA
        ;         SJMP $
              MOV TMOD,#00010010B  ;STC15F104W         12MHZ
              MOV TH0,#0F4H           
              MOV TL0,#0F4H              
              SETB ET1
              SETB ET0
              SETB EA
              SETB TR1
              SETB TR0
                          SJMP $
T0ISR:
                 CPL P3.4
                 CPL P3.5
                 RETI
         END

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接收
;12MHZ

               
                 SETB P3.3;IN1 红外接收头输入端
                SETB P3.4;IN2 红外接收头输入端
                SETB P3.5;LED 遮挡、延时指示        
                CLR  P3.1;OUT 输出控制电器
                SETB P3.0;蜂鸣器                 
                SETB P3.2;切换 A<=>B
                X EQU 04H;切换标志位        
        SETB X
                LCALL DELAY;
                LCALL DELAY;
                CLR  P3.0;蜂鸣器
                MOV  60H,#00
        MOV  61H,#00
                MOV  62H,#00
                MOV  63H,#00 ;自动熄灭延时
MAIN1:        MOV  66H,#00
        MOV  67H,#00
                MOV  68H,#00
            SETB P3.5;LED 遮挡、延时指示               
                LCALL DELAY;

                LCALL DELAY;            
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;            
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;
                LCALL DELAY;                        
MAIN0:  JNB P3.4,KK111;         IN1;  关灯
        JNB P3.3,KK222;         IN2   开灯        
                JNB P3.2,QIEHUAN;切换 A<=>B        
            DJNZ 62H,MAIN0
        DJNZ 61H,MAIN0
            DJNZ 60H,MAIN0
                DJNZ 63H,MAI ;自动熄灭延时
            CLR P3.1; OUT  输出关闭
MAIN:   JNB P3.4,KK111;         IN1;  关灯
        JNB P3.3,KK222;         IN2   开灯        
                JNB P3.2,QIEHUAN;切换 A<=>B        
                LJMP MAIN;
MAI:    MOV  60H,#240
       MOV  61H,#240
           MOV  62H,#240
           LJMP MAIN0;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
QIEHUAN:LCALL DELAY;
                LCALL DELAY;
        JNB P3.2,MAIN;
        CPL X;
                SETB P3.0;蜂鸣器
        JNB P3.2,$
                LCALL DELAY;
                CLR  P3.0;蜂鸣器
        LJMP MAIN1
////////////////////////////////////
KK111: MOV  66H,#50
       MOV  67H,#240
           MOV  68H,#240
           CLR P3.5;LED 遮挡、延时指示
RLA:   JB P3.3,RLL;         IN2
       JNB X,QH1;切换 A<=>B
QH2:   CLR P3.1; OUT        输出关闭
       SETB P3.0;蜂鸣器
           LCALL DELAY;
           CLR  P3.0;蜂鸣器
           LCALL DELAY;
           SETB P3.0;蜂鸣器
           LCALL DELAY;
           CLR  P3.0;蜂鸣器
           LJMP MAIN1;
////////////////////////////////////////////
RLL:   DJNZ 68H,RLA
       DJNZ 67H,RLA
           DJNZ 66H,RLA        
           LJMP MAIN1;   
////////////////////////////////////      
KK222: MOV  66H,#50
       MOV  67H,#240
           MOV  68H,#240
           CLR P3.5;  LED 遮挡、延时指示
RRA:   JB P3.4,RRR;         IN1
           JNB X,QH2;切换 A<=>B
QH1:   SETB P3.1; OUT         输出开启
           SETB P3.0;蜂鸣器
           LCALL DELAY;
           CLR  P3.0;蜂鸣器
           MOV  60H,#240
       MOV  61H,#240
           MOV  62H,#240
           MOV  63H,#20
            LJMP MAIN1;
///////////////////////////////////////            
RRR:   DJNZ 68H,RRA
       DJNZ 67H,RRA
           DJNZ 66H,RRA        
           LJMP MAIN1;
////////////////////////////////////////
;秒延时子程序
DELAY: MOV R4,#5;10
           MOV R5,#248;248
       MOV R6,#248;
D10:   DJNZ R6,D10;
       DJNZ R5,D10;$
       DJNZ R4,D10
       RET
       END;


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:253767 发表于 2020-5-8 07:18 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

ID:282850 发表于 2020-5-8 14:24 | 显示全部楼层
思路很好,盒子及整体做工优秀。与我一样是实战派
回复

使用道具 举报

ID:305511 发表于 2020-5-9 13:11 | 显示全部楼层
挺有意思的!
回复

使用道具 举报

ID:584814 发表于 2020-5-15 07:35 | 显示全部楼层
去掉单片机可有效降低成本和故障率
回复

使用道具 举报

ID:261025 发表于 2020-5-27 21:08 | 显示全部楼层
man1234567 发表于 2020-5-15 07:35
去掉单片机可有效降低成本和故障率

还有一个版本我没发  数码管显示进去+1 出来-1  减到0关闭灯  用的是2.3寸数码管 单片机用的是贴片的 和数码管固定在一起
回复

使用道具 举报

ID:1075398 发表于 2025-3-3 15:51 | 显示全部楼层
我也做了一个类似功能的,也是放厕所门口,程序是请人帮写的,有问题, 会自已亮,会不到时间灭,会很长时间不灭,凑合用了好几年了,改天发图片上来
回复

使用道具 举报

ID:1075398 发表于 2025-3-3 16:00 | 显示全部楼层
把它改为C语言版,谁验证一下#include <stc15.h> #include <intrins.h>  // 发射部分代码 #if 0 // 发射代码,通过定义宏切换发射/接收 /************** 发射程序 **************/ sbit TxPin1 = P3^4; // 38kHz输出引脚 sbit TxPin2 = P3^5;  void Timer0_Init() {     TMOD = 0x12;    // 定时器0模式2(8位自动重装)     TH0 = 0xF4;     // 12MHz下产生38kHz方波     TL0 = 0xF4;     ET0 = 1;        // 允许定时器0中断     EA = 1;         // 开总中断     TR0 = 1;        // 启动定时器0 }  void main() {     P3M0 = 0x00;    // 设置P3为准双向口     P3M1 = 0x00;     Timer0_Init();     while(1); }  void Timer0_ISR() interrupt 1 {     TxPin1 = !TxPin1; // 翻转输出     TxPin2 = !TxPin2; }  #else /************** 接收程序 **************/ sbit RxPin1 = P3^3;   // 红外输入1 sbit RxPin2 = P3^4;   // 红外输入2 sbit LED = P3^5;      // 状态指示灯 sbit Out = P3^1;      // 控制输出 sbit Buzzer = P3^0;   // 蜂鸣器 sbit Switch = P3^2;   // 模式切换  bit X = 1;            // 切换标志 unsigned char counter[8]; // 60H-67H  void delay() {        // 约10ms延时     unsigned char i = 5;     while(i--) {         unsigned char j = 248;         while(j--) {             unsigned char k = 248;             while(k--);         }     } }  void main() {     // IO初始化     P3M0 = 0x00; P3M1 = 0x00; // 准双向模式     RxPin1 = RxPin2 = LED = Switch = 1;     Out = 0;     Buzzer = 1;          X = 1;     delay(); delay();     Buzzer = 0;          // 计数器初始化     for(unsigned char i=0; i<8; i++) counter[i] = 0;      while(1) {         LED = 1;         // 初始延时(约130ms)         for(int i=0; i<13; i++) delay();                  while(1) {             // 输入检测             if(!RxPin2) {        // 关灯检测                 counter[6] = 50; counter[7] = 240; counter[0] = 240;                 LED = 0;                 // 防抖动检测                 while(counter[0]-- || counter[7]-- || counter[6]--) {                     if(RxPin1) {                         if(!X) { // 模式B                             Out = 0;                             Buzzer = 1; delay(); Buzzer = 0; delay();                             Buzzer = 1; delay(); Buzzer = 0;                             goto RESTART;                         }                         break;                     }                 }                 goto RESTART;             }                          if(!RxPin1) {        // 开灯检测                 counter[6] = 50; counter[7] = 240; counter[0] = 240;                 LED = 0;                 while(counter[0]-- || counter[7]-- || counter[6]--) {                     if(RxPin2) {                         if(X) { // 模式A                             Out = 1;                             Buzzer = 1; delay(); Buzzer = 0;                             counter[0] = counter[1] = counter[2] = 240;                             counter[3] = 20;                             goto RESTART;                         }                         break;                     }                 }                 goto RESTART;             }                          if(!Switch) {        // 模式切换                 delay(); delay();                 if(!Switch) {                     X = !X;                     Buzzer = 1; delay(); Buzzer = 0;                 }                 while(!Switch);                 goto RESTART;             }                          // 自动关闭检测             if(!--counter[2] && !--counter[1] && !--counter[0] && !--counter[3]) {                 Out = 0;                 break;             }         }                  RESTART: // 重启循环         counter[3] = 20; // 重置自动关闭定时         counter[0] = counter[1] = counter[2] = 240;     } } #endif
回复

使用道具 举报

ID:1075398 发表于 2025-3-4 10:41 | 显示全部楼层
Lthrwy 发表于 2025-3-3 15:51
我也做了一个类似功能的,也是放厕所门口,程序是请人帮写的,有问题, 会自已亮,会不到时间灭,会很长时间不灭, ...

就是这样
墙开关.jpg
回复

使用道具 举报

ID:325985 发表于 2025-3-4 16:06 | 显示全部楼层
那如果搞个双稳态电路不是也能实现这个功能吗?是不是简单多了呢。
回复

使用道具 举报

ID:1075398 发表于 2025-3-5 08:43 | 显示全部楼层
是问我吗?我这个原来是打算带3路输出,实际上只作了2路,一路控灯,一路控风扇, 进入的话,先开灯,稍延时才开风扇,出来的话,先关灯,风扇会继续延时一小会儿才关掉, 所以用双稳态可能不能达到相要的效果, 再说用MCU电路可能会比较简单一些
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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