标题: 我想问一下这个定时器0在什么时候中断 新手求问!!! [打印本页]

作者: wuli555    时间: 2017-4-27 16:52
标题: 我想问一下这个定时器0在什么时候中断 新手求问!!!

作者: wuli555    时间: 2017-4-27 17:05
并且我在淘宝上看了一个单片机遥控器他给的资料只用外部中断 ,各位能帮我解释下他的原理吗
  1. void IR_IN() interrupt 0 using 0
  2. {
  3.   unsigned char j,k,N=0;
  4.      EX0 = 0;   
  5.          delay(15);
  6.          if (IRIN==1)
  7.      { EX0 =1;
  8.            return;
  9.           }
  10.                            
  11.   while (!IRIN)            
  12.     {delay(1);}

  13. for (j=0;j<4;j++)   
  14. {     
  15.   for (k=0;k<8;k++)      
  16.   {
  17.    while (IRIN)            
  18.     while (!IRIN)         
  19.      {delay(1);}
  20.      while (IRIN)         
  21.       {
  22.     delay(1);
  23.     N++;           
  24.     if (N>=30)
  25.          { EX0=1;
  26.          return;}                 
  27.       }                                      
  28.      IRCOM[j]=IRCOM[j] >> 1;                  
  29.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
  30.      N=0;
  31.   }//end for k
  32. }//end for j
  33.    
  34.    if (IRCOM[2]!=~IRCOM[3])
  35.    { EX0=1;
  36.      return; }

  37.    IRCOM[5]=IRCOM[2] & 0x0F;   
  38.    IRCOM[6]=IRCOM[2] >> 4;      

  39.    if(IRCOM[5]>9)
  40.     { IRCOM[5]=IRCOM[5]+0x37;}
  41.    else
  42.           IRCOM[5]=IRCOM[5]+0x30;

  43.    if(IRCOM[6]>9)
  44.     { IRCOM[6]=IRCOM[6]+0x37;}
  45.    else
  46.           IRCOM[6]=IRCOM[6]+0x30;

  47.      lcd_pos(0x4b);            
  48.      lcd_wdat(IRCOM[6]);         
  49.      lcd_pos(0x4c);            
  50.      lcd_wdat(IRCOM[5]);      
  51.      beep();
  52.      EX0 = 1;
  53. }
复制代码

作者: 你像风儿来了    时间: 2017-4-28 13:42
当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。遥控器发射代码时.均是低位在前。高位在后。由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。当接收到此码时.表示一帧数据的开始。(定时器部分我在程序里注释了)

void tim0_isr()interrupt 1 using 1//定时器0中断服务函数
{
        irtime++; //每278us中断一次
}
void ex0_isr()interrupt 0 using 0//外部中断0服务函数
{
        static unsigned char i;
        static bit startflag;//如果startflag置1
        if(startflag)
        {
                                  //如果时间在278*33~278*63us之间
                if(irtime<63&&irtime>=33)//引导码TC9012的头码
                i=0;
                irdata=irtime;
                irtime=0;
                i++;
                if(i==33)
                {
                        irok=1;
                        i=0;
                }
        }
        else{irtime=0;startflag=1;}
}
void TIM0init()//定时器0初始化
{
        TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
               
        TH0=0x00;//reload value
        TL0=0x00;//initial value //大概278微秒定时
               
        ET0=1;//开总中断
        TR0=1;
}
void EX0init()
{
        IT0=1;//Configure interrupt 0 for falling edge on/INT0(P3.2)
        EX0=1;//Enable EX0 Interrupt
        EA=1;
}////////////////////////////////////////////////////////////////////////
void lrcordpro()//红外码值处理函数(关键函数)
{
        unsigned char i,j,k=1;
        unsigned char cord,value;
        for(i=0;i<4;i++)
        {/////////////////////处理4个字节
                for(j=1;j<=8;j++)
                {//////////////////处理1个字节8位
                        cord=irdata[k];
                        value=value>>1;
                        if(cord>7)value=value|0x80;//大于某值为1
                        k++;
                }
                IRcord=value;
                value=0;
        }
        irpro_ok=1;//处理完毕标志位置1
}
void lcd_delay(uchar ms)/*LCD1602延时*/
{
        uchar j;
        while(ms--)
        {
                for(j=0;j<250;j++)
                {;}
        }
}

这个详细介绍了这个过程
作者: wal    时间: 2017-4-29 13:33
void TIM0init()//定时器0初始化
{
        TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
        TH0=0x00;//reload value
        TL0=0x00;//initial value
        ET0=1;//开总中断
        TR0=1;
}
这个段代码控制定时器0中断
TMOD用来设置时钟的工作方式
TH0和TL0控制多长时间中断一次
ET0  EA TR0 用来打开中断 其中EA为总中断
要详细了解建议百度,网上中断的教程很多,初学者不建议看很长很复杂的程序

作者: 17875511173    时间: 2017-4-29 16:30
void TIM0init()//定时器0初始化
{
        TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
        TH0=0x00;//reload value
        TL0=0x00;//initial value
        ET0=1;//开总中断
        TR0=1;
}
这个段代码控制定时器0中断
TMOD用来设置时钟的工作方式
TH0和TL0控制多长时间中断一次
ET0  EA TR0 用来打开中断 其中EA为总中断
作者: zl2168    时间: 2017-4-29 21:38
定时器在溢出时中断。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1