********以下是遙控完整程序********
/********
**項(xiàng)目: 自制紅外電視遙控器(EE01學(xué)習(xí)板演示程序)
**作者:一線工人
**網(wǎng)站:電子工程師之家 www.eehome.cn
**轉(zhuǎn)貼請(qǐng)保持代碼的完整性
********/
#include 《reg52.h》
#define uint unsigned int
#define uchar unsigned char
bit irout;//紅外管狀態(tài)
sbit ir=P1^7;//紅外發(fā)射管控制腳
uint count, set_count;//中斷計(jì)數(shù),設(shè)定中斷次數(shù)
bit flag,keyflag;//紅外發(fā)送標(biāo)志,按鍵標(biāo)志位
uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26位系統(tǒng)碼,最后一個(gè)字節(jié)只用2位
uchar ircode,irdata;
/**********************************************
延時(shí)1ms
***********************************************/
void delay(uint z)//延時(shí)1ms,晶振22.1184M
{
uint x,y;
for(x=z;x》0;x--)
for(y=225;y》0;y--);
}
/**********************************************
按鍵掃描
**********************************************/
void keyscan(void)
{
uchar keytemp;
P3=0xff;
keytemp=P3&0x0f;
if(keytemp!=0x0f)
{
delay(20);
keytemp=P3&0x0f;
if(keytemp!=0x0f)
keyflag=1;//有按鍵標(biāo)志
switch(keytemp)
{
case 0x0e:irdata=27;break;//按鍵1對(duì)應(yīng)該遙控器P+的鍵值
case 0x0d:irdata=26;break;//按鍵2對(duì)應(yīng)該遙控器P-的鍵值
case 0x0b:irdata=31;break;//按鍵3對(duì)應(yīng)該遙控器VOL+的鍵值
case 0x07:irdata=30;break;//按鍵4對(duì)應(yīng)該遙控器VOL-的鍵值
}
}
}
/*******************************************
發(fā)送8位紅外數(shù)據(jù)
*******************************************/
void sendcode_8(void)
{
uchar i;
for(i=0;i《8;i++)
{
set_count=28;//發(fā)送0.56ms 38k紅外波(編碼中的0.56ms低電平)
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
if(ircode&0x01)//判斷紅外編碼最低位,1寬的高電平,0窄的高電平
{
set_count=120;
}
else
{
set_count=38;
}
flag=0;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
ircode=ircode》》1;
}
}
/*******************************************
發(fā)送2位紅外數(shù)據(jù)
*******************************************/
void sendcode_2(void)//前26位系統(tǒng)碼最后兩位
{
uchar i;
for(i=0;i《2;i++)
{
set_count=28;
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
if(ircode&0x01)
{
set_count=120;
}
else
{
set_count=38;
}
flag=0;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
ircode=ircode》》1;
}
}
/*******************************************
發(fā)送紅外數(shù)據(jù)
*******************************************/
void sendcode(void)
{
set_count=575;//發(fā)送9ms 38K紅外光
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
set_count=320;//間隔4.5ms
flag=0;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
ircode=irsys[0];//發(fā)送26位系統(tǒng)碼的前1-8位
sendcode_8();
ircode=irsys[1];//發(fā)送26位系統(tǒng)碼的前9-16位
sendcode_8();
ircode=irsys[2];//發(fā)送26位系統(tǒng)碼的前17-24位
sendcode_8();
ircode=irsys[3];//發(fā)送26位系統(tǒng)碼的前24-26位
sendcode_2();
ircode=irdata;//發(fā)送8位數(shù)據(jù)碼
sendcode_8();
ircode=~irdata; //發(fā)送8位數(shù)據(jù)反碼
sendcode_8();
set_count=28;//發(fā)送0.56ms 38k紅外波(編碼中的0.56ms低電平)
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
ir=1;
delay(23);//延時(shí)23ms(編碼中的23ms高電平)
set_count=575;//發(fā)送9ms 38k紅外波
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
set_count=330;//間隔4.5ms
flag=0;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
set_count=30;//發(fā)送0.56ms 38k紅外波(編碼中的0.56ms低電平)
flag=1;
count=0;
TR0=1;
while(count《set_count);
TR0=0;
ir=1;
}
/*******************************************
定時(shí)器初始化
*******************************************/
void init_timer()
{
EA=1;
TMOD=0X02;//8位自動(dòng)重載模式
ET0=1;
TH0=0XE8;//定時(shí)13us,38K紅外波,晶振22.1184
TL0=0XE8;
}
/*******************************************
主函數(shù)
*******************************************/
void main(void)
{
init_timer();
count=0;
flag=0;
irout=1;
while(1)
{
keyscan();
if(keyflag)//若有新按鍵
{
delay(10);
sendcode();//發(fā)送紅外編碼
delay(500);
keyflag=0;//按鍵標(biāo)志清零
}
}
}
/*******************************************
定時(shí)器中斷
*******************************************/
void timer0(void) interrupt 1
{
count++;
if(flag==1)
{
irout=~irout;
}
else
{
irout=1;
}
ir=irout;
}
***************************************************************************************************
評(píng)論
查看更多