單片機紅外發(fā)射原理與設計程序_第1頁
單片機紅外發(fā)射原理與設計程序_第2頁
單片機紅外發(fā)射原理與設計程序_第3頁
單片機紅外發(fā)射原理與設計程序_第4頁
單片機紅外發(fā)射原理與設計程序_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、用AT89S51單片機制作紅外電視遙控器一般紅外電視遙控器的輸出都是用編碼后串行數(shù)據(jù)對3840kHz的方波進行脈沖幅度調(diào)制而產(chǎn)生的。當發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”。上述“0”和“1”組成的32位二進制碼經(jīng)38kHz的載頻進行二次調(diào)制,然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射。一般電視遙控器的遙控編碼是連續(xù)的32位二進制碼組,其中前16位為用

2、戶識別碼,能區(qū)別不同的紅外遙控設備,防止不同機種遙控碼互相干擾。后16位為8位的操作碼和8位的操作反碼,用于核對數(shù)據(jù)是否接收準確。根據(jù)紅外編碼的格式,發(fā)送數(shù)據(jù)前需要先發(fā)送9ms的起始碼和4.5ms的結(jié)果碼。遙控串行數(shù)據(jù)編碼波形如下圖所示:接收方一般使用TL0038一體化紅外線接收器進行接收解碼,當TL0038接收到38kHz紅外信號時,輸出端輸出低電平,否則為高電平。所以紅外遙控器發(fā)送紅外信號時,參考上面遙控串行數(shù)據(jù)編碼波形圖,在低電平處發(fā)送38kHz紅外信號,高電平處則不發(fā)送紅外信號。單片機紅外電視遙控器電路圖如下: C51程序代碼:#include <AT89X51.h&g

3、t; static bit OP;        /紅外發(fā)射管的亮滅static unsigned int count;       /延時計數(shù)器static unsigned int endcount; /終止延時計數(shù)static unsigned char flag;      /紅外發(fā)送標志char iraddr1;  /十六位地址的第一個字節(jié)char iraddr2;  /十六位地址的第二

4、個字節(jié)void SendIRdata(char p_irdata);void delay();void main(void)   count = 0;  flag = 0;  OP = 0;  P3_4 = 0;  EA = 1; /允許CPU中斷   TMOD = 0x11; /設定時器0和1為16位模式1   ET0 = 1; /定時器0中斷允許   TH0 = 0xFF;   TL0 = 0xE6; /設定時值0為38K 也就是每隔26us中斷一次    TR0 = 1

5、;/開始計數(shù)  iraddr1=3;  iraddr2=252;  do      delay();      SendIRdata(12);  while(1); /定時器0中斷處理 void timeint(void) interrupt 1   TH0=0xFF;   TL0=0xE6; /設定時值為38K 也就是每隔26us中斷一次  count+;  if (flag=1)   

6、0;  OP=OP;    else      OP = 0;    P3_4 = OP; void SendIRdata(char p_irdata)  int i;  char irdata=p_irdata;  /發(fā)送9ms的起始碼  endcount=223;  flag=1;  count=0;  dowhile(count<endcount);  /發(fā)送4.5ms的結(jié)果碼  endcount=117

7、  flag=0;  count=0;  dowhile(count<endcount);  /發(fā)送十六位地址的前八位  irdata=iraddr1;  for(i=0;i<8;i+)       /先發(fā)送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)     endcount=10;     flag=1;     count=0;  

8、   dowhile(count<endcount);/停止發(fā)送紅外信號(即編碼中的高電平)     if(irdata-(irdata/2)*2)  /判斷二進制數(shù)個位為1還是0            endcount=41;  /1為寬的高電平         else          endco

9、unt=15;   /0為窄的高電平         flag=0;    count=0;    dowhile(count<endcount);    irdata=irdata>>1;    /發(fā)送十六位地址的后八位  irdata=iraddr2;  for(i=0;i<8;i+)       e

10、ndcount=10;     flag=1;     count=0;     dowhile(count<endcount);     if(irdata-(irdata/2)*2)             endcount=41;          else

11、            endcount=15;          flag=0;     count=0;     dowhile(count<endcount);     irdata=irdata>>1;    /發(fā)送八位數(shù)據(jù)  irdata=p_irdata;  for(i

12、=0;i<8;i+)       endcount=10;     flag=1;     count=0;     dowhile(count<endcount);     if(irdata-(irdata/2)*2)              endc

13、ount=41;          else            endcount=15;          flag=0;     count=0;     dowhile(count<endcount);     ir

14、data=irdata>>1;    /發(fā)送八位數(shù)據(jù)的反碼  irdata=p_irdata;  for(i=0;i<8;i+)       endcount=10;     flag=1;     count=0;     dowhile(count<endcount);     if(irdata-(irdata/2)*

15、2)              endcount=41;          else            endcount=15;          flag=0;     count=0;

16、0;    dowhile(count<endcount);     irdata=irdata>>1;    endcount=10;  flag=1;  count=0;  dowhile(count<endcount);  flag=0;void delay()  int i,j;  for(i=0;i<400;i+)      for(j=0;j<100

17、;j+)          制作的實物如下圖所示:步進電機#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define ms *77/ f = 12 M#define LEDLen 4#define Dj_star() IE=0x81; pri_dj=0; #define Dj_stop() IE=0x00; pri_dj=1; P1=0xff; shache="0" delay(800ms); del

18、ay(800ms);delay(400ms); shache = 1; #define Chilun_Num 8/* 齒輪數(shù) 8 個*/#define set_display_num() LEDBuf0 = tmp / 1000; LEDBuf1 = tmp / 100 % 10; LEDBuf2 = tmp / 10 % 10; LEDBuf3 = tmp % 10; uchar LEDBufLEDLen = 0,0,0,0;void read_num (); /* 讀播碼盤 到 set_round_num * 8 */void display ();void delay(uint dela

19、y_time) uint i; for (i=0; i < delay_time ; i+) ; void run ();void fx_run();uint round_num = 0; /* 記錄已轉(zhuǎn)的 齒輪數(shù) , 中斷1次 加 1*/uint set_round_num = 0; /* 播碼盤設置 圈數(shù) */uint set_pwm_width = 0; /* 播碼盤設置 步進電機 正向速度 */bit one_round_flg = 0;sbit led_1000 = P07; /use for displaysbit led_100 = P06; /use for displa

20、ysbit led_10 = P05; /use for displaysbit led_1 = P04; /use for displaysbit key_start = P30;sbit key_puse = P30;sbit key_clear = P31; /* P32 接齒輪傳感器 中斷 */sbit bujin_zx_stop = P33; /* 接步進電機 ,正向到位傳感器 ,為 0 停機 */sbit bujin_fx_stop = P34; /* 接步進電機 ,反向到位傳感器 ,為 0 停機 */sbit shache = P35; /* 接剎車控制繼電器 0 電位有效 */

21、sbit pri_dj = P36; /* 接主電機控制繼電器 0 電位有效 */void main() TCON = 0x01; display(); while(1) IE="0x00" round_num = 0; display(); if ( bujin_fx_stop ) fx_run(); while ( key_start ); delay ( 8ms ); if(!key_start) read_num(); /set_round_num = 8; while ( !key_start ); run (); fx_run(); void run () #d

22、efine Delay_time 180 /* 轉(zhuǎn)一圈 50 次循環(huán),每循環(huán) 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */ uchar i ; P1 = 0xff; set_pwm_width = 15 + set_pwm_width / 10; while ( 1 ) while( !shache | !key_start ); Dj_star(); for ( i="0" ; bujin_zx_stop & !pri_dj;i+ ) P1 = 0xf9; delay ( Delay_time ); / bujin_zx_stop

23、= P33; P1 = 0xfc; / bujin_fx_stop = P34; delay ( Delay_time); / key_puse = P30; P1 = 0xf6; / key_clear = P31; delay ( Delay_time ); / shache = P35; P1 = 0xf3; / pri_dj = P36; delay ( Delay_time ); if( i = set_pwm_width ) P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse ); i

24、f(!key_puse) delay(4ms); if(!key_puse) break; P1 = 0xff; if ( pri_dj ) break; if ( !key_puse ) delay ( 8ms ); if ( !key_puse ) Dj_stop(); while ( !key_puse ); / next pree key while( !shache ); while(1) while ( key_puse & key_clear ); delay ( 8ms ); if ( !key_clear ) round_num = 0; display(); if

25、( !key_puse ) break; while( !key_puse ); delay(8ms); while( !key_puse ); void ext_int0(void) interrupt 0 /* 主電機 齒輪 中斷 */ uint tmp; EA = 0; if( !pri_dj ) round_num +; if (round_num % Chilun_Num = 0 ) one_round_flg = 1; tmp = round_num / Chilun_Num ; set_display_num(); P0 = 0xf0; P0 = P0 | LEDBuf0 ; l

26、ed_1000 = 0; P0 |= 0xf0; P0 = 0xf0; P0 = P0 | LEDBuf1 ; led_100 = 0; P0 |= 0xf0; P0 = 0xf0; P0 = P0 | LEDBuf2 ; led_10 = 0; P0 |= 0xf0; P0 = 0xf0; P0 = P0 | LEDBuf3 ; led_1 = 0; P0 |= 0xf0; P0 = 0xf0; if ( round_num >= set_round_num ) Dj_stop(); EA = 0x81;void display() uchar i; uint tmp = 0; tmp = round_num / Chilun_Num ; set_display_num(); for(i = 0; i < LEDLen ; i +) P0 = 0xf0; P0 = P0 | LEDBufi ; if(i=0) led_1000 = 0; /P04 if(i=1) led_100 = 0; /P05 if(i=2) led_10 = 0; /P06 if(i=3) led_1 = 0; /P07 P0 |= 0xf0; P0 = 0xf0;void read_nu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論