我想用紅外來控制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;
}
uj5u.com熱心網友回復:
樓主所用的紅外接收功能和PWM調節LED亮度功能都分別除錯過嗎?中斷可以嵌套,只要不是一直按住遙控器,定時中斷是可以正常運行的。uj5u.com熱心網友回復:
好的謝謝,我沒試過中斷嵌套
uj5u.com熱心網友回復:
暫時只看到延時函式這樣用不好,還有主函式只有初始化,沒有功能實作部分,沒辦法分析//=================================================
//首先我覺得想實作你說的功能延時函式不能這樣寫
//應該使用定時器的方法實作
//這樣寫會造成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;
}
uj5u.com熱心網友回復:
//=================================================
//以下分析為自己的一點拙見,如有高見歡迎交流。
//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;
uj5u.com熱心網友回復:
定時中斷不就是直接初始化就好了嗎??那個紅外通信函式(外部中斷)的初始化也是吧??紅外通信直接在下面那個外部中斷服務函式進行就好了啊。
uj5u.com熱心網友回復:
還有,大佬能把代碼搞全點不?那樣我好分析。
uj5u.com熱心網友回復:
//=================================================
//以下分析為自己的一點拙見,如有高見歡迎交流。
//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;
定時中斷不就是直接初始化就好了嗎??那個紅外通信函式(外部中斷)的初始化也是吧??紅外通信直接在下面那個外部中斷服務函式進行就好了啊。
1、紅外只初始化我能理解,可是紅外怎么控制LED亮度,我需要知道你的原理。
2、PWD就是能夠實作LED呼吸燈,你要先能實作這個部分。
3、延時函式那樣使用不行,應該使用定時器,
具體我手上沒有工具沒辦法實作,除錯代碼,只有思路。
如果你是識別到紅外后LED亮一個等級,那我建議先用獨立鍵盤控制,然后再轉為紅外能保證LED模塊的正常使用。確實想做聯系我微信啊,這個哪有時間經常看
uj5u.com熱心網友回復:
很復雜啊得好好學習uj5u.com熱心網友回復:
回復一下。看看有啥轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/134318.html
標籤:單片機/工控
