• PIC定时器的使用


    View Code
      1 TIM0  查询法使LED一秒闪烁,未使用预分频
      2 #include<pic.h>
      3 #define uint unsigned int
      4 #define uchar unsigned char
      5 #define input  RA3
      6 #define clk  RA5
      7 #define cs_led  RE0 
      8 __CONFIG(0x3B31);
      9 
     10 void init();
     11 void delay(uint);
     12 void write_164(uchar);
     13 uint intnum1,intnum2;
     14 void main()
     15 {
     16        init();
     17        while(1)
     18        {
     19               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
     20               {
     21                      T0IF=0;//需要软件清零
     22                  intnum1++;
     23                      if(intnum1==3906)//一秒钟到了
     24                     {
     25                             intnum1=0;
     26                             intnum2++;
     27                             cs_led=0;
     28                             if(intnum2==1)
     29                             write_164(0xfd);
     30                             if(intnum2==2)
     31                             {
     32                                    intnum2=0;
     33                                    write_164(0xff);
     34                             }
     35                      }                  
     36               }
     37        }
     38 }
     39 
     40 void init()
     41 {
     42        TRISA=0b11010111;
     43        TRISE=0b11111110;
     44        OPTION=0x08;//使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频,
     45        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
     46 }
     47 void delay(uint x)
     48 {
     49        uint a,b;
     50        for(a=x;a>0;a--)
     51               for(b=110;b>0;b--);
     52 }
     53 
     54 void write_164(uchar dt)
     55 {
     56        uchar i;   
     57        for(i=0;i<8;i++)
     58        { 
     59               clk=0;     
     60               if(dt&0x80)
     61                      input=1;
     62               else
     63                      input=0;
     64               dt=dt<<1;                   
     65               clk=1;           
     66        }            
     67 }
     68 
     69 TIM0  查询法使LED一秒闪烁,使用预分频
     70 #include<pic.h>
     71 #define uint unsigned int
     72 #define uchar unsigned char
     73 #define input  RA3
     74 #define clk  RA5
     75 #define cs_led  RE0 
     76 __CONFIG(0x3B31);
     77 
     78 void init();
     79 void delay(uint);
     80 void write_164(uchar);
     81 uint intnum1,intnum2;
     82 void main()
     83 {
     84        init();
     85        while(1)
     86        {
     87               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
     88               {
     89                           T0IF=0;//需要软件清零
     90                      TMR0=61;//重新给定时器装初值。
     91                      intnum1++;
     92                      if(intnum1==20)//一秒钟到了
     93                      {
     94                             intnum1=0;
     95                             intnum2++;
     96                             cs_led=0;
     97                             if(intnum2==1)
     98                             write_164(0xfd);
     99                             if(intnum2==2)
    100                             {
    101                                    intnum2=0;
    102                                    write_164(0xff);
    103                             }
    104                      }
    105               }
    106        }
    107 }
    108 
    109 void init()
    110 {
    111        TRISA=0b11010111;
    112        TRISE=0b11111110;
    113        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
    114        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
    115        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
    116 }
    117 
    118 void delay(uint x)
    119 {
    120        uint a,b;
    121        for(a=x;a>0;a--)
    122               for(b=110;b>0;b--);
    123 }
    124 
    125 void write_164(uchar dt)
    126 {
    127        uchar i;   
    128        for(i=0;i<8;i++)
    129        { 
    130               clk=0;     
    131               if(dt&0x80)
    132                      input=1;
    133               else
    134                      input=0;
    135               dt=dt<<1;       
    136               clk=1;           
    137        }            
    138 }
    139 
    140 TIM0  中断法使LED一秒闪烁,使用预分频
    141 #include<pic.h>
    142 #define uint unsigned int
    143 #define uchar unsigned char
    144 #define input  RA3
    145 #define clk  RA5
    146 #define cs_led  RE0 
    147 __CONFIG(0x3B31);
    148  
    149 void init();
    150 void delay(uint);
    151 void write_164(uchar);
    152 uint intnum1,intnum2;
    153 void main()
    154 {
    155        init();
    156       while(1)
    157        {
    158       if(intnum1==2)//一秒钟到了
    159                      {
    160                             intnum1=0;
    161                             intnum2++;
    162                             cs_led=0;
    163                             if(intnum2==1)
    164                             write_164(0xfd);
    165                             if(intnum2==2)
    166                             {
    167                                    intnum2=0;
    168                                    write_164(0xff);                         
    169                             }                   
    170                      }            
    171        }
    172 }
    173 
    174 void init()
    175 {
    176        TRISA=0b11010111;
    177        TRISE=0b11111110;
    178        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
    179        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
    180        INTCON=0xa0;//GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。
    181        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
    182 }
    183 
    184 void interrupt time0()
    185 
    186 {
    187        T0IF=0;//由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零,
    188        TMR0=61;
    189        intnum1++;
    190 }
    191 
    192 void delay(uint x)
    193 {
    194        uint a,b;
    195        for(a=x;a>0;a--)
    196               for(b=110;b>0;b--);
    197 }
    198 
    199 void write_164(uchar dt)
    200 {
    201       uchar i;   
    202        for(i=0;i<8;i++)
    203        { 
    204               clk=0;             
    205               if(dt&0x80)
    206                      input=1;
    207               else
    208                      input=0;
    209               dt=dt<<1;                          
    210               clk=1;           
    211        }            
    212 }
    213 
    214 TMR1 中断法TIM0  中断法使LED一秒闪烁,不设置预分频。
    215 #include<pic.h>
    216 #define uint unsigned int
    217 #define uchar unsigned char
    218 #define input  RA3
    219 #define clk  RA5
    220 #define cs_led  RE0 
    221 
    222 __CONFIG(0x3B31);
    223 
    224  
    225 
    226 void init();
    227 void delay(uint);
    228 void write_164(uchar);
    229 uint intnum1,intnum2;
    230 void main()
    231 {
    232        init();
    233        while(1)
    234        {
    235                 if(intnum1==20)//一秒钟到了
    236 
    237                      {
    238 
    239                             intnum1=0;
    240 
    241                             intnum2++;
    242 
    243                             cs_led=0;
    244 
    245                             if(intnum2==1)
    246 
    247                             write_164(0xfd);
    248 
    249                             if(intnum2==2)
    250 
    251                             {
    252 
    253                                    intnum2=0;
    254 
    255                                    write_164(0xff);
    256 
    257                             
    258 
    259                             }                   
    260 
    261                      }            
    262 
    263        }
    264 
    265 }
    266 
    267 void init()
    268 
    269 {
    270 
    271        TRISA=0b11010111;
    272 
    273        TRISE=0b11111110;
    274 
    275  
    276 
    277        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
    278 
    279        PIE1=0x01;//开启定时器1的中断
    280 
    281        TMR1L=(65536-50000)%256;
    282 
    283        TMR1H=(65536-50000)/256;//进入一次中断,是50ms,
    284 
    285  
    286 
    287        T1CON=0x01;//不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
    288 
    289  
    290 
    291 }
    292 
    293 void interrupt time1()
    294 
    295 {
    296 
    297        TMR1IF=0;//将中断溢出标志位清零,
    298 
    299        TMR1L=(65536-50000)%256;
    300 
    301        TMR1H=(65536-50000)/256;
    302 
    303        
    304 
    305        intnum1++;
    306 
    307 }
    308 
    309 void delay(uint x)
    310 
    311 {
    312 
    313        uint a,b;
    314 
    315        for(a=x;a>0;a--)
    316 
    317               for(b=110;b>0;b--);
    318 
    319  
    320 
    321 }
    322 
    323 void write_164(uchar dt)
    324 
    325 {
    326 
    327        uchar i;   
    328 
    329        for(i=0;i<8;i++)
    330 
    331        { 
    332 
    333               clk=0;     
    334 
    335               
    336 
    337               if(dt&0x80)
    338 
    339                      input=1;
    340 
    341               else
    342 
    343                      input=0;
    344 
    345               dt=dt<<1;       
    346 
    347                      
    348 
    349               clk=1;           
    350 
    351        }            
    352 
    353 }
    354 
    355 TMR1 中断法TIM0  中断法使LED400ms闪烁,设置预分频
    356 
    357 #include<pic.h>
    358 
    359 #define uint unsigned int
    360 
    361 #define uchar unsigned char
    362 
    363 #define input  RA3
    364 
    365 #define clk  RA5
    366 
    367 #define cs_led  RE0 
    368 
    369  
    370 
    371 __CONFIG(0x3B31);
    372 
    373  
    374 
    375 void init();
    376 
    377 void delay(uint);
    378 
    379 void write_164(uchar);
    380 
    381 uint intnum1,intnum2;
    382 
    383 void main()
    384 
    385 {
    386 
    387        init();
    388 
    389        while(1)
    390 
    391        {
    392 
    393        
    394 
    395               /*    if(intnum1==20)//一秒钟到了
    396 
    397                      {
    398 
    399                             intnum1=0;
    400 
    401                             intnum2++;
    402 
    403                             cs_led=0;
    404 
    405                             if(intnum2==1)
    406 
    407                             write_164(0xfd);
    408 
    409                             if(intnum2==2)
    410 
    411                             {
    412 
    413                                    intnum2=0;
    414 
    415                                    write_164(0xff);
    416 
    417                             
    418 
    419                             }                   
    420 
    421                      }*/          
    422 
    423        }
    424 
    425 }
    426 
    427 void init()
    428 
    429 {
    430 
    431        TRISA=0b11010111;
    432 
    433        TRISE=0b11111110;
    434 
    435  
    436 
    437        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
    438 
    439        PIE1=0x01;//开启定时器1的中断
    440 
    441        TMR1L=(65536-50000)%256;
    442 
    443        TMR1H=(65536-50000)/256;//如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。
    444 
    445  
    446 
    447        T1CON=0x31;//设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
    448 
    449  
    450 
    451 }
    452 
    453 void interrupt time1()
    454 
    455 {
    456 
    457        TMR1IF=0;//将中断溢出标志位清零,
    458 
    459        TMR1L=(65536-50000)%256;
    460 
    461        TMR1H=(65536-50000)/256;
    462 
    463        
    464 
    465        //intnum1++;
    466 
    467               intnum2++;
    468 
    469                             cs_led=0;
    470 
    471                             if(intnum2==1)
    472 
    473                             write_164(0xfd);
    474 
    475                             if(intnum2==2)
    476 
    477                             {
    478 
    479                                    intnum2=0;
    480 
    481                                    write_164(0xff);
    482 
    483                             
    484 
    485                             }                   
    486 
    487  
    488 
    489 }
    490 
    491 void delay(uint x)
    492 
    493 {
    494 
    495        uint a,b;
    496 
    497        for(a=x;a>0;a--)
    498 
    499               for(b=110;b>0;b--);
    500 
    501  
    502 
    503 }
    504 
    505 void write_164(uchar dt)
    506 
    507 {
    508 
    509        uchar i;   
    510 
    511        for(i=0;i<8;i++)
    512 
    513        { 
    514 
    515               clk=0;     
    516 
    517               
    518 
    519               if(dt&0x80)
    520 
    521                      input=1;
    522 
    523               else
    524 
    525                      input=0;
    526 
    527               dt=dt<<1;       
    528 
    529                      
    530 
    531               clk=1;           
    532 
    533        }            
    534 
    535 }
    536 
    537 TMR2预分频 后分频       
    538 
    539 #include<pic.h>
    540 
    541 #define uint unsigned int
    542 
    543 #define uchar unsigned char
    544 
    545 #define input  RA3
    546 
    547 #define clk  RA5
    548 
    549 #define cs_led  RE0 
    550 
    551  
    552 
    553 __CONFIG(0x3B31);
    554 
    555  
    556 
    557 void init();
    558 
    559 void delay(uint);
    560 
    561 void write_164(uchar);
    562 
    563 uint intnum1,intnum2;
    564 
    565 void main()
    566 
    567 {
    568 
    569        init();
    570 
    571        while(1)
    572 
    573        {
    574 
    575        
    576 
    577                      if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms
    578 
    579                      {
    580 
    581                             intnum1=0;
    582 
    583                             intnum2++;
    584 
    585                             cs_led=0;
    586 
    587                             if(intnum2==1)
    588 
    589                             write_164(0xfd);
    590 
    591                             if(intnum2==2)
    592 
    593                             {
    594 
    595                                    intnum2=0;
    596 
    597                                    write_164(0xff);
    598 
    599                             
    600 
    601                             }                   
    602 
    603                      }     
    604 
    605        }
    606 
    607 }
    608 
    609 void init()
    610 
    611 {
    612 
    613        TRISA=0b11010111;
    614 
    615        TRISE=0b11111110;
    616 
    617  
    618 
    619        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
    620 
    621        PIE1=0x02;//开启定时器2的中断
    622 
    623  
    624 
    625        TMR2=56;
    626 
    627        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,
    628 
    629  
    630 
    631 }
    632 
    633 void interrupt time1()
    634 
    635 {
    636 
    637        TMR2IF=0;//将中断溢出标志位清零,
    638 
    639        TMR2=56;
    640 
    641        
    642 
    643        intnum1++;
    644 
    645                             
    646 
    647  
    648 
    649 }
    650 
    651 void delay(uint x)
    652 
    653 {
    654 
    655        uint a,b;
    656 
    657        for(a=x;a>0;a--)
    658 
    659               for(b=110;b>0;b--);
    660 
    661  
    662 
    663 }
    664 
    665 void write_164(uchar dt)
    666 
    667 {
    668 
    669        uchar i;   
    670 
    671        for(i=0;i<8;i++)
    672 
    673        { 
    674 
    675               clk=0;     
    676 
    677               
    678 
    679               if(dt&0x80)
    680 
    681                      input=1;
    682 
    683               else
    684 
    685                      input=0;
    686 
    687               dt=dt<<1;       
    688 
    689                      
    690 
    691               clk=1;           
    692 
    693        }            
    694 
    695 }
    696 
    697 TMR2预分频 后分频 周期寄存器
    698 
    699 #include<pic.h>
    700 
    701 #define uint unsigned int
    702 
    703 #define uchar unsigned char
    704 
    705 #define input  RA3
    706 
    707 #define clk  RA5
    708 
    709 #define cs_led  RE0 
    710 
    711  
    712 
    713 __CONFIG(0x3B31);
    714 
    715  
    716 
    717 void init();
    718 
    719 void delay(uint);
    720 
    721 void write_164(uchar);
    722 
    723 uint intnum1,intnum2;
    724 
    725 void main()
    726 
    727 {
    728 
    729        init();
    730 
    731        while(1)
    732 
    733        {
    734 
    735        
    736 
    737                      if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms
    738 
    739                      {
    740 
    741                             intnum1=0;
    742 
    743                             intnum2++;
    744 
    745                             cs_led=0;
    746 
    747                             if(intnum2==1)
    748 
    749                             write_164(0xfd);
    750 
    751                             if(intnum2==2)
    752 
    753                             {
    754 
    755                                    intnum2=0;
    756 
    757                                    write_164(0xff);
    758 
    759                             
    760 
    761                             }                   
    762 
    763                      }     
    764 
    765        }
    766 
    767 }
    768 
    769 void init()
    770 
    771 {
    772 
    773        TRISA=0b11010111;
    774 
    775        TRISE=0b11111110;
    776 
    777  
    778 
    779        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
    780 
    781        PIE1=0x02;//开启定时器2的中断
    782 
    783  
    784 
    785        TMR2=0;
    786 
    787        PR2=100;//周期寄存器
    788 
    789        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,
    790 
    791  
    792 
    793 }
    794 
    795 void interrupt time1()
    796 
    797 {
    798 
    799        TMR2IF=0;//将中断溢出标志位清零,
    800 
    801        //TMR2=56;
    802 
    803        
    804 
    805        intnum1++;
    806 
    807                             
    808 
    809  
    810 
    811 }
    812 
    813 void delay(uint x)
    814 
    815 {
    816 
    817        uint a,b;
    818 
    819        for(a=x;a>0;a--)
    820 
    821               for(b=110;b>0;b--);
    822 
    823  
    824 
    825 }
    826 
    827 void write_164(uchar dt)
    828 
    829 {
    830 
    831        uchar i;   
    832 
    833        for(i=0;i<8;i++)
    834 
    835        { 
    836 
    837               clk=0;     
    838 
    839               
    840 
    841               if(dt&0x80)
    842 
    843                      input=1;
    844 
    845               else
    846 
    847                      input=0;
    848 
    849               dt=dt<<1;       
    850 
    851                      
    852 
    853               clk=1;           
    854 
    855        }            
    856 
    857 }
    PIC定时程序
      1 TIM0  查询法使LED一秒闪烁,未使用预分频
      2 #include<pic.h>
      3 #define uint unsigned int
      4 #define uchar unsigned char
      5 #define input  RA3
      6 #define clk  RA5
      7 #define cs_led  RE0 
      8 __CONFIG(0x3B31);
      9 
     10 void init();
     11 void delay(uint);
     12 void write_164(uchar);
     13 uint intnum1,intnum2;
     14 void main()
     15 {
     16        init();
     17        while(1)
     18        {
     19             if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
     20               {
     21                      T0IF=0;//需要软件清零
     22                      intnum1++;
     23                      if(intnum1==3906)//一秒钟到了
     24                      {
     25                             intnum1=0;
     26                             intnum2++;
     27                             cs_led=0;
     28                             if(intnum2==1)
     29                             write_164(0xfd);
     30                             if(intnum2==2)
     31                             {
     32                                   intnum2=0;
     33                                    write_164(0xff);                          
     34                             }                   
     35                      }                     
     36               }
     37        }
     38 }
     39 
     40 void init()
     41 {
     42        TRISA=0b11010111;
     43        TRISE=0b11111110;
     44        OPTION=0x08;//使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频,
     45        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
     46 }
     47 
     48 void delay(uint x)
     49 {
     50        uint a,b;
     51        for(a=x;a>0;a--)
     52               for(b=110;b>0;b--);
     53 }
     54 
     55 void write_164(uchar dt)
     56 {
     57        uchar i;   
     58        for(i=0;i<8;i++)
     59        { 
     60               clk=0;                  
     61               if(dt&0x80)
     62                      input=1;
     63               else
     64                      input=0;
     65               dt=dt<<1;                            
     66               clk=1;           
     67        }            
     68 }
     69 
     70 TIM0  查询法使LED一秒闪烁,使用预分频
     71 #include<pic.h>
     72 #define uint unsigned int
     73 #define uchar unsigned char
     74 #define input  RA3
     75 #define clk  RA5
     76 #define cs_led  RE0  
     77 __CONFIG(0x3B31);
     78 void init();
     79 void delay(uint);
     80 void write_164(uchar);
     81 uint intnum1,intnum2;
     82 void main()
     83 {
     84        init();
     85        while(1)
     86        {             
     87               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
     88               {
     89                      T0IF=0;//需要软件清零
     90                      TMR0=61;//重新给定时器装初值。
     91                      intnum1++;
     92                      if(intnum1==20)//一秒钟到了
     93                      {
     94                             intnum1=0;
     95                             intnum2++;
     96                             cs_led=0;
     97                             if(intnum2==1)
     98                                        write_164(0xfd);
     99                             if(intnum2==2)
    100                             {
    101                                   intnum2=0;
    102                                    write_164(0xff);                            
    103                             }
    104                   }
    105               }
    106        }
    107 }
    108 
    109 void init()
    110 {
    111        TRISA=0b11010111;
    112        TRISE=0b11111110;
    113        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
    114        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
    115        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
    116 }
    117 
    118 void delay(uint x)
    119 {
    120        uint a,b;
    121        for(a=x;a>0;a--)
    122               for(b=110;b>0;b--);
    123 }
    124 
    125 void write_164(uchar dt)
    126 {
    127        uchar i;   
    128        for(i=0;i<8;i++)
    129        { 
    130               clk=0;               
    131               if(dt&0x80)
    132                      input=1;
    133               else
    134                      input=0;
    135               dt=dt<<1;                            
    136               clk=1;           
    137        }            
    138 }
    139 
    140 TIM0  中断法使LED一秒闪烁,使用预分频
    141 #include<pic.h>
    142 #define uint unsigned int
    143 #define uchar unsigned char
    144 #define input  RA3
    145 #define clk  RA5
    146 #define cs_led  RE0 
    147 __CONFIG(0x3B31);
    148 
    149 void init();
    150 void delay(uint);
    151 void write_164(uchar);
    152 uint intnum1,intnum2;
    153 void main()
    154 {
    155        init();
    156        while(1)
    157        {
    158                      if(intnum1==2)//一秒钟到了
    159                      {
    160                             intnum1=0;
    161                             intnum2++;
    162                             cs_led=0;
    163                             if(intnum2==1)
    164                             write_164(0xfd);
    165                             if(intnum2==2)
    166                             {
    167                                   intnum2=0;
    168                                    write_164(0xff);                            
    169                             }                   
    170 
    171                      }            
    172        }
    173 }
    174 
    175 void init()
    176 {
    177        TRISA=0b11010111;
    178        TRISE=0b11111110;
    179        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
    180        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
    181        INTCON=0xa0;//GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。
    182        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
    183 }
    184 
    185 void interrupt time0()
    186 {
    187        T0IF=0;//由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零,
    188        TMR0=61;
    189        intnum1++;
    190 }
    191 
    192 void delay(uint x)
    193 {
    194        uint a,b;
    195        for(a=x;a>0;a--)
    196               for(b=110;b>0;b--);
    197 }
    198 
    199 void write_164(uchar dt)
    200 {
    201        uchar i;   
    202        for(i=0;i<8;i++)
    203        { 
    204               clk=0;                 
    205              if(dt&0x80)
    206                      input=1;
    207               else
    208                      input=0;
    209               dt=dt<<1;                            
    210               clk=1;           
    211        }            
    212 }
    213 
    214 TMR1 中断法TIM0  中断法使LED一秒闪烁,不设置预分频。
    215 #include<pic.h>
    216 #define uint unsigned int
    217 #define uchar unsigned char
    218 #define input  RA3
    219 #define clk  RA5
    220 #define cs_led  RE0 
    221 __CONFIG(0x3B31);
    222 
    223  
    224 
    225 void init();
    226 void delay(uint);
    227 void write_164(uchar);
    228 uint intnum1,intnum2;
    229 void main()
    230 {
    231        init();
    232        while(1)
    233        {     
    234                      if(intnum1==20)//一秒钟到了
    235                      {
    236                             intnum1=0;
    237                             intnum2++;
    238                             cs_led=0;
    239                             if(intnum2==1)
    240                                         write_164(0xfd);
    241                             if(intnum2==2)
    242                             {
    243                                    intnum2=0;
    244                                    write_164(0xff);                         
    245                             }                   
    246                      }            
    247        }
    248 }
    249 
    250 void init()
    251 {
    252        TRISA=0b11010111;
    253        TRISE=0b11111110; 
    254        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
    255        PIE1=0x01;//开启定时器1的中断
    256        TMR1L=(65536-50000)%256;
    257        TMR1H=(65536-50000)/256;//进入一次中断,是50ms, 
    258        T1CON=0x01;//不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
    259 }
    260 
    261 void interrupt time1()
    262 {
    263        TMR1IF=0;//将中断溢出标志位清零,
    264        TMR1L=(65536-50000)%256;
    265        TMR1H=(65536-50000)/256;       
    266        intnum1++;
    267 }
    268 
    269 void delay(uint x)
    270 {
    271        uint a,b;
    272        for(a=x;a>0;a--)
    273               for(b=110;b>0;b--);
    274 }
    275 
    276 void write_164(uchar dt)
    277 {
    278        uchar i;   
    279        for(i=0;i<8;i++)
    280        { 
    281               clk=0;                
    282               if(dt&0x80)
    283                     input=1;
    284               else
    285                      input=0;
    286               dt=dt<<1;                            
    287               clk=1;           
    288        }            
    289 }
    290 
    291 TMR1 中断法TIM0  中断法使LED400ms闪烁,设置预分频
    292 #include<pic.h>
    293 #define uint unsigned int
    294 #define uchar unsigned char
    295 #define input  RA3
    296 #define clk  RA5
    297 #define cs_led  RE0 
    298 __CONFIG(0x3B31);
    299 
    300 void init();
    301 void delay(uint);
    302 void write_164(uchar);
    303 uint intnum1,intnum2;
    304 void main()
    305 {
    306        init();
    307        while(1)
    308        {                   
    309               /*    if(intnum1==20)//一秒钟到了
    310                    {
    311                             intnum1=0;                                                
    312                             intnum2++;
    313                             cs_led=0;
    314                             if(intnum2==1)
    315                             write_164(0xfd);
    316                             if(intnum2==2)
    317                             {
    318                                   intnum2=0;
    319                                    write_164(0xff);                           
    320                             }                   
    321                      }*/          
    322        }
    323 }
    324 
    325 void init()
    326 {
    327        TRISA=0b11010111;
    328        TRISE=0b11111110; 
    329        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
    330        PIE1=0x01;//开启定时器1的中断
    331        TMR1L=(65536-50000)%256;
    332        TMR1H=(65536-50000)/256;//如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。
    333        T1CON=0x31;//设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
    334 }
    335 
    336 void interrupt time1()
    337 {
    338        TMR1IF=0;//将中断溢出标志位清零,
    339        TMR1L=(65536-50000)%256;
    340        TMR1H=(65536-50000)/256;      
    341        //intnum1++;
    342         intnum2++;
    343        cs_led=0;
    344         if(intnum2==1)
    345              write_164(0xfd);
    346          if(intnum2==2)
    347             {
    348                    intnum2=0;
    349                    write_164(0xff);           
    350             }                   
    351 }
    352 
    353 void delay(uint x)
    354 {
    355        uint a,b;
    356        for(a=x;a>0;a--)
    357               for(b=110;b>0;b--); 
    358 }
    359 
    360 void write_164(uchar dt)
    361 {
    362        uchar i;   
    363        for(i=0;i<8;i++)
    364        {                           
    365               clk=0;                   
    366               if(dt&0x80)
    367                      input=1;
    368               else                    
    369                      input=0;
    370               dt=dt<<1;                            
    371               clk=1;           
    372        }            
    373 }
    374 
    375 TMR2预分频 后分频       
    376 #include<pic.h>
    377 #define uint unsigned int
    378 #define uchar unsigned char
    379 #define input  RA3
    380 #define clk  RA5
    381 #define cs_led  RE0 
    382 __CONFIG(0x3B31);
    383 
    384 void init();
    385 void delay(uint);
    386 void write_164(uchar);
    387 uint intnum1,intnum2;
    388 void main()
    389 {      
    390        init();
    391        while(1)
    392        {      
    393                      if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms
    394                      {
    395                             intnum1=0;
    396                             intnum2++;
    397                             cs_led=0;
    398                             if(intnum2==1)
    399                             write_164(0xfd);
    400                             if(intnum2==2)
    401                             {                                  
    402                                    intnum2=0;
    403                                            write_164(0xff);
    404                             }                   
    405                      }     
    406        }
    407 }
    408 
    409 void init()
    410 {
    411        TRISA=0b11010111;
    412        TRISE=0b11111110;
    413        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
    414        PIE1=0x02;//开启定时器2的中断 
    415        TMR2=56;
    416        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,
    417 }
    418 
    419 void interrupt time1()
    420 {
    421        TMR2IF=0;//将中断溢出标志位清零,
    422        TMR2=56;       
    423        intnum1++;                           
    424 }
    425 
    426 void delay(uint x)
    427 {
    428        uint a,b;
    429        for(a=x;a>0;a--)
    430               for(b=110;b>0;b--);
    431 }
    432 
    433 void write_164(uchar dt)
    434 {
    435        uchar i;   
    436        for(i=0;i<8;i++)
    437        { 
    438               clk=0;            
    439               if(dt&0x80)
    440                      input=1;
    441               else
    442                      input=0;
    443               dt=dt<<1;                            
    444               clk=1;           
    445        }            
    446 }
    447 TMR2预分频 后分频 周期寄存器
    448 #include<pic.h>
    449 #define uint unsigned int
    450 #define uchar unsigned char
    451 #define input  RA3
    452 #define clk  RA5
    453 #define cs_led  RE0 
    454 __CONFIG(0x3B31);
    455 void init();
    456 void delay(uint);
    457 void write_164(uchar);
    458 uint intnum1,intnum2;
    459 void main()
    460 {
    461        init();
    462        while(1)
    463        {     
    464                      if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms
    465                      {
    466                             intnum1=0;
    467                             intnum2++;
    468                             cs_led=0;
    469                             if(intnum2==1)
    470                                     write_164(0xfd);
    471                             if(intnum2==2)
    472                             {
    473                                    intnum2=0;
    474                                    write_164(0xff);                          
    475                             }                   
    476                      }     
    477        }
    478 }
    479 
    480 void init()
    481 {
    482        TRISA=0b11010111;
    483        TRISE=0b11111110;
    484        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
    485        PIE1=0x02;//开启定时器2的中断
    486        TMR2=0;
    487        PR2=100;//周期寄存器
    488        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2?
    489 }
    490 
    491 void interrupt time1()
    492 {
    493        TMR2IF=0;//将中断溢出标志位清零,
    494        //TMR2=56;       
    495        intnum1++;                           
    496 }
    497 
    498 void delay(uint x)
    499 {
    500        uint a,b;
    501        for(a=x;a>0;a--)
    502               for(b=110;b>0;b--);
    503 }
    504 
    505 void write_164(uchar dt)
    506 {
    507        uchar i;   
    508        for(i=0;i<8;i++)
    509        { 
    510               clk=0;                  
    511               if(dt&0x80)
    512                      input=1;
    513               else
    514                     input=0;
    515               dt=dt<<1;                           
    516               clk=1;           
    517        }            
    518 }

     所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1 ,计数值达到予置值后,定时/计数模块产生溢出。

    所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。

    定时器/ 计数器TMR0 模块的定时工作方式

      对8 位定时器TMR0 来说,不使用分频器时,定时时间的计算公式为:(2-计数初值)×指令周期

      使用分频器时,定时时间的计算公式为:分频比×(28-计数初值) ×指令周期;分频比取值为2 、4 、8…256。

             首先强调的是TMR1可以被禁止工作,以降低能耗。要关闭定时/计数模块T M R 1只要将 T M R 1使能位 TMR1ON清0 ,“ 与” 门G1的一个引脚被低电平封锁,就使得累加计数器保持静止状态。对16位定时器TMR1 来说,如选择内部时钟源,则定时时间的计算公式为:

             分频比×(216– 计数初值)  ×指令周期。分频比取值为1 、2 、4、8 。

    定时器TMR2模块只有一种工作方式,即定时器工作方式.时钟信
    号由内部系统时钟4分频后获取,即取自指令周期信号.
    (1)用作周期可调的时基发生器:如指令周期为T,分频比为P1,周期寄存器预赋值为PR2 ,则该周期的计算式为:TTMR2=T×P1×(PR2+1)。

    (2)用作延时可调的周期性定时器:如指令周期为T,预分频比为P ,周期寄存器预赋值为PR2 ,后分频比为P2,则该超时溢出周期为:TTMR2IF=T×P1×(PR2+1)×P2
    (3)用作普通定时器:如指令周期为T,预分频比为P1,则定时时间为P1×(28-X)×T   (以PIC16F877A为例进行的说明)

  • 相关阅读:
    Vue 异步组件按需加载
    Net core 连接 Minio 出现 Access Denied 错误
    vue 脚手架打包 生成时间戳版本号
    vue tab 切换动画
    想尽办法不出错的语言太可怕了
    .NET Core:处理全局异常
    C#获取当前路径的方法
    [C#]解决生成的缩略图模糊的问题
    C# 正则表达式 —— 中文/英文空格(全角/半角空格)处理
    用C# 7.0的switch...case模式匹配取代一堆if语句
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/2527091.html
Copyright © 2020-2023  润新知