[其他产品] PIC定时器的使用

[复制链接]
1337|2
 楼主| deadtime 发表于 2019-5-6 20:33 | 显示全部楼层 |阅读模式
所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1 ,计数值达到予置值后,定时/计数模块产生溢出。
所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。
定时器/ 计数器TMR0 模块的定时工作方式
  对8 位定时器TMR0 来说,不使用分频器时,定时时间的计算公式为:(28 -计数初值)×指令周期
  使用分频器时,定时时间的计算公式为:分频比×(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为例进行的说明)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| deadtime 发表于 2019-5-6 20:34 | 显示全部楼层
  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. void init();
  10. void delay(uint);
  11. void write_164(uchar);
  12. uint intnum1,intnum2;
  13. void main()
  14. {
  15.        init();
  16.        while(1)
  17.        {
  18.               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
  19.               {
  20.                      T0IF=0;//需要软件清零
  21.                  intnum1++;
  22.                      if(intnum1==3906)//一秒钟到了
  23.                     {
  24.                             intnum1=0;
  25.                             intnum2++;
  26.                             cs_led=0;
  27.                             if(intnum2==1)
  28.                             write_164(0xfd);
  29.                             if(intnum2==2)
  30.                             {
  31.                                    intnum2=0;
  32.                                    write_164(0xff);
  33.                             }
  34.                      }                  
  35.               }
  36.        }
  37. }

  38. void init()
  39. {
  40.        TRISA=0b11010111;
  41.        TRISE=0b11111110;
  42.        OPTION=0x08;//使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频,
  43.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  44. }
  45. void delay(uint x)
  46. {
  47.        uint a,b;
  48.        for(a=x;a>0;a--)
  49.               for(b=110;b>0;b--);
  50. }

  51. void write_164(uchar dt)
  52. {
  53.        uchar i;   
  54.        for(i=0;i<8;i++)
  55.        {
  56.               clk=0;     
  57.               if(dt&0x80)
  58.                      input=1;
  59.               else
  60.                      input=0;
  61.               dt=dt<<1;                  
  62.               clk=1;           
  63.        }            
  64. }

  65. TIM0  查询法使LED一秒闪烁,使用预分频
  66. #include<pic.h>
  67. #define uint unsigned int
  68. #define uchar unsigned char
  69. #define input  RA3
  70. #define clk  RA5
  71. #define cs_led  RE0
  72. __CONFIG(0x3B31);

  73. void init();
  74. void delay(uint);
  75. void write_164(uchar);
  76. uint intnum1,intnum2;
  77. void main()
  78. {
  79.        init();
  80.        while(1)
  81.        {
  82.               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
  83.               {
  84.                           T0IF=0;//需要软件清零
  85.                      TMR0=61;//重新给定时器装初值。
  86.                      intnum1++;
  87.                      if(intnum1==20)//一秒钟到了
  88.                      {
  89.                             intnum1=0;
  90.                             intnum2++;
  91.                             cs_led=0;
  92.                             if(intnum2==1)
  93.                             write_164(0xfd);
  94.                             if(intnum2==2)
  95.                             {
  96.                                    intnum2=0;
  97.                                    write_164(0xff);
  98.                             }
  99.                      }
  100.               }
  101.        }
  102. }

  103. void init()
  104. {
  105.        TRISA=0b11010111;
  106.        TRISE=0b11111110;
  107.        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
  108.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  109.        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
  110. }

  111. void delay(uint x)
  112. {
  113.        uint a,b;
  114.        for(a=x;a>0;a--)
  115.               for(b=110;b>0;b--);
  116. }

  117. void write_164(uchar dt)
  118. {
  119.        uchar i;   
  120.        for(i=0;i<8;i++)
  121.        {
  122.               clk=0;     
  123.               if(dt&0x80)
  124.                      input=1;
  125.               else
  126.                      input=0;
  127.               dt=dt<<1;      
  128.               clk=1;           
  129.        }            
  130. }

  131. TIM0  中断法使LED一秒闪烁,使用预分频
  132. #include<pic.h>
  133. #define uint unsigned int
  134. #define uchar unsigned char
  135. #define input  RA3
  136. #define clk  RA5
  137. #define cs_led  RE0
  138. __CONFIG(0x3B31);

  139. void init();
  140. void delay(uint);
  141. void write_164(uchar);
  142. uint intnum1,intnum2;
  143. void main()
  144. {
  145.        init();
  146.       while(1)
  147.        {
  148.       if(intnum1==2)//一秒钟到了
  149.                      {
  150.                             intnum1=0;
  151.                             intnum2++;
  152.                             cs_led=0;
  153.                             if(intnum2==1)
  154.                             write_164(0xfd);
  155.                             if(intnum2==2)
  156.                             {
  157.                                    intnum2=0;
  158.                                    write_164(0xff);                        
  159.                             }                  
  160.                      }            
  161.        }
  162. }

  163. void init()
  164. {
  165.        TRISA=0b11010111;
  166.        TRISE=0b11111110;
  167.        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
  168.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  169.        INTCON=0xa0;//GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。
  170.        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
  171. }

  172. void interrupt time0()

  173. {
  174.        T0IF=0;//由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零,
  175.        TMR0=61;
  176.        intnum1++;
  177. }

  178. void delay(uint x)
  179. {
  180.        uint a,b;
  181.        for(a=x;a>0;a--)
  182.               for(b=110;b>0;b--);
  183. }

  184. void write_164(uchar dt)
  185. {
  186.       uchar i;   
  187.        for(i=0;i<8;i++)
  188.        {
  189.               clk=0;            
  190.               if(dt&0x80)
  191.                      input=1;
  192.               else
  193.                      input=0;
  194.               dt=dt<<1;                          
  195.               clk=1;           
  196.        }            
  197. }

  198. TMR1 中断法TIM0  中断法使LED一秒闪烁,不设置预分频。
  199. #include<pic.h>
  200. #define uint unsigned int
  201. #define uchar unsigned char
  202. #define input  RA3
  203. #define clk  RA5
  204. #define cs_led  RE0

  205. __CONFIG(0x3B31);



  206. void init();
  207. void delay(uint);
  208. void write_164(uchar);
  209. uint intnum1,intnum2;
  210. void main()
  211. {
  212.        init();
  213.        while(1)
  214.        {
  215.                 if(intnum1==20)//一秒钟到了

  216.                      {

  217.                             intnum1=0;

  218.                             intnum2++;

  219.                             cs_led=0;

  220.                             if(intnum2==1)

  221.                             write_164(0xfd);

  222.                             if(intnum2==2)

  223.                             {

  224.                                    intnum2=0;

  225.                                    write_164(0xff);

  226.                            

  227.                             }                  

  228.                      }            

  229.        }

  230. }

  231. void init()

  232. {

  233.        TRISA=0b11010111;

  234.        TRISE=0b11111110;



  235.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断

  236.        PIE1=0x01;//开启定时器1的中断

  237.        TMR1L=(65536-50000)%256;

  238.        TMR1H=(65536-50000)/256;//进入一次中断,是50ms,



  239.        T1CON=0x01;//不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,



  240. }

  241. void interrupt time1()

  242. {

  243.        TMR1IF=0;//将中断溢出标志位清零,

  244.        TMR1L=(65536-50000)%256;

  245.        TMR1H=(65536-50000)/256;

  246.       

  247.        intnum1++;

  248. }

  249. void delay(uint x)

  250. {

  251.        uint a,b;

  252.        for(a=x;a>0;a--)

  253.               for(b=110;b>0;b--);



  254. }

  255. void write_164(uchar dt)

  256. {

  257.        uchar i;   

  258.        for(i=0;i<8;i++)

  259.        {

  260.               clk=0;     

  261.               

  262.               if(dt&0x80)

  263.                      input=1;

  264.               else

  265.                      input=0;

  266.               dt=dt<<1;      

  267.                      

  268.               clk=1;           

  269.        }            

  270. }

  271. TMR1 中断法TIM0  中断法使LED400ms闪烁,设置预分频

  272. #include<pic.h>

  273. #define uint unsigned int

  274. #define uchar unsigned char

  275. #define input  RA3

  276. #define clk  RA5

  277. #define cs_led  RE0



  278. __CONFIG(0x3B31);



  279. void init();

  280. void delay(uint);

  281. void write_164(uchar);

  282. uint intnum1,intnum2;

  283. void main()

  284. {

  285.        init();

  286.        while(1)

  287.        {

  288.       

  289.               /*    if(intnum1==20)//一秒钟到了

  290.                      {

  291.                             intnum1=0;

  292.                             intnum2++;

  293.                             cs_led=0;

  294.                             if(intnum2==1)

  295.                             write_164(0xfd);

  296.                             if(intnum2==2)

  297.                             {

  298.                                    intnum2=0;

  299.                                    write_164(0xff);

  300.                            

  301.                             }                  

  302.                      }*/         

  303.        }

  304. }

  305. void init()

  306. {

  307.        TRISA=0b11010111;

  308.        TRISE=0b11111110;



  309.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断

  310.        PIE1=0x01;//开启定时器1的中断

  311.        TMR1L=(65536-50000)%256;

  312.        TMR1H=(65536-50000)/256;//如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。



  313.        T1CON=0x31;//设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,



  314. }

  315. void interrupt time1()

  316. {

  317.        TMR1IF=0;//将中断溢出标志位清零,

  318.        TMR1L=(65536-50000)%256;

  319.        TMR1H=(65536-50000)/256;

  320.       

  321.        //intnum1++;

  322.               intnum2++;

  323.                             cs_led=0;

  324.                             if(intnum2==1)

  325.                             write_164(0xfd);

  326.                             if(intnum2==2)

  327.                             {

  328.                                    intnum2=0;

  329.                                    write_164(0xff);

  330.                            

  331.                             }                  



  332. }

  333. void delay(uint x)

  334. {

  335.        uint a,b;

  336.        for(a=x;a>0;a--)

  337.               for(b=110;b>0;b--);



  338. }

  339. void write_164(uchar dt)

  340. {

  341.        uchar i;   

  342.        for(i=0;i<8;i++)

  343.        {

  344.               clk=0;     

  345.               

  346.               if(dt&0x80)

  347.                      input=1;

  348.               else

  349.                      input=0;

  350.               dt=dt<<1;      

  351.                      

  352.               clk=1;           

  353.        }            

  354. }

  355. TMR2预分频 后分频      

  356. #include<pic.h>

  357. #define uint unsigned int

  358. #define uchar unsigned char

  359. #define input  RA3

  360. #define clk  RA5

  361. #define cs_led  RE0



  362. __CONFIG(0x3B31);



  363. void init();

  364. void delay(uint);

  365. void write_164(uchar);

  366. uint intnum1,intnum2;

  367. void main()

  368. {

  369.        init();

  370.        while(1)

  371.        {

  372.       

  373.                      if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms

  374.                      {

  375.                             intnum1=0;

  376.                             intnum2++;

  377.                             cs_led=0;

  378.                             if(intnum2==1)

  379.                             write_164(0xfd);

  380.                             if(intnum2==2)

  381.                             {

  382.                                    intnum2=0;

  383.                                    write_164(0xff);

  384.                            

  385.                             }                  

  386.                      }     

  387.        }

  388. }

  389. void init()

  390. {

  391.        TRISA=0b11010111;

  392.        TRISE=0b11111110;



  393.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断

  394.        PIE1=0x02;//开启定时器2的中断



  395.        TMR2=56;

  396.        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,



  397. }

  398. void interrupt time1()

  399. {

  400.        TMR2IF=0;//将中断溢出标志位清零,

  401.        TMR2=56;

  402.       

  403.        intnum1++;

  404.                            



  405. }

  406. void delay(uint x)

  407. {

  408.        uint a,b;

  409.        for(a=x;a>0;a--)

  410.               for(b=110;b>0;b--);



  411. }

  412. void write_164(uchar dt)

  413. {

  414.        uchar i;   

  415.        for(i=0;i<8;i++)

  416.        {

  417.               clk=0;     

  418.               

  419.               if(dt&0x80)

  420.                      input=1;

  421.               else

  422.                      input=0;

  423.               dt=dt<<1;      

  424.                      

  425.               clk=1;           

  426.        }            

  427. }

  428. TMR2预分频 后分频 周期寄存器

  429. #include<pic.h>

  430. #define uint unsigned int

  431. #define uchar unsigned char

  432. #define input  RA3

  433. #define clk  RA5

  434. #define cs_led  RE0



  435. __CONFIG(0x3B31);



  436. void init();

  437. void delay(uint);

  438. void write_164(uchar);

  439. uint intnum1,intnum2;

  440. void main()

  441. {

  442.        init();

  443.        while(1)

  444.        {

  445.       

  446.                      if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms

  447.                      {

  448.                             intnum1=0;

  449.                             intnum2++;

  450.                             cs_led=0;

  451.                             if(intnum2==1)

  452.                             write_164(0xfd);

  453.                             if(intnum2==2)

  454.                             {

  455.                                    intnum2=0;

  456.                                    write_164(0xff);

  457.                            

  458.                             }                  

  459.                      }     

  460.        }

  461. }

  462. void init()

  463. {

  464.        TRISA=0b11010111;

  465.        TRISE=0b11111110;



  466.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断

  467.        PIE1=0x02;//开启定时器2的中断



  468.        TMR2=0;

  469.        PR2=100;//周期寄存器

  470.        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,



  471. }

  472. void interrupt time1()

  473. {

  474.        TMR2IF=0;//将中断溢出标志位清零,

  475.        //TMR2=56;

  476.       

  477.        intnum1++;

  478.                            



  479. }

  480. void delay(uint x)

  481. {

  482.        uint a,b;

  483.        for(a=x;a>0;a--)

  484.               for(b=110;b>0;b--);



  485. }

  486. void write_164(uchar dt)

  487. {

  488.        uchar i;   

  489.        for(i=0;i<8;i++)

  490.        {

  491.               clk=0;     

  492.               

  493.               if(dt&0x80)

  494.                      input=1;

  495.               else

  496.                      input=0;

  497.               dt=dt<<1;      

  498.                      

  499.               clk=1;           

  500.        }            

  501. }
 楼主| deadtime 发表于 2019-5-6 20:34 | 显示全部楼层
  1. PIC定时程序
  2. TIM0  查询法使LED一秒闪烁,未使用预分频
  3. #include<pic.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define input  RA3
  7. #define clk  RA5
  8. #define cs_led  RE0
  9. __CONFIG(0x3B31);

  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. void init()
  40. {
  41.        TRISA=0b11010111;
  42.        TRISE=0b11111110;
  43.        OPTION=0x08;//使用内部时钟信号,预分频器分配给WDT模块,相当于不给TM0设置预分频,
  44.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  45. }

  46. void delay(uint x)
  47. {
  48.        uint a,b;
  49.        for(a=x;a>0;a--)
  50.               for(b=110;b>0;b--);
  51. }

  52. void write_164(uchar dt)
  53. {
  54.        uchar i;   
  55.        for(i=0;i<8;i++)
  56.        {
  57.               clk=0;                  
  58.               if(dt&0x80)
  59.                      input=1;
  60.               else
  61.                      input=0;
  62.               dt=dt<<1;                           
  63.               clk=1;           
  64.        }            
  65. }

  66. TIM0  查询法使LED一秒闪烁,使用预分频
  67. #include<pic.h>
  68. #define uint unsigned int
  69. #define uchar unsigned char
  70. #define input  RA3
  71. #define clk  RA5
  72. #define cs_led  RE0  
  73. __CONFIG(0x3B31);
  74. void init();
  75. void delay(uint);
  76. void write_164(uchar);
  77. uint intnum1,intnum2;
  78. void main()
  79. {
  80.        init();
  81.        while(1)
  82.        {            
  83.               if(T0IF==1)//判断中断溢出位是否溢出,TOIF是否溢出和总中断是否开启无关系。
  84.               {
  85.                      T0IF=0;//需要软件清零
  86.                      TMR0=61;//重新给定时器装初值。
  87.                      intnum1++;
  88.                      if(intnum1==20)//一秒钟到了
  89.                      {
  90.                             intnum1=0;
  91.                             intnum2++;
  92.                             cs_led=0;
  93.                             if(intnum2==1)
  94.                                        write_164(0xfd);
  95.                             if(intnum2==2)
  96.                             {
  97.                                   intnum2=0;
  98.                                    write_164(0xff);                           
  99.                             }
  100.                   }
  101.               }
  102.        }
  103. }

  104. void init()
  105. {
  106.        TRISA=0b11010111;
  107.        TRISE=0b11111110;
  108.        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
  109.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  110.        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
  111. }

  112. void delay(uint x)
  113. {
  114.        uint a,b;
  115.        for(a=x;a>0;a--)
  116.               for(b=110;b>0;b--);
  117. }

  118. void write_164(uchar dt)
  119. {
  120.        uchar i;   
  121.        for(i=0;i<8;i++)
  122.        {
  123.               clk=0;               
  124.               if(dt&0x80)
  125.                      input=1;
  126.               else
  127.                      input=0;
  128.               dt=dt<<1;                           
  129.               clk=1;           
  130.        }            
  131. }

  132. TIM0  中断法使LED一秒闪烁,使用预分频
  133. #include<pic.h>
  134. #define uint unsigned int
  135. #define uchar unsigned char
  136. #define input  RA3
  137. #define clk  RA5
  138. #define cs_led  RE0
  139. __CONFIG(0x3B31);

  140. void init();
  141. void delay(uint);
  142. void write_164(uchar);
  143. uint intnum1,intnum2;
  144. void main()
  145. {
  146.        init();
  147.        while(1)
  148.        {
  149.                      if(intnum1==2)//一秒钟到了
  150.                      {
  151.                             intnum1=0;
  152.                             intnum2++;
  153.                             cs_led=0;
  154.                             if(intnum2==1)
  155.                             write_164(0xfd);
  156.                             if(intnum2==2)
  157.                             {
  158.                                   intnum2=0;
  159.                                    write_164(0xff);                           
  160.                             }                  

  161.                      }            
  162.        }
  163. }

  164. void init()
  165. {
  166.        TRISA=0b11010111;
  167.        TRISE=0b11111110;
  168.        OPTION=0x07;//使用内部时钟信号,预分频器分配给TIM0模块,256分频。
  169.        //一个时钟周期是一秒,当不装初值时,256微秒之后溢出,因为时8位定时器。
  170.        INTCON=0xa0;//GIE=1,开总中断,T0IE=1,开启T0中断,T0IE是TMR0 溢出中断允许位。
  171.        TMR0=61;//256*Y=50000,=>Y=195,256-195=61,这样就是50ms溢出一次,溢出20次就是1s。
  172. }

  173. void interrupt time0()
  174. {
  175.        T0IF=0;//由于只开启了TMR0中断,所以不用查询是哪个中断,能进来的肯定是TMR0溢出中断,直接将中断溢出标志位清零,
  176.        TMR0=61;
  177.        intnum1++;
  178. }

  179. void delay(uint x)
  180. {
  181.        uint a,b;
  182.        for(a=x;a>0;a--)
  183.               for(b=110;b>0;b--);
  184. }

  185. void write_164(uchar dt)
  186. {
  187.        uchar i;   
  188.        for(i=0;i<8;i++)
  189.        {
  190.               clk=0;                 
  191.              if(dt&0x80)
  192.                      input=1;
  193.               else
  194.                      input=0;
  195.               dt=dt<<1;                           
  196.               clk=1;           
  197.        }            
  198. }

  199. TMR1 中断法TIM0  中断法使LED一秒闪烁,不设置预分频。
  200. #include<pic.h>
  201. #define uint unsigned int
  202. #define uchar unsigned char
  203. #define input  RA3
  204. #define clk  RA5
  205. #define cs_led  RE0
  206. __CONFIG(0x3B31);



  207. void init();
  208. void delay(uint);
  209. void write_164(uchar);
  210. uint intnum1,intnum2;
  211. void main()
  212. {
  213.        init();
  214.        while(1)
  215.        {     
  216.                      if(intnum1==20)//一秒钟到了
  217.                      {
  218.                             intnum1=0;
  219.                             intnum2++;
  220.                             cs_led=0;
  221.                             if(intnum2==1)
  222.                                         write_164(0xfd);
  223.                             if(intnum2==2)
  224.                             {
  225.                                    intnum2=0;
  226.                                    write_164(0xff);                        
  227.                             }                  
  228.                      }            
  229.        }
  230. }

  231. void init()
  232. {
  233.        TRISA=0b11010111;
  234.        TRISE=0b11111110;
  235.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
  236.        PIE1=0x01;//开启定时器1的中断
  237.        TMR1L=(65536-50000)%256;
  238.        TMR1H=(65536-50000)/256;//进入一次中断,是50ms,
  239.        T1CON=0x01;//不设置预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
  240. }

  241. void interrupt time1()
  242. {
  243.        TMR1IF=0;//将中断溢出标志位清零,
  244.        TMR1L=(65536-50000)%256;
  245.        TMR1H=(65536-50000)/256;      
  246.        intnum1++;
  247. }

  248. void delay(uint x)
  249. {
  250.        uint a,b;
  251.        for(a=x;a>0;a--)
  252.               for(b=110;b>0;b--);
  253. }

  254. void write_164(uchar dt)
  255. {
  256.        uchar i;   
  257.        for(i=0;i<8;i++)
  258.        {
  259.               clk=0;               
  260.               if(dt&0x80)
  261.                     input=1;
  262.               else
  263.                      input=0;
  264.               dt=dt<<1;                           
  265.               clk=1;           
  266.        }            
  267. }

  268. TMR1 中断法TIM0  中断法使LED400ms闪烁,设置预分频
  269. #include<pic.h>
  270. #define uint unsigned int
  271. #define uchar unsigned char
  272. #define input  RA3
  273. #define clk  RA5
  274. #define cs_led  RE0
  275. __CONFIG(0x3B31);

  276. void init();
  277. void delay(uint);
  278. void write_164(uchar);
  279. uint intnum1,intnum2;
  280. void main()
  281. {
  282.        init();
  283.        while(1)
  284.        {                  
  285.               /*    if(intnum1==20)//一秒钟到了
  286.                    {
  287.                             intnum1=0;                                                
  288.                             intnum2++;
  289.                             cs_led=0;
  290.                             if(intnum2==1)
  291.                             write_164(0xfd);
  292.                             if(intnum2==2)
  293.                             {
  294.                                   intnum2=0;
  295.                                    write_164(0xff);                           
  296.                             }                  
  297.                      }*/         
  298.        }
  299. }

  300. void init()
  301. {
  302.        TRISA=0b11010111;
  303.        TRISE=0b11111110;
  304.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断
  305.        PIE1=0x01;//开启定时器1的中断
  306.        TMR1L=(65536-50000)%256;
  307.        TMR1H=(65536-50000)/256;//如果不设置预分频,进入一次中断,是50ms,现在设置8倍预分频,进入一次中断是400ms。
  308.        T1CON=0x31;//设置8倍预分频,关闭定时器1晶振使能控制位,与外部时钟同步,选择内部时钟,使能定时器1,
  309. }

  310. void interrupt time1()
  311. {
  312.        TMR1IF=0;//将中断溢出标志位清零,
  313.        TMR1L=(65536-50000)%256;
  314.        TMR1H=(65536-50000)/256;      
  315.        //intnum1++;
  316.         intnum2++;
  317.        cs_led=0;
  318.         if(intnum2==1)
  319.              write_164(0xfd);
  320.          if(intnum2==2)
  321.             {
  322.                    intnum2=0;
  323.                    write_164(0xff);           
  324.             }                  
  325. }

  326. void delay(uint x)
  327. {
  328.        uint a,b;
  329.        for(a=x;a>0;a--)
  330.               for(b=110;b>0;b--);
  331. }

  332. void write_164(uchar dt)
  333. {
  334.        uchar i;   
  335.        for(i=0;i<8;i++)
  336.        {                           
  337.               clk=0;                  
  338.               if(dt&0x80)
  339.                      input=1;
  340.               else                    
  341.                      input=0;
  342.               dt=dt<<1;                           
  343.               clk=1;           
  344.        }            
  345. }

  346. TMR2预分频 后分频      
  347. #include<pic.h>
  348. #define uint unsigned int
  349. #define uchar unsigned char
  350. #define input  RA3
  351. #define clk  RA5
  352. #define cs_led  RE0
  353. __CONFIG(0x3B31);

  354. void init();
  355. void delay(uint);
  356. void write_164(uchar);
  357. uint intnum1,intnum2;
  358. void main()
  359. {      
  360.        init();
  361.        while(1)
  362.        {      
  363.                      if(intnum1==1000)//本来预分频1:1时是200ms到了,现在预分频是4.所以是200*4 ms到了,由于后分频1:2,所以是200*4*2 ms
  364.                      {
  365.                             intnum1=0;
  366.                             intnum2++;
  367.                             cs_led=0;
  368.                             if(intnum2==1)
  369.                             write_164(0xfd);
  370.                             if(intnum2==2)
  371.                             {                                 
  372.                                    intnum2=0;
  373.                                            write_164(0xff);
  374.                             }                  
  375.                      }     
  376.        }
  377. }

  378. void init()
  379. {
  380.        TRISA=0b11010111;
  381.        TRISE=0b11111110;
  382.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
  383.        PIE1=0x02;//开启定时器2的中断
  384.        TMR2=56;
  385.        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2,
  386. }

  387. void interrupt time1()
  388. {
  389.        TMR2IF=0;//将中断溢出标志位清零,
  390.        TMR2=56;      
  391.        intnum1++;                           
  392. }

  393. void delay(uint x)
  394. {
  395.        uint a,b;
  396.        for(a=x;a>0;a--)
  397.               for(b=110;b>0;b--);
  398. }

  399. void write_164(uchar dt)
  400. {
  401.        uchar i;   
  402.        for(i=0;i<8;i++)
  403.        {
  404.               clk=0;            
  405.               if(dt&0x80)
  406.                      input=1;
  407.               else
  408.                      input=0;
  409.               dt=dt<<1;                           
  410.               clk=1;           
  411.        }            
  412. }
  413. TMR2预分频 后分频 周期寄存器
  414. #include<pic.h>
  415. #define uint unsigned int
  416. #define uchar unsigned char
  417. #define input  RA3
  418. #define clk  RA5
  419. #define cs_led  RE0
  420. __CONFIG(0x3B31);
  421. void init();
  422. void delay(uint);
  423. void write_164(uchar);
  424. uint intnum1,intnum2;
  425. void main()
  426. {
  427.        init();
  428.        while(1)
  429.        {     
  430.                      if(intnum1==1000)//本来预分频1:1时是100ms到了,现在预分频是4.所以是100*4 ms到了,由于后分频1:2,所以是100*4*2 ms
  431.                      {
  432.                             intnum1=0;
  433.                             intnum2++;
  434.                             cs_led=0;
  435.                             if(intnum2==1)
  436.                                     write_164(0xfd);
  437.                             if(intnum2==2)
  438.                             {
  439.                                    intnum2=0;
  440.                                    write_164(0xff);                          
  441.                             }                  
  442.                      }     
  443.        }
  444. }

  445. void init()
  446. {
  447.        TRISA=0b11010111;
  448.        TRISE=0b11111110;
  449.        INTCON=0xc0;//GIE=1,开总中断,开启第一外设中断外围功能模块中断
  450.        PIE1=0x02;//开启定时器2的中断
  451.        TMR2=0;
  452.        PR2=100;//周期寄存器
  453.        T2CON=0x0d;//预分频1:4,使能tmr2计数允许/禁止控制位,预分频1:4后分频1:2?
  454. }

  455. void interrupt time1()
  456. {
  457.        TMR2IF=0;//将中断溢出标志位清零,
  458.        //TMR2=56;      
  459.        intnum1++;                           
  460. }

  461. void delay(uint x)
  462. {
  463.        uint a,b;
  464.        for(a=x;a>0;a--)
  465.               for(b=110;b>0;b--);
  466. }

  467. void write_164(uchar dt)
  468. {
  469.        uchar i;   
  470.        for(i=0;i<8;i++)
  471.        {
  472.               clk=0;                  
  473.               if(dt&0x80)
  474.                      input=1;
  475.               else
  476.                     input=0;
  477.               dt=dt<<1;                           
  478.               clk=1;           
  479.        }            
  480. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

470

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部