|
已經(jīng)有結(jié)果了,想追求完美最后還是初完美打敗。已經(jīng)做出了跟原始波形一樣的了,但就是不起做用,不明原因,反而是那填充了載波的長(zhǎng)條圖波形能正常遙控。
把程序里 remoteout=0; //關(guān)紅外發(fā)射 變成 remoteout=1; //開紅外發(fā)射 波形就從正波變成負(fù)波了。
- i=remotedata[n];
- ET1=1;
- TR1=0; //開定時(shí)
- 。。。。。。。。。。。
- ET1=0;
- TR1=1;//不發(fā)送調(diào)制脈沖
復(fù)制代碼
然后把ET1和TR1改成上面的就可以出線條圖而不是填充載波的長(zhǎng)條圖
整個(gè)代碼如下,基本全注釋了,能搞清楚這代碼為什么不實(shí)用的大神請(qǐng)M我
- /********學(xué)習(xí)型遙控器程序*********/
- /*
- 該程序只對(duì)紅外脈沖波形復(fù)制并不解碼是真正的萬能學(xué)習(xí)型,程序是根據(jù)論壇公開程序資料修改完成的,
- 對(duì)多種遙控都能學(xué)習(xí)包括:電視遙控,機(jī)頂盒遙控,空調(diào)遙控等....學(xué)習(xí)到的波形脈沖總寬度幾乎一致.
-
- 源碼調(diào)試:風(fēng)中有你 2015.11.29
-
-
- 2021年8月25日
- 改為低電平亮燈,芯片用STC8F1K08S2,波形跟原始波一樣都是線條形,波形也是負(fù)波,但就是無效果
- */
- #include"stc8.h"
- #include<intrins.h> //延時(shí)函數(shù)
- #define uchar unsigned char
- #define uint unsigned int
- sbit studylamp=P5^4; //學(xué)習(xí)指示燈
- sbit lamp=P1^1; //發(fā)射指示燈
- sbit studykey=P3^4; //學(xué)習(xí)鍵
- sbit txkey=P3^5; //發(fā)射鍵
- sbit remotein=P3^2; //遙控信號(hào)輸入口 高阻
- sbit remoteout=P5^5; //遙控信號(hào)輸出口 強(qiáng)推
- uint i,j,m=5000,n,k,s;
- uint remotedata[207]; //存脈沖寬度數(shù)據(jù)用
- uint remdata; //脈沖計(jì)數(shù)
- bit tag;//學(xué)習(xí)狀態(tài)標(biāo)志
- /****1ms*t延時(shí)程序****/
- void delay1ms(uint t)
- {
- for(i=0;i<t;i++)
- for(j=0;j<120;j++)
- ;
- }
- /****2us*t秒延時(shí)程序****/
- void Delay2us(uchar y) //@12.000MHz
- {
- unsigned char i;
- i = y;//數(shù)越大長(zhǎng)度越短
- while (--i);
- }
- void Timer1Init(void) //38Khz@12.000MHz
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式 1011 1111
- TMOD |= 0x20; //設(shè)置定時(shí)器模式 10 0000
- TH1=0xf3;//38KHz初值
- TL1=0xf3;
- }
- void clr_ram()
- {
- for(i=0;i<207;i++)
- {
- remotedata[i]=0x00;
- } //清內(nèi)存
- }
- /////////////////////
- /****初始化程序****/
- void clearmen(void)
- {
- // I/O 口特殊功能寄存器,這里不定義還好,定義后就不可用了,不明白
- //P3M0=0x04; P3M1=0x00;//P3.2 紅外輸入 高阻
- //P5M0=0x00; P5M1=0x20;//P5.5 紅外輸出 推挽輸出
-
- /*
- P0M0[1:0] P0M1[1:0]
- 0 0 準(zhǔn)雙向口(傳統(tǒng)8051 I/O口模式)灌電流可達(dá)20mA
- 0 1 推挽輸出(強(qiáng)上拉輸出,可達(dá)20mA,要加限流電阻)
- 1 0 僅為輸入(高阻)
- 1 1 開漏(Open Drain),內(nèi)部上拉電阻斷開,要外加
- */
-
-
-
- studylamp=1;//關(guān)學(xué)習(xí)指示燈
- lamp=1; //關(guān)發(fā)射指示燈
- remoteout=0; //關(guān)遙控輸出
- remotein=1; // 遙控輸入置高電平
- IE=0x00;//IE是中端允許寄存器,這里面包括了定時(shí)器和外部中斷還有EA等
- IP=0x01;//IP是中斷優(yōu)先級(jí)控制寄存器
- Timer1Init();
- EA=1; //開總中斷
- clr_ram();
- }
- /*
- (IP.7:保留)
- (IP.6:保留)
- PT2(IP.5):若=1,定時(shí)器2中斷設(shè)為高優(yōu)先級(jí)(只適用于8052及其增強(qiáng)型)
- PS(IP.4):若=1,串行中斷設(shè)為高優(yōu)先級(jí)
- PT1(IP.3):若=1,定時(shí)器1中斷設(shè)為高優(yōu)先級(jí)
- PX1(IP.2):若=1,外部中斷1設(shè)為高優(yōu)先級(jí)
- PT0(IP.1):若=1,定時(shí)器0中斷設(shè)為高優(yōu)先級(jí)
- PX0(IP.0):若=1,外部中斷0設(shè)為高優(yōu)先級(jí)
- */
- /*****發(fā)送鍵功能函數(shù)****/
- void keywork(void)
- {
- if (txkey==0) //如發(fā)射按鍵按下
- {
- delay1ms(10);//延時(shí)10毫秒防抖
- while(txkey==0);//等待發(fā)射鍵釋放,釋放后txkey==1,釋放后才繼續(xù)執(zhí)行下去就是為了防止按鍵一按下就無數(shù)次循環(huán)了
- n=0;//計(jì)數(shù)用
- lamp=0;//學(xué)習(xí)燈亮
- while(1) //開始發(fā)射調(diào)制波形
- {
- i=remotedata[n]; //把讀到的數(shù)組數(shù)據(jù)第0個(gè)賦給i
- ET1=1;//開啟T1中斷 關(guān)閉也無波
- TR1=0; //關(guān)閉定時(shí)器T1不發(fā)送調(diào)制脈沖
- while(i--)
- {
- Delay2us(2);//延時(shí)2個(gè)2毫秒
- _nop_();//單片機(jī)空跑一周期
- _nop_();//單片機(jī)空跑一周期
- }
- /*
- 方式1:上面的ET1=1 TR1=1 下面的ET1=0 TR1=0 出有色波,能遙控
-
- 0001不出波
- 0010不出波
- 0011全黃,全輸出載波,沒得停了
- 0100不出波
- 0101不出波
- 0110一直高電平
- 0111全黃,全輸出載波,沒得停了
- 1000不出波
- 1001出跟原始波一樣的線條波形,方向反,不能遙控
- 1010不出波
- 1011全黃
- 1100出有色波,能遙控
- 1101出有色波,能遙控
- 1110也有色波但跟方式1有點(diǎn)不一樣,在遙控碼中部有一上電平線,能遙控
- 1111全黃
- */
-
- ET1=0;//關(guān)閉T1中斷
- TR1=1;//開啟定時(shí)器T1發(fā)送調(diào)制脈沖 TR1=0且上面那個(gè)TR1=1時(shí)波形有填充色且能遙控,燈充滿電遙控較遠(yuǎn),
- //TR1=1且上面的TR1=0時(shí)波形跟原始波一樣無填充色,但不能遙控
- remoteout=1; //關(guān)紅外發(fā)射
- n++;//下一組脈沖寬度地址
- i=remotedata[n]; //把讀到的數(shù)組數(shù)據(jù)第n個(gè)賦給i
- while(i--) //根據(jù)i值發(fā)送計(jì)時(shí)
- {
- Delay2us(2);//延時(shí)2個(gè)2毫秒
- _nop_();//單片機(jī)空跑一周期
- _nop_();//單片機(jī)空跑一周期
- }
- //等待該位時(shí)間結(jié)束
- n++; //下一組脈沖寬度地址
- if((remotedata[n]==0)||(n>206))//如果數(shù)值為0了或超過了206個(gè)//該位地址數(shù)據(jù)為0或地址計(jì)數(shù)大于設(shè)定值就結(jié)束
- {
- delay1ms(10);//延時(shí)10毫秒
- break;//結(jié)束退出
- }
-
- }
- }
- lamp=1; //滅燈
- }
-
- /****40KHz載波發(fā)生函數(shù)*****/
- void time_intt(void)interrupt 3 //定時(shí)器1
- {
- remoteout=~remoteout;
- }
- /*
- 外部中斷0 interrupt 0
- 定時(shí)器0 interrupt 1
- 外部中斷1 interrupt 2
- 定時(shí)器1 interrupt 3
- 串口中斷 interrupt 4
- 定時(shí)器2 interrupt 5
- */
- //*********學(xué)習(xí)紅外函數(shù)*************
- void studywork()
- {
- while(studykey==0)//按鍵按下放
- {
- while(studykey==1);//等待鍵釋放
- studylamp=0; //學(xué)習(xí)燈亮
- lamp=1;//發(fā)射燈滅
- tag=1; //學(xué)習(xí)標(biāo)致置1
- n=0;
- remdata=0x00;//脈寬計(jì)數(shù)器清零
- while(remotein==1);//等待遙控碼輸入
- while(tag)//當(dāng)tag是1在學(xué)習(xí)狀態(tài)就一直循環(huán)
- {
- while(remotein==0)//當(dāng)?shù)碗娖綍r(shí)有遙控碼輸入
- {
- Delay2us(4);//延時(shí)4個(gè)2微秒
- remdata++; //記錄低電平脈寬時(shí)間
- if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出 m設(shè)為5000,這個(gè)值不懂怎么來的,設(shè)為255只有一條豎線
- {
- remotedata[n]=0x00; //肪沖寬度置0
- tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
- goto end;//跳到結(jié)束
- }
- }
- remotedata[n]=remdata;//如果低電平肪寬時(shí)間remdata不大于5000就把值賦給脈沖寬度數(shù)組remotedata[n],就是說這個(gè)值有效吧記錄下來
- remdata=0x00;//脈寬計(jì)數(shù)器清零
- n++;//電平脈寬數(shù)據(jù)個(gè)數(shù)加1
- if(n>206) //緩存滿退出,remotedata[n]設(shè)為最大207
- {
- remotedata[n]=0x00;//一組數(shù)是206,大于就清0
- tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
- goto end;//跳到結(jié)束,兩燈都滅了
- }
- while(remotein==1)//當(dāng)高電平時(shí)無遙控碼輸入
- {
- Delay2us(4);//延時(shí)4個(gè)2微秒
- remdata++; //高電平計(jì)數(shù)
- if(remdata>m) //計(jì)數(shù)大于設(shè)定值退出 m設(shè)為5000,這個(gè)值不懂怎么來的,設(shè)為255只有一條豎線
- {
- remotedata[n]=0x00; //肪沖寬度置0
- tag=0;//學(xué)習(xí)標(biāo)志置0,結(jié)束學(xué)習(xí)
- goto end;//跳到結(jié)束,兩燈都滅了
- }
- }
- remotedata[n]=remdata; //存高電平脈寬數(shù)據(jù)
- remdata=0x00;//脈寬計(jì)數(shù)器清零
- n++;//電平脈寬數(shù)據(jù)個(gè)數(shù)加1
- }
- }
- end:
- {//學(xué)習(xí)結(jié)束
- lamp=1;//發(fā)射燈滅
- studylamp=1; //學(xué)習(xí)燈滅
- }
- }
- /******主函數(shù)****/
- void main()
- {
- clearmen();
- remoteout=0; //關(guān)紅外發(fā)射
- studylamp=0; //學(xué)習(xí)燈滅
- tag=0;
- studykey=1;
- while(1)
- {
- keywork(); // 發(fā)射
- studywork(); //學(xué)習(xí)
- }
- }
復(fù)制代碼
|
|