找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2773|回复: 5
打印 上一主题 下一主题
收起左侧

我想问一下这个定时器0在什么时候中断 新手求问!!!

[复制链接]
跳转到指定楼层
楼主
ID:154739 发表于 2017-4-27 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • void tim0_isr()interrupt 1 using 1//定时器0中断服务函数
  • {
  •         irtime++;
  • }
  • void ex0_isr()interrupt 0 using 0//外部中断0服务函数
  • {
  •         static unsigned char i;
  •         static bit startflag;
  •         if(startflag)
  •         {
  •                 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
  •         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++)
  •                 {;}
  •         }
  • }
  • 我想问一下这个定时器0在什么时候中断,以及中断的时间并且引导码那部分能帮我解答一下吗

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:154739 发表于 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. }
复制代码
回复

使用道具 举报

板凳
ID:148552 发表于 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++)
                {;}
        }
}

这个详细介绍了这个过程
回复

使用道具 举报

地板
ID:193176 发表于 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为总中断
要详细了解建议百度,网上中断的教程很多,初学者不建议看很长很复杂的程序
回复

使用道具 举报

5#
ID:194774 发表于 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为总中断
回复

使用道具 举报

6#
ID:111634 发表于 2017-4-29 21:38 | 只看该作者
定时器在溢出时中断。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表