- 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 }
|