PIC定时器的使用

2019-04-15 14:35发布

View Code 1 TIM0 查询法使LED一秒闪烁,未使用预分频 2 #include 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 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 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 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 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 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