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

QQ登錄

只需一步,快速開始

搜索
查看: 1979|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

紅外控制流水燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:306790 發(fā)表于 2018-4-12 20:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近在弄紅外解鎖:數(shù)據(jù)碼,數(shù)據(jù)反碼:
  1.                          /*NEC協(xié)議紅外通信
  2. 單片機(jī)解碼后通過串口以9600的比特率發(fā)送出去
  3. */
  4. #include <reg52.h>
  5. /*====================================
  6. 自定義類型名
  7. ====================================*/
  8. typedef unsigned char INT8U;
  9. typedef unsigned char uchar;

  10. typedef unsigned int INT16U;
  11. typedef unsigned int uint;
  12. /*====================================
  13. 硬件接口位聲明
  14. ====================================*/
  15. sbit IR  = P3^2;     //定義紅外脈沖數(shù)據(jù)接口        外部中斷O輸入口

  16. uchar IRtime;//儲(chǔ)存檢測(cè)紅外高低電平持續(xù)時(shí)間
  17. uchar IRcord[4];//儲(chǔ)存解碼后的4個(gè)字節(jié)數(shù)據(jù)
  18. uchar IRdata[33];//包含起始碼在內(nèi)的33位數(shù)據(jù)
  19. bit IRpro_ok;//解碼后4個(gè)字節(jié)數(shù)據(jù)接收完成標(biāo)志位
  20. bit IRok;//33位數(shù)據(jù)接收完成標(biāo)志
  21. //初始化定時(shí)器0,外部中斷0
  22. void init()
  23. {
  24.         TMOD|=0x02;//設(shè)置定時(shí)器0工作模式2,8位自動(dòng)重裝
  25.         TL0=TH0=0;//初始化定時(shí)器0寄存器,定時(shí)器0溢出一次時(shí)間為256個(gè)機(jī)器周期
  26.         EA=1;//開總中斷
  27.         ET0=1;//開定時(shí)器0中斷
  28.         TR0=1;//啟動(dòng)定時(shí)器0
  29.        
  30.         IT0=1;//設(shè)置外部中斷0跳變沿觸發(fā)方式
  31.         EX0=1;//開外部中斷0中斷
  32.        
  33. }
  34. //定時(shí)器0中斷,每中斷一次需要256*1.085us =  277.76us
  35. void time0() interrupt 1
  36. {
  37.         IRtime++;  //277.76us
  38. }
  39. //外部中斷0 存入33次脈寬
  40. void int0() interrupt 0
  41. {
  42.         static uchar i;//靜態(tài)變量用于存入33次數(shù)據(jù)計(jì)數(shù)
  43.         static bit startflag;//開始儲(chǔ)存脈寬標(biāo)志位
  44.         if(startflag)
  45.         {
  46.                 /*判斷引導(dǎo)碼,如果是引導(dǎo)碼則從起始碼開始存*/
  47.                 if((IRtime<53)&&(IRtime>=32)) i=0;
  48.                 IRdata[i]=IRtime;  //以TO溢出的次數(shù)來計(jì)算脈寬把這個(gè)時(shí)間存放在數(shù)組中
  49.                 IRtime=0;  //計(jì)數(shù)清零
  50.                 i++;//計(jì)數(shù)脈寬存入次數(shù)自加
  51.                 if(i==33)  //i等于33那么就表示已經(jīng)存入了33次脈寬
  52.                 {
  53.                         IRok=1;  //脈寬檢查完成
  54.                         i=0; //把脈寬計(jì)數(shù)清零準(zhǔn)備下次存入
  55.                 }
  56.         }
  57.         else
  58.         {
  59.                 IRtime=0;//定時(shí)器0計(jì)數(shù)清零
  60.                 startflag=1;//開始處理標(biāo)志位置1
  61.         }
  62. }
  63. void IRcordpro()
  64. {
  65.         uchar i;//i是用于計(jì)數(shù)處理4個(gè)字節(jié)
  66.         uchar j;//j用于計(jì)數(shù)處理1個(gè)字節(jié)的8位數(shù)據(jù)
  67.         uchar k;//k用于計(jì)數(shù)處理33次脈寬
  68.         k = 1;//從第一位脈寬開始處理,丟掉起始碼
  69.         for(i=0;i<4;i++)
  70.         {
  71.                 for(j=0;j<8;j++)
  72.                 {
  73.                         //如果脈寬大于數(shù)據(jù)0標(biāo)準(zhǔn)的1125us那么就判定為數(shù)據(jù)1
  74.                         if(IRdata[k]>5)  IRcord[i]|=0x80;//寫1
  75.                         //只能右移7次,如果右移8次則會(huì)把第一位數(shù)據(jù)移出去
  76.                         if(j<7)  IRcord[i]>>=1;
  77.                         k++;  //處理下一次脈寬
  78.                 }
  79.         }
  80.         IRpro_ok=1;//解碼完成
  81. }
  82. void main()
  83. {
  84.         init(); //初始化
  85.         while(1)
  86.         {
  87.                 if(IRok)//判斷33次脈寬是否提取完成
  88.                 {
  89.                         IRcordpro();//根據(jù)脈寬解碼出4個(gè)字節(jié)的數(shù)據(jù)
  90.                         IRok=0;//清零脈寬檢查完成標(biāo)志位等待下一次脈寬檢查
  91.                         if(IRpro_ok)//判斷解碼完成,4個(gè)字節(jié)數(shù)據(jù)
  92.                         {
  93.                                 if(IRcord[2] == 0x45)
  94.                                         P1 = 0xfe;  //數(shù)據(jù)碼,低電平,開鎖       
  95.                                 else
  96.                                         P1 = 0x01;          //數(shù)據(jù)反碼,高電平
  97.                                 IRpro_ok=0;//清零解碼標(biāo)志位
  98.                         }
  99.                 }
  100.         }
  101. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
stkh + 5 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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