红外遥控数码管显示

红外遥控器实物图

红外遥控器接口电路

数码管接口电路

红外遥控数码管显示程序源代码

/**************************红外遥控数码管显示**************************

* 单片机:51单片机

* 开发环境:keil

* 名称:红外遥控数码管显示

* 功能:遥控器红外解码数码管显示

按配套遥控器上1-9会在数码管上对应显示

*************************************************************************/

#include<reg51.h>

#define DataPort P0

#define uchar unsigned char

sbit IR=P3^2;

sbit smg_duan=P3^4;

bit IRpro_ok;

bit IR_ok;

uchar IRcord[4];

uchar IRdata[33];

uchar codedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar irtime;

void Ir_work(void);

void Ircordpro(void);

void TIM0init(void) //定时器0初始化

{

TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值

TH0=0x00; //重载值

TL0=0x00; //初始化值

ET0=1; //开中断

TR0=1;

}

void EX0init(void)

{

IT0=1; //指定外部中断0下降沿触发,INT0 (P3.2)

EX0=1; //使能外部中断

EA=1; //开总中断

}

void SYSinit(void)

{

TIM0init();

EX0init();

}

void Ir_work(void) //红外键值散转程序

{

switch(IRcord[2]) //判断第三个数码值

{

case 0x0c:

{DataPort=dofly_DuanMa[1];}break; //1显示相应的按键值

case 0x18:

{DataPort=dofly_DuanMa[2];}break; //2显示相应的按键值

case 0x5e:

{DataPort=dofly_DuanMa[3];}break; //3显示相应的按键值

case 0x08:

{DataPort=dofly_DuanMa[4];}break; //4显示相应的按键值

case 0x1c:

{DataPort=dofly_DuanMa[5];}break; //5显示相应的按键值

case 0x5a:

{DataPort=dofly_DuanMa[6];}break; //6显示相应的按键值

case 0x42:

{DataPort=dofly_DuanMa[7];}break; //7显示相应的按键值

case 0x52:

{DataPort=dofly_DuanMa[8];}break; //8显示相应的按键值

case 0x4a:

{DataPort=dofly_DuanMa[9];}break; //9显示相应的按键值

default:break;

}

IRpro_ok=0; //处理完成标志

}

void Ircordpro(void) //红外码值处理函数

{

uchar i, j,k;

ucharcord,value;

k=1;

for(i=0;i<4;i++) //处理4个字节

{

for(j=1;j<=8;j++) //处理1个字节8位

{

cord=IRdata[k];

if(cord>6)

//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80;

if(j<8)

{value>>=1;}

k++;

}

IRcord[i]=value;

value=0;

}

IRpro_ok=1; //处理完毕标志位置1

}

void main(void)

{

SYSinit();

DataPort=0x00; //先让数码管什么都不显示

smg_duan=0;

while(1) //主循环

{

if(IR_ok) //如果接收好了进行红外处理

{Ircordpro();IR_ok=0;}

if(IRpro_ok)

//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{Ir_work();}

}

}

void tim0_isr (void) interrupt 1 using 1

{irtime++;} //用于计数2个下降沿之间的时间

void EX0_ISR (void) interrupt 0 //外部中断0服务函数

{

staticuchar i; //接收红外信号处理

static bitstartflag ; //是否开始处理标志位

if(startflag)

{

if(irtime<63&&irtime>=33) //引导码 TC9012的头码,9ms+4.5ms

i=0;

IRdata[i]=irtime;

//存储每个电平的持续时间,用于以后判断是0还是1

irtime=0;

i++;

if(i==33)

{IR_ok=1;i=0;}

}

else

{irtime=0;startflag=1;}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式硬件与代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值