51单片机红外遥控程序

求51单片机红外遥控程序,当按下一键时,开发板上第一个led亮,按2时,第二个亮,按3键时。。。。... 求51单片机红外遥控程序,当按下一键时,开发板上第一个led亮,按2时,第二个亮,按3键时。。。。 展开
 我来答
百度网友283d78e
推荐于2018-07-14 · 知道合伙人IT服务行家
百度网友283d78e
知道合伙人IT服务行家
采纳数:1491 获赞数:2982

向TA提问 私信TA
展开全部
#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=0;i<13;i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/****************************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=0;i<4;i++)
{
for(j=0;j<8;j++)
{
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; //重新开启外部中断
}
加Q2531263726
2013-09-01
知道答主
回答量:75
采纳率:0%
帮助的人:21万
展开全部
首先你得有红外收发头,编码解码芯片,然后就编程可以用单片机控制了。单片机、电路方面我都是很熟悉的!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式