zoukankan      html  css  js  c++  java
  • 几种方波方法及脉冲计数

     if(DeviceFlag == 0x55)
      { 

       amount++;
         switch(amount%2)
         {
            case 1: Command_Out =1; break;
            case 0: Command_Out =0; break;
         }
         if(amount==8)//16*8=128ms
         {  
            amount=0; 
            DeviceStatus = TurnOn;
            DeviceFlag = 0xFF;
         }

    //发出波形的方式很多种,

      1、可用两个定时器,第一用作定时占空比,并且执行一次就关闭,由另外一个定时器开启,另外一个定时器作为定时周期。

     1 //----------发送命令变量----------------------------
     2 static unsigned int  current;                  //延时计数器
     3 static unsigned char irdata_silent[]={0,1,0,1,2,0,1,0,1,2,0,1,0,1,2};   //kaiji指令
     4 static unsigned char irdata_TurnOn[]={1,0,1,0,2,1,0,1,0,2,1,0,1,0,2};//guanji zhiling
     5 /***************************************************************
     6 *总体格式:静默指令(共三帧指令):0101 S 0101 S 0101 S(左移) ASASAS
     7 * 开启指令(共三帧指令):1010 S 1010 S 1010 S(左移) 5S5S5S
     8 *左移:0101,0x05,开;1010,0x0A,关;“S”代码(STOP):1mS高电平+9mS低电平
     9 ***************************************************************/
    10 void SendCommand(unsigned char data)
    11 {
    12     p_irdate = data;
    13     switch(p_irdate)
    14     {
    15        case 0:     Timer01_Init();   //1ms
    16                    Timer35_Init();   //5ms 
    17                    break;
    18        case 1:     Timer04_Init();   //4ms            
    Timer35_Init();
    //5ms 19 break; 20 case 2: Timer01_Init(); //1ms 21 Timer310_Init(); //10ms 22 break; 23 } 24 T0CONbits.TMR0ON = 1; 25 T3CONbits.TMR3ON = 1; 26 Command_Out = 1; 27 } 28 /******************************* 29 *中断处理函数 30 *******************************/ 31 #pragma code high_vector=0x08 32 void interrupt_at_high_vector(void) 33 { 34 _asm goto high_isr _endasm 35 } 36 #pragma code 37 38 #pragma code low_vector=0x18 39 void interrupt_at_low_vector(void) 40 { 41 _asm goto low_isr _endasm 42 } 43 #pragma code 44 45 #pragma interrupt high_isr 46 void high_isr(void) //TMR0 47 { 48 if(INTCONbits.TMR0IF==1) 49 { 50 INTCONbits.TMR0IF=0; 51 Command_Out = !Command_Out; 52 mLED_1_Off(); 53 T0CONbits.TMR0ON = 0; 54 } 55 56 } 57 58 #pragma interruptlow low_isr 59 void low_isr(void) 60 { 61 if(PIR2bits.TMR3IF==1) 62 { 63 PIR2bits.TMR3IF=0; 64 Command_Out = 1; 65 mLED_1_On(); 66 current++; 67 if(current<15) 68 { 69 SendCommand(irdata_silent[current]); 70 } 71 else 72 { 73 current =0; 74 SendCommand(irdata_silent[current]);//
    }
    75 //T3CONbits.TMR3ON = 0; 76 //T0CONbits.TMR0ON = 1; 77 } 78 }


    另外一种是用一个定时器,根据时间分段。

    PIC18FXXXXX系列单片机的TMR0寄存器的读写编程技巧

    TMR0工作原理:Timer0即可用作定时器亦可用作计数器;具体的模式由T0CS位(T0CON<5>)选择。在定时器模式下(T0CS=0),除非选择了不同的预分频值,否则,默认情况下在每个时钟周期该模块的计时都会递增。如果写入TMR0寄存器,那么在随后的两个指令周期内,计时将不再递增。用户可通过将校正后的值写入TMR0寄存器来解决上述问题。通过将T0CS位置1选择计数器模式。在计数器模式下,Timer0可在RA4/T0CKI引脚信号的每个上升沿或下降沿递增。触发递增的边沿Timer0时钟源边沿选择位T0SE(T0CON<4>)决定。清零此位选择上升沿递增。

    TMR0的16位读写过程:TMR0H并不是16位模式下Timer0的高字节,而是Timer0高字节的缓冲寄存器,且不可以被直接读写。在读TMR0L时使用Timer0高字节的内容更新TMR0H.这样可以一次读取Timer0 的高16位,而无需验证读到的高字节和低字节的有效性(在高、低字节分两次连续读取的情况下,由于可能存在进位,因此需要验证读到字节的有效性)。同样,写入Timer0的高字节也是通过TMR0H缓冲寄存器来操作的。在写入TMR0L的同时,使用TMR0H的内容更新Timer0的高字节。这样一次就可以完成Timer0全部16位的更新。

    TMR0的16位读写编程技巧(SP9608-PIC单片机增强型开发板)验证TMR0作为外部计数的程序段:

    初始化:

      T0CON=0X3F;将TMR0设置为16位的外部RA4/T0CKI计数功能

          TMR0H=0;

          TMR0L=0;

      T0CONbit.TMR0ON=1;启动TMR0工作

    读取TMR0寄存器中的内容,并合成到一个整形变量

          Temp=TMR0L;

          Temp=TMR0H;

          Temp<<==8;

          Temp|=TMR0L;   

  • 相关阅读:
    第一次冲刺02
    第一次冲刺01
    Android源码分析(十四)PackageManagerService服务分析
    Android源码分析(十三)ActivityManagerService服务分析
    Android源码分析(十二)ServiceManager服务分析
    Serializable和Parcelable之序列化
    ViewPager 相关使用
    AIDL介绍以及简单使用
    Android 四大组件 (五) 第五大组件
    Android 源码分析(十一) 事件传递机制
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/3243639.html
Copyright © 2011-2022 走看看