一、前言
利用STC公司1T內核的STC
本文主要對測試結果進行展示與分析并對單片機控制程序進行分析,以此起到拋磚引玉的作用,希望讀者理解程序以后可以利用單片機對身邊的任意一款遙控器進行解碼并將遙控器與單片機的實際應用聯系在一起。
二、測試結果展示
1、實驗材料介紹
實驗材料硬件部分 軟件部分 為KEIL V2 編程軟件 和 單片機程序下載軟件STC_ISP_V479
為了高效率學習程序編寫,本實驗平臺采用單片機教程網的51hei-5單片機開發板。控制芯片為 STC
2、遙控器按下數字1,PC所接收的數據碼
顯示的數據:數字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、遙控器按下數字2,PC所接收的數據碼
數字2:2456 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、遙控器按下數字3,PC所接收的數據碼
數字3:02457 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
三、測試數據分析
下載程序在硬件電路正常的情況下,遙控器按下數字1,PC機可以接收到以下數據數字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個數據仔細觀察可以發現都有以下規律:
第一個數據 在2456和2460之間。
第二個數據到第九個數據 在200和210之間。
第十個數據到第十八個數據 在400和410之間。
第十九個數據到第三十二個數據在200和210之間和在400和410之間都有。
繼續分析:如果將在2456和2460之間的數據定義為字符‘h’,將在200和210之間的數據定義為字符‘0’,將在400和410之間的數據定義為字符‘1’。那么以上33個數據可以表達為:h 1111 1111 0000 0000 0011 0000 1100 1111 那么這個數據就是按鍵1按下的用0和1來表示的編碼。
相同道理可以推測出數字2和數字3用0和1來表示的編碼如下:
數字 2 : h 0000 0000 1111 1111 0001 1000 1110 0111
數字 3 : h 0000 0000 1111 1111 0111 1010 1000 0101
好了,到了這里我們可以下結論了,因為已經有了3個對比。
我們的結論是:如上圖的遙控器編碼原理為每個按鍵都有33個編碼其中第一個編碼都相同時間比較長,接著16編碼分別可以用我們所定義的0和1表示即前八個為0后八個為1。其實這個我們可以理解為遙控器的地址編碼,就好比電話號碼的區號一樣的,浙江衢州的區號是0570而武漢的區號是027,在本區域里的所有的座機號碼都是以這個開頭固定不變的。
接著再仔細觀察可以發現原來后面16個數據碼也是有規律的,那就是前8個和后8個是相互取反的的編碼。
好了,更多的思維留個大家,下面我們要分享程序了,希望大家下載程序以后可以得出我以上的結論,如果復制到keil上有亂碼,大家可從這里下載源程序:http://m.zg4o1577.cn/f/hwykjm1.rar 哈哈,這也是學習單片機的趣味所在哦。因為我將分享的程序涵蓋了單片機外部中斷、內部定時器、串口通訊的三個結構的應用。
四、程序分享
/*
測試方案_07
程序設計:胡琴
電話:15886684881
設計時間:
測試方法:用定時器計算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亮并且蜂鳴器報警器一次。
如今中國和日本的矛盾不斷,很多技術人都在抱怨,但是我想其實我們也是可以為國家出點力的。因為我們所使用的大部分遙控器的編碼與標準都是日本人技術所制定。
同學們,中國的智能電子愛好者,我們也可以制定出這個標準哦。希望更多的同仁能設計出自己的家用紅外遙控器。