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

QQ登錄

只需一步,快速開(kāi)始

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

對(duì)前期帖51單片機(jī)紅外通信第一種方案修正,附完整源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:965487 發(fā)表于 2021-10-18 19:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前期我發(fā)帖稱也談51單片機(jī)紅外通信(附四種方案),現(xiàn)對(duì)第一方案一處錯(cuò)誤進(jìn)行修正。前期貼鏈接附在下面:

也談51單片機(jī)紅外通信(附有四種紅外解碼源碼) - 單片機(jī)DIY制作 (51hei.com)


  1. /*-----------------------------------------------
  2. 【實(shí)驗(yàn)平臺(tái)】: QX-MCS51 單片機(jī)開(kāi)發(fā)板
  3. * 【外部晶振】: 11.0592Mhz       
  4. * 【主控芯片】: STC89C52
  5. * 【編譯環(huán)境】: Keil μVisio4         
  6. * 【編    程】:wzqwxx 水上人家
  7. 名稱:遙控器紅外解碼數(shù)碼管顯示
  8.   內(nèi)容:按配套遙控器會(huì)在數(shù)碼管上對(duì)應(yīng)顯示鍵碼值,實(shí)測(cè)通過(guò)

  9.                   NEC 標(biāo)準(zhǔn)下的編碼表示

  10.                 其中:引導(dǎo)碼高電平約9000us 左右,低電平約4500us 左右;
  11.                 接收端:引導(dǎo)碼低電平約9000us 左右,高電平約4500us 左右;
  12.                 用戶碼16 位,數(shù)據(jù)碼16 位,共32位;
  13.         發(fā)送端:        數(shù)據(jù)0 是用“高電平約560us +低電平約560us”表示。
  14.                                 數(shù)據(jù)1 可用“高電平約560us+低電平約1680us”表示

  15.         接收端反轉(zhuǎn):數(shù)據(jù)0 是用“低電平約560us +高電平約560us”表示。
  16.                                 數(shù)據(jù)1 可用“低電平約560us+高電平約1680us”表示

  17. ------------------------------------------------*/
  18. #include<reg52.h>            //包含頭文件,頭文件包含特殊功能寄存器的定義
  19. #include <stdio.h>
  20. #include "SMG.H"

  21. sbit IR=P3^2;                          //紅外接口
  22. sbit beep = P2^3;//蜂鳴器接口
  23. unsigned char irtime;        //紅外用全局變量   計(jì)數(shù)延時(shí),識(shí)別比特位電平高低
  24. unsigned char IRcord[4]= {0x12,0x34,0x56,0x78};//存儲(chǔ)鍵碼


  25. void tim0_isr (void) interrupt 1   //STC89C52 11.0592M
  26. {
  27.   irtime++;  //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間         每個(gè)溢出中斷時(shí)長(zhǎng)256*1.085069us=277.77us
  28. }


  29. void EX0_ISR (void) interrupt 0  //外部中斷0服務(wù)函數(shù)
  30. {
  31.         static unsigned char  i,blag;             //接收紅外信號(hào)處理
  32.           if(blag == 1)
  33.         {
  34.                 if( irtime <3 || irtime >51)goto end;  //兩個(gè)下降沿延時(shí)過(guò)短(少于833us)或過(guò)長(zhǎng)不解碼 濾除干擾波
  35.                 if(irtime > 28 && irtime < 55)//跳過(guò)引導(dǎo)碼 頭碼,9ms+4.5ms
  36.                 { i=0; goto end;}               
  37.                 IRcord[i/8] >>= 1;          //i/8每處理8位換下一個(gè)元素,總的處理4個(gè)字節(jié)共32位的數(shù)據(jù)
  38.                  if(irtime > 5 ) IRcord[i/8] |= 0x80;           //位0電平時(shí)長(zhǎng)計(jì)數(shù)上限4,位1高電平計(jì)數(shù)上限8
  39.                 i++;                                                                           //這里取6為0/1 的識(shí)別分界
  40.                 if(i > 31){ i = 0; blag = 0; beep = 0; delay(30); beep = 1; }        //beep 鳴叫一聲        解碼成功                                                  
  41.         }
  42.         else  
  43.                 {blag = 1;}
  44.         end:irtime=0;                                                                          
  45. }


  46. //void UART_init()
  47. //{
  48. //        TMOD |= 0x20;          //T1工作模式2  8位自動(dòng)重裝
  49. //        TH1 = 0xfd;
  50. //        TL1 = 0xfd;         //比特率9600   時(shí)鐘頻率11.0592MHZ
  51. //        TR1 = 1;                //啟動(dòng)T1定時(shí)器
  52. //        SM0 = 0;
  53. //        SM1 = 1;                 //串口工作方式1 10位異步
  54. //        REN = 1;                //串口允許接收
  55. //        TI = 1;
  56. //}

  57. void TIM0init(void)//定時(shí)器0初始化
  58. {
  59.         TMOD|=0x02;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
  60.         TH0=0x00; //重載值
  61.         TL0=0x00; //初始化值
  62.         ET0=1;    //開(kāi)中斷
  63.         TR0=1;   
  64. }
  65. void EX0init(void)
  66. {
  67. IT0 = 1;   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  68. EX0 = 1;   //使能外部中斷
  69. EA = 1;    //開(kāi)總中斷
  70. }


  71. void main(void)
  72. {
  73. //        UART_init();
  74.         EX0init(); //初始化外部中斷
  75.         TIM0init();//初始化定時(shí)器

  76.         while(1)//主循環(huán)
  77.         {
  78.                 SMGXSSZ(IRcord);
  79.         //        printf(" %bx %bx %bx %bx \n  ",IRcord[0],IRcord[1],IRcord[2],IRcord[3]) ;
  80.         }
  81. }
  82.   
  83.   
復(fù)制代碼

  1. #include "SMG.H"

  2. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  3.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  4.                                                 //0-F的碼表
  5. uchar code wen_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //數(shù)碼管位數(shù)選擇碼表

  6. void delay(uint i)//延時(shí)毫秒程序
  7. {
  8.         uint m,n;
  9.         for(m=i;m>0;m--)
  10.                 for(n=114;n>0;n--);
  11. }

  12. //一位數(shù)碼管顯示,參數(shù)1:位,參數(shù)2:數(shù)
  13. void smgxs(uchar we,uchar shu)
  14. {
  15.        
  16.         P0=table[shu];
  17.         du=1;
  18.         du=0;

  19.         P0=wen_code[we];
  20.         we=1;
  21.         we=0;
  22.         delay(2);
  23. }
  24. //void smgxs8w(unsigned long shu)         //數(shù)碼管顯示8位大數(shù)
  25. //{
  26. //        unsigned long shu_temp=shu;
  27. //        uchar i=8;
  28. //    if(shu>0)
  29. //    {
  30. //          while(shu_temp)
  31. //          {       
  32. //                  i--;
  33. //                smgxs(i,shu_temp%10);         
  34. //                shu_temp=shu_temp/10;
  35. //          }
  36. //        } else {smgxs(7,0);}//歸零數(shù)碼管顯一個(gè)零
  37. //}

  38. void SMGXSSZ(uchar shuz[])         //數(shù)碼管顯示數(shù)組
  39. {
  40.         uchar i;
  41.           for(i = 0;i < 4;i++)
  42.           {       
  43.                 smgxs(i*2+1,shuz[i]&0x0f);                 //顯示十六進(jìn)制數(shù)
  44.                 smgxs(i*2,shuz[i]>>4);
  45.           }                       
  46. }
復(fù)制代碼




評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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