找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

红外的问题

[复制链接]
admin 发表于 2012-9-4 06:03:41 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
#include <reg52.h>

sbit P3_4 = P2^1;

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 = 0xE8; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数

iraddr1=3;
iraddr2=252;


do{
unsigned char i;
delay();
SendIRdata(12);
}while(1);
}

//定时器0中断处理
void timeint(void) interrupt 1
{
[size=5] TH0=0xFF;
TL0=0xE8; //设定时值为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 < 200; j++){
}
}
}





有谁帮忙解答一下
{
TH0=0xFF;
TL0=0xE8; //设定时值为38K 也就是每隔26us中断一次
count++;
}

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

}
哥们,9ms跟26us,223的关系是什么!!!!
0xff;跟0xE8怎么求的
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-28 02:05 , Processed in 0.382525 second(s), 67 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表