| 楼主,你这个发射接收的距离有多远,发射,接收管的使用寿命长不长, |
| 是问我吗?我这个原来是打算带3路输出,实际上只作了2路,一路控灯,一路控风扇, 进入的话,先开灯,稍延时才开风扇,出来的话,先关灯,风扇会继续延时一小会儿才关掉, 所以用双稳态可能不能达到相要的效果, 再说用MCU电路可能会比较简单一些 |
| 那如果搞个双稳态电路不是也能实现这个功能吗?是不是简单多了呢。 |
Lthrwy 发表于 2025-3-3 15:51 就是这样 |
墙开关.jpg (1.68 MB, 下载次数: 0)
| 把它改为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 |
| 我也做了一个类似功能的,也是放厕所门口,程序是请人帮写的,有问题, 会自已亮,会不到时间灭,会很长时间不灭,凑合用了好几年了,改天发图片上来 |
man1234567 发表于 2020-5-15 07:35 还有一个版本我没发 数码管显示进去+1 出来-1 减到0关闭灯 用的是2.3寸数码管 单片机用的是贴片的 和数码管固定在一起 |
去掉单片机可有效降低成本和故障率 ![]() |
| 挺有意思的! |
| 思路很好,盒子及整体做工优秀。与我一样是实战派 |
| 谢谢分享!!! |