|
發布時間: 2020-5-6 15:48
正文摘要:做它的目的是提示廁所內有人 不用走近后才被里面的人提示 其他人在遠處看到裝在外面的燈亮了就知道里面有人 紅外接收頭遮擋后重新接收到38khz信號會有一個低脈沖 通過判斷兩個接收 ... |
| 樓主,你這個發射接收的距離有多遠,發射,接收管的使用壽命長不長, |
| 是問我嗎?我這個原來是打算帶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寸數碼管 單片機用的是貼片的 和數碼管固定在一起 |
去掉單片機可有效降低成本和故障率 ![]() |
| 挺有意思的! |
| 思路很好,盒子及整體做工優秀。與我一樣是實戰派 |
| 謝謝分享!!! |