久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2592|回復: 5
打印 上一主題 下一主題
收起左側

不知道為什么單片機測的頻率不對啊 實際測18000 仿真1200左右

[復制鏈接]
跳轉到指定樓層
樓主
ID:390998 發表于 2018-10-7 16:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大佬   小弟做了個測頻率的東西  單片機測得的頻率嚴重出錯啊  可以告訴我為什么么
  1. //#include"reg52.h"                                                                             /* 調用頭文件,單片機內部寄存器都定義在此,用的時候需要先調用 */
  2. #include"LCD1602.H"
  3. #include <NEW_8051.h>

  4. UINT8   CounterCnt;                                         /* 計數器次數 */
  5. UINT8   FreResultFlag;                                      /* 頻率計計算結果標志 */

  6. /******************************** 引腳定義 **************************************
  7.                         單片機            NE555
  8.                           P35              OUT
  9. ********************************************************************************/

  10. /*******************************************************************************
  11. * 函  數  名      : Init_Timer
  12. * 描      述      : 初始化定時器T0,計數器T1.
  13. * 輸      入      : 無.
  14. * 返      回      : 無.
  15. ********************************************************************************/
  16. void Init_Timer(void)
  17. {
  18.         TMOD |= 0x51;
  19.                                                                                                   /* T0工作在定時器模式1,16位定時器,T1工作在計數器模式 */                     
  20.          TH0 =        ( 65536 -50000 ) / 256;                                                      /* T0定時器初值,定時50ms */
  21.          TL0 =        ( 65536 -50000 ) % 256;

  22.          TH1 =   0;                                              /* T1從0開始計數 */
  23.     TL1 =   0;

  24.     ET0 =        1;                                                               /* 定時器T0中斷打開 */
  25. //         ET1 =   1;                                              /* 定時器T1中斷打開 */

  26.          EA        =        1;                                                                /* 總中斷打開 */

  27. //    PT1 =   1;                                              /* 定義T1為高優先級 */

  28.     TR0 =        1;                                                               /* T0開關打開 */
  29.     TR1 =   1;                                              /* T1開關打開 */
  30. }

  31. /*******************************************************************************
  32. * 函  數  名      : Timer0
  33. * 描      述      : 中斷程序,定時時間到后重新賦值開始定時,同時將LED的狀態取反.
  34. * 輸      入      : 無.
  35. * 返      回      : 無.
  36. ********************************************************************************/
  37. void Timer0(void) interrupt 1
  38. {
  39.         static UINT8 Temp;

  40.     TH0 =        ( 65536 -50000 ) / 256;                                                      /* 重新賦值 */
  41.          TL0 =        ( 65536 -50000 ) % 256;

  42.     Temp++;
  43.     if( Temp == 20 )                                        /* 大概一秒計算一次 */
  44.     {
  45.         Temp = 0;     
  46.                                                       
  47.         TR0  = 0;                                           /* 關閉定時器T0,T1 */
  48.         TR1  = 0;

  49.         FreResultFlag = 1;                                  /* 準備計算頻率 */                                          
  50.     }   
  51. }

  52. /*******************************************************************************
  53. * 函  數  名      : Timer1
  54. * 描      述      : 計數器中斷程序.
  55. * 輸      入      : 無.
  56. * 返      回      : 無.
  57. ********************************************************************************/
  58. void Timer1(void) interrupt 3
  59. {
  60.          CounterCnt++;                                                                        /* 計算脈沖個數 */
  61. }

  62. /*******************************************************************************
  63. * 函  數  名      : DisplayFre
  64. * 描      述      : LCD1602顯示頻率.
  65. * 輸      入      : UINT32 PulseCnt:
  66. *                   脈沖數.
  67. * 返      回      : 無.
  68. ********************************************************************************/
  69. void DisplayFre( UINT32 PulseCnt )
  70. {
  71.     UINT8 i;
  72.     UINT8 DisplayBuf[6];

  73.     for( i = 0; i < 5; i++ )                                /* 計算1-5位的每位數據 */
  74.     {
  75.         DisplayBuf[i] = PulseCnt % 10 + 0x30;               /* 轉成成1602可以顯示的數值 */
  76.         PulseCnt   =  PulseCnt / 10;
  77.     }
  78.     DisplayBuf[5] = PulseCnt + 0x30;                        /* 計算第6位數據 */

  79.     for( i = 5; i > 0; i-- )                                /* 處理高位為0時候的情況 */
  80.     {
  81.         if( DisplayBuf[ i ] == 0x30 )DisplayBuf[ i ] = 0x20;/* 檢測到高位為 0,不顯示高位,空格代替 */
  82.         else break;
  83.     }  

  84.     LCD1602_SetDisplayPosition( 7,2 );                      /* 設置顯示位置 */

  85.     for( i = 5; i != 0xFF; i-- )
  86.     LCD1602_WriteData(DisplayBuf[i]);                       /* 顯示頻率計字符 */

  87. }

  88. /*******************************************************************************
  89. * 函  數  名      : main
  90. * 描      述      : 主程序.
  91. * 輸      入      : 無.
  92. * 返      回      : 無.
  93. ********************************************************************************/
  94. void main(void)
  95. {
  96.     UINT32 FreNum;                                          /* 計算頻率次數 */



  97.     Init_Timer();                                           /* 初始化定時器 */



  98.     LCD1602_Init();                                         /* 初始化LCD1602 */



  99.     LCD1602_SetDisplayPosition(0,1);                        /* 設置第一行顯示位置 */
  100.     LCD1602_WriteString("FREQUENCY METER");                 /* 設置頻率計字符 */
  101.     LCD1602_SetDisplayPosition(0,2);                        /* 設置第二行顯示位置 */
  102.     LCD1602_WriteString("FRE:          Hz");                /* 設置FRE:   HZ字符 */

  103.      while(1)
  104.      {
  105.             if( FreResultFlag )                                 /* 計算頻率 */
  106.         {
  107.             FreNum = ( CounterCnt * 65536 + TH1 * 256 + TL1);  /* 計算1秒后的脈沖個數 */

  108.             TH1    = 0;                                     /* 清計數次數 */
  109.             TL1    = 0;

  110.             FreResultFlag = 0;                              /* 清標志 */
  111. //            CounterCnt = 0;
  112.             TR1    = 1;
  113.             TR0    = 1;                                     /* 開定時器 */
  114.         }
  115.         DisplayFre( FreNum );   
  116.       }

  117. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

來自 2#
ID:401564 發表于 2018-10-7 23:09 | 只看該作者
C我不會,但如果你用的是STC的單片機,那你就得好好的看一下它的使用手冊了,因為它很多的指令執行時間和傳統的8051是不一樣的,也就是所謂的1T,但它又不是完全的1T,亂得很!!!!!!!!
定時器也是一樣的,有的是1T的有的是12T的

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:387733 發表于 2018-10-8 06:50 | 只看該作者
定時器時間常數計算是否正確?特別是計算定時器常熟的系統主頻是否與實際使用的主頻一致

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:390998 發表于 2018-10-8 15:21 來自手機 | 只看該作者
sxhwdz 發表于 2018-10-8 06:50
定時器時間常數計算是否正確?特別是計算定時器常熟的系統主頻是否與實際使用的主頻一致

一致啊  主頻是指晶振頻率么
回復

使用道具 舉報

5#
ID:406356 發表于 2018-10-8 20:29 | 只看該作者
看定時器計數器初值是否和所使用的晶振相對應,或者這些初值可以通過ISP燒錄軟件里的定時器生成器生成
回復

使用道具 舉報

6#
ID:406764 發表于 2018-10-8 21:55 | 只看該作者
定時器的初始值是否計算正確呢?在仿真的時候要把晶振改成你單片機的晶振
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频免费观看 | 日本午夜视频 | 精品av | 天天干天天操天天看 | 精品视频在线观看 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 狠狠涩 | 黄色片在线观看网址 | 一区二区日本 | 波多野吉衣久久 | 91人人看 | 99国产欧美| 欧美另类视频 | 日韩中文字幕在线观看视频 | 99久久婷婷国产综合精品首页 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 国产乱码精品一区二区三区忘忧草 | 日本成人中文字幕 | 一区二区国产精品 | 亚洲第一在线 | 高清视频一区二区三区 | 91国内视频在线 | 亚洲午夜精品一区二区三区他趣 | 精品视频一区二区 | 欧美精品在线一区二区三区 | 日本三级网站在线观看 | 天天干天天操 | 国产女人与拘做受视频 | www.jizzjizz | 亚洲成人av | 九九久久免费视频 | 中文字幕在线观看一区 | 99久久婷婷国产精品综合 | 亚洲国产精品成人综合久久久 | 成人精品一区二区 | 国产第一页在线播放 | 久久久久亚洲精品中文字幕 | 欧美日韩黄色一级片 | 国产免费一区二区三区免费视频 | 欧美不卡一区二区 | 伊人狠狠干 |