********************************************************************************
* 描述: *
* 遥控键值读取器*
* 数码管显示, P0口为数码管的数据口 *
* *
********************************************************************************
遥控键值解码-数码管显示*
********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW()
void delay(unsigned char x)//x*0.14MS
void delay1(unsigned char ms)
void beep()
sbit IRIN = P3^2
sbit BEEP = P3^7
sbit RELAY= P1^3
sbit GEWEI= P2^7
sbit SHIWEI= P2^6
unsigned char IRCOM[8]
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
main()
{
IE = 0x81 //允许总中断中断,使能 INT0 外部中断
TCON = 0x1 //触发方式为脉冲负边沿触发
delay(1)
IRIN=1
BEEP=1
RELAY=1
for()
{
IR_SHOW()
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0
EA = 0
I1:
for (i=0i<4i++)
{
if (IRIN==0) break
if (i==3) {EA =1return}
}
delay(20)
if (IRIN==1) goto I1 //确认IR信号出现
while (!IRIN)//等 IR 变为高电平
{delay(1)}
for (j=0j<4j++)
{
for (k=0k<8k++)
{
while (IRIN)//等 IR 变为低电平
{delay(1)}
while (!IRIN) //等 IR 变为高电平
{delay(1)}
while (IRIN) //计算IR高电平时长
{
delay(1)
N++
if (N>=30) {EA=1return}
}
IRCOM[j]=IRCOM[j] >>1
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80}
N=0
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1return}
IRCOM[5]=IRCOM[2] &0x0F
IRCOM[6]=IRCOM[2] &0xF0
IRCOM[6]=IRCOM[6] >>4
beep()
EA = 1
}
void IR_SHOW()
{
P0 = table[IRCOM[5]]
GEWEI = 0
SHIWEI = 1
delay1(4)
P0 = table[IRCOM[6]]
SHIWEI = 0
GEWEI = 1
delay1(4)
}
void beep()
{
unsigned char i
for (i=0i<100i++)
{
delay(5)
BEEP=!BEEP
}
BEEP=1
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i
while(x--)
{
for (i = 0i<13i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i
while(ms--)
{
for(i = 0i<120i++)
{
_nop_()
_nop_()
_nop_()
_nop_()
}
}
}
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7
sbit lcdrs = P2^6
sbit lcdwr = P2^5
sbit IR = P3^2
uchar IRCOM[6]//数组,用于存储红外编码
uchar code table1[] = "remote control"
uchar code table2[] = "CODE:"
void delayms(uchar x)// 延时x*0.14ms
{
uchar i
while(x--)
for(i=0i<13i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j
for(i=xi>0i--)
for(j=110j>0j--)
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0
lcdrs = 0
lcdwr = 0
P0 = com
delay(5)
lcden = 1
delay(5)
lcden = 0 //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0
lcdrs = 1
lcdwr = 0
P0 = date
delay(5)
lcden = 1
delay(5)
lcden = 0
}
void lcd_init(void)
{
lcden = 0
lcdrs = 0
lcdwr = 0
delay(5)
write_com(0x38)
write_com(0x0c)
write_com(0x06)
write_com(0x01)
}
/*****************main()************************/
void main(void)
{
uchar count=0
IR = 1
lcd_init()
write_com(0x80)
while(table1[count]!='\0')
{
write_date(table1[count])
count++
delay(5)
}
count = 0
write_com(0x80+0x40)
while(table2[count]!='\0')
{
write_date(table2[count])
count++
delay(5)
}
IE = 0x81//开中断
TCON = 0x01//脉冲负边沿触发
while(1)
}
/*********************红外中断**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0//关闭中断
delayms(5)
if(1 == IR)
{
EX0 = 1
return
}
while(!IR) //跳过9ms前导低电平
delayms(1)
for(i=0i<4i++)
{
for(j=0j<8j++)
{
while(IR) //跳过4.5ms的前导高电平
delayms(1)
while(!IR) //跳过0.56ms的低电平
delayms(1)
while(IR)
{
TimeNum++//计时高电平时间从而判断读取的是0还是1
delayms(1)
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1
return
}
IRCOM[i] = IRCOM[i]>>1
if(TimeNum >= 8) //8*0.14ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80
}
TimeNum = 0
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1
return
}
IRCOM[4] = IRCOM[2]&0x0f//取低四位
IRCOM[5] = IRCOM[2]>>4 //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] >9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37
}
else
IRCOM[4] = IRCOM[4] + 0x30
if(IRCOM[5] >9)
{
IRCOM[5] = IRCOM[5] + 0x37
}
else
IRCOM[5] = IRCOM[5] + 0x30
delay(5)
write_com(0x80 + 0x40 + 5)
write_date(IRCOM[5])
write_date(IRCOM[4])
EX0 = 1//重新开启外部中断
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)