钻石会员
主题
回帖0
积分19929
阅读权限50
注册时间2011-2-25
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2014-5-12 18:42
来自手机
|
显示全部楼层
本帖最后由 261307853 于 2014-5-12 18:47 编辑
静夜思月晖 发表于 2014-5-12 08:44
我也在做毕业设计用到这个,参考下这段语句
#include"reg51.h"
能否帮忙看一下我把楼上朋友给的红外码写到程序中就是不能控制呢,谢了!
#include "stc15f104e.h"
#define CPU_Fosc 12//12M晶振
#define M 1//定时器1T时钟
#define Tc 250 //250us采样
#define Th (65536-CPU_Fosc*Tc/M)/256
#define Tl (65536-CPU_Fosc*Tc/M)%256
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define ma1 0XE4EB //用户码/按键码
sbit K0=P3^4; //1#
sbit K1=P3^5; //3#
sbit K2=P3^0; //5#
sbit K3=P3^3; //8#
sbit K4=P3^1; //6#
sbit IR=P3^2; //定义红外接收输入端口7#
bit IR_ok,state;
ulong longcode;
uint OKCode;
uint Tick,step;
uchar Count;
bit IRsync;
bit IRb,IRa,IR_ok;
void Delay(uint t);
uchar reverse8( uchar c );
void InitTimer();
void main()
{
P3=0xff;
InitTimer();
while(1)
{
if(IR_ok)
{
if(OKCode==0XE4EB) //用户码/按键码
{
state=!state;
K0=K1=0;
Delay(3000);
K0=K1=1;
if(state)
{
K3=K4=K2=0;
}
else
{
K3=K4=K2=1;
}
}
IR_ok=0;
}
}
}
void InitTimer()
{
AUXR=0xc0;
TMOD = 0x00;
TH0=Th;
TL0=Tl;
EA=ET0=TR0=1;
}
void timer0() interrupt 1
{
if(IR_ok)
{
return;
}
IRb = IRa; //上次电位状态
IRa = IR; //当前电位状态
++step;
if(IRb && !IRa) //是否下降沿(上次高,当前低)
{
Tick = step;
step=0;
if(Tick>(14000/Tc))
{
IRsync=0;
}
else if(IRsync)
{
if(Tick>(3000/Tc))
{
IRsync=0;
}
else
{
longcode<<=1;
if(Tick>(1500/Tc))
{
longcode|=1;
}
if (--Count==0)
{
uchar x,y;
x= longcode;
y= longcode>>8;
if(x=~y)
{
OKCode =longcode>>8;
OKCode=reverse8(OKCode/256)*256|reverse8(OKCode);
IRsync=0;
IR_ok=1;
}
}
}
}
else if(Tick>(13500/Tc-2)&&Tick<(13500/Tc+2))
{
IRsync=1;
Count=32;
}
}
}
uchar reverse8( uchar c )
{
c = ( c & 0x55 ) << 1 | ( c & 0xAA )>> 1;
c = ( c & 0x33 ) << 2 | ( c & 0xCC )>> 2;
c = ( c & 0x0F ) << 4 | ( c & 0xF0 )>> 4;
return c;
}
void Delay(uint t)
{
uchar a,b;
for(; t>0; t--)
for(b=222; b>0; b--)
for(a=12; a>0; a--)
{
;
}
}
|
|