找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3908|回復(fù): 3
收起左側(cè)

原創(chuàng)單片機(jī)紅外反射開關(guān)源碼,有詳細(xì)注釋,可以做小便池前面的開關(guān)

[復(fù)制鏈接]
ID:140489 發(fā)表于 2018-3-8 08:43 | 顯示全部樓層 |閱讀模式
51單片機(jī)源程序如下:
  1. //紅外反射開關(guān),接收頭HS0038B,發(fā)射管用pnp三極管驅(qū)動(dòng)
  2. //第一次上電,燈亮1秒后熄滅,
  3. //有人在開關(guān)前面,延時(shí)約1秒,燈亮,人離開后,延時(shí)X 秒后燈滅
  4. //如果燈還沒滅,人又來到開關(guān)前面,燈長亮,人離開后,延時(shí)X 秒后燈滅
  5. //實(shí)驗(yàn)板測(cè)試正常
  6. //哪位大神有更好的方法來實(shí)現(xiàn)這個(gè)功能,也希望發(fā)出來
  7. #include <reg52.h>
  8. #include <intrins.h>
  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. sbit ir=P2^4;         //紅外發(fā)射
  12. sbit ir_in=P3^2; //紅外接收
  13. sbit led=P1^7;
  14. bit flag,flag2;
  15. uint cont,cont1;

  16. bit f1,f2;
  17. void delay(uint z)           //ms
  18. {
  19.         uint x,y;
  20.         for(x=z; x>0; x--)
  21.                 for(y=114; y>0; y--);
  22. }


  23. void fa_38k()          //38k 載波                         //接收頭前面有濾光片,發(fā)射管要用黑色熱縮套管套起來
  24. {                                  //不是很準(zhǔn),沒有邏輯分析儀,搞不準(zhǔn),現(xiàn)在的反射距離在60厘米左右(發(fā)射管串100歐電阻)
  25.         ir=0;                  //如果有邏輯分析儀,把頻率調(diào)準(zhǔn),反射距離肯定要遠(yuǎn)些
  26.         _nop_();_nop_();_nop_();_nop_();
  27.         _nop_();_nop_();_nop_();_nop_();
  28.         
  29.         ir=1;
  30.         _nop_();_nop_();_nop_();_nop_();
  31.         _nop_();_nop_();_nop_();_nop_();
  32.         _nop_();_nop_();_nop_();_nop_();
  33.         _nop_();_nop_();_nop_();_nop_();
  34.         _nop_();//_nop_();
  35. }

  36. void main()
  37. {
  38.         uint i;
  39.         ir_in=1;
  40.         TMOD |= 0X01;                          //T0定時(shí)器,模式1, 16位計(jì)數(shù)
  41.         TH0 = (65536-10000)/256;  //10ms初值 @12MHz晶振
  42.         TL0 = (65536-10000)%256;
  43.         EA=1;
  44.         ET0=1;
  45.         TR0=1;
  46.         led=0;
  47.         delay(1000);
  48.         led=1;
  49.         while(1)
  50.         {
  51.                 if(flag)
  52.                 {
  53.                         fa_38k();  //發(fā)38K
  54.                 }
  55.                 else ir=1;           //停止發(fā)射
  56.            
  57.                
  58.                 if(ir_in==0)  //如果紅外接收的輸出端為0,表示前面有反射物體
  59.                 {        
  60.                         i++;          //這句起消抖的作用 ,i取大些,抗干擾能力強(qiáng)些
  61.                         if((ir_in==0) && (i>15000)) //確認(rèn)反射物體還在開關(guān)前面,這里i的延時(shí)燈點(diǎn)亮的速度
  62.                         {                                                //i越小,燈點(diǎn)亮越快,i的數(shù)值如果設(shè)定20000,可以不要下面那句delay(2000);
  63.                                 i=0;                         //消抖計(jì)時(shí)變量清0
  64.                         //        delay(1000);         //延時(shí)2秒后,這里不加延時(shí)也可以,看自己的喜好
  65.                                 led=0;                         //亮燈
  66.                                 f1=1;                         //延時(shí)計(jì)時(shí)標(biāo)志置1
  67.                                 cont1=0;                 //延時(shí)計(jì)時(shí)變量清零
  68.                                 while(!ir_in);         //判斷反射物體是否離開,如果沒離開,程序就停在這里,
  69.                                                                  //燈一直亮,相當(dāng)于按鍵的松手檢測(cè)
  70.                         }
  71.                 }

  72.                 if(cont1==1000 && ir_in==1)  //松手+延時(shí)時(shí)間到后,這里是設(shè)定延時(shí)10秒
  73.                 {
  74.                         f1=0;                                          //延時(shí)計(jì)時(shí)標(biāo)志清0
  75.                         cont1=0;                                  //延時(shí)關(guān)燈計(jì)時(shí)變量清0
  76.                         led=1;                                          //關(guān)燈
  77.                 }

  78.         }
  79. }

  80. void timer0() interrupt 1
  81. {
  82.         TH0 = (65536-10000)/256;  //重裝10ms初值
  83.         TL0 = (65536-10000)%256;
  84.         cont++;
  85.         if(cont==10)  
  86.         {        
  87.                 cont=0;
  88.                 flag=!flag;         //發(fā)100ms 38K,停100ms
  89.         }
  90.         
  91.         if(f1)
  92.         {
  93.                 cont1++;
  94.         }        
  95. }

復(fù)制代碼


評(píng)分

參與人數(shù) 2黑幣 +55 收起 理由
kkggg12345 + 5 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:387856 發(fā)表于 2020-3-10 12:05 | 顯示全部樓層
能不能不用紅外接收頭,用紅外對(duì)管,程序能做到防太陽光。高手能不能搞
回復(fù)

使用道具 舉報(bào)

ID:140489 發(fā)表于 2020-3-10 14:28 | 顯示全部樓層
可以做的,紅外對(duì)管的反射距離比較近,只能做到10幾厘米
回復(fù)

使用道具 舉報(bào)

ID:964852 發(fā)表于 2021-11-19 10:59 來自觸屏版 | 顯示全部樓層
大神,能否發(fā)下紅外對(duì)管的參考點(diǎn)代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表