📄 c_redread.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define clr_bit(x,y) (x&=~(1<<y))
#define set_bit(x,y) (x|=(1<<y))
/*---------------------------------变量列表-----------------------------------*/
uchar key;
sbit P3_2=P3^2; //中断
sbit P1_0=P1^0; //蜂鸣器
uchar code keytab_1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89};//H: 0x89;//L: 0x87;//P: 0x8a;//Q: 0X98;
uchar code keytab_2[]={0xef,0xdf,0xbf,0x7f};
/*---------------------------------函数列表-----------------------------------*/
void init(void); //初始化子程序
void Delay_us(int N); //delay 16*N+24;
void INT0_intrupt(); //中断处理子程序(解码程序)
/*-----------------------------主程序入口-------------------------------------*/
void main(void)
{
init();
while(1)
{
switch(key)
{
case 0: P2=0XFE;break;
case 1: P2=0XFD;break;
case 2: P2=0XFB;break;
case 3: P2=0XF7;break;
case 4: P2=0XEF;break;
case 5: P2=0XDF;break;
case 6: P2=0XBF;break;
case 7: P2=0X7F;break;
default: P2=0xff;
}
}
}
/*--------------------------外部中断0子程序(解码程序)--------------------------*/
void INT0_intrupt(void) interrupt 0 using 1
{ bit BitState; //定时结束标志位
uchar RedCode=0,_RedCode=0,i=0; //操作码和操作反码
EX0=0; //关闭外部0中断
for(i=10;i>0;i--) //重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
{
Delay_us(54); //判断定时结束
if(P3_2==1) //延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
{ EX0=1; //允许外部0中断
return;
}
} //以上完成对遥控信号的9000微秒的初始低电平信号的识别。
while(P3_2==0); //等待高电平避开9毫秒低电平引导脉冲
Delay_us(295); //延时4.74毫秒避开4.5毫秒的结果码
for(i=26;i>0;i--) //忽略前26位系统识别码
{
while(P3_2==0); //等待地址码第一位的高电平信号
Delay_us(54); //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
if(P3_2==1) //P3.2引脚此时的电平状态
{
Delay_us(61); //检测到高电平1的话延时1毫秒等待脉冲高电平结束
}
}
for(i=0;i<16;i++) //接收完8位数据码和8位数据反码,存放在RedCode,_RedCode中
{
while(P3_2==0); //等待地址码第一位的高电平信号
Delay_us(54); //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
BitState=P3_2; //P3.2引脚此时的电平状态
if(P3_2==1) //P3.2引脚此时的电平状态
{
Delay_us(61); //检测到高电平1的话延时1毫秒等待脉冲高电平结束
}
if(i<8)
{
RedCode=RedCode|BitState; //移位
if(i!=7)
RedCode=RedCode<<1;
}
else
{
_RedCode=_RedCode|BitState; //移位
if(i!=15)
_RedCode=_RedCode<<1;
}
}
if(RedCode==(~_RedCode)) //如果不等表示接收数据发生错误,放弃
{
/*--------------------------------字节高低互换-----------------------------------------*/
uchar temp=0;
for(i=0;i<8;i++)
{ if(RedCode&(1<<i))
set_bit(temp,7-i);
else
clr_bit(temp,7-i);
}
key=temp;
/*-------------------------------字节高低互换----------------------------------------*/
}
EX0=1; //允许外部0中断
}
/*---------------------------------初始化子程序--------------------------------*/
void init(void)
{
EA=1; //打开CPU总中断请求
EX0=1; //打开INT0中断请求
IT0=1; //设定INT0的触发方式为脉冲负边沿触发
P1=0xff; //引脚进行初始化,设置成高电平
P1_0=0; //蜂鸣器引脚
key=0; //初始化按键
}
void Delay_us(int N)
{ int i;
for(i=0;i<N;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -