一、前言
利用STC公司1T內(nèi)核的STC
本文主要對測試結(jié)果進(jìn)行展示與分析并對單片機(jī)控制程序進(jìn)行分析,以此起到拋磚引玉的作用,希望讀者理解程序以后可以利用單片機(jī)對身邊的任意一款遙控器進(jìn)行解碼并將遙控器與單片機(jī)的實(shí)際應(yīng)用聯(lián)系在一起。
二、測試結(jié)果展示
1、實(shí)驗(yàn)材料介紹
實(shí)驗(yàn)材料硬件部分 軟件部分 為KEIL V2 編程軟件 和 單片機(jī)程序下載軟件STC_ISP_V479
為了高效率學(xué)習(xí)程序編寫,本實(shí)驗(yàn)平臺采用單片機(jī)教程網(wǎng)的51hei-5單片機(jī)開發(fā)板。控制芯片為 STC
2、遙控器按下數(shù)字1,PC所接收的數(shù)據(jù)碼
顯示的數(shù)據(jù):數(shù)字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、遙控器按下數(shù)字2,PC所接收的數(shù)據(jù)碼
數(shù)字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、遙控器按下數(shù)字3,PC所接收的數(shù)據(jù)碼
數(shù)字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
三、測試數(shù)據(jù)分析
下載程序在硬件電路正常的情況下,遙控器按下數(shù)字1,PC機(jī)可以接收到以下數(shù)據(jù)數(shù)字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
那這些數(shù)據(jù)代表什么意思呢?
單片機(jī)向PC機(jī)每發(fā)送一次都是5位數(shù)據(jù),這5位數(shù)據(jù)是單片機(jī)內(nèi)部定時器以5us循環(huán)一次對temp變量從0開始自加所得到的數(shù)據(jù)。也就是說這些數(shù)據(jù)可以理解為一個時間值,這個時間值就是遙控器每個數(shù)據(jù)碼高電平和低電平所持續(xù)時間的值。
從數(shù)據(jù)可以看出每個按鍵按下去PC機(jī)都接收到33個數(shù)據(jù),這33個數(shù)據(jù)仔細(xì)觀察可以發(fā)現(xiàn)都有以下規(guī)律:
第一個數(shù)據(jù) 在2456和2460之間。
第二個數(shù)據(jù)到第九個數(shù)據(jù) 在200和210之間。
第十個數(shù)據(jù)到第十八個數(shù)據(jù) 在400和410之間。
第十九個數(shù)據(jù)到第三十二個數(shù)據(jù)在200和210之間和在400和410之間都有。
繼續(xù)分析:如果將在2456和2460之間的數(shù)據(jù)定義為字符‘h’,將在200和210之間的數(shù)據(jù)定義為字符‘0’,將在400和410之間的數(shù)據(jù)定義為字符‘1’。那么以上33個數(shù)據(jù)可以表達(dá)為:h 1111 1111 0000 0000 0011 0000 1100 1111 那么這個數(shù)據(jù)就是按鍵1按下的用0和1來表示的編碼。
相同道理可以推測出數(shù)字2和數(shù)字3用0和1來表示的編碼如下:
數(shù)字 2 : h 0000 0000 1111 1111 0001 1000 1110 0111
數(shù)字 3 : h 0000 0000 1111 1111 0111 1010 1000 0101
好了,到了這里我們可以下結(jié)論了,因?yàn)橐呀?jīng)有了3個對比。
我們的結(jié)論是:如上圖的遙控器編碼原理為每個按鍵都有33個編碼其中第一個編碼都相同時間比較長,接著16編碼分別可以用我們所定義的0和1表示即前八個為0后八個為1。其實(shí)這個我們可以理解為遙控器的地址編碼,就好比電話號碼的區(qū)號一樣的,浙江衢州的區(qū)號是0570而武漢的區(qū)號是027,在本區(qū)域里的所有的座機(jī)號碼都是以這個開頭固定不變的。
接著再仔細(xì)觀察可以發(fā)現(xiàn)原來后面16個數(shù)據(jù)碼也是有規(guī)律的,那就是前8個和后8個是相互取反的的編碼。
好了,更多的思維留個大家,下面我們要分享程序了,希望大家下載程序以后可以得出我以上的結(jié)論,如果復(fù)制到keil上有亂碼,大家可從這里下載源程序:http://www.zg4o1577.cn/f/hwykjm1.rar 哈哈,這也是學(xué)習(xí)單片機(jī)的趣味所在哦。因?yàn)槲覍⒎窒淼某绦蚝w了單片機(jī)外部中斷、內(nèi)部定時器、串口通訊的三個結(jié)構(gòu)的應(yīng)用。
四、程序分享
/*
測試方案_07
程序設(shè)計:胡琴
電話:15886684881
設(shè)計時間:
測試方法:用定時器計算33位紅外信號持續(xù)時間
測試原理:在測試方案_01的結(jié)論上,記錄一組紅外信號33位中各編碼持續(xù)時間
測試結(jié)果:前導(dǎo)碼:約 2457,持續(xù)時間為 2457 * 0.005 = 12.285ms (NEC標(biāo)準(zhǔn)為13.5)
編碼 0:約 206, 持續(xù)時間為 206 * 0.005 = 1.03ms (NEC標(biāo)準(zhǔn)為1.125)
編碼 1:約 408, 持續(xù)時間為 408 * 0.005 = 2.04ms (NEC標(biāo)準(zhǔn)為2.25)
*/
#include <reg52.h> sbit IR = P3^2; // 紅外信號感應(yīng)引腳 unsigned int time; unsigned int dat[33] ={ 0 }; bit flag = 0; void Send( void ) //將32位數(shù)據(jù)對應(yīng)的時間發(fā)送到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,F(xiàn)osc=11.05926,BPS=9600 TH0 = TL0 = 0xfb; // 中斷頻率 0.005ms TR1 = 1; // 開啟與串行口相關(guān)的定時器1 IT0 = 1; // 邊沿式觸發(fā) ET0 = 1; // 開啟定時器0中斷 EX0 = 1; // 外部中斷0中斷允許 IP = 0x02; // 定時器0優(yōu)先級高 EA = 1; } void main( void ) //主程序 { Init( ); //中斷 定時器 初始化 while( 1 ); //等待遙控信號 } void Xint0( void ) interrupt 0 //外部中斷0復(fù)位子程序 { char i; for(i = 0;i < 33;i ++) { time = 0; TR0 = 1; while( !IR ); // 前導(dǎo)信號檢測 while( IR ); TR0 = 0; dat[i] = time; } Send( ); flag = 1; EX0 = 0; } void Timer0( void ) interrupt 1 //5us中斷一次 變量加1 { time ++; }
五、最后的話
真正入門單片機(jī)的學(xué)習(xí)者應(yīng)該是已經(jīng)掌握了單片機(jī)內(nèi)部定時器、外部中斷、串口通訊的工作原理及編程方法,所以對于這個程序我想很多人都可以馬上體會并變?yōu)樽约旱某绦颉?/span>
希望在這個程序的引導(dǎo)下結(jié)合自己的C語言編程能力,可以拿起自己身邊的遙控器為單片機(jī)邊學(xué)邊用所應(yīng)用。修改程序?qū)崿F(xiàn)每個按鍵按下單片機(jī)對應(yīng)控制一個LED亮并且蜂鳴器報警器一次。
如今中國和日本的矛盾不斷,很多技術(shù)人都在抱怨,但是我想其實(shí)我們也是可以為國家出點(diǎn)力的。因?yàn)槲覀兯褂玫拇蟛糠诌b控器的編碼與標(biāo)準(zhǔn)都是日本人技術(shù)所制定。
同學(xué)們,中國的智能電子愛好者,我們也可以制定出這個標(biāo)準(zhǔn)哦。希望更多的同仁能設(shè)計出自己的家用紅外遙控器。