找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 9
打印 上一主题 下一主题
收起左侧

单片机timer2定时器计时的疑问

[复制链接]
跳转到指定楼层
楼主
刚从51单片机转到新的芯片来,对这个芯片的定时器不了解,有没有人能说一下 time2中断处理的500us中断一次是怎么算来的 ,还有芯片手册写的预分频比后分频比是什么意思?定时时间怎么设?感觉好混乱啊,理不清楚。

void Timer2_Init (void)
{
         T2CON = 0x49;  //Bit[1,0]=01,T2时钟分频 1:4 FT60F02x_DS_rev1p09.pdf (1.96 MB, 下载次数: 9)

                                    //Bit[6-3]=1001,T2输出时钟分频1:1
         TMR2 = 0;         
         PR2 = 100;         //设置TMR2输出比较值定时100us=(1/4000000)*4*100(PR2)
         TMR2IF = 0;
         TMR2IE = 1;
         TMR2ON = 1;
         PEIE=1;   
}
//定时器2的中断处理**********************
else if(TMR2IE && TMR2IF)//500us中断一次
  {
    TMR2IF = 0;
    time2++;
    if(time2)
     {
                 if (time2>=20)//500us*20=10ms
                 {
                         KeyScan_Process();
                         time2=0;
                 }
     }               







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2019-7-17 18:21 | 只看该作者
你从51转到哪种单片机了?是不是89c52一类的?
回复

使用道具 举报

板凳
ID:155507 发表于 2019-7-17 22:47 | 只看该作者
你这种单片机是辉芒的, 有PIC16 like 指令集

设置TMR2输出比较值定时100us=(1/16000000)*2*4*200(PR2)

  1. //*********************************************************
  2. /*  文件名:TEST_60F02x_Timer2.c
  3. *        功能:  FT60F02x-Time2功能演示
  4. *   IC:    FT60F023 SOP16
  5. *   晶振:  16M/2T                    
  6. *   说明:  当DemoPortIn悬空或者高电平时,
  7. *                   DemoPortOut输出5KHz占空比50%的波形-Tm2实现
  8. *                   当DemoPortIn接地时,DemoPortOut输出高电平.关定时器

  9. *                  FT60F023  SOP16
  10. *                 ----------------
  11. *  NC------------|1(PA1)   (PA0)16|------------NC     
  12. *  NC------------|2(PA7)   (PA2)15|------------NC
  13. *  DemoPortIn----|3(PA6)   (PA4)14|---DemoPortOut
  14. *  VDD-----------|4(VDD)   (GND)13|-----------GND
  15. *  NC------------|5(PC7)   (PC0)12|------------NC
  16. *  NC------------|6(PC6)   (PC1)11|------------NC
  17. *  NC------------|7(PC5)   (PC2)10|------------NC
  18. *  NC------------|8(PC4)   (PC3)09|------------NC
  19. *                              ----------------
  20. */
  21. //*********************************************************
  22. #include "SYSCFG.h"

  23. //**********************************************************
  24. //***********************宏定义*****************************
  25. #define  unchar     unsigned char
  26. #define  unint      unsigned int
  27. #define  unlong     unsigned long

  28. #define  DemoPortOut        RA4   
  29. #define  DemoPortIn                RA6

  30. /*-------------------------------------------------
  31. *  函数名:POWER_INITIAL
  32. *        功能:  上电系统初始化
  33. *  输入:  无
  34. *  输出:  无
  35. --------------------------------------------------*/
  36. //********************************************************
  37. //**************中断处理**********************************
  38. void interrupt ISR(void)                        //PIC_HI-TECH使用
  39. {
  40.    
  41.   //定时器2的中断处理**********************
  42.         if(TMR2IE && TMR2IF)                        //100us中断一次 = 5KHz
  43.         {
  44.                 TMR2IF = 0;

  45.                 DemoPortOut = ~DemoPortOut; //翻转电平
  46.         }
  47. }
  48. /*-------------------------------------------------
  49. *  函数名:POWER_INITIAL
  50. *        功能:  上电系统初始化
  51. *  输入:  无
  52. *  输出:  无
  53. --------------------------------------------------*/       
  54. void POWER_INITIAL (void)
  55. {
  56.          
  57.         OSCCON = 0B01110001;        //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
  58.                                                          //Bit0=1,系统时钟为内部振荡器
  59.                                                          //Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
  60.         INTCON = 0;                          //暂禁止所有中断
  61.         PORTA = 0B00000000;               
  62.         TRISA = 0B11101111;                //PA输入输出 0-输出 1-输入
  63.                                                         //PA3->输出
  64.         PORTC = 0B00000000;        
  65.         TRISC = 0B11111111;                //PC输入输出 0-输出 1-输入         
  66.         WPUA = 0B01000000;             //PA端口上拉控制 1-开上拉 0-关上拉
  67.         OPTION = 0B00001000;        //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
  68.                                                         //Bit3 预分频器分配位 0-Timer0 1-WDT
  69.                                                         //Bit7(PAPU)=0 ENABLED PULL UP PA
  70.         MSCKCON = 0B00000000;        //Bit6->0,禁止PA4, PC5稳压输出(60F02x保留位)
  71.                                                           //Bit5->0,TIMER2时钟为Fosc(60F02x保留位)
  72.                                                           //Bit4->0,禁止LVR(60F02x M版之前)
  73.                             //Bit4->0, LVREN使能时,开启LVR(60F02x M版及M版之后)  
  74.                             //Bit4->1, LVREN使能时,工作时开启LVR, 睡眠时自动关闭LVR(60F02x M版及M版之后)      
  75.         CMCON0 = 0B00000111;         //关闭比较器,CxIN为数字IO口

  76. }
  77. /*-------------------------------------------------
  78. * 函数名称:   TIMER2_INITIAL
  79. * 功能:      初始化设置定时器2
  80. * 相关寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
  81. -------------------------------------------------*/
  82. void TIMER2_INITIAL (void)
  83. {
  84.          
  85.         T2CON = 0B00000001;         //Bit[1,0]=01,T2时钟分频 1:4
  86.                                                         //Bit[6-3]=0000,T2输出时钟分频1:1
  87.         TMR2 = 0;                                  //TMR2赋初值
  88.         PR2 = 200;                                 //设置TMR2输出比较值定时100us=(1/16000000)*2*4*200(PR2)
  89.                                                         //16M-2T-4分频
  90.         TMR2IF = 0;                                //清TIMER2中断标志
  91.         TMR2IE = 1;                                //使能TIMER2的中断
  92.         TMR2ON = 1;                                //使能TIMER2启动
  93.         PEIE=1;                                    //使能外设中断
  94.         GIE = 1;                                   //使能全局中断

  95. }
  96. /*-------------------------------------------------
  97. *  函数名: main
  98. *        功能:  主函数
  99. *  输入:  无
  100. *  输出:  无
  101. --------------------------------------------------*/
  102. void main()
  103. {
  104.         POWER_INITIAL();                //系统初始化
  105.         TIMER2_INITIAL();                  //初始化T2
  106.        
  107.         while(1)
  108.         {
  109.                 if(DemoPortIn == 1) //判断输入是否为高电平
  110.                 {
  111.                         TMR2IE = 1;         //开定时器2
  112.                          
  113.                 }
  114.                 else
  115.                 {
  116.                         TMR2IE = 0;         //关定时器2
  117.                         DemoPortOut = 1;
  118.                 }  
  119.         }
  120. }
复制代码

回复

使用道具 举报

地板
ID:155507 发表于 2019-7-17 23:02 | 只看该作者


有没有人能说一下 time2中断处理的500us中断一次是怎么算来的



mcu+application+note_v0.07.pdf

698.99 KB, 下载次数: 6

FT60F02x_TIMER2.pdf

265.33 KB, 下载次数: 4

回复

使用道具 举报

5#
ID:370231 发表于 2019-7-18 08:05 | 只看该作者
ahshmj 发表于 2019-7-17 18:21
你从51转到哪种单片机了?是不是89c52一类的?

我发了有芯片手册在上面,你可以下载来看看。
回复

使用道具 举报

6#
ID:370231 发表于 2019-7-18 10:55 | 只看该作者

十分感谢大佬的回答,谢谢!!!
回复

使用道具 举报

7#
ID:370231 发表于 2019-7-18 11:29 | 只看该作者
angmall 发表于 2019-7-17 22:47
你这种单片机是辉芒的, 有PIC16 like 指令集

设置TMR2输出比较值定时100us=(1/16000000)*2*4*200(PR2)
...

  100us中断一次 = 5KHz 这个5KHz是怎么来的?
100us=(1/16000000)*2*4*200(PR2)我把PR2=200代入这个公式等于0.02,这个0.02的值是定时时间吗?
回复

使用道具 举报

8#
ID:123289 发表于 2019-7-18 17:31 | 只看该作者
你51会了。
提示:在51中,12M的晶振,为什么一个时钟脉冲是1us,而不是1/12 us 呢? 道理一样。
回复

使用道具 举报

9#
ID:155507 发表于 2019-7-18 19:55 | 只看该作者
a89588038 发表于 2019-7-18 11:29
100us中断一次 = 5KHz 这个5KHz是怎么来的?
100us=(1/16000000)*2*4*200(PR2)我把PR2=200代入这个公 ...

  每100us 翻转电平一次,一个周期为200us,所以频率是5KHz

不用代入PR2,200就是PR2,(1/16000000)*2*4*200 = 1x10^-4 = 100us

回复

使用道具 举报

10#
ID:370231 发表于 2019-7-19 09:38 | 只看该作者
angmall 发表于 2019-7-18 19:55
每100us 翻转电平一次,一个周期为200us,所以频率是5KHz

不用代入PR2,200就是PR2,(1/16000000)*2 ...

我理解了,非常感谢你的回答!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表