专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
HX1838
2019-07-16 04:01
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
12862
4
1128
想学一下红外的控制,但是不知道怎样编程控制HX1838,有没有这个资料及程序,帮助一下,谢谢!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
lstcspring
2019-07-16 05:07
基于HX1838(HS0038)与STC10F04单片机的红外遥控器的读码程序) //此程序在硬件上测试通过,要弄懂的话就要去看看HT6221的时序图。
//此程序可以将读到的键值,地址码通过串口发送到计算机,上位机可用串口调试助手查看。
///C51的红外解码程序,可以根据需要自己修改:
//2009年9月18日 徐学军作
////////////////////////////
//11.0592Mhz
#include<reg51.h>
//根据自己的接线来改
sbit IRIN = P3^2; //红外接收器数据线
sbit led = P3^7; //指示灯
////////////////////////////////////////////
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0] 低8位地址码
//IRCOM[1] 高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
/////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
uchar IRCOM[4]=0;
bit flag=0;
bit flagcom=0; //串口发送标志
/********************/
void delay014ms(unsigned char x); //x*0.14MS
void IR_init(void);
void delay014ms(unsigned char x) //x*0.14MS STC10F04延时约0.15MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<125; i++) //13
{;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
EA=1;
EX0=1; //允许总中断中断,使能 INT0 外部中断
IT0=1; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
//////////
//解码过程
//////////////
void IR_CODE(void) interrupt 0 //在外部中断子程序中解码
{
unsigned char j,k,N=0;
EX0 = 0;
delay014ms(15);
if (IRIN==1)
{ EX0 =1;
return;
} //确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay014ms(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay014ms(1);}
while (!IRIN) //等 IR 变为高电平
{delay014ms(1);}
while (IRIN) //计算IR高电平时长
{
delay014ms(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补"1"
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败
{
IRCOM[4]=0;
EX0=1;
return;
}
flagcom = 1; //正确解码后,置串口发送标志
flag = !flag;//pro();//解码成功后运行的程序
EX0=1;
return;
}
//主程序
void main(void)
{
unsigned char k;
IR_init( ); //初始化外部中断0
SCON=0x50; //串口 方式 1
TMOD=0x20; //T1 方式 1
TL1=0xfd; //波特率 9600 的常数
TH1=0xfd;
TR1=1; //开定时器1
flag = 0;
while(1)
{
led=flag;
if(flagcom)
{
flagcom = 0;
for(k=0;k<4;k++)
{
SBUF=IRCOM[k]; //串口输出键盘输入的值
while(TI==0); //是否发送完毕
TI=0;
}
}
}
}
加载中...
查看其它4个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//此程序可以将读到的键值,地址码通过串口发送到计算机,上位机可用串口调试助手查看。
///C51的红外解码程序,可以根据需要自己修改:
//2009年9月18日 徐学军作
////////////////////////////
//11.0592Mhz
#include<reg51.h>
//根据自己的接线来改
sbit IRIN = P3^2; //红外接收器数据线
sbit led = P3^7; //指示灯
////////////////////////////////////////////
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0] 低8位地址码
//IRCOM[1] 高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
/////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
uchar IRCOM[4]=0;
bit flag=0;
bit flagcom=0; //串口发送标志
/********************/
void delay014ms(unsigned char x); //x*0.14MS
void IR_init(void);
void delay014ms(unsigned char x) //x*0.14MS STC10F04延时约0.15MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<125; i++) //13
{;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
EA=1;
EX0=1; //允许总中断中断,使能 INT0 外部中断
IT0=1; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
//////////
//解码过程
//////////////
void IR_CODE(void) interrupt 0 //在外部中断子程序中解码
{
unsigned char j,k,N=0;
EX0 = 0;
delay014ms(15);
if (IRIN==1)
{ EX0 =1;
return;
} //确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay014ms(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay014ms(1);}
while (!IRIN) //等 IR 变为高电平
{delay014ms(1);}
while (IRIN) //计算IR高电平时长
{
delay014ms(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补"1"
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败
{
IRCOM[4]=0;
EX0=1;
return;
}
flagcom = 1; //正确解码后,置串口发送标志
flag = !flag;//pro();//解码成功后运行的程序
EX0=1;
return;
}
//主程序
void main(void)
{
unsigned char k;
IR_init( ); //初始化外部中断0
SCON=0x50; //串口 方式 1
TMOD=0x20; //T1 方式 1
TL1=0xfd; //波特率 9600 的常数
TH1=0xfd;
TR1=1; //开定时器1
flag = 0;
while(1)
{
led=flag;
if(flagcom)
{
flagcom = 0;
for(k=0;k<4;k++)
{
SBUF=IRCOM[k]; //串口输出键盘输入的值
while(TI==0); //是否发送完毕
TI=0;
}
}
}
}
一周热门 更多>