标题:
红外遥控显示程序
[打印本页]
作者:
daming
时间:
2014-12-30 23:39
标题:
红外遥控显示程序
/************************************************************************
TC9012芯片:是一块用于东芝系列红外遥控的专用发射集成电路
因为一个小小的语句的错误,害了我两个多小时的精力。写程序就这样
*************************************************************************/
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code meg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7f,0x39,0x3f,0x79,0x71};
uchar code meg_we[]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
//sbit sc=P3^7;//锁存信号
uchar irtime;
uchar startflag;
uchar bitnum;
uchar irdata[33];//传送一次有1位引导码+8位客户码+8位客户码+8位数据码+8位数据反码
uchar irreceok;
uchar ircode[4];//存放四个字节的红外线代码
uchar irprossok;
uchar disp[8];
void _init_();
void irpross();
void irwork();
void delay_zms(uint);
void xianshi();
/**********************************************************
主函数:
***********************************************************/
void main()
{
_init_();
while(1)
{
if(irreceok)//接收完毕?
{
irreceok=0;//数据接收成功标志清零
startflag=0;
irpross();
}
if(irprossok)//处理完毕?
{
irprossok=0;
irwork();
}
xianshi();
}
}
void delay_zms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/* **********************************************************
初始函数:设置定时器0为方式2,装初值0,开启定时器中断,总中断
外部0中断(设置为下降沿触发)
*************************************************************/
void _init_()
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
IT0=1;
EX0=1;
EA=1;
TR0=1;
}
/*************************************************************
红外数据处理函数:将接收的时间数据(时间的长短定义0和1)处理成
数据代码,保存于ircode[]中
**************************************************************/
void irpross()
{
uchar i,j,k,value;
k=1;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
value=value>>1;
if(irdata[k]>7)//判断是否为1
{
value=value|0x80;
}
k++;
}
ircode[i]=value;
}
irprossok=1;
}
/*************************************************************
数码管显示红外代码函数:用于了解和记录遥控上每个键所对应的代码
便于对以后每个键的代码处理,赋予键不同
功能
**************************************************************/
void irwork()
{
disp[1]=ircode[0]/16;
disp[0]=ircode[0]%16;
disp[3]=ircode[1]/16;
disp[2]=ircode[1]%16;
disp[5]=ircode[2]/16;
disp[4]=ircode[2]%16;
disp[7]=ircode[3]/16;
disp[6]=ircode[3]%16;
}
void xianshi()
{
uchar i;
for(i=0;i<8;i++)
{
P0=meg_du[disp[i]];
P2=meg_we[i];
delay_zms(2);
}
}
/************************************************************
定时器中断处理函数:irtime定时次数,定时时间为irtime*256us
*************************************************************/
void timer0 () interrupt 1
{
irtime++;
}
/***************************************************************
外部中断0中断处理函数:接收红外线数据,处理,保存
****************************************************************/
void int0 () interrupt 0
{
if(startflag) //判断开始信号,屏蔽第一个中断
{
if(irtime>35) //检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
irtime=0;
startflag=1;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1