红外遥控器键值数码管显示
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
//#define DELAYNUM 40 //该数值可以调节显示的速度
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P2^3; //蜂鸣器驱动线
//uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar dis[8];
void delay(unsigned char x);
void display();
void beep();
void dis8(uchar r,uchar c)
{
dula=0;
P0=table[r];
dula=1;
dula=0;
wela=0;
P0=~(1<<c);
wela=1;
wela=0;
delay(5);
}
/*******************************************************
* *
* 主函数 *
* *
*******************************************************/
main(void)
{
// uchar k;
EA=1;
ET1=1;
EX0=1;
while(1)
{
dis8(IRCOM[4],5);
dis8(IRCOM[5],4);
}
} //end of main()
void IR_IN() interrupt 0 //using 0
{
unsigned char j,k,N=0;
EA = 0;
delay(10);
if (IRIN==1)
{
EA =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delay(1);
}
while (IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delay(1);
}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
delay(1);
}
while (!IRIN) //等 IR 变为高电平
{
delay(1);
}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
} //高电平计数完毕
if (N>=30)
{
EA=1;
return; //0.14ms计数过长自动离开。
}
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>7)
{
IRCOM[j] = IRCOM[j] | 0x80;
} //数据最高位补“
N=0;
}//end for k
}//end for j
/*
if (IRCOM[2]!=~IRCOM[3]) //接收时间是否正确
{
EA=1;
return;
}
if(IRCOM[0]!=0x00) //比较用户码
{
EA=1;
return;
}*/
IRCOM[4]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[5]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
beep();
EA = 1;
}
/**********************************************************/
void beep()
{
unsigned char i;
for (i=0;i<180;i++)
{
delay(6);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/**********************************************************/
学校单片机软件程序!
学习 谢谢分享!
这个是用什么芯片实现啊!
搞不懂啊
搞不懂啊
感谢小编分享!
这个给力,先学习下先
看着好像很不错哦
谢谢小编分享好资料,先收藏了,方便学习交流。
谢谢小编分享了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P3^2;
uchar irtime;
uchar irdata[33];
uchar bitnum;
uchar startflag;
uchar irok;
uchar ircode[4];
uchar irprosok;
uchar disnum[8];
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table_we[]={
0xfe,0xfd,0xff,0xff,0xef,0xdf};
void timer0init(void) //256*(1/12m)*12=0.256ms
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
EA=1;
TR0=1;
}
void irpros(void) // 红外码值处理
{
uchar mun,k,i,j;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
mun=mun>>1;
if(irdata[k]>6)
{
mun=mun | 0x80;
}
k++;
}
ircode[j]=mun;
}
irprosok=1;
}
void irwork(void) // 红外码值转换
{
disnum[0]=ircode[0]/16;
disnum[1]=ircode[0]%16;
disnum[2]=ircode[1]/16;
disnum[3]=ircode[1]%16;
disnum[4]=ircode[2]/16;
disnum[5]=ircode[2]%16;
disn um[6]=ircode[3]/16;
disnum[7]=ircode[3]%16;
}
delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
display()
{
uchar i;
for(i=0;i<6;i++)
{
P0=0xff;
wela=1;
wela=0;
P0=table_du[disnum[i]];
dula=1;
dula=0;
P0=table_we[i];
wela=1;
wela=0;
delay(10);
}
}
void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
timer0init();
int0init();
while(1)
{
if(irok==1)
{
irpros();
irok=0;
}
if(irprosok==1)
{
irwork();
irprosok=0;
}
display();
}
}
void int0 () interrupt 0 //中断服务
{
if(startflag)
{
if(irtime>32&&irtime<63) //8-16ms
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irok=1;
}
}
else
{
irtime=0;
startflag=1;
}
}
void timer0 () interrupt 1
{
irtime++;
}