专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
红外接收
2019-03-25 18:43
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
PIC单片机
9205
8
949
PIC16F616或者PIC16F722 怎么写红外接收译码程序
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
邱海涛qht
2019-03-26 19:55
#define TIME 125 //定时器定时时间
#define IR_sample TIME //定义采样时间
#define IR_SYNC_MAX (15000/IR_sample)//120 //前导码最大时间(9ms+4.5ms=13.5ms)
#define IR_SYNC_MIN (9700 /IR_sample)//77 //前导码最小时间(连发9ms+2.25ms=11.25ms)
#define IR_SYNC_DIVIDE (12375/IR_sample)//99 //区分连发前导码((11.25+(13.5-11.25))/2=12.375ms)
#define IR_DATA_MAX (3000 /IR_sample)//24 //数据最大时间3ms
#define IR_DATA_MIN (600 /IR_sample)//4 //数据最小时间0.6ms
#define IR_DATA_DIVIDE (1687 /IR_sample)//13 //区分0和1数据,(1.12+(2.25-1.12)/2)=1.685ms
#define IR_BIT_NUMBER 32 //32位数据
#define User_code 0x0cf3
uchar IR_SampleCnt,IR_BitCnt,IR_UserH,IR_UserL,IR_data,IR_DataShit,IR_code,D_F0;
bit bdata Ir_Pin_temp,IR_Sync,IrUserErr,IR_OK;
void IR_RX_HT6121()
{
uchar SampleTimer; //信号周期
IR_SampleCnt++; //定时器对红外口检测次数
D_F0 = Ir_Pin_temp; //保存前一次扫描到的端口电平状态
Ir_Pin_temp = p_reg;//Ir_pin; //读取当前端口电平状态
if(D_F0 && !Ir_Pin_temp) //判断是否触发
{
SampleTimer = IR_SampleCnt; //记录脉冲周期
IR_SampleCnt = 0; //清零计数值
if(SampleTimer > IR_SYNC_MAX) IR_Sync=0;//超出最大前导信号,退出
else if(SampleTimer >= IR_SYNC_MIN)
{
if(SampleTimer >= IR_SYNC_DIVIDE) //区分连发信号与同步信号
{
IR_Sync = 1; //接收到有效同步信号
IR_BitCnt = IR_BIT_NUMBER; //赋值32位有用信号
}
}
else if(IR_Sync) //已接收到同步信号
{
if((SampleTimer < IR_DATA_MIN)|(SampleTimer > IR_DATA_MAX)) IR_Sync=0;//数据周期过长,退出
else
{
IR_DataShit >>= 1; //键反码右移一位(发送端是低位在前,高位在后格式)
if(SampleTimer >= IR_DATA_DIVIDE) IR_DataShit |= 0x80; //区分0和1
if(--IR_BitCnt==0) //所有数据接收完毕
{
IR_Sync = 0; //清除同步信号标志
if(~IR_DataShit == IR_data) //判断数据正反码
{
if((IR_UserH == (User_code / 256))&&(IR_UserL == (User_code%256)))
{
IrUserErr = 0; //判断用户码正确
}
else
IrUserErr = 1; //判断用户码错误
//IR_code = IR_data;
d_rem_key = IR_data; //取键码值
//Set_buz(5);//测试
IR_OK = 1; //键码值有效标志
}
}
else if((IR_BitCnt & 7)==0) //数据倒序
{
IR_UserL = IR_UserH; // 保存用户码高字节
IR_UserH = IR_data; // 保存用户码低字节
IR_data = IR_DataShit; // 保存当前红外字节
}
}
}
}
}
用定时器定时125us,然后在中断子程序中调用这个函数就好
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
单片机程序必知的几个寄存器
0个评论
单片机 矩阵式按键
0个评论
51单片机上移植C语言的printf()
0个评论
STC89C52MCU--软件实现系统复位
0个评论
单片机C语言程序该这样写!不是教科书上教的那样!转[]
0个评论
单片机并行I/O口(P0)硬件结构
0个评论
壹:单片机的内部资源
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#define IR_sample TIME //定义采样时间
#define IR_SYNC_MAX (15000/IR_sample)//120 //前导码最大时间(9ms+4.5ms=13.5ms)
#define IR_SYNC_MIN (9700 /IR_sample)//77 //前导码最小时间(连发9ms+2.25ms=11.25ms)
#define IR_SYNC_DIVIDE (12375/IR_sample)//99 //区分连发前导码((11.25+(13.5-11.25))/2=12.375ms)
#define IR_DATA_MAX (3000 /IR_sample)//24 //数据最大时间3ms
#define IR_DATA_MIN (600 /IR_sample)//4 //数据最小时间0.6ms
#define IR_DATA_DIVIDE (1687 /IR_sample)//13 //区分0和1数据,(1.12+(2.25-1.12)/2)=1.685ms
#define IR_BIT_NUMBER 32 //32位数据
#define User_code 0x0cf3
uchar IR_SampleCnt,IR_BitCnt,IR_UserH,IR_UserL,IR_data,IR_DataShit,IR_code,D_F0;
bit bdata Ir_Pin_temp,IR_Sync,IrUserErr,IR_OK;
void IR_RX_HT6121()
{
uchar SampleTimer; //信号周期
IR_SampleCnt++; //定时器对红外口检测次数
D_F0 = Ir_Pin_temp; //保存前一次扫描到的端口电平状态
Ir_Pin_temp = p_reg;//Ir_pin; //读取当前端口电平状态
if(D_F0 && !Ir_Pin_temp) //判断是否触发
{
SampleTimer = IR_SampleCnt; //记录脉冲周期
IR_SampleCnt = 0; //清零计数值
if(SampleTimer > IR_SYNC_MAX) IR_Sync=0;//超出最大前导信号,退出
else if(SampleTimer >= IR_SYNC_MIN)
{
if(SampleTimer >= IR_SYNC_DIVIDE) //区分连发信号与同步信号
{
IR_Sync = 1; //接收到有效同步信号
IR_BitCnt = IR_BIT_NUMBER; //赋值32位有用信号
}
}
else if(IR_Sync) //已接收到同步信号
{
if((SampleTimer < IR_DATA_MIN)|(SampleTimer > IR_DATA_MAX)) IR_Sync=0;//数据周期过长,退出
else
{
IR_DataShit >>= 1; //键反码右移一位(发送端是低位在前,高位在后格式)
if(SampleTimer >= IR_DATA_DIVIDE) IR_DataShit |= 0x80; //区分0和1
if(--IR_BitCnt==0) //所有数据接收完毕
{
IR_Sync = 0; //清除同步信号标志
if(~IR_DataShit == IR_data) //判断数据正反码
{
if((IR_UserH == (User_code / 256))&&(IR_UserL == (User_code%256)))
{
IrUserErr = 0; //判断用户码正确
}
else
IrUserErr = 1; //判断用户码错误
//IR_code = IR_data;
d_rem_key = IR_data; //取键码值
//Set_buz(5);//测试
IR_OK = 1; //键码值有效标志
}
}
else if((IR_BitCnt & 7)==0) //数据倒序
{
IR_UserL = IR_UserH; // 保存用户码高字节
IR_UserH = IR_data; // 保存用户码低字节
IR_data = IR_DataShit; // 保存当前红外字节
}
}
}
}
}
用定时器定时125us,然后在中断子程序中调用这个函数就好
一周热门 更多>