ops-单片机红外发射(原理与设计程序).doc

上传人:scccc 文档编号:12048825 上传时间:2021-12-01 格式:DOC 页数:17 大小:132.50KB
返回 下载 相关 举报
ops-单片机红外发射(原理与设计程序).doc_第1页
第1页 / 共17页
ops-单片机红外发射(原理与设计程序).doc_第2页
第2页 / 共17页
ops-单片机红外发射(原理与设计程序).doc_第3页
第3页 / 共17页
ops-单片机红外发射(原理与设计程序).doc_第4页
第4页 / 共17页
ops-单片机红外发射(原理与设计程序).doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《ops-单片机红外发射(原理与设计程序).doc》由会员分享,可在线阅读,更多相关《ops-单片机红外发射(原理与设计程序).doc(17页珍藏版)》请在三一文库上搜索。

1、用AT89S51单片机制作红外电视遥控器一般红外电视遥控器的输出都是用编码后串行数据对3840kHz的方波进行脉冲幅度调制而产生的。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用

2、户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。根据红外编码的格式,发送数据前需要先发送9ms的起始码和4.5ms的结果码。遥控串行数据编码波形如下图所示:接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低电平处发送38kHz红外信号,高电平处则不发送红外信号。单片机红外电视遥控器电路图如下:推荐精选 C51程序代码:#include <AT89X51

3、.h> static bit OP;        /红外发射管的亮灭static unsigned int count;       /延时计数器static unsigned int endcount; /终止延时计数static unsigned char flag;      /红外发送标志char iraddr1;  /十六位地址的第一个字节char iraddr2;  /十六位地

4、址的第二个字节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中断一次   

5、 TR0 = 1;/开始计数  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、160;   OP=OP;    else      OP = 0;    P3_4 = OP; 推荐精选void SendIRdata(char p_irdata)  int i;  char irdata=p_irdata;  /发送9ms的起始码  endcount=223;  flag=1;  count=0;  dowhile(count<endcount);  /发送4.5ms的结果码 

7、endcount=117  flag=0;  count=0;  dowhile(count<endcount);  /发送十六位地址的前八位  irdata=iraddr1;  for(i=0;i<8;i+)       /先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)     endcount=10;     flag=1;     count=0;

8、     dowhile(count<endcount);/停止发送红外信号(即编码中的高电平)     if(irdata-(irdata/2)*2)  /判断二进制数个位为1还是0            endcount=41;  /1为宽的高电平         else       

9、  endcount=15;   推荐精选/0为窄的高电平         flag=0;    count=0;    dowhile(count<endcount);    irdata=irdata>>1;    /发送十六位地址的后八位  irdata=iraddr2;  for(i=0;i<8;i+)   

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

11、#160;  else            endcount=15;          flag=0;     count=0;     dowhile(count<endcount);     irdata=irdata>>1;    /发送八位数据  irdata=p_ird

12、ata;  for(i=0;i<8;i+)       endcount=10;     flag=1;     count=0;     推荐精选dowhile(count<endcount);     if(irdata-(irdata/2)*2)          

13、60;   endcount=41;          else            endcount=15;          flag=0;     count=0;     dowhile(count<endcount); &

14、#160;   irdata=irdata>>1;    /发送八位数据的反码  irdata=p_irdata;  for(i=0;i<8;i+)       endcount=10;     flag=1;     count=0;     dowhile(count<endcount);     i

15、f(irdata-(irdata/2)*2)              endcount=41;          else            endcount=15;          flag=0;   

16、;  count=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+)    

17、;  for(j=0;j<100;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

18、="0" delay(800ms); delay(800ms);delay(400ms); shache = 1; #define Chilun_Num 8/* 齿轮数 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

19、 display ();void delay(uint delay_time) uint i; for (i=0; i < delay_time ; i+) ; void run ();void fx_run();uint round_num = 0; /* 记录已转的 齿轮数 , 中断1次 加 1*/uint set_round_num = 0; /* 播码盘设置 圈数 */uint set_pwm_width = 0; /* 播码盘设置 步进电机 正向速度 */bit one_round_flg = 0;sbit led_1000 = P07; /use for displaysbi

20、t led_100 = P06; /use for displaysbit 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 sha

21、che = P35; /* 接刹车控制继电器 0 电位有效 */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 );

22、run (); fx_run(); void run () #define Delay_time 180 /* 转一圈 50 次循环,每循环 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

23、( Delay_time ); / bujin_zx_stop = 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 ( !o

24、ne_round_flg & key_puse ); if(!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

25、 ) round_num = 0; display(); if ( !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();

26、P0 = 0xf0; P0 = P0 | LEDBuf0 ; led_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 disp

27、lay() 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_num() /* 读播码盘 到 set_roun

28、d_num ,set_pwm_width */ uchar tmp; P2 = 0xFF; P2 = 0xEF; / 1110 1111 delay ( 1ms ); tmp = (P2 | 0xF0); P2 = 0xDF; / 1101 1111 delay ( 1ms ); tmp = (P2 | 0xF0 ) * 10 + tmp; set_round_num = tmp; P2 = 0xBF; / 1011 1111 delay ( 1ms ); tmp = (P2 | 0xF0); P2 = 0x推荐精选7F; / 0111 1111 delay ( 1ms ); tmp = (P

29、2 | 0xF0) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num; P2 = 0xFF; P1 = 0xbF; / 0111 1111 delay ( 1ms ); tmp = (P2 | 0xF0) ; P1 = 0xFF; P2 = 0xFF; P1 &= 0x7F; / 1011 1111 delay ( 1ms ); tmp = (P2 | 0xF0) * 10 + tmp ; set_pwm_width = tmp ; P1 =

30、 0xFF; P2 = 0xFF;void fx_run() #define f_Delay_time 180 while ( bujin_fx_stop ) /* 反向 回车 直到 传感器 动作*/ P1 = 0xf3; /0011 delay ( f_Delay_time ); P1 = 0xf6; /0110 delay ( f_Delay_time ); P1 = 0xfc; /1100 delay ( f_Delay_time ); P1 = 0xf9; /1001 delay ( f_Delay_time ); P1 = 0xff; (注:可编辑下载,若有不当之处,请指正,谢谢!) 推荐精选

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1