初级会员
- 积分
- 82
- 金钱
- 82
- 注册时间
- 2013-1-29
- 在线时间
- 0 小时
|
楼主 |
发表于 2013-2-22 13:58:37
|
显示全部楼层
回复【2楼】正点原子:
---------------------------------
问题是怎么让程序知道它什么时候松开按键呀?这是我的红外解码程序~~求原子兄指导
sbit RDATA=P3^3; //红外接口 与外部中断一相连
unsigned char RedKey=255; //红外摇控的键值,无键按下时为255
int RedRec;
int RedRdy;
//红外初始化
void Red_Init(void)
{
RDATA=1; //P3^3输出高电平
EX1=1; //开启红外中断 3^3
EA=1; //开总中断
IT1=1; //外部中断下降沿触发
}
//检测高电平脉冲宽度,逻辑0 560微秒 逻辑1 1680微秒
//高电平最长脉冲不超过5毫秒
//返回值:T 脉宽为T*20微秒
unsigned char Get_PulseWidth(void)
{
unsigned char t=0,a=0;
while(RDATA)//高电平到来,检测其脉宽
{
t++;
for(a=0;a<68;a++); // 延时20微秒
if(t==250)return t; //超时溢出
}
return t;
}
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是16位前导脉冲,用于识别该型号的摇控。
然后是发送8位数据的原码,接着又发送8位数据的反码.
最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
8位原码就可以识别按键了
---------------------------------------------------------*/
/****** 外部中断1服务程序,按键处理 ******/
void EXTI1_ISR() interrupt 2
{
unsigned char res=0,aa=0; //aa用于取位
char OK=0; //收到前导位的标志
char RODATA=0;
char Fin=0;
while(1)
{
if(RDATA)//有高脉冲出现
{
res=Get_PulseWidth();//获得此次高脉冲宽度
if(res==250)
break;
//非有用信号
if(res>=200&&res<250)OK=1; //获得前导位(4.5ms) 介于4毫秒与5毫秒之间
else if(res>=50&&res<85) //如果是宽脉冲,则RODATA=1
{
aa++;
RODATA=1;//1.5ms
}
else if(res>=10&&res<50) //如果是窄脉冲,则RODATA=0
{
aa++;
RODATA=0;//500us
}
//舍去16位前导脉冲,从第17位开始接着的8位是数据的正码,再后8位是反码
//获取正码
if(OK&&(aa>=17)&&(aa<25))
{
RedKey<<=1;
RedKey+=RODATA;
RedRec=0;
}
else if(res>=85&&res<200)
{
RedRdy=1;
RedRec++;
}
}
}
} |
|