27,375
社区成员
发帖
与我相关
我的任务
分享
//=================================================
//以下分析为自己的一点拙见,如有高见欢迎交流。
//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;
//=================================================
//首先我觉得想实现你说的功能延时函数不能这样写
//应该使用定时器的方法实现
//这样写会造成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;
}