PIC定时器的使用

PIC定时器的使用
文章图片
View Code

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


PIC定时器的使用
文章图片
PIC定时器的使用
文章图片
PIC定时程序
1 TIM0查询法使LED一秒闪烁,未使用预分频 2 #include3 #define uint unsigned int 4 #define uchar unsigned char 5 #define inputRA3 6 #define clkRA5 7 #define cs_ledRE0 8 __CONFIG(0x3B31); 9 10 void init(); 11 void delay(uint); 12 void write_164(uchar); 13 uint intnum1,intnum2; 14 void main() 15 { 16init(); 17while(1) 18{ 19if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。 20{ 21T0IF=0; //需要软件清零 22intnum1++; 23if(intnum1==3906)//一秒钟到了 24{ 25intnum1=0; 26intnum2++; 27cs_led=0; 28if(intnum2==1) 29write_164(0xfd); 30if(intnum2==2) 31{ 32intnum2=0; 33write_164(0xff); 34} 35} 36} 37} 38 } 39 40 void init() 41 { 42TRISA=0b11010111; 43TRISE=0b11111110; 44OPTION=0x08; //使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频, 45//一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。 46 } 47 48 void delay(uint x) 49 { 50uint a,b; 51for(a=x; a>0; a--) 52for(b=110; b>0; b--); 53 } 54 55 void write_164(uchar dt) 56 { 57uchar i; 58for(i=0; i<8; i++) 59{ 60clk=0; 61if(dt&0x80) 62input=1; 63else 64input=0; 65dt=dt<<1; 66clk=1; 67} 68 } 69 70 TIM0查询法使LED一秒闪烁,使用预分频 71 #include 72 #define uint unsigned int 73 #define uchar unsigned char 74 #define inputRA3 75 #define clkRA5 76 #define cs_ledRE0 77 __CONFIG(0x3B31); 78 void init(); 79 void delay(uint); 80 void write_164(uchar); 81 uint intnum1,intnum2; 82 void main() 83 { 84init(); 85while(1) 86{ 87if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。 88{ 89T0IF=0; //需要软件清零 90TMR0=61; //重新给定时器装初值。 91intnum1++; 92if(intnum1==20)//一秒钟到了 93{ 94intnum1=0; 95intnum2++; 96cs_led=0; 97if(intnum2==1) 98write_164(0xfd); 99if(intnum2==2) 100{ 101intnum2=0; 102write_164(0xff); 103} 104} 105} 106} 107 } 108 109 void init() 110 { 111TRISA=0b11010111; 112TRISE=0b11111110; 113OPTION=0x07; //使用内部时钟信号,预分频器分配给TIM0模块,256分频。 114//一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。 115TMR0=61; //256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。 116 } 117 118 void delay(uint x) 119 { 120uint a,b; 121for(a=x; a>0; a--) 122for(b=110; b>0; b--); 123 } 124 125 void write_164(uchar dt) 126 { 127uchar i; 128for(i=0; i<8; i++) 129{ 130clk=0; 131if(dt&0x80) 132input=1; 133else 134input=0; 135dt=dt<<1; 136clk=1; 137} 138 } 139 140 TIM0中断法使LED一秒闪烁,使用预分频 141 #include142 #define uint unsigned int 143 #define uchar unsigned char 144 #define inputRA3 145 #define clkRA5 146 #define cs_ledRE0 147 __CONFIG(0x3B31); 148 149 void init(); 150 void delay(uint); 151 void write_164(uchar); 152 uint intnum1,intnum2; 153 void main() 154 { 155init(); 156while(1) 157{ 158if(intnum1==2)//一秒钟到了 159{ 160intnum1=0; 161intnum2++; 162cs_led=0; 163if(intnum2==1) 164write_164(0xfd); 165if(intnum2==2) 166{ 167intnum2=0; 168write_164(0xff); 169} 170 171} 172} 173 } 174 175 void init() 176 { 177TRISA=0b11010111; 178TRISE=0b11111110; 179OPTION=0x07; //使用内部时钟信号,预分频器分配给TIM0模块,256分频。 180//一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。 181INTCON=0xa0; //GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。 182TMR0=61; //256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。 183 } 184 185 void interrupt time0() 186 { 187T0IF=0; //由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零, 188TMR0=61; 189intnum1++; 190 } 191 192 void delay(uint x) 193 { 194uint a,b; 195for(a=x; a>0; a--) 196for(b=110; b>0; b--); 197 } 198 199 void write_164(uchar dt) 200 { 201uchar i; 202for(i=0; i<8; i++) 203{ 204clk=0; 205if(dt&0x80) 206input=1; 207else 208input=0; 209dt=dt<<1; 210clk=1; 211} 212 } 213 214 TMR1 中断法TIM0中断法使LED一秒闪烁,不设置预分频。 215 #include216 #define uint unsigned int 217 #define uchar unsigned char 218 #define inputRA3 219 #define clkRA5 220 #define cs_ledRE0 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 { 231init(); 232while(1) 233{ 234if(intnum1==20)//一秒钟到了 235{ 236intnum1=0; 237intnum2++; 238cs_led=0; 239if(intnum2==1) 240write_164(0xfd); 241if(intnum2==2) 242{ 243intnum2=0; 244write_164(0xff); 245} 246} 247} 248 } 249 250 void init() 251 { 252TRISA=0b11010111; 253TRISE=0b11111110; 254INTCON=0xc0; //GIE=1,开总中断,开启第一外设中断 255PIE1=0x01; //开启定时器1的中断 256TMR1L=(65536-50000)%256; 257TMR1H=(65536-50000)/256; //进入一次中断,是50ms, 258T1CON=0x01; //不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1, 259 } 260 261 void interrupt time1() 262 { 263TMR1IF=0; //将中断溢出标志位清零, 264TMR1L=(65536-50000)%256; 265TMR1H=(65536-50000)/256; 266intnum1++; 267 } 268 269 void delay(uint x) 270 { 271uint a,b; 272for(a=x; a>0; a--) 273for(b=110; b>0; b--); 274 } 275 276 void write_164(uchar dt) 277 { 278uchar i; 279for(i=0; i<8; i++) 280{ 281clk=0; 282if(dt&0x80) 283input=1; 284else 285input=0; 286dt=dt<<1; 287clk=1; 288} 289 } 290 291 TMR1 中断法TIM0中断法使LED400ms闪烁,设置预分频 292 #include293 #define uint unsigned int 294 #define uchar unsigned char 295 #define inputRA3 296 #define clkRA5 297 #define cs_ledRE0 298 __CONFIG(0x3B31); 299 300 void init(); 301 void delay(uint); 302 void write_164(uchar); 303 uint intnum1,intnum2; 304 void main() 305 { 306init(); 307while(1) 308{ 309/*if(intnum1==20)//一秒钟到了 310{ 311intnum1=0; 312intnum2++; 313cs_led=0; 314if(intnum2==1) 315write_164(0xfd); 316if(intnum2==2) 317{ 318intnum2=0; 319write_164(0xff); 320} 321}*/ 322} 323 } 324 325 void init() 326 { 327TRISA=0b11010111; 328TRISE=0b11111110; 329INTCON=0xc0; //GIE=1,开总中断,开启第一外设中断 330PIE1=0x01; //开启定时器1的中断 331TMR1L=(65536-50000)%256; 332TMR1H=(65536-50000)/256; //如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。 333T1CON=0x31; //设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1, 334 } 335 336 void interrupt time1() 337 { 338TMR1IF=0; //将中断溢出标志位清零, 339TMR1L=(65536-50000)%256; 340TMR1H=(65536-50000)/256; 341//intnum1++; 342intnum2++; 343cs_led=0; 344if(intnum2==1) 345write_164(0xfd); 346if(intnum2==2) 347{ 348intnum2=0; 349write_164(0xff); 350} 351 } 352 353 void delay(uint x) 354 { 355uint a,b; 356for(a=x; a>0; a--) 357for(b=110; b>0; b--); 358 } 359 360 void write_164(uchar dt) 361 { 362uchar i; 363for(i=0; i<8; i++) 364{ 365clk=0; 366if(dt&0x80) 367input=1; 368else 369input=0; 370dt=dt<<1; 371clk=1; 372} 373 } 374 375 TMR2预分频 后分频 376 #include377 #define uint unsigned int 378 #define uchar unsigned char 379 #define inputRA3 380 #define clkRA5 381 #define cs_ledRE0 382 __CONFIG(0x3B31); 383 384 void init(); 385 void delay(uint); 386 void write_164(uchar); 387 uint intnum1,intnum2; 388 void main() 389 { 390init(); 391while(1) 392{ 393if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms 394{ 395intnum1=0; 396intnum2++; 397cs_led=0; 398if(intnum2==1) 399write_164(0xfd); 400if(intnum2==2) 401{ 402intnum2=0; 403write_164(0xff); 404} 405} 406} 407 } 408 409 void init() 410 { 411TRISA=0b11010111; 412TRISE=0b11111110; 413INTCON=0xc0; //GIE=1,开总中断,开启第一外设中断外围功能模块中断 414PIE1=0x02; //开启定时器2的中断 415TMR2=56; 416T2CON=0x0d; //预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2, 417 } 418 419 void interrupt time1() 420 { 421TMR2IF=0; //将中断溢出标志位清零, 422TMR2=56; 423intnum1++; 424 } 425 426 void delay(uint x) 427 { 428uint a,b; 429for(a=x; a>0; a--) 430for(b=110; b>0; b--); 431 } 432 433 void write_164(uchar dt) 434 { 435uchar i; 436for(i=0; i<8; i++) 437{ 438clk=0; 439if(dt&0x80) 440input=1; 441else 442input=0; 443dt=dt<<1; 444clk=1; 445} 446 } 447 TMR2预分频 后分频 周期寄存器 448 #include449 #define uint unsigned int 450 #define uchar unsigned char 451 #define inputRA3 452 #define clkRA5 453 #define cs_ledRE0 454 __CONFIG(0x3B31); 455 void init(); 456 void delay(uint); 457 void write_164(uchar); 458 uint intnum1,intnum2; 459 void main() 460 { 461init(); 462while(1) 463{ 464if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms 465{ 466intnum1=0; 467intnum2++; 468cs_led=0; 469if(intnum2==1) 470write_164(0xfd); 471if(intnum2==2) 472{ 473intnum2=0; 474write_164(0xff); 475} 476} 477} 478 } 479 480 void init() 481 { 482TRISA=0b11010111; 483TRISE=0b11111110; 484INTCON=0xc0; //GIE=1,开总中断,开启第一外设中断外围功能模块中断 485PIE1=0x02; //开启定时器2的中断 486TMR2=0; 487PR2=100; //周期寄存器 488T2CON=0x0d; //预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2? 489 } 490 491 void interrupt time1() 492 { 493TMR2IF=0; //将中断溢出标志位清零, 494//TMR2=56; 495intnum1++; 496 } 497 498 void delay(uint x) 499 { 500uint a,b; 501for(a=x; a>0; a--) 502for(b=110; b>0; b--); 503 } 504 505 void write_164(uchar dt) 506 { 507uchar i; 508for(i=0; i<8; i++) 509{ 510clk=0; 511if(dt&0x80) 512input=1; 513else 514input=0; 515dt=dt<<1; 516clk=1; 517} 518 }


所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1 ,计数值达到予置值后,定时/计数模块产生溢出。
所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。
定时器/ 计数器TMR0 模块的定时工作方式
对8 位定时器TMR0 来说,不使用分频器时,定时时间的计算公式为:(28 -计数初值)×指令周期
使用分频器时,定时时间的计算公式为:分频比×(28-计数初值) ×指令周期;分频比取值为2 、4 、8…256。

PIC定时器的使用
文章图片

首先强调的是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)。
【PIC定时器的使用】(2)用作延时可调的周期性定时器:如指令周期为T,预分频比为P ,周期寄存器预赋值为PR2 ,后分频比为P2,则该超时溢出周期为:TTMR2IF=T×P1×(PR2+1)×P2
(3)用作普通定时器:如指令周期为T,预分频比为P1,则定时时间为P1×(28-X)×T(以PIC16F877A为例进行的说明)

    推荐阅读