标题:
红外遥控程序
[打印本页]
作者:
forgetname
时间:
2015-7-15 15:17
标题:
红外遥控程序
希望对新手有用,里面有几个疑问请高手指点
///** STC15F104不需要外部晶振8管脚VCC/GND/P3.0-P3.5 **///
///** 四个元件实现NEC协议红外遥控的发射(STC15F104、按键开关、红外发射管、限流电阻) 还有4个IO口可以利用 **///
///** 程序烧写时选运行频率12M **///
///** P3.3接按键开关与GND链接 **///
///** P3.5接红外发射管负极,红外发射管正极接+5,注意串接限流电阻 **///
//本程序主体不是自己写的,主体部分来源与admin 在2009-11-1 02:26:38 发布的红外发射实验
//***http://www.51hei.com/bbs/dpj-2820-1.html****////
///*** 有的地方不了解就按自己的意识修改了一下
///1、是不是应该13um中断一次,换一次电平??????????????
///2、SendIRdata函数中 endcount原始赋值看不懂
///上学时接触几天C语言(没过级,英语太差)、自学的51,
///请教高手指点
///请教高手指点
#include <STC15F104E.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 = 1; //红外发射管的亮灭初始化
P35 = 1; //红外发射io口初始化
//***中断初始设置***//
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF; //设定时值0为38K 也就是每隔26us中断一次 TH0 = 0xFF; ????是不是应该13um换一次电平
TL0 = 0xf2; // TL0 = 0xE5;
TR0 = 1; //开始计数
///***地址初始化****///
iraddr1=0x00; //第一字节
iraddr2=0xfd; //第二字节
/**进入主程序循环**/
do{
delay();
if(P33==0)
{SendIRdata(0x16);}// 在此填入发射数据
}while(1);
}
/*****定时器0中断处理 ***/
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xf2; //设定时值为38K 也就是每隔26us中断一次 ????是不是应该13um换一次电平
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 1;
}
P35 = OP;
}
//**数据传输函数**//
void SendIRdata(char p_irdata)
{
/*声明变量*/
int i;
char irdata=p_irdata;
/*发送9ms的起始码*/
endcount=692; /// endcount=223 223*26=5798 ?????????????????
flag=1;
count=0;
do{}while(count<endcount);
/*发送4.5ms的结果码 */
endcount=346;
flag=0;
count=0;
do{}while(count<endcount);
/******发送十六位地址的前八位********/
irdata=iraddr1;
for(i=0;i<8;i++)
{
endcount=43; //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
flag=1;
count=0;
do{}while(count<endcount); //停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=130; //1为宽的高电平
}
else
{
endcount=43; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/**********发送十六位地址的后八位*********/
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=43;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=130;
}
else
{
endcount=43;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
////*****发送八位数据*****/////
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=43;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=130;
}
else
{
endcount=43;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/******发送八位数据的反码******/
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=43;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=130;
}
else
{
endcount=43;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=43;
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++)
{
}
}
}
复制代码
作者:
▓逍〓遥◆
时间:
2015-11-4 11:31
学习了,顶。。。。
作者:
ylll75
时间:
2016-7-19 13:03
正在学习,谢谢了!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1