登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
使用P87LPC762单片机处理红外控制信号
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
使用P87LPC762单片机处理红外控制信号
[复制链接]
3334
0
ad***
管理员
发表于 2010-5-24 23:18:06
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
Philips公司推出的51LPC系列
单片机
P87LPC762具有速度快可靠性高的特点在相同工作频率下指令处理速度
是标准51的两倍内建的看门狗可以有效防止程序飞跑该系列单片机的详细情况可到
http://www.zlgmcu.com/
查询这
里详细介绍它在红外控制中的一个应用
红外控制系统中的红外发送电路采用NB9148它是用作通用红外遥控发射器的CMOS大规模集成电路与NB9149
相配可完成10个功能控制与NB9150相配可完成18个功能控制可发射的指令达75个其中63个是连续指令可多
键组合12个是单发指令只能单键使用
一NB9148简介
1主要特点
源电压范围较宽2.2V-5.5V
MOS工艺保证了极低的功耗
多键组合
围元件少
位与其它模式兼容
需外接LC或陶瓷振荡器即产生振荡
2内部结构如下图所示
3电路外形图如下
4极限参数表Ta=25摄氏度)
5电参数表(VDD=3V,Ta=25,另有说明外)
6各管脚功能描述
7内部结构主要部分功能描述
振荡电路
内含CMOS反相器及自偏置电阻外接陶瓷振荡器或LC串联谐振回路即可组成振荡器当振荡频率设定为455kHz时则
发射载波频率为38kHz只有当按键操作时才会产生振荡以此降低功耗
键输入
通过K1~K6输入和T1~T3的时序输出可连接6 3键盘矩阵在T1这一列内的6个键图中1~6号键可以任意多键组合
成63个状态输出连续发射处于T2和T3这两列的键图中7~18号键均只能单键使用且每按一次只能发射一组控
制脉冲若一列上的数键同时按下其优先次序为K1 K2 K3 K4 K5 K6在同一K线上的键无多键功能若同时按
下数键其优先次序为T1 T2 T3
8典型应用线路如下
9发送命令格式
发送命令由12位码组成其中C1-C3是用户码用来确定不同的模式每种组合有三个状态01 10和11而00
状态
不用H S1和S2是代表连续发送或单次发送的码D1~D6是发送的数据码
10键与码的关系
11发送波形
(1)0与1的识别
正脉冲的占空比为1/4时代表0正脉冲的占空比为3/4时代表1
(2)载波
无论是0还是1它们被发射时正脉冲是被调制在38kHz振荡频率为455kHz时的载波上载波的占空
比为1/3这样有利于减小功耗
(3)基本发送波形
每个发送周期按C1 C2 C3 H S1 S2 D1 D2 D3 D4 D5 D6的次序串行发送总长度为48a其中a
等于每个码周期的1/4其计算方法是a=1/fosc 192秒
(4)单发信号
凡是按下单发键时输出码只发送两个周期
二接收处理电路
控制系统不采用与其配套的接收电路采用通用的红外接受器接受到调制后的方波脉冲序列然后由P87LPC762处
理并进行相应的控制这种方案与采用配套电路的方案相比具有成本低处理灵活多变实时控制性能佳等的诸多优点
P87LPC762的电源采用5V由一个红外接受器接受到由NB9148发出的经过检波去除38kHz载波后的高电平为5V
的方波信号下面是一个三端通用红外接受器的内部线路示意图内部包含对接收信号进行整形的斯密特触发器
输出信号送到单片机的INT1输入口由P87LPC762解码并实施相应的操作
接受信号编码的判断根据9148的编码规则从编码表中可以看出接受到的12位编码中最后6位只有一个1每个循
环组成一个编码组这样每组有6个指令码第一组1 6是连续发送的编码7 12是第一组单发编码13 18则是第
二组单发编码具体实施控制的其它外围电路可以根据大家的需要自己添加下面介绍P87LPC762中的
C51
处理程序
可在Keil C51 6.0以上版本中编译晶振采用11.0592Mc工作在每个机器周期6时钟的快速状态
#include<REG768.H>/*Philips 87LPC768寄存器定义头文件*/
#define REDINT 0x06/*红外线间隔*/
/*存放消息标志的可位寻址字节Message,Message=NULL时无任消息*/
unsigned char bdata Message;
/*在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失.*/
sbit RedMsg=Message^0;/*红外遥控消息*/
sbit RedRead=Message^1;/*位接收过程标志*/
sbit RedBit=Message^2;/*接收到的位值*/
sbit RSend=Message^3;/*红外接收中重新发送标志*/
/*存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit*/
unsigned char bdata RedDataL,RedDataH;
/*RedDataH字节低6位代表指令只有一个1 C1-C3是用户码H表示连续S1 S2分别表示第一二组单发*/
sbit RedData0=RedDataL^4;/*C1*/
sbit RedData1=RedDataL^5;/*C2*/
sbit RedData2=RedDataL^6;/*C3*/
sbit RedData3=RedDataL^7;/*H*/
sbit RedData11=RedDataH^0;/*D6*/
sbit RedData10=RedDataH^1;/*D5*/
sbit RedData9=RedDataH^2;/*D4*/
sbit RedData8=RedDataH^3;/*D3*/
sbit RedData7=RedDataH^4;/*D2*/
sbit RedData6=RedDataH^5;/*D1*/
sbit RedData5=RedDataH^6;/*S2*/
sbit RedData4=RedDataH^7;/*S1*/
unsigned char bdata State;/*状态字节*/
sbit RedControl=State^6;/*遥控状态*/
/*定时器T00的高位定时参数为Timer定时256*Timer+(80--336)个周期共139Timer+(43--182)us<37ms定时器T01
的高位定时节参数为nTimer定时256*nTimer+(24--280)个周期139nTimer+(13--152)us<9.1s,RedCon存放红外接收时的载
波计数*/
unsigned char data RedCon,Timer;
unsigned int nTimer;/*定时整型参数*/
void main()
{
IEN0=0x14;/*只打开INT1中断*/
WDRST=0x1E;/*看门狗清0*/
WDRST=0xE1;
WDCON=0x12;/*40-90ms看门狗(>最大延时37ms)*/
TCON=0x40;/*定时器1开始工作,INT1低电平触发*/
TMOD=0x23;/*定时器0扩展成两个8位定时器T00和T01用于同步控制*/
if((WDCON&0x30)!=0x30){/*看门狗陷阱复位时无需初始化*/
Message=0;/*无消息*/
State=0;/*正常复位无任何状态*/
}
while(1){/*消息循环*/
WDRST=0x1E;/*看门狗清0*/
WDRST=0xE1;
EX1=RedControl;/*设置遥控中断INT1*/
if(RedMsg){/*执行遥控指令*/
EX1=0;/*在指令没有处理完之前不能重复中断*/
switch(RedDataH){/*这里加入红外指令的控制过程*/
case 0x82:/*Channel 1*/
break;
case 0xA0:/*Channel 2*/
break;
/*……*/
}
EX1=1;
RedDataL=0;/*复位红外数据*/
RedDataH=0;/*复位红外数据*/
RedMsg=0;}/*复位红外遥控消息*/
}
}
void Count0(void)interrupt 1 using 3
{/*定时器T00中断,最大定时37ms*/
if(Timer!=0){/*检测定时器T00的扩展高位*/
Timer--;
return;}
}
/*INT1用于红外解码状态遥控解码数据处理,nTimer=1定时152--291us*/
void Inte1()interrupt 2 using 2
{
for(nTimer=8;nTimer>1;nTimer--);/*使处理周期达到51机器周期=27.7us使得RedCon<32*/
if(RedRead)RedCon++;/*0信号宽度a=420us,1信号宽度a=1260us,周期4a=1680us*/
else{/*开始计数或者重新发送时开始计数*/
RedBit=0;/*复位接收位*/
RedCon=0;/*复位载波计数*/
RedRead=1;/*置位位接收标志*/
if(!ET1){/*首次接收时没有启动定时器T01接收第一个位*/
TF1=0;/*复位定时器T01益出标志*/
ET1=1;/*启动T01定时*/
RedDataL=0;/*复位红外数据*/
RedDataH=0;/*复位红外数据*/
RSend=0;}/*复位重新发送标志*/
}
}
void Count1(void)interrupt 3 using 3
{/*定时器T01中断,最大定时9.1s*/
if(nTimer!=0){/*检测定时器T01的扩展高位*/
nTimer--;
return;}
ET1=0;/*关闭T01定时*/
if(RedRead){/*红外接收状态*/
if((RedDataL&0xF)==12){/*第一阶段接收已经结束*/
RSend=1;/*置位重新发送标志以便校验*/
RedDataL&=0xF0;}/*复位位指针以便校验*/
if(RedCon>27-REDINT&&RedCon<27+REDINT)RedBit=1;
else RedBit=0;/*低电平计数9表示0 27表示1*/
if(RSend){/*检验重复发送的数据是否与第一次符合*/
switch(RedDataL&0xF){
case 0:/*检验重复发送的第1位数据*/
if(RedBit!=RedData0)goto RClear;
break;
case 1:/*检验重复发送的第2位数据*/
if(RedBit!=RedData1)goto RClear;
break;
case 2:/*检验重复发送的第3位数据*/
if(RedBit!=RedData2)goto RClear;
break;
case 3:/*检验重复发送的第4位数据*/
if(RedBit!=RedData3)goto RClear;
break;
case 4:/*检验重复发送的第5位数据*/
if(RedBit!=RedData4)goto RClear;
break;
case 5:/*检验重复发送的第6位数据*/
if(RedBit!=RedData5)goto RClear;
break;
case 6:/*检验重复发送的第7位数据*/
if(RedBit!=RedData6)goto RClear;
break;
case 7:/*检验重复发送的第8位数据*/
if(RedBit!=RedData7)goto RClear;
break;
case 8:/*检验重复发送的第9位数据*/
if(RedBit!=RedData8)goto RClear;
break;
case 9:/*检验重复发送的第10位数据*/
if(RedBit!=RedData9)goto RClear;
break;
case 10:/*检验重复发送的第11位数据*/
if(RedBit!=RedData10)goto RClear;
break;
case 11:/*检验重复发送的第12位数据*/
if(RedBit!=RedData11)goto RClear;
RedMsg=1;/*接受到经过检验正确的编码后置位遥控消息*/
RedBit=0;/*复位接收位*/
RSend=0;/*复位重新发送标志*/
RedRead=0;/*复位接收过程标志*/
RedCon=0;/*复位载波计数*/
return;
default:/*重复发送的数据多于12位时判断为错误*/
goto RClear;
}
}
else{
switch(RedDataL&0xF){
case 0:/*保存首次发送的第1位数据*/
RedData0=RedBit;
break;
case 1:/*保存首次发送的第2位数据*/
RedData1=RedBit;
break;
case 2:/*保存首次发送的第3位数据*/
RedData2=RedBit;
break;
case 3:/*保存首次发送的第4位数据*/
RedData3=RedBit;
break;
case 4:/*保存首次发送的第5位数据*/
RedData4=RedBit;
break;
case 5:/*保存首次发送的第6位数据*/
RedData5=RedBit;
break;
case 6:/*保存首次发送的第7位数据*/
RedData6=RedBit;
break;
case 7:/*保存首次发送的第8位数据*/
RedData7=RedBit;
break;
case 8:/*保存首次发送的第9位数据*/
RedData8=RedBit;
break;
case 9:/*保存首次发送的第10位数据*/
RedData9=RedBit;
break;
case 10:/*保存首次发送的第11位数据*/
RedData10=RedBit;
break;
case 11:/*保存首次发送的第12位数据*/
RedData11=RedBit;
break;
default:/*首次发送的数据多于12位时判断为错误*/
goto RClear;
}
}
RedDataL++;/*位位移加1*/
RedBit=0;/*复位接收位*/
RedRead=0;/*复位接收过程标志*/
RedCon=0;/*复位载波计数*/
nTimer=423;/*用定时140a检测同步信号208a*/
TF1=0;/*复位定时器T01益出标志*/
ET1=1;}/*启动定时器*/
else if(RSend){/*在位接收没有结束时发生定时中断需要复位接收信息(同步)*/
RClear:
RedDataL=0;/*复位红外数据*/
RedDataH=0;/*复位红外数据*/
RedBit=0;/*复位接收位*/
RedRead=0;/*复位接收过程标志*/
RSend=0;/*复位重新发送标志*/
RedCon=0;/*复位载波计数*/
ET1=0;/*关闭T01定时*/
}
}
复制代码
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
产品品牌:永嘉微电/VINKA 产品型号:VK0192 封装形式:LQFP44 概述 VK0192是一
不用电池收音机中锗三极管的替代
图中的检波二极管已找到贴片器件,图中的锗三极管能否使用贴片替换?
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
产品品牌:永嘉微电/VINKA 产品型号:VK1088B 封装形式:QFN32L 概述 VK1088B是
LCD液晶驱动/点阵段码屏驱动芯片VK1072D SS
产品品牌:永嘉微电/VINKA 产品型号:VK1072D 封装形式:SSOP28 概述 VK1072D
VK1072C SOP28/3线串行接口LCD液晶显示驱动
产品品牌:永嘉微电/VINKA 产品型号:VK1072C 封装形式:SOP28 概述 VK1072C是
更多
精华推荐
51单片机的智能反汇编工具
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
不用电池收音机中锗三极管的替代
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
LCD液晶驱动/点阵段码屏驱动芯片VK1072D SS
VK1072C SOP28/3线串行接口LCD液晶显示驱动
AP8100 外围简单的 BOOST 升压恒压控制驱动
AP510X 单路低压差线性恒流芯片 LED手电筒
更多
社区学堂
工控仪表液晶驱动VK0192 LQFP44/点阵LC
不用电池收音机中锗三极管的替代
工控仪表液晶驱动VK0192 LQFP44/点阵LCD液
产品品牌:永嘉微电/VINKA 产品型号:VK0192 封装形式:LQFP44 概述 VK0192是一
不用电池收音机中锗三极管的替代
图中的检波二极管已找到贴片器件,图中的锗三极管能否使用贴片替换?
小封装液晶驱动VK1088B QFN32L点阵LCD液晶
产品品牌:永嘉微电/VINKA 产品型号:VK1088B 封装形式:QFN32L 概述 VK1088B是
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表