打印

新手上路,请帮忙指点一下

[复制链接]
1890|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhiyonghe|  楼主 | 2009-10-24 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟头次写程序,实在是困惑,我的问题是:程序下降沿中断,以判断两次下降时间差来解码,因为没能解码,我就写了下面那个判断两次下降沿的时间差来确定,我用示波器确认了红外发出的波形是正确的,1838一体红外头输出给单片机解码的波形脉宽也是正确的,但我用下面那程序把时间差 timeH timeL发到串口上显示就比我实际编码的值大量9倍左右,比如我编码0的脉宽是1.12ms但发到串口上的数据有9ms左右!!
我真不知道为什么,而且以这大9倍多的时间为依据去解码也能正确!!!
有做过红外的前辈帮小弟看看呀!!实在很困惑,程序那里错了呀!!!

#include <reg51.h>
#include"uart.h"
unsigned char IRcode;  //红外解码值
unsigned char timeL,timeH; //保存时间
unsigned int  time_us;  //保存下降沿差时间
unsigned char uSendData;
bit NewIRcode=0;     //指示当处理完了4位码后,就有了新的遥控码

/*******************初始化************************/
void initial()  
{
EA = 0;

TMOD=0x01; //定时器0,工作方式1 ;
TCON=0x01; //外中断0下降沿触发(IT0=1)(其中包括TR1=0,TR0=0)
TH0=0x00;  //初始化定时器0
TL0=0x00;   

EA=1;     //开全中断
ET0=1;   //开放T0中断
EX0=1;    //开放INT0
}
/**********************interrupt0******************************
中断0(P3^2脚)下降沿中断,以判断两次下降时间差来解码,
12M
***********************************************************/
unsigned char TempTH[32];
unsigned char uInterruptNum = 0;      //中断的次数
void IR_ISR() interrupt 0 using 1  //红外数据中断处理函数
{   
// static unsigned char cn=0;  //处理数据计数

EX0 = 0;          // 关INT 0
TR0 = 0;         // 关 Timer 0
TR0=0;          //关定时器0
timeH=TH0;   //保存时间
timeL=TL0;
TH0=0X00;   //时间重新置0
TL0=0X00;
TR0=1;          //开定时器0
  EX0 = 1;         // 开INT 0

TempTH[uInterruptNum] = timeH;
uInterruptNum++;
    TempTH[uInterruptNum] = timeL;
    uInterruptNum++;
}

/***************************中断入***************************/
void Timer0_ISR() interrupt 1 using 2 {} //定时器0中断函数

/****************************主函数******************************/

void main()
{  
  unsigned char i;
initial();  
Uart_initial();  //串口初始化

while(1)   
{
  
  if(uInterruptNum >= 16)
  {
   for(i = 0; i < uInterruptNum; i++)
   {
    Uart_send(TempTH[i]);
   }
   uInterruptNum = 0;
  }   

}
  
}

相关帖子

沙发
zhiyonghe|  楼主 | 2009-10-24 16:34 | 只看该作者
请前辈们帮小弟一把!!是不是哪里设置错了呀!!!困惑中!!要是以这种9倍多的关系去解码,虽然能解码,可这困惑实在太伤人了!!!这么也不明白为什么!!:dizzy:

使用特权

评论回复
板凳
zhiyonghe|  楼主 | 2009-10-24 21:47 | 只看该作者
人呢???出来救命呀!!

使用特权

评论回复
地板
想出国打工| | 2009-10-24 21:59 | 只看该作者
太困了,没看;--不好意思啊
是不是串口打印影响了?

使用特权

评论回复
5
zjswuyunbo| | 2009-10-25 08:19 | 只看该作者
定时器会不会溢出哦?

使用特权

评论回复
6
zhiyonghe|  楼主 | 2009-10-25 09:12 | 只看该作者
串口我试过了,能正常发送,定时器我也算了,方式1有65536的值对于0 1的编码足够了,头是溢出了,但我后来改了发射的头,也在范围之内,也就是9被后也不会溢出的值,后来再做实验,发现头没有溢出,值比较接近,但头,0,1,发串口后全部是9倍的关系!!!!我晕!!
那位大哥做过红外的,看看呀!!!真是郁闷了!!!

使用特权

评论回复
7
zhiyonghe|  楼主 | 2009-10-26 08:28 | 只看该作者
人呢??? 求救呀!!

使用特权

评论回复
8
magic_mice| | 2009-10-26 13:55 | 只看该作者
我也是初学者,刚学了一个星期,不怎么懂

使用特权

评论回复
9
zhiyonghe|  楼主 | 2009-10-26 15:22 | 只看该作者
真难受!!:'(咋就没人呢??

使用特权

评论回复
10
ZRL700424| | 2009-10-26 15:35 | 只看该作者
本帖最后由 ZRL700424 于 2009-10-26 15:50 编辑

如果解码正确,应该是定时器计时有问题

晶振是多少?定时器每加1的时间是多少?是不是1US?(与定时器的分频和晶振有关)

使用特权

评论回复
11
zhiyonghe|  楼主 | 2009-10-26 15:52 | 只看该作者
如果解码正确,应该是定时器计时有问题

晶振是多少?定时器每加1的时间是多少?是不是1US?(与定时器的分频和晶振有关)
ZRL700424 发表于 2009-10-26 15:35


晶振是12M,  定时器每加1的时间是1US?我没有设置分频!!!

使用特权

评论回复
12
ZRL700424| | 2009-10-26 16:08 | 只看该作者
你可以用定时器做一个1S钟亮灭一个灯,确认一下时间是否正确

使用特权

评论回复
13
zhiyonghe|  楼主 | 2009-10-26 20:39 | 只看该作者
确认了!!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

1265

帖子

1

粉丝