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

QQ登錄

只需一步,快速開始

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

STC12C5A60S2單片機(jī)萬能學(xué)習(xí)紅外遙控只差一步

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 2 黑幣 回復(fù)本帖可獲得 2 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
#
ID:95375 發(fā)表于 2021-8-22 16:57 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
本帖最后由 liyago 于 2021-8-25 10:25 編輯

在論壇翻了好多天資料,終于把這個(gè)完全克隆信號(hào)的萬能紅外遙控器搞清楚了,論壇有位老兄很早就發(fā)了那篇紅外收發(fā)的帖子,后面又有位兄弟改寫了那程序,我都下在板上試驗(yàn)了,只是我對(duì)信號(hào)的收發(fā)波形還沒有完全理解,所以走了幾天彎路,下圖是一個(gè)紅外燈的開燈原始波形



剛開始學(xué)習(xí)時(shí)我還以為學(xué)習(xí)后發(fā)送的波形應(yīng)該跟原始波形是一樣的,可搞了好多天都沒發(fā)現(xiàn)能發(fā)出原始波形,最后沒辦法了去了某一個(gè)寶買了一塊萬能學(xué)習(xí)紅外遙控板回來,一看它的發(fā)射波形是完全跟我自已這個(gè)stc12c5a60s2發(fā)射的一樣啊



上面這個(gè)是專業(yè)商品波形,實(shí)際控制燈是有效的,下圖是自已搭的板的波形



波形是不是也很完美,跟專業(yè)的一樣,但問題來了,這個(gè)波形控制不了燈啊,一看問題出在哪了嗎,兩個(gè)波形相反了,這就是問題了,只要把這個(gè)波形倒轉(zhuǎn)那問題就解決了,可是我看了半天沒看出要怎么倒,是學(xué)習(xí)部份還是發(fā)射部份造成的都沒搞清楚,怎么說我也是從C51到STM32走過的人,怎么回到這只有幾行代碼的51反而暈暈了,稀望各位大神大蝦能指點(diǎn)迷津,搞清楚這一步下一步就可以搞記憶了。

弱弱地問一句,51單片機(jī)能復(fù)制得出原始波形一樣的波形嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

10#
ID:965189 發(fā)表于 2022-11-7 11:00 | 只看該作者
三極管有放大并倒相的作用。
回復(fù)

使用道具 舉報(bào)

9#
ID:195496 發(fā)表于 2022-11-7 07:21 | 只看該作者
你的圖上有三個(gè)二極管,哪一個(gè)是紅外發(fā)射用的,
回復(fù)

使用道具 舉報(bào)

8#
ID:695401 發(fā)表于 2022-11-7 00:44 | 只看該作者
三極管倒向應(yīng)該可以吧
回復(fù)

使用道具 舉報(bào)

7#
ID:1045007 發(fā)表于 2022-9-17 05:47 | 只看該作者
不錯(cuò),新手多多指教
回復(fù)

使用道具 舉報(bào)

6#
ID:742998 發(fā)表于 2022-9-16 22:27 | 只看該作者
liyago 發(fā)表于 2021-8-25 22:55
已經(jīng)有結(jié)果了,想追求完美最后還是初完美打敗。已經(jīng)做出了跟原始波形一樣的了,但就是不起做用,不明原因, ...

你好,問題弄清楚了嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:95375 發(fā)表于 2021-8-25 22:55 | 只看該作者
已經(jīng)有結(jié)果了,想追求完美最后還是初完美打敗。已經(jīng)做出了跟原始波形一樣的了,但就是不起做用,不明原因,反而是那填充了載波的長(zhǎng)條圖波形能正常遙控。

把程序里         remoteout=0; //關(guān)紅外發(fā)射  變成         remoteout=1; //開紅外發(fā)射  波形就從正波變成負(fù)波了。

  1.      i=remotedata[n];
  2.       ET1=1;
  3.       TR1=0;  //開定時(shí)
  4. 。。。。。。。。。。。
  5.       ET1=0;
  6.       TR1=1;//不發(fā)送調(diào)制脈沖
復(fù)制代碼



然后把ET1和TR1改成上面的就可以出線條圖而不是填充載波的長(zhǎng)條圖


整個(gè)代碼如下,基本全注釋了,能搞清楚這代碼為什么不實(shí)用的大神請(qǐng)M我
  1. /********學(xué)習(xí)型遙控器程序*********/
  2. /*
  3.       該程序只對(duì)紅外脈沖波形復(fù)制并不解碼是真正的萬能學(xué)習(xí)型,程序是根據(jù)論壇公開程序資料修改完成的,
  4. 對(duì)多種遙控都能學(xué)習(xí)包括:電視遙控,機(jī)頂盒遙控,空調(diào)遙控等....學(xué)習(xí)到的波形脈沖總寬度幾乎一致.
  5.          
  6.                                                                                                                                                                                  源碼調(diào)試:風(fēng)中有你        2015.11.29
  7.                                                                                                                                                                                  
  8.                                                                                                                                                                                  
  9. 2021年8月25日  
  10. 改為低電平亮燈,芯片用STC8F1K08S2,波形跟原始波一樣都是線條形,波形也是負(fù)波,但就是無效果

  11. */

  12. #include"stc8.h"

  13. #include<intrins.h>   //延時(shí)函數(shù)
  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. sbit studylamp=P5^4; //學(xué)習(xí)指示燈
  17. sbit lamp=P1^1; //發(fā)射指示燈
  18. sbit studykey=P3^4; //學(xué)習(xí)鍵
  19. sbit txkey=P3^5; //發(fā)射鍵
  20. sbit remotein=P3^2; //遙控信號(hào)輸入口 高阻
  21. sbit remoteout=P5^5; //遙控信號(hào)輸出口 強(qiáng)推
  22. uint i,j,m=5000,n,k,s;
  23. uint  remotedata[207]; //存脈沖寬度數(shù)據(jù)用
  24. uint remdata; //脈沖計(jì)數(shù)
  25. bit tag;//學(xué)習(xí)狀態(tài)標(biāo)志

  26. /****1ms*t延時(shí)程序****/
  27. void delay1ms(uint t)
  28. {
  29.                 for(i=0;i<t;i++)
  30.                 for(j=0;j<120;j++)
  31.                 ;
  32. }
  33. /****2us*t秒延時(shí)程序****/
  34. void Delay2us(uchar y)                //@12.000MHz
  35. {
  36.                 unsigned char i;
  37.                 i = y;//數(shù)越大長(zhǎng)度越短
  38.                 while (--i);
  39. }


  40. void Timer1Init(void)                //38Khz@12.000MHz
  41. {
  42.                 AUXR &= 0xBF;                //定時(shí)器時(shí)鐘12T模式        1011 1111
  43.                 TMOD |= 0x20;                //設(shè)置定時(shí)器模式 10 0000
  44.                 TH1=0xf3;//38KHz初值
  45.                 TL1=0xf3;
  46. }


  47. void clr_ram()
  48. {
  49.                 for(i=0;i<207;i++)
  50.                 {
  51.                                 remotedata[i]=0x00;
  52.                 }  //清內(nèi)存
  53. }

  54. /////////////////////
  55. /****初始化程序****/

  56. void clearmen(void)
  57. {
  58. // I/O 口特殊功能寄存器,這里不定義還好,定義后就不可用了,不明白
  59. //P3M0=0x04;        P3M1=0x00;//P3.2        紅外輸入 高阻
  60. //P5M0=0x00;        P5M1=0x20;//P5.5 紅外輸出 推挽輸出
  61.         
  62. /*
  63. P0M0[1:0]        P0M1[1:0]
  64.         0                                        0                準(zhǔn)雙向口(傳統(tǒng)8051 I/O口模式)灌電流可達(dá)20mA
  65.         0                                        1                推挽輸出(強(qiáng)上拉輸出,可達(dá)20mA,要加限流電阻)
  66.         1                                        0                僅為輸入(高阻)
  67.         1                                        1                開漏(Open Drain),內(nèi)部上拉電阻斷開,要外加
  68. */        
  69.         
  70.         
  71.         
  72.                 studylamp=1;//關(guān)學(xué)習(xí)指示燈
  73.                 lamp=1;  //關(guān)發(fā)射指示燈
  74.                 remoteout=0; //關(guān)遙控輸出
  75.                 remotein=1;  // 遙控輸入置高電平

  76.                 IE=0x00;//IE是中端允許寄存器,這里面包括了定時(shí)器和外部中斷還有EA等
  77.                 IP=0x01;//IP是中斷優(yōu)先級(jí)控制寄存器
  78.                 Timer1Init();
  79.                 EA=1; //開總中斷
  80.                 clr_ram();
  81. }

  82. /*
  83. (IP.7:保留)
  84. (IP.6:保留)
  85. PT2(IP.5):若=1,定時(shí)器2中斷設(shè)為高優(yōu)先級(jí)(只適用于8052及其增強(qiáng)型)
  86. PS(IP.4):若=1,串行中斷設(shè)為高優(yōu)先級(jí)
  87. PT1(IP.3):若=1,定時(shí)器1中斷設(shè)為高優(yōu)先級(jí)
  88. PX1(IP.2):若=1,外部中斷1設(shè)為高優(yōu)先級(jí)
  89. PT0(IP.1):若=1,定時(shí)器0中斷設(shè)為高優(yōu)先級(jí)
  90. PX0(IP.0):若=1,外部中斷0設(shè)為高優(yōu)先級(jí)
  91. */

  92. /*****發(fā)送鍵功能函數(shù)****/        
  93. void keywork(void)
  94. {
  95.         if (txkey==0)         //如發(fā)射按鍵按下
  96.                 {
  97.                                 delay1ms(10);//延時(shí)10毫秒防抖
  98.                                 while(txkey==0);//等待發(fā)射鍵釋放,釋放后txkey==1,釋放后才繼續(xù)執(zhí)行下去就是為了防止按鍵一按下就無數(shù)次循環(huán)了
  99.                                 n=0;//計(jì)數(shù)用
  100.                                 lamp=0;//學(xué)習(xí)燈亮
  101.                                 while(1)   //開始發(fā)射調(diào)制波形
  102.                                 {
  103.                                                 i=remotedata[n]; //把讀到的數(shù)組數(shù)據(jù)第0個(gè)賦給i
  104.                                                 ET1=1;//開啟T1中斷 關(guān)閉也無波
  105.                                                 TR1=0;  //關(guān)閉定時(shí)器T1不發(fā)送調(diào)制脈沖
  106.                                                 while(i--)
  107.                                                 {
  108.                                                                 Delay2us(2);//延時(shí)2個(gè)2毫秒
  109.                                                                 _nop_();//單片機(jī)空跑一周期
  110.                                                                 _nop_();//單片機(jī)空跑一周期
  111.                                                 }
  112. /*
  113.                                                 方式1:上面的ET1=1 TR1=1 下面的ET1=0 TR1=0 出有色波,能遙控
  114.                                                 
  115.                                                 0001不出波
  116.                                                 0010不出波
  117.                                                 0011全黃,全輸出載波,沒得停了
  118.                                                 0100不出波
  119.                                                 0101不出波
  120.                                                 0110一直高電平
  121.                                                 0111全黃,全輸出載波,沒得停了
  122.                                                 1000不出波
  123.                                                 1001出跟原始波一樣的線條波形,方向反,不能遙控
  124.                                                 1010不出波
  125.                                                 1011全黃
  126.                                                 1100出有色波,能遙控
  127.                                                 1101出有色波,能遙控
  128.                                                 1110也有色波但跟方式1有點(diǎn)不一樣,在遙控碼中部有一上電平線,能遙控
  129.                                                 1111全黃
  130. */                                                
  131.                                                 
  132.                                                 ET1=0;//關(guān)閉T1中斷
  133.                                                 TR1=1;//開啟定時(shí)器T1發(fā)送調(diào)制脈沖  TR1=0且上面那個(gè)TR1=1時(shí)波形有填充色且能遙控,燈充滿電遙控較遠(yuǎn),
  134.                                                                         //TR1=1且上面的TR1=0時(shí)波形跟原始波一樣無填充色,但不能遙控
  135.                                                 remoteout=1; //關(guān)紅外發(fā)射
  136.                                                 n++;//下一組脈沖寬度地址
  137.                                                 i=remotedata[n]; //把讀到的數(shù)組數(shù)據(jù)第n個(gè)賦給i
  138.                                                 while(i--)  //根據(jù)i值發(fā)送計(jì)時(shí)
  139.                                                 {
  140.                                                                 Delay2us(2);//延時(shí)2個(gè)2毫秒
  141.                                                                 _nop_();//單片機(jī)空跑一周期
  142.                                                                 _nop_();//單片機(jī)空跑一周期
  143.                                                 }
  144.                                                 //等待該位時(shí)間結(jié)束
  145.                                                 n++; //下一組脈沖寬度地址
  146.                                                 if((remotedata[n]==0)||(n>206))//如果數(shù)值為0了或超過了206個(gè)//該位地址數(shù)據(jù)為0或地址計(jì)數(shù)大于設(shè)定值就結(jié)束
  147.                                                 {
  148.                                                                 delay1ms(10);//延時(shí)10毫秒
  149.                                                                 break;//結(jié)束退出
  150.                                                 }
  151.                         
  152.                                 }  
  153.                 }
  154.                 lamp=1; //滅燈
  155. }



  156. /****40KHz載波發(fā)生函數(shù)*****/

  157. void time_intt(void)interrupt 3        //定時(shí)器1
  158. {
  159.                 remoteout=~remoteout;
  160. }

  161. /*
  162. 外部中斷0 interrupt 0
  163. 定時(shí)器0     interrupt 1
  164. 外部中斷1 interrupt 2
  165. 定時(shí)器1     interrupt 3
  166. 串口中斷   interrupt 4
  167. 定時(shí)器2     interrupt 5
  168. */




  169. //*********學(xué)習(xí)紅外函數(shù)*************
  170. void studywork()
  171. {
  172.                 while(studykey==0)//按鍵按下放
  173.                 {
  174.                                 while(studykey==1);//等待鍵釋放
  175.                                 studylamp=0;         //學(xué)習(xí)燈亮
  176.                                 lamp=1;//發(fā)射燈滅
  177.                                 tag=1;        //學(xué)習(xí)標(biāo)致置1
  178.                                 n=0;
  179.                                 remdata=0x00;//脈寬計(jì)數(shù)器清零
  180.                                 while(remotein==1);//等待遙控碼輸入
  181.                                 while(tag)//當(dāng)tag是1在學(xué)習(xí)狀態(tài)就一直循環(huán)
  182.                                 {
  183.                                                 while(remotein==0)//當(dāng)?shù)碗娖綍r(shí)有遙控碼輸入
  184.                                                 {
  185.                                                                 Delay2us(4);//延時(shí)4個(gè)2微秒
  186.                                                                 remdata++;        //記錄低電平脈寬時(shí)間
  187.                                                                 if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出  m設(shè)為5000,這個(gè)值不懂怎么來的,設(shè)為255只有一條豎線
  188.                                                                 {
  189.                                                                                 remotedata[n]=0x00; //肪沖寬度置0
  190.                                                                                 tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
  191.                                                                                 goto end;//跳到結(jié)束
  192.                                                                 }
  193.                                                 }
  194.                                                 remotedata[n]=remdata;//如果低電平肪寬時(shí)間remdata不大于5000就把值賦給脈沖寬度數(shù)組remotedata[n],就是說這個(gè)值有效吧記錄下來
  195.                                                 remdata=0x00;//脈寬計(jì)數(shù)器清零
  196.                                                 n++;//電平脈寬數(shù)據(jù)個(gè)數(shù)加1
  197.                                                 if(n>206) //緩存滿退出,remotedata[n]設(shè)為最大207
  198.                                                 {
  199.                                                                 remotedata[n]=0x00;//一組數(shù)是206,大于就清0
  200.                                                                 tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
  201.                                                                 goto end;//跳到結(jié)束,兩燈都滅了
  202.                                                 }
  203.                                                 while(remotein==1)//當(dāng)高電平時(shí)無遙控碼輸入
  204.                                                 {
  205.                                                                 Delay2us(4);//延時(shí)4個(gè)2微秒
  206.                                                                 remdata++; //高電平計(jì)數(shù)
  207.                                                                 if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出  m設(shè)為5000,這個(gè)值不懂怎么來的,設(shè)為255只有一條豎線
  208.                                                                 {               
  209.                                                                                 remotedata[n]=0x00; //肪沖寬度置0
  210.                                                                                 tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
  211.                                                                                 goto end;//跳到結(jié)束,兩燈都滅了
  212.                                                                 }
  213.                                                 }
  214.                                                 remotedata[n]=remdata; //存高電平脈寬數(shù)據(jù)
  215.                                                 remdata=0x00;//脈寬計(jì)數(shù)器清零
  216.                                                 n++;//電平脈寬數(shù)據(jù)個(gè)數(shù)加1
  217.                                 }
  218.                 }
  219.                 end:
  220.                 {//學(xué)習(xí)結(jié)束
  221.                                 lamp=1;//發(fā)射燈滅
  222.                                 studylamp=1;         //學(xué)習(xí)燈滅
  223.                 }
  224. }
  225. /******主函數(shù)****/                                                                                                                                                                        
  226. void main()
  227. {  
  228.                 clearmen();
  229.                 remoteout=0; //關(guān)紅外發(fā)射
  230.                 studylamp=0;         //學(xué)習(xí)燈滅
  231.                 tag=0;
  232.                 studykey=1;
  233.                 while(1)
  234.                 {
  235.                                 keywork();        // 發(fā)射
  236.                                 studywork();        //學(xué)習(xí)
  237.                 }
  238. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

地板
ID:95375 發(fā)表于 2021-8-25 10:25 | 只看該作者
hhdsdy 發(fā)表于 2021-8-24 10:18
你改了電路啊,原來是怎么控制的?用NPN的三極管?現(xiàn)在不用三極管又是怎么接的,可能就是出在更改上



原來有兩個(gè)提示用的LED是用三級(jí)管驅(qū)動(dòng)的,我把它們?nèi)サ袅,直接用IO口加限流電阻代替了,這跟波形沒關(guān)系吧,大部份單片機(jī)都是這樣接LED燈,除口IO口不夠用了才加個(gè)控制片。

經(jīng)過這兩天研究,原來的波算是負(fù)波,而這個(gè)單片機(jī)發(fā)射的是正波,測(cè)試結(jié)果這也可以控制燈,但要貼很近了,不明原理,昨晚搞出了跟原始波形一樣的純線條波形,但好你去控制不了燈,奇怪,等把正波變負(fù)波先,論壇有負(fù)波的程序,研究看看再說。
回復(fù)

使用道具 舉報(bào)

板凳
ID:88256 發(fā)表于 2021-8-24 10:18 | 只看該作者
你改了電路啊,原來是怎么控制的?用NPN的三極管?現(xiàn)在不用三極管又是怎么接的,可能就是出在更改上
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:95375 發(fā)表于 2021-8-23 11:13 | 只看該作者
hhdsdy 發(fā)表于 2021-8-23 08:29
也不是新注冊(cè)的,程序也不發(fā)一個(gè)出來。
那些波形是接在哪里測(cè)試的?紅外接收的波形是倒的,沒信號(hào)是高電平 ...
  1. /********學(xué)習(xí)型遙控器程序*********/
  2. /*
  3.       該程序只對(duì)紅外脈沖波形復(fù)制并不解碼是真正的萬能學(xué)習(xí)型,程序是根據(jù)論壇公開程序資料修改完成的,
  4. 對(duì)多種遙控都能學(xué)習(xí)包括:電視遙控,機(jī)頂盒遙控,空調(diào)遙控等....學(xué)習(xí)到的波形脈沖總寬度幾乎一致.
  5.          
  6. 源碼調(diào)試:風(fēng)中有你  
  7. */

  8. #include"stc12c5a60s2.h"

  9. #include<intrins.h>   //延時(shí)函數(shù)
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. sbit studylamp=P1^6; //學(xué)習(xí)指示燈 7p
  13. sbit lamp=P1^7; //發(fā)射指示燈         8p
  14. sbit studykey=P3^3; //學(xué)習(xí)鍵  13p  ---
  15. sbit remotein=P3^6; //遙控信號(hào)輸入口16p
  16. sbit remoteout=P3^5; //遙控信號(hào)輸出口15p
  17. sbit txkey=P3^4; //發(fā)射鍵 14p               
  18. uint i,j,m=5000,n,k,s;
  19. uint  remotedata[207]; //存脈沖寬度數(shù)據(jù)用
  20. uint remdata; //脈沖計(jì)數(shù)
  21. bit tag;//學(xué)習(xí)標(biāo)致

  22. /****1ms*t延時(shí)程序****/
  23. void delay1ms(uint t)
  24. {
  25.   for(i=0;i<t;i++)
  26.    for(j=0;j<120;j++)
  27.   ;
  28. }
  29. /****2us*t秒延時(shí)程序****/
  30. void Delay2us(uchar y)                //@12.000MHz
  31. {
  32.         unsigned char i;

  33.         i = 3*y;
  34.         while (--i);
  35. }


  36. void Timer1Init(void)                //38Khz@12.000MHz
  37. {


  38.   AUXR &= 0xBF;                //定時(shí)器時(shí)鐘12T模式        1011 1111
  39.         TMOD |= 0x20;                //設(shè)置定時(shí)器模式 10 0000
  40.   TH1=0xf3;//38KHz初值
  41.   TL1=0xf3;


  42. }


  43. void clr_ram()
  44. {
  45.   for(i=0;i<207;i++)
  46.   {
  47.    remotedata[i]=0x00;
  48.   }  //清內(nèi)存
  49. }

  50. /////////////////////
  51. /****初始化程序****/

  52. void clearmen(void)
  53. {
  54.   P3M1=0x40;        //P3.5強(qiáng)推P3.6高阻
  55.                                 //P3M0=00100000
  56.   P3M0=0x20;        //P3M1=01000000,
  57.   P1M1=        0x00;                //P1M0=00000001
  58.   P1M0=0x01;                    //P1M1=00000000
  59.   studylamp=1;//關(guān)學(xué)習(xí)指示燈
  60.   lamp=1;  //關(guān)發(fā)射指示燈
  61.   remoteout=0; //關(guān)遙控輸出
  62.   remotein=1;  // 遙控輸入置高電平
  63.   

  64.   IE=0x00;
  65.   IP=0x01;


  66.   Timer1Init();

  67.   EA=1; //開總中斷
  68. clr_ram();


  69. }

  70. /*****發(fā)送鍵功能函數(shù)****/        
  71. void keywork(void)
  72. {


  73.   if (txkey==0)         //有按鍵按下
  74.     {
  75.            delay1ms(10);
  76.           while(txkey==0);//等待鍵釋放
  77.          
  78.            n=0;
  79.            lamp=0;
  80.     while(1)   //開始發(fā)射調(diào)制波形
  81.     {



  82.      i=remotedata[n];
  83.           ET1=1;
  84.       TR1=1;  //開定時(shí)
  85.      while(i--)
  86.          {
  87.           Delay2us(2);
  88.         // _nop_();
  89.          }


  90.       ET1=0;
  91.       TR1=0;//不發(fā)送調(diào)制脈沖
  92.           remoteout=0; //關(guān)紅外發(fā)射
  93.           n++;//下一組脈沖寬度地址
  94.           i=remotedata[n];
  95.          
  96.      while(i--)  //根據(jù)i值發(fā)送計(jì)時(shí)
  97.          {
  98.           Delay2us(2);
  99.          // _nop_();
  100.           }
  101.   
  102.                //等待該位時(shí)間結(jié)束
  103.       n++; //下一組脈沖寬度地址
  104.           if((remotedata[n]==0)||(n>206)){delay1ms(10);break;} //該位地址數(shù)據(jù)為0或地址計(jì)數(shù)大于設(shè)定值就結(jié)束
  105.     }  
  106.   }
  107.   lamp=1; //滅燈

  108. }

  109. /****40KHz載波發(fā)生函數(shù)*****/

  110. void time_intt(void)interrupt 3
  111. {
  112. remoteout=~remoteout;

  113. }


  114. //*********學(xué)習(xí)紅外函數(shù)*************
  115. void studywork()
  116. {
  117.    while(studykey==0)//按鍵按下放
  118.    {

  119.     while(studykey==1);//等待鍵釋放

  120.            studylamp=0;         //學(xué)習(xí)燈亮
  121.            lamp=1;
  122.            tag=1;        //學(xué)習(xí)標(biāo)致置1
  123.        n=0;
  124.            remdata=0x00;//脈寬計(jì)數(shù)器清零

  125.    while(remotein==1);//等待遙控碼輸入

  126.    while(tag)
  127.     {
  128.   
  129.     while(remotein==0)//有遙控碼輸入

  130.       {

  131.            Delay2us(4);
  132.            


  133.      remdata++;        //記錄低電平脈寬時(shí)間
  134.             if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出
  135.           {remotedata[n]=0x00;
  136.             tag=0;
  137.                goto end;
  138.               }
  139.        }

  140.          
  141.     remotedata[n]=remdata;
  142.         remdata=0x00;//脈寬計(jì)數(shù)器清零
  143.    n++;//存低電平脈寬數(shù)據(jù)
  144.            if(n>206) //緩存滿退出
  145.       {
  146.             remotedata[n]=0x00;
  147.         tag=0;
  148.             goto end;
  149.           }

  150.   while(remotein==1)
  151.   {
  152. Delay2us(4);


  153.   remdata++; //高電平計(jì)數(shù)
  154.    if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出
  155.      {remotedata[n]=0x00;
  156.       tag=0;
  157.           goto end;
  158.         }
  159.   }


  160.   remotedata[n]=remdata; //存高電平脈寬數(shù)據(jù)
  161.   n++;
  162.        remdata=0x00;//脈寬計(jì)數(shù)器清零
  163. }
  164.   
  165.   }
  166.   end:
  167.   {
  168.       lamp=1;
  169.     studylamp=1;         //學(xué)習(xí)燈滅

  170.         }

  171. }
  172. /******主函數(shù)****/                                                                                                                                                                        
  173. void main()
  174. {  
  175.   
  176.   clearmen();

  177.             remoteout=0; //關(guān)紅外發(fā)射
  178.             studylamp=0;         //學(xué)習(xí)燈滅

  179.             tag=0;
  180.                 studykey=1;


  181.   while(1)
  182.   {
  183.    keywork();        // 發(fā)射
  184.       studywork();        //學(xué)習(xí)

  185. }

  186. }
復(fù)制代碼



這個(gè)程序是論壇里下的,只是把二級(jí)管改成了陰級(jí)導(dǎo)通,想不明白為什么原帖會(huì)用三級(jí)管控制LED,IO口加限流電阻控制LED應(yīng)沒問題吧,又不多。

所有波形都是在IO口測(cè)的
回復(fù)

使用道具 舉報(bào)

樓主
ID:88256 發(fā)表于 2021-8-23 08:29 | 只看該作者
也不是新注冊(cè)的,程序也不發(fā)一個(gè)出來。
那些波形是接在哪里測(cè)試的?紅外接收的波形是倒的,沒信號(hào)是高電平,接收到信號(hào)輸出低電平,遵循這一點(diǎn)再結(jié)合程序就知道是接收還是發(fā)射部分出錯(cuò)了。至于怎么倒,沒有程序就沒辦法建議了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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