/*********************************************************************/
// remote.c
// 学习型遥控器
// LRM 2004.10.12
/*********************************************************************/
//使用AT89C52单片机,12MHZ晶振,
//
#pragma src(E:\remote.asm)
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
//
#define char unsigned char
#define int unsigned int
//
sbit studylamp=P1^6; //学习状态指示灯
sbit lamp=P1^7; //发射指示灯
sbit studykey=P3^2; //学习键(中断口)
sbit remotein=P3^4; //遥控信号输入口
sbit remoteout=P3^5; // 遥控输出口
sbit txkey=P1^0 ; //发射键
//
//
int i,j,m=255,n,k,s;
char idata remotedata[206];//存肪冲宽度数据用
int head; //存起始位用
int remdata;
//
//
////
/*********1毫秒延时程序**********/
delay1ms(int t)
{
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
//
//
/***********初始化函数**********/
clearmen()
{
studylamp=0; //关学习灯
lamp=0; //关发射指示
remoteout=0; //关遥控输出
remotein=1; //
for(i=0;i<206;i++) //清内存
{remotedata[i]=0x00;}
IE=0x00;
IP=0x01;
TMOD=0x22; //8位自动重装模式
PCON=0X00;
TH1=0xf3; //40KHZ初值
TL1=0xf3;
IT0=1;
EX0=1; //外中断允许
EA=1; //开总中断
}
//
//
/**********键功能函数************/
keywork()
{
if(txkey==0)
{
while(txkey==0); //等待键释放
ET1=1;TR1=1; //发起始位
for(i=head;i>0;i--){;}
remoteout=0;ET1=0;TR1=0;
n=0;
while(1)
{
if(remotedata[n]==0x00){delay1ms(10);break;}//数据为0结束
for(i=remotedata[n];i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
lamp=~lamp;n++;//偶地址不发脉冲
//
ET1=1;TR1=1; //奇地址发调制脉冲
for(i=remotedata[n];i>0;i--){;}
remoteout=0;ET1=0;TR1=0;n++;
}
}
}
//
//
/***********主函数***************/
main()
{
clearmen(); //初始化
while(1)
{
keywork(); //按键扫描
}
}
//
//
/*********40KHZ发生器***********/
//定时中断T1
void time_intt1(void) interrupt 3
{
remoteout=~remoteout;
}
//
//
/***********学习函数 ***********/
//外中断0
void intt0(void) interrupt 0
{
ET1=0;TR1=0;EX0=0;EA=0;
head=0;studylamp=1;lamp=0;
while(studykey==0); //等待键释放
while(remotein==1); //等待遥控码输入
head=0; //读入起始位
while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();head++;}
n=0;remdata=0x0000;
while(1)
{
while(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}
if(remdata>m) //高电平>5毫秒退出
{remotedata[n]=0x00;EX0=1;EA=1;goto end;}
remotedata[n]=remdata;n++; //存高电平脉宽数据
remdata=0x0000; //脉宽计数器清零
while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;} //低电平计数
remotedata[n]=remdata;n++;remdata=0x00;//存低电平脉宽数据
}
end: lamp=1;studylamp=0;
}
//
//*********************结束**************************//