串口通信发送红外遥控器解码值.docx
- 文档编号:26398435
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:8
- 大小:16.17KB
串口通信发送红外遥控器解码值.docx
《串口通信发送红外遥控器解码值.docx》由会员分享,可在线阅读,更多相关《串口通信发送红外遥控器解码值.docx(8页珍藏版)》请在冰豆网上搜索。
串口通信发送红外遥控器解码值
串口通信发送红外遥控器解码值
本程序所用的原理图下载:
点这里,单片机芯片使用的stc89c52;找到数码管的原理图即可.这是一整个单片机开发板的电路图其他的忽略.
/**
***********************************************************************************************
*@file
main.c
*@author
xr
*@date
2014年3月31日10:
26:
47
*@version
V1.2.3
*@brief
红外通信NEC协议进行红外遥控器解码显示用户码和键码到数码管上
*@note
单片机STC89C52RCMCU晶振11.0592MHZ
***********************************************************************************************
*/
#include;
//红外输出数据口
sbitIRD=P3^3;//外部中断引脚
bitirflag=0;
unsignedcharircode[4];//接收解码得到的数据
unsignedcharcodeLedTable[]={
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x90,//"9"
0x88,//"A"
0x83,//"B"
0xC6,//"C"
0xA1,//"D"
0x86,//"E"
0x8E
//"F"
};
unsignedcharLedBuff[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//数码管显示缓冲区
unsignedcharthr0,tlr0;
voidConfigTimer0(unsignedintxms);
voidConfigTimer1();
voidmain()
{
ConfigTimer0
(1);//定时1ms
ConfigTimer1();
while
(1)
{
if(irflag)//接收到红外数据,则刷新显示
{
LedBuff[5]=LedTable[ircode[0]>;>;4];//取用户码的高4位字节
LedBuff[4]=LedTable[ircode[0]&0x0F];//取用户码的低四位字节
LedBuff[1]=LedTable[ircode[2]>;>;4];//取键码的高四位
LedBuff[0]=LedTable[ircode[2]&0x0F];//取键码的低四位
}
}
}
/**
*@brief
定时器T0配置
*@param
定时时间xms
*@retval
无
*/
voidConfigTimer0(unsignedintxms)
{
unsignedinttmp;
tmp=65536-xms*11059200/12/1000;
thr0=(unsignedchar)(tmp>;>;8);
tlr0=(unsignedchar)(tmp&0x00FF);
TMOD&=0xF0;
TMOD|=0x01;//T0方式1
TH0=thr0;
TL0=tlr0;
TR0=1;
EA=1;
ET0=1;
//设置定时器T0的中断优先级高于外部中断的优先级
//IP中断优先级寄存器PT2PSPT1PX1PT0PX0
PT0=1;//提高T0的优先级,优先进行数码管刷新,消除数码管显示抖动
}
/**
*@brief
数码管刷新
*@param
无
*@retval
无
*/
voidrefresh()
{
staticunsignedcharj=0;
P0=0xFF;//消隐
P1=(0x08|j);//00001ADDR2ADDR1ADDR0
P0=LedBuff[j++];
if(j>;=6)
j=0;
}
/**
*@brief
T0中断服务
*@param
无
*@retval
无
*/
voidTimer0_ISP()interrupt1
{
TH0=thr0;
TL0=tlr0;
refresh();//数码管刷新
}
/**********************红外解码*************************************/
/**
*@brief
配置定时器T1,开启外部中断,T1用来计数
*@param
无
*@retval
无
*/
voidConfigTimer1()
{
TMOD&=0x0F;//清零T1控制位
TMOD|=0x10;//T1方式1
TH1=0;
TL1=0;//初始化计数值为0
TR1=0;//在没有进入外部中断前,先关闭定时器T1
ET1=0;//关闭T1中断,只用来计数
IT1=1;//设置外部中断为下降沿触发中断
EX1=1;//开启外部中断
}
/**
*@brief
获得高电平时间(空闲时间)
*@param
无
*@retval
无
*/
unsignedintgetHeighTime()
{
//在检测外部电平之前,先将红外检测引脚拉高释放
IRD=1;
TH1=0;
TL1=0;//重新清零
TR1=1;//打开定时器T1开始计数
while(IRD)
{
//进行超时判断,若高电平时间大于9ms,即引导码时间,则直接退出
if(TH1>;0x40)//(0x40*256)*(12/11059200)s=17.7ms
{
break;//退出
}
}
TR1=0;//关闭计数
return(TH1*256+TL1);//返回IRD引脚持续的高电平时T1计数值
}
/**
*@brief
获取低电平时间(载波)
*@param
无
*@retval
无
*/
unsignedintgetLowTime()
{
//释放IRD检测引脚
IRD=1;
TH1=0;
TL1=0;//清零T1计数值
TR1=1;//启动T1计数
while(!
IRD)
{
if(TH1>;0x40)//TL1计数满则进位TH1,时间:
TH1*256*12/11059200s=17.7ms
{//时间大于了NEC协议的引导码载波时间9ms,进行强制退出,避免假等待
break;
}
}
TR1=0;//关闭计数
return(TH1*256+TL1);//返回低电平持续的计数值每计数一次是一个机器周期的时间即1.08us
}
/**
*@brief
外部中断服务,检测红外信号
*@param
无
*@retval
无
*/
voidExINT_ISP()interrupt2//外部中断1中断标号为2
{
unsignedinttime;//时间
unsignedchari,j;
unsignedcharbyte=0;
time=getLowTime();//获取低电平T1计数值,即引导码的9ms载波
if((time;8755))//范围8.5-9.5msX=0.0085/(12/11059200)
{
//错误引导码
IE1=0;//清零外部中断标志
return;//退出中断
}
//符合引导码的9ms
time=getHeighTime();//获取高电平时间
if((time;4608))//范围4ms-5ms
{
//不是4.5ms的空闲
IE1=0;//清零外部中断
return;//退出中断
}
//是正确的引导码
for(i=0;i;645))//范围350us-700us
{
IE1=0;//清零外部中断标志
return;//退出中断
}
time=getHeighTime();//空闲时间
if((time>;322)&&(time;>;=1;//地位在前,先接收低位
}
elseif((time>;1198)&&(time;>;=1;
byte|=0x80;//高位置1
}
else
{
//无效码
IE1=0;
return;
}
}
ircode=byte;//接收数据
}
//全部接收完毕
irflag=1;
IE1=0;//清零外部中断标志位
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 通信 发送 红外 遥控器 解码