久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機定時器-遙控器解碼程序分析

作者:佚名   來源:本站原創   點擊數:  更新時間:2010年12月07日   【字體:

一、前言

  利用STC公司1T內核的STC12C08S2 單片機對一款遙控器進行解碼,將解碼的數據轉換為以us為單位的時間通過單片機串口通訊發送到STC下載軟件自帶的串口調試工具接收框進行顯示。

  本文主要對測試結果進行展示與分析并對單片機控制程序進行分析,以此起到拋磚引玉的作用,希望讀者理解程序以后可以利用單片機對身邊的任意一款遙控器進行解碼并將遙控器與單片機的實際應用聯系在一起。

二、測試結果展示

1、實驗材料介紹

 

實驗材料硬件部分 軟件部分 KEIL V2 編程軟件 單片機程序下載軟件STC_ISP_V479

為了高效率學習程序編寫,本實驗平臺采用單片機教程網的51hei-5單片機開發板。控制芯片為 STC12C08S2,紅外通訊傳感器為sm0038與單片機的P3.2引腳連接。大家用一根杜邦線將j7的3腳 連到頂部的p3.2口的排針處即可。程序下載器采用usb轉串口線。遙控器采用如上圖(對于NEC標準的遙控器都適用,比如電視遙控器等)。

2、遙控器按下數字1PC所接收的數據碼

顯示的數據:數字1 02456 00206 00205 00202 00204 00207 00202 00206 00206 00407 00408 00412 00407 00408 00412 00407 00408 00206 00206 00407 00408 00206 00205 00203 00204 00409 00411 00202 00204 00410 00410 00407 00410

3、遙控器按下數字2PC所接收的數據碼

數字22456 00206 00200 00206 00206 00202 00205 00206 00202 00412 00407 00410 00410 00407 00408 00412 00407 00206 00205 00202 00410 00410 00203 00204 00205 00408 00409 00410 00205 00202 00408 00412 00407

4、遙控器按下數字3PC所接收的數據碼

數字302457 00206 00198 00208 00206 00198 00209 00206 00200 00413 00407 00406 00414 00407 00405 00415 00408 00206 00410 00405 00417 00407 00206 00407 00206 00408 00206 00200 00208 00208 00407 00206 00408

三、測試數據分析

下載程序在硬件電路正常的情況下,遙控器按下數字1PC機可以接收到以下數據數字1 02456 00206 00205 00202 00204 00207 00202 00206 00206 00407 00408 00412 00407 00408 00412 00407 00408 00206 00206 00407 00408 00206 00205 00203 00204 00409 00411 00202 00204 00410 00410 00407 00410

那這些數據代表什么意思呢?

單片機向PC機每發送一次都是5位數據,這5位數據是單片機內部定時器以5us循環一次對temp變量從0開始自加所得到的數據。也就是說這些數據可以理解為一個時間值,這個時間值就是遙控器每個數據碼高電平和低電平所持續時間的值。

從數據可以看出每個按鍵按下去PC機都接收到33個數據,這33個數據仔細觀察可以發現都有以下規律:

第一個數據 24562460之間。

第二個數據到第九個數據 200210之間。

第十個數據到第十八個數據 400410之間。

第十九個數據到第三十二個數據在200210之間和在400410之間都有。

繼續分析:如果將在24562460之間的數據定義為字符‘h’,將在200210之間的數據定義為字符‘0’,將在400410之間的數據定義為字符‘1’。那么以上33個數據可以表達為:h 1111 1111 0000 0000 0011 0000 1100 1111 那么這個數據就是按鍵1按下的用01來表示的編碼。

相同道理可以推測出數字2和數字301來表示的編碼如下:

數字 2 h  0000 0000 1111 1111 0001 1000 1110 0111

數字 3 h  0000 0000 1111 1111 0111 1010 1000 0101

好了,到了這里我們可以下結論了,因為已經有了3個對比。

我們的結論是:如上圖的遙控器編碼原理為每個按鍵都有33個編碼其中第一個編碼都相同時間比較長,接著16編碼分別可以用我們所定義的01表示即前八個為0后八個為1。其實這個我們可以理解為遙控器的地址編碼,就好比電話號碼的區號一樣的,浙江衢州的區號是0570而武漢的區號是027,在本區域里的所有的座機號碼都是以這個開頭固定不變的。

接著再仔細觀察可以發現原來后面16個數據碼也是有規律的,那就是前8個和后8個是相互取反的的編碼。

好了,更多的思維留個大家,下面我們要分享程序了,希望大家下載程序以后可以得出我以上的結論,如果復制到keil上有亂碼,大家可從這里下載源程序:http://m.zg4o1577.cn/f/hwykjm1.rar 哈哈,這也是學習單片機的趣味所在哦。因為我將分享的程序涵蓋了單片機外部中斷、內部定時器、串口通訊的三個結構的應用。

四、程序分享

/*

測試方案_07 

程序設計:胡琴

電話:15886684881

設計時間:2010-12-1                              

測試方法:用定時器計算33位紅外信號持續時間

測試原理:在測試方案_01的結論上,記錄一組紅外信號33位中各編碼持續時間

測試結果:前導碼:約 2457,持續時間為 2457 * 0.005 = 12.285ms (NEC標準為13.5)

         編碼 0:約 206 持續時間為  206 * 0.005 = 1.03ms   (NEC標準為1.125)

         編碼 1:約 408 持續時間為  408 * 0.005 = 2.04ms   (NEC標準為2.25)

*/

  #include <reg52.h>
sbit IR = P3^2;                     // 紅外信號感應引腳
unsigned int time;
unsigned int dat[33] ={ 0 };
bit flag = 0;
void Send( void )  //將32位數據對應的時間發送到PC上顯示
{
       char i;
       for(i = 0;i < 33;i ++)
       {  
              TI = 0;
              SBUF = dat[i] / 10000 + 48;
              while( !TI );
              TI = 0;
              SBUF = dat[i] / 1000 % 10 + 48;
              while( !TI );
              TI = 0;
              SBUF = dat[i] / 100 % 10 + 48;
              while( !TI );
              TI = 0;
              SBUF = dat[i] / 10 % 10 + 48;
              while( !TI );
              TI = 0;
              SBUF = dat[i] % 10 + 48;
              while( !TI );   
              TI = 0;
              SBUF = ' ';
              while( !TI );
       }
}
void Init( void )             //定時器、外部中斷初始化
{
       TMOD = 0x22;             // 定時器0、1方式2
       SCON = 0x40;              // 串行口方式1,不允許接收    
       TH1 = TL1 = 0xfd;       // 串行口方式2,Fosc=11.05926,BPS=9600
       TH0 = TL0 = 0xfb;       // 中斷頻率 0.005ms
       TR1 = 1;               // 開啟與串行口相關的定時器1
       IT0 = 1;                // 邊沿式觸發
       ET0 = 1;               // 開啟定時器0中斷
       EX0 = 1;               // 外部中斷0中斷允許
       IP  = 0x02;                  // 定時器0優先級高
       EA  = 1;
}
void main( void )     //主程序
{
       Init( );                   //中斷 定時器 初始化
       while( 1 );                    //等待遙控信號
}
void Xint0( void ) interrupt 0 //外部中斷0復位子程序
{
       char i;
       for(i = 0;i < 33;i ++)
       {     
              time = 0;
              TR0 = 1;
              while( !IR );          // 前導信號檢測
              while( IR );   
              TR0 = 0;
              dat[i] = time;
       }
       Send( );
       flag = 1;
       EX0 = 0; 
}
void Timer0( void ) interrupt 1 //5us中斷一次 變量加1
{
       time ++;
}

  

五、最后的話

  真正入門單片機的學習者應該是已經掌握了單片機內部定時器、外部中斷、串口通訊的工作原理及編程方法,所以對于這個程序我想很多人都可以馬上體會并變為自己的程序。

  希望在這個程序的引導下結合自己的C語言編程能力,可以拿起自己身邊的遙控器為單片機邊學邊用所應用。修改程序實現每個按鍵按下單片機對應控制一個LED亮并且蜂鳴器報警器一次。

  如今中國和日本的矛盾不斷,很多技術人都在抱怨,但是我想其實我們也是可以為國家出點力的。因為我們所使用的大部分遙控器的編碼與標準都是日本人技術所制定。

  同學們,中國的智能電子愛好者,我們也可以制定出這個標準哦。希望更多的同仁能設計出自己的家用紅外遙控器。

 

 

關閉窗口

相關文章

主站蜘蛛池模板: 精品国产乱码一区二区三 | 精品国产一区二区三区久久狼黑人 | 午夜精品一区二区三区在线观看 | 中文字幕第十页 | 日本一二三区电影 | 国产日韩视频 | 91在线免费视频 | 亚洲人成人一区二区在线观看 | 黄色免费av| 欧洲尺码日本国产精品 | 中文字幕第三页 | 美日韩精品 | 欧产日产国产精品国产 | 自拍偷拍亚洲欧美 | 精品一区二区三区av | 亚洲精品一区二区三区丝袜 | 久久久人成影片一区二区三区 | 中文字幕精品一区 | 国产精品久久久久一区二区三区 | 国产一区二区三区 | 亚洲一区导航 | 久久久青草婷婷精品综合日韩 | 日本韩国电影免费观看 | 在线视频中文字幕 | 亚洲精品在线国产 | 免费观看黄色一级片 | 日韩美香港a一级毛片免费 国产综合av | 二区在线视频 | 欧美日韩1区2区 | 九七午夜剧场福利写真 | 日韩高清中文字幕 | 中文字幕欧美在线观看 | 久久久精品一区二区三区四季av | 欧美亚洲视频在线观看 | 日韩在线视频一区二区三区 | 国产精品欧美一区二区 | 精品一区二区在线视频 | 久久国产麻豆 | 亚洲免费精品 | 国产高清免费 | 黄片毛片免费观看 |