📄 jiemama.c
字号:
//这个解码方式是针对目前最常用的宽度调剂方式编的.
//注意:1.遥控器中红外信号是反相输出的。
#include<STC89C51RC.H>
sbit T2 = P2^0;
void dely(int time) //定义延时函数
{
while(time--)
{
}
}
unsigned char bianma(void)
{
char wei,pm,ma;
int gdp;
pm=0xff;
for (wei=0;wei<8;wei++)
{
while(T2==0);//SBUF=5; //低电平时停住
TH0=0; //进入高电平后开始计时
TL0=0;
TR0=1;
while(T2==1); // SBUF=6;
TR0=0; //进入低电平后计时结束
gdp=TH0*256+TL0; //高电平的时间长度
if ((gdp<2000)&&(gdp>100)) //属于编码长度范围
{ //SBUF=7;
if (gdp>1000) ma=1;
else ma=0;
pm<<=1;
pm+=ma;
}
}
return pm;
}
void fasong(void) interrupt 4 using 2
{ char j;
if(RI) //RI接收中断标志位 当接收到了一信息帧后,RI自动置1,
{ //指示CPU可以读取丰放在接收缓冲器SUBUF中的数据//
RI=0;
j=SBUF;
dely(300);
SBUF=j;
}
if(TI) //发送中断标志 TI自动置1表明当前数据帧已发送毕
{
TI=0;
}
}
main()
{
char thh,tll;
unsigned char jiema1,jiema2,jiema3,jiema4;
int low,high;
TMOD=0X21; // 12M晶体,不能用11.0592
SCON=0X50; //SM1=1,工作方式为1,REN=1,接收允许;其他为0
PCON=0X80; //不加倍
TH1=0XF3; //定时器初值,用于设定波特率
TL1=0XF3; //同上
EA=1; //中断总允许
ES=1; //串行口的中断允许位
ET0=1; //定时器T0中断允许位
PS=1; //串行中断优先值
ET1=1;
TR1=1; //启动定时器1
//unsigned char bianma(void); //函数原型说明
while(1) //解码程序
{
while(T2==1); //SBUF=0Xff; //最开始没信号时为高电平,停住不动
TH0=0; TL0=0; TR0=1; //来信号,进入引导码低电平后开始计时
while(T2==0); //SBUF=4;//停住,计时引导码的低电平
TR0=0; //进入高电平后计时结束
thh=TH0;
tll=TL0;
TH0=0; TL0=0; TR0=1; //进入高电平后开始计时
low=thh*256+tll;
//低电平的时间长度
while(T2==1); // SBUF=8;//停住,计时引导码的高电平
TR0=0; //进入低电平后计时结束
high=TH0*256+TL0; //高电平的时间长度
if ((high>3000)&&(high<6000)&&(low>8000)&&(low<10000))
{ //引导码高低电平符合范围
jiema1=bianma(); //用户码
jiema2=bianma(); //用户反码
jiema3=bianma(); //键码
jiema4=bianma(); //键反码
//向串口输出数据
if((jiema1==~jiema2)&&(jiema3==~jiema4)) SBUF=jiema3;
//else SBUF=0x00;
dely(255);
//j1为0x00,j2为0xff,这里我只输出了键码
//本程序经调试可行!!!!!
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -