×
单片机 > 单片机程序设计 > 详情

几种方波方法及脉冲计数

发布时间:2025-02-28 发布时间:
|

 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;   


关键字:方波  脉冲计数 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8X8 LED点阵显示原理与编程技术