大家帮着看看PIC16F688 定时器1不能用外部时钟计数

2020-02-08 09:09发布

  1. //==================================================================================
  2. #include <pic.h>
  3. #include "TM16xx.h"


  4. volatile INT8U  FreqCountL = 0;      //频率计数值
  5. volatile INT8U  FreqCountH = 0;      //频率计数值
  6. volatile INT8U  FreqUpdata = 0;      //频率更新
  7. const INT8U CodeTable[] = {0xee,0x28,0xb6,0xba,0x78,0xda,0xde,0xa8,0xfe,0xfa};
  8. //----------------------------------------------------------------------------------
  9. //                             系统初始化                                                                     
  10. //
  11. //描述:上电初始化系统
  12. //参数: 无
  13. //返回:无
  14. //----------------------------------------------------------------------------------
  15. void Init(void)
  16. {
  17.      GIE       = 0;                              //禁止中断
  18.      //初始化时钟                                //内部4M
  19.      IRCF0     = 0;
  20.      IRCF1     = 1;
  21.      IRCF2     = 1;
  22.      //配置端口
  23.      CMCON0    = 0x07;                           //关闭比较器
  24.      ANSEL     = 0x00;                           //指定数字IO
  25.      //配置端口
  26.      TRISA     = 0xF8;                           // 1:输入 0: 输出
  27.      PORTA     = 0x00;                           // 设置IO状态
  28.      TRISC     = 0xFF;                           // 1:输入 0: 输出
  29.      PORTC     = 0x00;                           // 设置IO状态
  30.      //初始化AD
  31.      ANS7      = 1;                              //设IO为模拟输入
  32.      ADCS0     = 1;                              //指定专用时钟
  33.      ADCS1     = 1;
  34.      ADCS2     = 1;
  35.      VCFG      = 0;                              //参考电压为VCC
  36.      CHS0      = 1;                              //选择通道7
  37.      CHS1      = 1;
  38.      CHS2      = 1;
  39.      ADFM      = 0;                              //结果格式右对
  40.      ADIF      = 0;                              //清标记位
  41.      ADON      = 1;                              //启动AD
  42.      //初始化计数器1
  43.      TMR1CS    = 1;                              //外部时钟计数
  44.      TMR1ON    = 0;                              //停止计数器
  45.      //初始化定时器0
  46.      T0CS      = 0;                              //时钟源主F/4
  47.      PSA       = 0;                              //分频器分配定时器
  48.      PS0       = 1;                              //分频256
  49.      PS1       = 1;
  50.      PS2       = 1;
  51.      TMR0      = 61;                             //初值
  52.      T0IE      = 1;                              //使能定时器中断   
  53.      GIE       = 1;                              //使能中断
  54.      //初始化看门狗
  55.      WDTPS0    = 1;
  56.      WDTPS1    = 1;
  57.      WDTPS2    = 1;
  58.      WDTPS3    = 0;                    
  59. }
  60. //----------------------------------------------------------------------------------
  61. //                             主程序和函数入口                                                                     
  62. //
  63. //描述:主程序和函数入口
  64. //参数: 无
  65. //返回:无
  66. //----------------------------------------------------------------------------------
  67. void main(void)
  68. {
  69.     INT16U Freq;
  70.     INT8U  Precent;
  71.     INT16U FreqTemp[3];  
  72.     INT8U  PrecentTemp[3];
  73.     INT8U  Index = 0;
  74.     INT8U  CtrlCount = 3;

  75.     Init();
  76.     while(1)
  77.     {   
  78.         //采样
  79.         if(FreqUpdata)
  80.         {
  81.              //外控开关
  82.              if((RA4==1)) {if(CtrlCount<5) CtrlCount++;}
  83.              else                          CtrlCount=0;
  84.              //外部调功
  85.              GODONE = 1;
  86.              while(ADIF == 0);ADIF = 0;
  87.              PrecentTemp[Index] = ((INT16U)ADRESH)*4/10;
  88.              //频率
  89.              FreqTemp[Index] = (((INT16U)FreqCountH)<<8) + FreqCountL;
  90.              FreqUpdata = 0;
  91.              Index++;
  92.         }
  93.         //显示刷新
  94.         if(Index >= 3)
  95.         {
  96.              Freq = (FreqTemp[0]+FreqTemp[1]+FreqTemp[2])/3;
  97.              Precent = (PrecentTemp[0]+PrecentTemp[1]+PrecentTemp[2])/3;         
  98.              if(CtrlCount>=2)
  99.              {
  100.                   TM16xx_DisSeg(0,  0x10);
  101.                   TM16xx_DisSeg(2,  0x10);
  102.                   TM16xx_DisSeg(4,  0x10);
  103.                   TM16xx_DisSeg(6,  0x10);
  104.                   TM16xx_DisSeg(8,  0x10);
  105.                   TM16xx_DisSeg(10, 0x10);
  106.                   TM16xx_DisSeg(12, 0x10);
  107.                   TM16xx_DisSeg(14, 0x10);
  108.              }
  109.              else
  110.              {
  111.                   TM16xx_DisSeg(14,CodeTable[0]);
  112.                   TM16xx_DisSeg(10,CodeTable[Freq/1000]);
  113.                   TM16xx_DisSeg(8, CodeTable[Freq%1000/100]|0x01);
  114.                   TM16xx_DisSeg(12,CodeTable[Freq%1000%100/10]);

  115.                   if(Precent > 100) Precent = 100;
  116.                   Precent =  100 - Precent;
  117.                   TM16xx_DisSeg(4, 0x00);
  118.                   TM16xx_DisSeg(2, 0x00);
  119.                   TM16xx_DisSeg(0, CodeTable[Precent%100/10]);
  120.                   TM16xx_DisSeg(6, CodeTable[Precent%100%10]);           
  121.              }
  122.              Index = 0;
  123.              CLRWDT();              
  124.         }   
  125.     }
  126. }
  127. //----------------------------------------------------------------------------------
  128. //                              中断服务程序                                                                     
  129. //
  130. //描述:中断服务程序
  131. //参数: 无
  132. //返回:无
  133. //----------------------------------------------------------------------------------
  134. static void interrupt ISR(void)       
  135. {
  136.      static INT8U status = 0;

  137.      if(T0IF)
  138.      {
  139.          TMR0 = 61;
  140.          TMR1ON    = 0;          //停止计数器
  141.          if(status ==0)         
  142.          {
  143.              status    = 1;
  144.              TMR1L     = 0;
  145.              TMR1H     = 0;
  146.          }
  147.          else if (status ==1)
  148.          {
  149.              status    = 2;
  150.          }
  151.          else
  152.          {
  153.              status     = 0;
  154.              FreqCountH = TMR1H;
  155.              FreqCountL = TMR1L;         
  156.              FreqUpdata = 1;
  157.          }
  158.          TMR1ON    = 1;          //启动计数器
  159.          T0IF      = 0;          //清除标记
  160.      }
  161. }
  162. //==================================================================================
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
liguangqang
1楼-- · 2020-02-08 10:44
前几测试过是行的,昨天再用就是出来来频率,不知哪里出错了,这是一个简单的频率计。

一周热门 更多>