基于51单片机的红外遥控
基于51单片机的红外遥控 1 红外遥控是无线遥控的一种方式,本文讲述的红外遥控,采用STC89C52单片机,1838 红外接收头和38k红外遥控器。 1838红外接收头 红外遥控器 原理 红外接收的原理我不赘述,百度文库上不少,我推荐个网址,这篇文章写得比较清楚, 也比较全面9 httD//wenku・baidu・com/view/c353e8360b4c2e3f57276349.html 我主要讲下程序的具体意思,在了解原理的基础上,我们知道,当我们在遥控器上每 按下一个键,遥控器上的红外发射头都会发出一个32位的编码(32位编码分成4组8位二 进制编码,前16位为用户码和用户反码,后16位为数据码和数据反码,用户码表示遥控 器类型,数据码表示按键编码),不同的键对应不同的编码,红外接收头接收到这个编码后, 发送给单片机,再进行相关操作。 源程序1(这个程序的功能是将用户码和用户反码,数据码和数据反码显示在1602液晶上, 因为遥控器买回来是不会说明按键对应什么码值,所以先自己测试,确定每个 按键的码值) includereg52.h includestdioh includeintrins.h define uint unsigned int define uchar unsigned char define _Nop _nop_ define TURE 1 define FALSE 0 /*端口定义*/ sbit lcd_rs_port P3人5; /*定义 LCD 控制端口*/ sbit lcd_rw_port P3A6; sbit lcd_en_port P3A4; define lcd_data_port PO lllllllllllllllllllllllllllllllllll void delayl void//关闭数码管延时程序 { int k; for k0; k1000; k; } llllllllllllllllllllllllllllllllllll uchar code line0[16]{n user}; uchar code linel[16]n data**}; uchar code lcd_mun_to_char[16]*,0123456789ABCDEFM}; unsigned char irtime;//红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4];//ffi来存放用户码、用户反码、数据码、数据反码 unsigned charirdata[33];〃用来存放 32 位码值 void ShowString unsigned char line,char *ptr; llllllllllllllllllllllllllllllllllllllllllllll void Delayunsigned char niS; void Ir_workvoid; void Ircordprovoid; void timO_isr void interrupt 1 using 1〃定时器 0 中断服务函数 irtime; } void exO_isr void interrupt 0 using 0〃外部中断 0 服务函数 { static unsigned char i; static bit startflag; ifstartflag ifirtime63irtime33//引导码 TC9012 的头码 i0; irdata[i]irtinie; irtime0; i; ifi33{ irokl; i0; else{ irtinieO; startflagl; } } void TIMOinitvoid//定时器 0 初始化 TMOD0 x02;〃定时器0工作方式2, TH0是重装值,TL0是初值 TH00 x00;//reload value TL00 x00;//initial value ETO1;〃开中断 TRO1; } void EXOinitvoid { ITO 1;// Configure interrupt 0 for falling edge on /INTO P3.2 EXO 1;// Enable EXO Interrupt EA 1; void Ircordprovoid//红外码值处理函数关键函数 unsigned char i, j, kl; unsigned char cord,value; fori0;iv4;i{〃处理 4 个字节 forjly8;j{ 〃处理 1 个字节 8 位 cordirdata[k]; valuevaluel; ifcord7 valuevaluel0 x80; 〃大于某值为 1 k; IRcord[i]value; value0; } irpro_okl;〃处理完毕标志位置1 } lllllllllllllllllllllllllllllllllllllllllll void lcd_delayuchar ms /*LCD1602 延时*/ { ucharj; whilems{ forj0;j250;j {;} llllllllllllllllllllllllllllllllllllllllllllll void lcd_busy_wait /*LCD1602 忙等待*/ lcd_rs_port 0; lcd_rw_port 1; lcd_en_port 1; lcd_data_port OxfT; _Nop; _Nop; _Nop; _Nop; while lcd_data_port0 x80; kd_en_port 0; } lllllllllllllllllllllllllllllllllllllllllllllll void lcd_command_writeuchar command /*LCD1602 命令字写入*/ { lcd_busy_wait; Icd_rs_port 0; lcd_rw_port 0; lcd_en_port 0; lcd_data_port command; _Nop; _Nop; _Nop; _Nop; _Nop; _Nop; lcd_en_port 1; _Nop; _Nop; _Nop; _Nop; _Nop; _Nop;