打印

请问:附件的定时中断时间是多少?

[复制链接]
1425|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hopewise|  楼主 | 2013-4-16 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在网上找到一个例程(红外遥控),是用PIC写的,只是我没用过PIC,程序也没提到用到多大的晶振.请高手猜一下定时中断时间多大,Thanks.我想用它来做双MCU通信.
相应的C代码如下:(C5口是发送口)
#include
#include
#include
unsigned char dispcount[5];                     //要发送的码值
unsigned char i,k,data,rfbit,zbit,rfgobit;
#pragma interrupt_level 1
interrupt adint(void)
{
      if(TMR1IF==1)
      {
          TMR1IF=0;
          TMR1H=0b11111100;
          TMR1L=0b00010111;
          rfbit=rfbit+1;                         //发送指针加一
          send( );
      }
}
//////////////////////////////////////////
send( )
{
      if(rfgobit==0)
      {
           switch(rfbit)
           {
                case 1 :
                        RC5=0;
                        break;
                case 6 :
                        RC5=1;
                        break;
                case 7 :
                        RC5=0;
                        rfgobit=1;                //制发送完标制
                        rfbit=0;
                        break;
                default :
                        break;
           }
     }
     if(rfgobit==1)
     {
           zbit=dispcount[i]&0b00000001;
           switch(rfbit)
           {
                case 1:
                         RC5=1;
                         break;
                case 2 :
                         if(zbit==0)
                         {
                              RC5=0;
                              rfbit=0;
                              rf( );
                         }
                         break;
                case 3 :
                         if(zbit==1)
                         {
                              RC5=0;
                              rfbit=0;
                              rf( );
                         }
                         break;
                default :
                         break;
           }
     }
}
//////////////////////////////////////////////
rf( )
{
     k=k+1;
     if(k==8)
     {
          i=i+1;
          k=0;
          if(i==6)
          {
               i=1;
               rfgobit=0;
               TMR1H=0;
               TMR1L=0;
               RC5=1;
               dispcount[1]=0xaa;
               dispcount[2]=0xbb;
               dispcount[3]=0xcc;
               dispcount[4]=0xdd;
               dispcount[5]=0xee;
          }
          return;
     }
     dispcount[i]=dispcount[i]>>1;
}
//////////////////////////////////////
main( )
{
     di( );
     TRISC=0b11011111;
     TRISA=0b111111;
     TRISB=0b11111111;
     i=1;
     k=0;
     TMR1H=0b11111100;
     TMR1L=0b00010111;
     T1CON=1;
     TMR1IE=1;
     RC5=1;
     PEIE=1;
     ei( );
     dispcount[1]=0xaa;
     dispcount[2]=0xbb;
     dispcount[3]=0xcc;
     dispcount[4]=0xdd;
     dispcount[5]=0xee;
     while( 1 )
     {
          ;
     }
}

相关帖子

沙发
airwill| | 2013-4-16 12:29 | 只看该作者
这是考试呢?  有奖品吗?
这代码注释都没有, 实在不吸引人看哪.
程序也不长, 楼主不如定下心来, 对照手册查一下寄存器就知道了

使用特权

评论回复
板凳
hopewise|  楼主 | 2013-4-17 14:58 | 只看该作者
那是网上找的,不工作.只好自己写了,下面是我按HT6221的时序图来编写的,但接收就是没反应(补充一下:接收部分是没问题的---用遥控器H6221的话,可以接收到).请高手帮忙查看一下.

使用特权

评论回复
地板
hopewise|  楼主 | 2013-4-17 14:58 | 只看该作者
//*************定时器1中断****************
//****************************************
void t1_isr(void) interrupt 3                                                                //每隔280us中断一次
{
         TL1=(0xffff-280)%0x100;
         TH1=(0xffff-280)/0x100;
         if(SendIE)                                                                                  //有数据要发送出去
     {
                   SendTCnt++;                                                    //脉宽计数器加一
           send( );                                                                                                  //发送数据
         }
         else
         {                                                                                                                      //否则要是没有数据发送的话,则
                  SendTCnt=0;                                                                                          //脉宽计数器清零
                  Dio=1;                                                                                                  //通信引脚拉高,释放总线
     }                                                                                                         
}
//**********************************
//**********************************
void  send( )
{
      if(rfgobit==0)                                                                                      //产生头码和结果码
      {
                 if(SendTCnt<=32)
                     {
                  Dio=0;                                                                      //头码时间到(9ms/280us=32次)
                     
             }
                         else  if(SendTCnt<48)
                         {
                  Dio=1;                                                   
                     
             }
                         else         if(SendTCnt==48)                                                      //结果码时间到(4.5ms/280us=16次,故32+16=48次)
                         {
                  Dio=0;                                                                              //通信引脚,为下次发32位数据作准备
                                  rfgobit=1;                                              //32位数据允许发送标志位置1
                  SendTCnt=0;                                                                        //脉宽计数器清零                    
             }
      
      }
      if(rfgobit==1)                                                                                      //发送32位数据
      {
             zbit=dispcount[word_count]&0x80;                                      //高位先发送
                         if(zbit==0)                                                                              //"0"状态
                         {
                              if(SendTCnt==1)  
                                  {

                                              Dio=0;
                                  }
                                  else         if(SendTCnt==2)
                                  {

                                              Dio=1;                                                                          //0.56ms低电平时间到
                                  }
                                  else         if(SendTCnt==3)
                                  {

                                              Dio=1;
                                  }
                                  else         if(SendTCnt==4)                                          //0.56ms高电平时间到
                                  {
                                       SendTCnt=0;
                                           bit_count++;                                                              //位数加一
                                           Dio=0;
                                           if(bit_count==8)                                                  //发完了8位
                       {
                                bit_count=0;
                                    word_count++;                                          //则字节数加一
                                    if(word_count==4)                                      //32位数据发完毕
                            {
                                             word_count=0;
                                 rfgobit=0;
                                 Dio=1;
                                                                 SendIE=0;                                              //禁止发送
                             }
                            return;
                       }
                       dispcount[word_count]=dispcount[word_count]<<1;          //发送下一位(数据左移1位)
                                  }

                         }
                     else   if(zbit==1)                                                                       //"1"状态
                         {
                              if(SendTCnt==1)  
                                  {

                                              Dio=0;
                                  }
                                  else         if(SendTCnt==2)
                                  {

                                              Dio=1;                                                                                           //0.56ms低电平时间到
                                  }
                                  else         if(SendTCnt==3)
                                  {

                                              Dio=1;
                                  }
                                  else         if(SendTCnt==4)
                                  {

                                              Dio=1;
                                  }
                                  else if(SendTCnt==5)
                                  {

                                               Dio=1;
                                  }
                                   else if(SendTCnt==6)
                                  {

                                               Dio=1;
                                  }
                                   else if(SendTCnt==7)
                                  {

                                               Dio=1;
                                  }
                                   else  if(SendTCnt==8)                                                               //1.68ms高电平时间到
                                  {
                                           SendTCnt=0;
                                           bit_count++;                                                              //位数加一
                                           Dio=0;
                                           if(bit_count==8)
                       {
                                bit_count=0;
                                    word_count++;
                                    if(word_count==4)
                            {
                                             word_count=0;
                                 rfgobit=0;
                                 Dio=1;
                                                         SendIE=0;
                            }
                            return;
                       }
                       dispcount[word_count]=dispcount[word_count]<<1;
                                  }
                         }
      }
}

使用特权

评论回复
5
hopewise|  楼主 | 2013-4-17 15:12 | 只看该作者
太乱了,重新贴上

使用特权

评论回复
6
hopewise|  楼主 | 2013-4-17 15:17 | 只看该作者
怎么不能让我上传附件?

使用特权

评论回复
7
hopewise|  楼主 | 2013-4-17 15:17 | 只看该作者
//*************定时器1中断****************
//****************************************
void t1_isr(void) interrupt 3                                                    //每隔280us中断一次
{
      TL1=(0xffff-280)%0x100;
      TH1=(0xffff-280)/0x100;
      if(SendIE)                                                          //有数据要发送出去
      {
           SendTCnt++;                                                    //脉宽计数器加一
           send( );                                                          //发送数据
      }
      else
      {                                                                          //否则要是没有数据发送的话,则
           SendTCnt=0;                                                          //脉宽计数器清零
           Dio=1;                                                          //通信引脚拉高,释放总线
     }                                                                                                         
}
//**********************************
//**********************************
void  send( )
{
      if(rfgobit==0)                                                          //产生头码和结果码
      {
             if(SendTCnt<=32)
             {
                  Dio=0;                                                  //头码时间到(9ms/280us=32次)
                     
             }
             else  if(SendTCnt<48)
             {
                  Dio=1;                                                   
                     
             }
             else if(SendTCnt==48)                                           //结果码时间到(4.5ms/280us=16次,故32+16=48次)
             {
                  Dio=0;                                                   //通信引脚,为下次发32位数据作准备
                  rfgobit=1;                                               //32位数据允许发送标志位置1
                  SendTCnt=0;                                                     //脉宽计数器清零                    
             }
      
      }
      if(rfgobit==1)                                                           //发送32位数据
      {
            zbit=dispcount[word_count]&0x80;                                   //高位先发送
            if(zbit==0)                                                           //"0"状态
            {
                 if(SendTCnt==1)  
                 {

                        Dio=0;
                }
                else         if(SendTCnt==2)
                {

                        Dio=1;                                                  //0.56ms低电平时间到
                }
                else         if(SendTCnt==3)
                {

                        Dio=1;
                }
                else         if(SendTCnt==4)                                          //0.56ms高电平时间到
                {
                        SendTCnt=0;
                        bit_count++;                                          //位数加一
                        Dio=0;
                        if(bit_count==8)                                  //发完了8位
                        {
                              bit_count=0;
                              word_count++;                                  //则字节数加一
                              if(word_count==4)                                  //32位数据发完毕
                              {
                                    word_count=0;
                                    rfgobit=0;
                                    Dio=1;
                                    SendIE=0;                                  //禁止发送
                             }
                            return;
                       }
                       dispcount[word_count]=dispcount[word_count]<<1;          //发送下一位(数据左移1位)
                }

          }
          else   if(zbit==1)                                                   //"1"状态
          {
                if(SendTCnt==1)  
                {

                        Dio=0;
                }
                else         if(SendTCnt==2)
                {

                        Dio=1;                                                  //0.56ms低电平时间到
                }
                else         if(SendTCnt==3)
                {

                         Dio=1;
                }
                else         if(SendTCnt==4)
                {

                        Dio=1;
                }
                else if(SendTCnt==5)
                {

                        Dio=1;
                }
                else if(SendTCnt==6)
                {

                        Dio=1;
                }
                else if(SendTCnt==7)
                {

                        Dio=1;
                }
                else  if(SendTCnt==8)                                          //1.68ms高电平时间到
                {
                       SendTCnt=0;
                       bit_count++;                                          //位数加一
                       Dio=0;
                       if(bit_count==8)
                       {
                             bit_count=0;
                             word_count++;
                             if(word_count==4)
                             {
                                  word_count=0;
                                  rfgobit=0;
                                  Dio=1;
                                  SendIE=0;
                            }
                            return;
                       }
                       dispcount[word_count]=dispcount[word_count]<<1;
               }
          }
    }
}

使用特权

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

本版积分规则

46

主题

468

帖子

3

粉丝