专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
家用遥控器的解码过程?
2019-03-24 19:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
11232
1
1378
一体化接收头是不是接收数据以后会将数据反向?也就是说0的高电平持续时间长,而1的高电平持续时间变为短,还有就是,接收到的数据分哪几部分,是不是先是引导码,然后数据,最后停止码,结束码是啥?是不是也就是停止?如果一直按着按键数据会怎样?如何检测按键抬起,菜鸟求解, 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
love小飞象
1楼-- · 2019-03-25 03:48
/******************************************/
/*红外遥控解码程序 */
/******************************************/
#include<reg52.h>
/******************************************/
/*端口定义 */
/******************************************/
sbit p32=P3 ^ 2;
/******************************************/
/*定时器1初始化 */
/******************************************/
void T1_INIT()
{
TMOD |= 0X10;
}
/******************************************/
/*稍小于9ms延时 */
/******************************************/
void delay9ms()
{
TH1 = (65535 - 8700) >> 8;
TL1 = (65535 - 8700) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*稍大于4.5ms延时,与9ms相加稍大于13.5ms */
/******************************************/
void delay5ms()
{
TH1 = (65535 - 5000) >> 8;
TL1 = (65535 - 5000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*1ms延时 */
/******************************************/
void delay1ms()
{
TH1 = (65535 - 1000) >> 8;
TL1 = (65535 - 1000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*外部中断0初始化 */
/******************************************/
void IT0_INIT()
{
IT0 = 1; //外中断0,下降沿触发
EX0 = 1; //允许外中断0,外部中断0接收数据
}
/******************************************/
/*外部中断0处理程序 */
/******************************************/
void IT0_ISR() interrupt 0 using 2
{
unsigned char a,b;
unsigned char table[4] = {0,0,0,0};
EX0 = 0; //关外中断0,开始解码
delay9ms();
if(p32) //9ms内出现高电平,干扰信号
goto end;
if(!p32) //9ms内一直为低电平,执行解码
{
delay5ms(); //再延时5ms与9ms相加,跳过引导码,下一步解用户码及数据码
for(a=0;a<4;a++)
{ for(b=0;b<8;b++)
{
while(!p32); //等待高电平到来
delay1ms(); //延时1ms(时间在0.56ms和1.69ms)之间即可,判断是0还是1
if(p32) //为1
{
table[a] >>= 1; //写1
table[a] |= 0x80;
delay1ms(); //延时1ms,等待高电平结束
}
else //为0
{
table[a] >>= 1; //写0
table[a] |= 0x00;
}
}
}
IR_DATA = table[3]; //提取最后一字节作为按键区分标志
}
end: EX0 = 1; //解码结束,开外中断0
}
加载中...
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/*红外遥控解码程序 */
/******************************************/
#include<reg52.h>
/******************************************/
/*端口定义 */
/******************************************/
sbit p32=P3 ^ 2;
/******************************************/
/*定时器1初始化 */
/******************************************/
void T1_INIT()
{
TMOD |= 0X10;
}
/******************************************/
/*稍小于9ms延时 */
/******************************************/
void delay9ms()
{
TH1 = (65535 - 8700) >> 8;
TL1 = (65535 - 8700) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*稍大于4.5ms延时,与9ms相加稍大于13.5ms */
/******************************************/
void delay5ms()
{
TH1 = (65535 - 5000) >> 8;
TL1 = (65535 - 5000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*1ms延时 */
/******************************************/
void delay1ms()
{
TH1 = (65535 - 1000) >> 8;
TL1 = (65535 - 1000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*外部中断0初始化 */
/******************************************/
void IT0_INIT()
{
IT0 = 1; //外中断0,下降沿触发
EX0 = 1; //允许外中断0,外部中断0接收数据
}
/******************************************/
/*外部中断0处理程序 */
/******************************************/
void IT0_ISR() interrupt 0 using 2
{
unsigned char a,b;
unsigned char table[4] = {0,0,0,0};
EX0 = 0; //关外中断0,开始解码
delay9ms();
if(p32) //9ms内出现高电平,干扰信号
goto end;
if(!p32) //9ms内一直为低电平,执行解码
{
delay5ms(); //再延时5ms与9ms相加,跳过引导码,下一步解用户码及数据码
for(a=0;a<4;a++)
{ for(b=0;b<8;b++)
{
while(!p32); //等待高电平到来
delay1ms(); //延时1ms(时间在0.56ms和1.69ms)之间即可,判断是0还是1
if(p32) //为1
{
table[a] >>= 1; //写1
table[a] |= 0x80;
delay1ms(); //延时1ms,等待高电平结束
}
else //为0
{
table[a] >>= 1; //写0
table[a] |= 0x00;
}
}
}
IR_DATA = table[3]; //提取最后一字节作为按键区分标志
}
end: EX0 = 1; //解码结束,开外中断0
}
一周热门 更多>