求一个简单的单片机红外遥控控制led灯的收发程序

有一个按键,按下时led灯亮,5秒吼自动熄灭,感谢大神们,我给全部分了

第1个回答  2013-08-28
这是我以前写的红外遥控器。。。你看看,有帮助的

#include <AT89X51.h>

static bit
OP; //红外发射管的亮灭
static unsigned int
count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char
flag; //红外发送标志
char
iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节

void SendIRdata(char p_irdata);
void delay();

void main(void)
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;

EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许

TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数

iraddr1=3;
iraddr2=252;

do{
delay();
SendIRdata(12);
}while(1);
}

//定时器0中断处理
void
timeint(void) interrupt
1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;

if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}

void
SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;

//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);

//发送4.5ms的结果码
endcount=117
flag=0;
count=0;
do{}while(count<endcount);

//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{

//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);

//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2)
//判断二进制数个位为1还是0
{
endcount=41;
//1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);

irdata=irdata>>1;
}

//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);

if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);

irdata=irdata>>1;
}

//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);

if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);

irdata=irdata>>1;
}

//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);

if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);

irdata=irdata>>1;
}

endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}

void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}追问

那接收的没程序?

有谁可帮我一下!谢谢!初学单片机,求个红外控制继电器C程序 我的邮箱179...
while (1) \/\/主循环 { Leden=1;\/\/高电平导通锁存器 led=IR;\/\/主循环中添加其他需要一直工作的程序 } }

单片机控制一个LED灯亮灭需要怎样的程序?
3.编写程序:使用单片机的编程软件(如Arduino IDE、Keil等),编写控制LED灯的程序。以下是一个简单的示例程序(以Arduino为例):\/\/ 定义LED灯连接的引脚 const int ledPin = 13;void setup() { \/\/ 将LED引脚设置为输出模式 pinMode(ledPin, OUTPUT);} void loop() { \/\/ 控制LED灯亮灭 di...

跪求一个51单片机控制ws2812灯带的程序,
WS2812是一种自带驱动IC的LED灯珠,可以通过程序控制每个LED的颜色和亮度。以下是一个简单的程序,用于控制144个WS2812 LED灯珠。这个程序是用C语言编写的,用于STC89C52RC单片机。首先,我们需要知道WS2812数据传输协议的一些基本概念。WS2812 LED灯珠需要接收24位数据,每8位代表一个颜色(红色,绿色,蓝色...

关于大学物理实验竞赛,用红外远程控制led灯的问题,求创意评估与参赛具体...
一、单片机能正常工作。(用开发板就没有这个过程了)单片机正常工作需要电源、晶振、开机复位电路等。在网上很方便的就能查到单片机的最小工作电路。二、单片机驱动led。有两种办法,简单的是单片机的I\/O口——电阻——led正极,led负极——电源负极。程序控制卡片机I\/O口输出高电平驱动led(在相应的I\/...

用单片机控制的LED流水灯设计(电路、程序全部给出)
流水灯的魅力在于其动态变化,而软件编程则是关键。这里,我们将采用位操作法,通过顺序控制P1口的位,实现LED的循环点亮。比如,首先让LED 7亮起,通过SETB P1.6指令,紧接着LED 8亮起,执行CLR P1.7指令将其关闭。更深入的细节在于延时子程序的编写,如SETB\/P1.7后,调用延时函数DELAY,确保LED...

单片机串口通信控制led灯的点亮
pc通过串口和单片机交换数据,从而控制LED灯。 pc程序用labview 调用Visa 进行串口通讯。单片机接受到串口命令后控制I\/O口的高低电平实现led灯亮灭控制。用串口调试助手就行,网上到处可以下载。也好用。关键问题是在电脑上发送的0,1,是以什么数据格式发送的,通常以字符格式发送的,即是ASCII码。所以,...

求控制led灯亮灭的例程和详解
;以下子程序 DELAY: MOV R7,#250;(6)D1: MOV R6,#250  ;(7)D2: DJNZ R6,D2  ;(8)DJNZ R7,D1 ;(9)RET ;(10)END ;(11)按上面的设想分析一下前面的五条指令。第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,...

基于单片机的红外遥控灯
简单设想一下,数码管显示当前正在操作的LED灯号,0表示全部 1-8表示单控1-8号灯 发送端只发送16个按建值,用32位标准红外信号协义,16个按按建值分别是0123456789ABCDEF 接收端自行解释按键含义: 0表示全选中 1-8表示选中灯号 9 表示设最大亮度; A 无亮度; B C D分别表示设置1\/4 2\/4 ...

怎么用上位机通过串口去控制51单片机点亮一个LED? 求程序。。
上位机发送Open led就点亮LED,发送Close led就关闭led,我要C语言的程序。llbb121 | 浏览2998 次 |举报 我有更好的答案推荐于2017-12-16 17:19:05 最佳答案 编了一个小程序,供参考,没有环境调试,大概意思就这样,你可以参考自己试试。#include<reg51.h>#include<string.h>#define uchar unsigned charsbit...

求一个用单片机控制LED灯亮灭的程序。要求按下S1使L1亮,按下S2使L2亮...
sbit led3=P1^2;main(){while(1){if(s1==0){while(s1==0);led1=0;led2=1;led3=1;}if(s2==0){while(s2==0);led1=1;led2=0;led3=1;}if(s3==0){while(s3==0);led1=1;led2=1;led3=0;}if(s4==0){while(s4==0);led1=0;led2=0;led3=0;}}} ...

相似回答