/*********************************************************************/
// remote.c
// 学习型遥控器
// LRM 2004.10.12
/*********************************************************************/
//使用AT89C52
单片机,12MHZ晶振,
//
//#pragma src(E:
emote.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++) //120个机器指令
;
}
//
//
/***********初始化函数**********/
cle
ARMen()
{
studylamp=0; //关学习灯
lamp=0; //关发射指示
remoteout=0; //关遥控输出
remotein=1; //遥控信号输入口 置高电平?
for(i=0;i<206;i++) //清内存
{remotedata
=0x00;}
IE=0x00;
IP=0x01;
TMOD=0x22; //8位自动重装模式
PCON=0X00;
TH1=0xf3; //40KHZ初值
TL1=0xf3;
IT0=1;
EX0=1; //外中断允许
EA=1; //开总中断
}
//
//
/**********发射函数************/
//=========================================================================
//======================================================================
//========问题:为什么接收的时候是15个nop,发射的时候才9个nop,而且偶数不延时??===============
//=========================================================================
//===========================================================================
keywork()
{
if(txkey==0) //发射键被按下
{
while(txkey==0); //等待键释放
ET1=1;TR1=1; //发起始位
for(i=head;i>0;i--){;} //起始位head
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_();} //9个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 //studykey学习键(中断口) P3^2
{
ET1=0;TR1=0;
EX0=0;EA=0;
head=0; //初始位初始化
studylamp=1; //开学习指示灯
lamp=0; //关发射指示
while(studykey==0); //等待键释放
while(remotein==1); //等待遥控码输入 //遥控信号输入口 出现低电平往下进行remotein==0
head=0; //读入起始位
//=========================================================================
//======================================================================
//========问题:为什么接收的时候是15个nop,发射的时候才9个nop,而且偶数不延时??===============
//=========================================================================
//===========================================================================
while(remotein==0)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
head++;
}
//remotein==1;
n=0;
remdata=0x0000;
while(1)
{
while(remotein==1)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //15个nop
remdata++; //remdata高电平脉宽数据
}
if(remdata>m) //高电平>5毫秒退出 m=255
{
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; //学习指示灯灭
}
//
//*********************结束**************************//
一周热门 更多>