📄 hongwai.c
字号:
//此程序用来显示红外遥控的键码值 包括8位系统识别码及其反码 8位数据码及其反码
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar TH0_BUF=0; //定义定时器时间缓冲
uchar TL0_BUF=0;
uchar INT0_TIMES=0; //定义中断次数
uchar RCV_NUM=0; //接收的数据是第几位
uint RH_CODE=0; //定义接收码高位
uint RL_CODE=0; //定义接收码低位
bit START_FLAG=0; //定义接收数据开始标志位
bit RCV_BIT_FLAG=0; //定义位接收标志位 1 表示接收成功
bit RCV_SUS_FLAG=0; //定义字接收标志位 1 表示接收成功
char code disp[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0x30,0x25,0x67,0x23,0x64,0x74};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
//char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x8e,0xff,0x00};
// 0 1 2 3 4 5 6 7 8 9 - f 空 显
char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0; //显示缓冲 其中i0为虚拟位
delay(uint t)
{ char a;
while(t--)
for(a=100;a>0;a--); }
void initial(void)
{ TMOD=0x01;
IT0=1; //外部中断0采用高到低的跳变有效
IE=0x81; //开外部中断0
TH0=0;
TL0=0;
TR0=0;
START_FLAG=0;
TH0_BUF=0; //定义定时器时间缓冲
TL0_BUF=0;
INT0_TIMES=0; //定义中断次数
RCV_NUM=0; //接收的数据是第几位
RH_CODE=0; //定义接收码高位
RL_CODE=0; //定义接收码低位
START_FLAG=0; //定义接收数据开始标志位
RCV_BIT_FLAG=0; //定义位接收标志位 1 表示接收成功
RCV_SUS_FLAG=0; //定义字接收标志位 1 表示接收成功
}
display(t)
{while(t--)
{P0=disp[i8];
P2=0x7f;
delay(1);
P2=0xff;
P0=disp[i7];
P2=0xbf;
delay(1);
P2=0xff;
P0=disp[i6];
P2=0xdf;
delay(1);
P2=0xff;
P0=disp[i5];
P2=0xef;
delay(1);
P2=0xff;
P0=disp[i4];
P2=0xf7;
delay(1);
P2=0xff;
P0=disp[i3];
P2=0xfb;
delay(1);
P2=0xff;
P0=disp[i2];
P2=0xfd;
delay(1);
P2=0xff;
P0=disp[i1];
P2=0xfe;
delay(1);
P2=0xff;} }
void RCV_SUS(void)
{
i8=RH_CODE/4096%16;i7=RH_CODE/256%16;i6=RH_CODE/16%16;i5=RH_CODE%16;
i4=RL_CODE/4096%16;i3=RL_CODE/256%16;i2=RL_CODE/16%16;i1=RL_CODE%16;
initial();
}
void RCV_BIT(void)
{ uint time0=TH0_BUF*256+TL0_BUF;
uint KEY_BIT; //当前的键值 为0或1
if(START_FLAG==0)
{ if( time0>12000 && time0<15000 )
{ START_FLAG=1; } //开始
}
else if(START_FLAG==1)
{
if( time0> 2000 && time0<2400 ) KEY_BIT=0x8000;
else if( time0> 900 && time0<1300 ) KEY_BIT=0;
else KEY_BIT=0;
if(RCV_NUM<16)
{ RH_CODE=RH_CODE>>1;
RH_CODE^=KEY_BIT; }
else
{ RL_CODE=RL_CODE>>1;
RL_CODE^=KEY_BIT; }
RCV_NUM++;
if(RCV_NUM==32)
{ RCV_NUM=0; RCV_SUS(); }
}
RCV_BIT_FLAG=0; }
main()
{ display(60);
delay(400);
initial();
while(1)
{
display(1); }
}
void ex_input(void) interrupt 0 //外部中断
{
INT0_TIMES++;
if(TR0==0) TR0=1;
else if(TR0==1)
{ TH0_BUF=TH0;
TL0_BUF=TL0;
TH0=0;
TL0=0;
//RCV_BIT_FLAG=1; //置标志位
TR0=1; //开始下一个脉冲的检测
RCV_BIT();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -