欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2141|回復: 0
收起左側

單片機紅外線接收源碼

[復制鏈接]
ID:335713 發表于 2018-5-22 15:22 | 顯示全部樓層 |閱讀模式
通過中斷方式接收紅外線,并譯出對應編碼。

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. sbit hwx=P3^3;   //定義紅外接收腳,

  4. code unsigned char d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5.     //P0段選,共陽數碼管 0-9 a-f - 表
  6. unsigned char code w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  7.     //P1位選,直接使用P1的8個端口進行8位選擇

  8. unsigned char l_tmpdate[4]={0,0,0,0};//顯示管數據

  9. unsigned char l_lhj[66];   //定義66位數組變量來存儲接收的時間參數
  10. void delay();                   //延時子函數
  11. void display(unsigned char *lp);//數字的顯示函數;lp為指向數組的地址

  12. void main(void)     //入口函數
  13. {
  14. EA=1;    //首先開啟總中斷
  15. EX1=1;    //開啟外部中斷 1
  16. IT1=1;        // 設置成 下降沿觸發方式
  17. while(1){   //循環顯示,接收都由中斷處理
  18.    display(l_tmpdate);  
  19. }  

  20. }
  21. void display(unsigned char *lp)//顯示
  22. {
  23. P2=w[5];  
  24. P0=~d[lp[0]];   //查表法得到要顯示數字的數碼段
  25. delay();
  26. //P0=0;     //清除顯示,為下一位顯示準備

  27. P2=w[4];  
  28. P0=~d[lp[1]];
  29. delay();
  30. //   P0=0;

  31. P2=w[2];  
  32. P0=~d[lp[2]];  
  33. delay();
  34. //   P0=0;

  35. P2=w[1];  
  36. P0=~d[lp[3]];
  37. delay();
  38. //P0=0;


  39. }
  40. void delay(void)         //空5個指令
  41. {
  42. unsigned char i=13;
  43. while(i)
  44.    i--;
  45. }
  46. void hongwai(void)   interrupt 2     //外部中斷 1 ,INT1(P3^3)連接紅外線接收IC數據腳
  47. {
  48. unsigned char i,j,tmp;
  49. EX1=0;    //暫是關閉處斷中斷1,才能正常接收數據
  50. j=33;    //傳送一組數包括引導碼1位,地址碼8位加反碼8位,指令碼8位加反碼8位,總共33位
  51. i=0;    //從第一維數組開始
  52. tmp=100;   //加八延時,按鍵消抖
  53. while(tmp){
  54. tmp--;
  55. }
  56. if(hwx){   //然后再檢測紅線接收腳是有數據接收,有繼續,沒有則退出
  57.    EX1=1;
  58.    return;
  59. }
  60. while(j){   //循環接收33位數據,為何我們用到66位數組,我們可以不接收高電平時間常數,只接低電平常數就
  61.      //可以判斷1或0了,在這里我們都接收,為串口調試軟件接收計算波形
  62.      //還有一點要知道,接收波形是反向,在沒有接收時端口為高電平
  63.    tmp=0;
  64.    l_lhj[i]=1;   //時間量從1開始
  65.    while(!hwx){ //檢測高低電平的變化,累計低電平的持續時間
  66.     l_lhj[i]++;   //沒變繼續加1
  67.     delay();   //加入延時,是因為我們采用8位二進來存儲,如果不加延時,時間量將計滿
  68.     tmp++;    //此變量為防止干擾帶來的死循環,也就是低電平持續時間最長不超過250個延時
  69.     if(tmp==250)
  70.      break;
  71.    }
  72.    i++;
  73.    tmp=0;
  74.    l_lhj[i]=1;   //時間量從1開始
  75.    while(hwx){   //檢測高低電平的變化,累計高電平的持續時間
  76.     l_lhj[i]++; //沒變繼續加1
  77.     delay();   //同上
  78.     tmp++;
  79.     if(tmp==250)
  80.      break;
  81.    }
  82.    i++;  
  83.    j--;
  84. }
  85. i=255;     //加入循環延時,抗干擾
  86. while(i){
  87. tmp=255;
  88. while(tmp){
  89. P0=0XF0;
  90. tmp--;
  91. }
  92. i--;   
  93. }

  94. tmp=0;
  95. for(i=3;i<19;i++,i++){   //處理地址位,對低電平時間數據的數理,這里我們只處理地址碼和指令碼,引導碼和反碼我們就忽略
  96.    tmp>>=1;     //右移一位,接收低電平在前
  97.    if(l_lhj[i]>30)    //檢測低電平時間超過30就確認為1
  98.     tmp+=0x80;    //0x80=10000000
  99. }
  100. l_tmpdate[0]=tmp/16;   //分開2位以16進制顯示
  101. l_tmpdate[1]=tmp%16;
  102.         
  103. tmp=0;
  104. for(i=35;i<51;i++,i++){   //同上,這里處理指令位
  105.    tmp>>=1;
  106.    if(l_lhj[i]>30)
  107.     tmp+=0x80;
  108. }
  109. l_tmpdate[2]=tmp/16;
  110. l_tmpdate[3]=tmp%16;
  111.     EX1=1;
  112. //再次啟用外部中斷1,為下一次接收做準備

  113. }
復制代碼

所有資料51hei提供下載:
ir.rar (18.28 KB, 下載次數: 12)


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表