红外遥控控制led

我想用红外来控制led的亮度,红外用的是外部中断,调节led亮度的pwm用定时器做的,但是代码下到板子上后我按遥控器,led的亮度不变。我在想是不是因为外部中断打断了定时中断导致的??如果是这样怎么解决?如果不是原因在哪??我用的是51板子。谢谢了!代码如下: #include<reg52.h> typedef unsigned int u16; typedef unsigned char u8; sbit led=P2^5; sbit IRIN=P3^2; u16 i,j; u8 IrValue[6],Time,scale=0; void delay(int xms)//延时函数 { for(i=xms;i>0;i--) for(j=110;j>0;j--) ; } void timeinit()//用于做pwm的定时器 { TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式 TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz) TL0=0x06; //写入预置值 TR0=1; //启动定时器 ET0=1; //允许定时器0中断 EA=1; //允许总中断 } void Irinit()//红外通信中断 { IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1;//打开总中断允许 IRIN=1; } void main() { timeinit(); Irinit(); while(1) { if(IrValue[2]==0x09) { scale=scale+1; } if(scale==2) { scale=0; } } } void ReadIr() interrupt 0 //红外数据读入 { u8 j,k; u16 err; Time=0; delay(700); if(IRIN==0)//确认是否收到正确信号 { err=1000; while((IRIN==0)&&(err>0)) { delay(1); err--; } if(IRIN==1) { err=500; while((IRIN==1)&&(err>0)) { delay(1); err--; } for(k=0;k<4;k++) //共有四组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IRIN==0)&&(err>0)) { delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) { delay(10); Time++; err--; if(Time>30) { return; } } IrValue[k]>>=1; if(Time>=8) { IrValue[k]=0x80; } Time=0; } } } if(IrValue[2]!=~IrValue[3]) { return; } } } void timer0() interrupt 1 //定时器0中断服务程序 { static unsigned int t ; //t用来保存当前时间在一秒中的比例位置 t++; //每250微秒增加1 if(t==2) { t=0; //使t=0,开始新的PWM周期 led=0; } if(scale==t) //按照当前占空比切换输出为高电平 led=1; }
...全文
200 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶小武 2019-04-19
  • 打赏
  • 举报
回复
回复一下。看看有啥
紫清烟雨 2019-04-19
  • 打赏
  • 举报
回复
很复杂啊得好好学习
海鸥的泪眸 2019-04-19
  • 打赏
  • 举报
回复
引用 5 楼 yzf874154547 的回复:
[quote=引用 4 楼 海鸥的泪眸的回复:]
//=================================================
//以下分析为自己的一点拙见,如有高见欢迎交流。
//VX:395233700
//2019年4月18日14:31:22
//=================================================
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^5;
sbit IRIN=P3^2;

u16 i,j;
u8 IrValue[6],Time,scale=0;

定时中断不就是直接初始化就好了吗??那个红外通信函数(外部中断)的初始化也是吧??红外通信直接在下面那个外部中断服务函数进行就好了啊。[/quote]
1、红外只初始化我能理解,可是红外怎么控制LED亮度,我需要知道你的原理。
2、PWD就是能够实现LED呼吸灯,你要先能实现这个部分。
3、延时函数那样使用不行,应该使用定时器,
具体我手上没有工具没办法实现,调试代码,只有思路。
如果你是识别到红外后LED亮一个等级,那我建议先用独立键盘控制,然后再转为红外能保证LED模块的正常使用。确实想做联系我微信啊,这个哪有时间经常看
  • 打赏
  • 举报
回复
引用 5 楼 yzf874154547的回复:
[quote=引用 4 楼 海鸥的泪眸的回复:]
//=================================================
//以下分析为自己的一点拙见,如有高见欢迎交流。
//VX:395233700
//2019年4月18日14:31:22
//=================================================
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^5;
sbit IRIN=P3^2;

u16 i,j;
u8 IrValue[6],Time,scale=0;
定时中断不就是直接初始化就好了吗??那个红外通信函数(外部中断)的初始化也是吧??红外通信直接在下面那个外部中断服务函数进行就好了啊。[/quote] 还有,大佬能把代码搞全点不?那样我好分析。
  • 打赏
  • 举报
回复
引用 4 楼 海鸥的泪眸的回复:
//=================================================
//以下分析为自己的一点拙见,如有高见欢迎交流。
//VX:395233700
//2019年4月18日14:31:22
//=================================================
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^5;
sbit IRIN=P3^2;

u16 i,j;
u8 IrValue[6],Time,scale=0;
定时中断不就是直接初始化就好了吗??那个红外通信函数(外部中断)的初始化也是吧??红外通信直接在下面那个外部中断服务函数进行就好了啊。
海鸥的泪眸 2019-04-18
  • 打赏
  • 举报
回复
//=================================================
//以下分析为自己的一点拙见,如有高见欢迎交流。
//VX:395233700
//2019年4月18日14:31:22
//=================================================
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^5;
sbit IRIN=P3^2;

u16 i,j;
u8 IrValue[6],Time,scale=0;
海鸥的泪眸 2019-04-18
  • 打赏
  • 举报
回复
暂时只看到延时函数这样用不好,还有主函数只有初始化,没有功能实现部分,没办法分析
//=================================================
//首先我觉得想实现你说的功能延时函数不能这样写
//应该使用定时器的方法实现
//这样写会造成CPU空等,LED状态长时间不变就不能实现
//控制LED亮度的效果
//=================================================
void delay(int xms) //延时函数
{
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}

void timeinit()//用于做pwm的定时器
{
TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式
TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
TL0=0x06; //写入预置值
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
}

void Irinit()//红外通信中断
{
IT0=1;//下降沿触发
EX0=1;//打开中断0允许
EA=1;//打开总中断允许

IRIN=1;
}

//=================================================
//主函数部分之后初始化,没有功能实现部分
//可能是代码不全,不能继续分析了
//=================================================
void main()
{
timeinit();
Irinit();
while(1)
{
if(IrValue[2]==0x09)
{
scale=scale+1;
}
if(scale==2)
{
scale=0;
}
}
}

void ReadIr() interrupt 0 //红外数据读入
{
u8 j,k;
u16 err;
Time=0;
delay(700);
if(IRIN==0)//确认是否收到正确信号
{
err=1000;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
if(IRIN==1)
{
err=500;
while((IRIN==1)&&(err>0))
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有四组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0))
{
delay(10);
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1;
if(Time>=8)
{
IrValue[k]=0x80;
}
Time=0;
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}

void timer0() interrupt 1 //定时器0中断服务程序
{
static unsigned int t ; //t用来保存当前时间在一秒中的比例位置
t++; //每250微秒增加1
if(t==2)
{
t=0; //使t=0,开始新的PWM周期
led=0;
}
if(scale==t) //按照当前占空比切换输出为高电平
led=1;
}
  • 打赏
  • 举报
回复
引用 1 楼 一树梅的回复:
楼主所用的红外接收功能和PWM调节LED亮度功能都分别调试过吗?中断可以嵌套,只要不是一直按住遥控器,定时中断是可以正常运行的。
好的谢谢,我没试过中断嵌套
yishumei 2019-04-18
  • 打赏
  • 举报
回复
楼主所用的红外接收功能和PWM调节LED亮度功能都分别调试过吗?中断可以嵌套,只要不是一直按住遥控器,定时中断是可以正常运行的。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧