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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

第16章-單片機頻率檢測

  [復制鏈接]
跳轉到指定樓層
樓主
51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全
編著 詳見:http://www.zg4o1577.cn/bbs/dpj-37954-1.html

16章 頻率檢測
1 頻率檢測的用途與頻率定義
2 頻率檢測實例
1 頻率檢測的用途與頻率定義

實際工程中有時需要使用單片機檢測脈沖信號頻率,比如家用恒溫型熱水器內部 的水流量傳感器輸出的是12V的矩形脈沖信號,工業運用中的液體流量計輸出的 往往也是5~24V的脈沖信號,我們要知道當前液體的瞬時流量就需要測量流量計 輸出的脈沖信號頻率,然后通過頻率換算公式得到當前流量值,脈沖信號可能存 在如下圖所示的2種波形,一個波形周期固定不變,另一個波形周期是變動的。


頻率定義:物質在1秒鐘內完成周期性變化的次數叫做頻率,常用f表示,比如
正弦交流電,其頻率是50Hz,也就是它在一秒鐘內做了50次周期性變化。 假設上圖波形總時間為1秒,則上下2個波形頻率都是6Hz,對于實際的檢測儀表,只要測量出1秒鐘內的脈沖個數也就知道頻率了,對上面2個波形測量結果 也都會是一致的(6Hz)。
2 頻率檢測實例
例16.1 程序功能:把P3.4 、P3.5在精確1秒鐘內輸入的脈沖個數值測量出來并 通過串口發送給計算機。
電路如下圖所示,由1號單片機輸出脈沖信號,2號單片機 P3.4 、P3.5用著頻率 檢測輸入口。

說明:由于要求同時測量2路脈沖信號頻率,使用T0(P3.4)與T1(P3.5)作

為外部計數脈沖輸入口,T2作串口波特率發生器,1S定時器可以使用T3、 T4,也可使用PCA模塊定時,使用頻率為22.1184MHz的外部晶振(重點),串口 通信波特率9600,可精確測量外部信號的最高頻率的理論值為22.1184MHz/4

= 5.5926 MHz,實驗結果:輸入6.021MHz時測量結果仍然是精確的,下限測 量到幾Hz依然是準確的,只是不能顯示小數部分而已。

程序要點分析:

(1)T0與T1是16位計數器,最大計數值為65535,我們需要測量1000000Hz以 上的頻率信號,因此需要將計數器擴展為24位,可定義一個unsigned char 變量作為軟件計數器, 當16位計數器溢出一次就讓軟件計數器加1,因此最 大測量范圍是65536*255=16711680,即16.7MHz。

(2)PCA定時器定時時間設置為5ms產生一次中斷,200次中斷即為1秒, 1秒 時間到達時讀取計數器T0與T1的值和軟件計數器的值。


由于1號單片機的輸出信號串聯了240Ω電阻,在信號頻率很高時接入萬用表會對

信號波形產生影響,因此需要直接測量1號單片機信號輸出引腳相連的測試點, 另外2號單片機晶振一定得選用外部晶振。實測結果如圖16-2所示(圖中只給一 個輸入通道輸入了頻率信號)。



1—1號單片機脈沖信號輸出程序:
  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/


  10. // 晶振頻率使用22.1184M
  11. #include "STC15W4K.H"
  12. void CLOCK_Init()
  13. {
  14. //*****************  設置主時鐘輸出,不分頻 *****************       
  15.         CLK_DIV = 0xc0;     // 主時鐘輸出頻率= Fosc /4,R/C時鐘頻率要求不大于12MHz。
  16. }

  17. void delay2ms(void)
  18. {
  19.    unsigned char i,j,k;
  20.    for(i=2;i>0;i--)     //注意后面沒分號
  21.    for(j=30;j>0;j--)    //注意后面沒分號
  22.    for(k=180;k>0;k--);    //注意后面有分號
  23. }

  24. void main()
  25. {         
  26.         CLOCK_Init();           // 時鐘輸出初始化,需要輸出高頻信號時使用本行代碼。
  27.         while(1);
  28. //        while(1)                   // 單通道低頻輸出時使用
  29. //        {
  30. //           P54=!P54;
  31. //           delay2ms();
  32. //        }
  33. }

復制代碼

1—2號單片機秒計數方式檢測頻率程序:
  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. // 晶振頻率為22.1184MHz外部晶振,串口通信波特率9600
  11. #include "STC15F2K60S2.H"
  12. #include <stdio.h>                        // 為使用KEIL自帶的庫函數printf而加入
  13. bit flag;                          // 需要通過串口向電腦發送數據的標志
  14. sbit LED_1s=P0^0;                             // 調試指示燈
  15. sbit LED_T0_Over=P0^1;                       // 調試指示燈
  16. sbit LED_T1_Over=P0^2;                     // 調試指示燈
  17. unsigned char Read_TH0,Read_TL0;   // 讀取的定時器T0的高低位計數值
  18. unsigned char Read_TH1,Read_TL1;   // 讀取的定時器T1的高低位計數值       
  19. unsigned char HT0,HT1;             // 超過16位的計數值,最大256*65536=16.777 216 MHz
  20. unsigned char Read_HT0,Read_HT1;   // 讀取的超過16位的計數值,
  21. unsigned char Count=200;           // 中斷計數變量(1S計時用),200*5mS = 1S

  22. void Uart_Init(void)                // 9600bps@22.1184MHz          
  23. {
  24.         SCON = 0x50;                // 8位數據,可變波特率
  25.         AUXR |= 0x04;                // 定時器2時鐘為Fosc,即1T
  26.         T2L = 0xC0;                    // 設定定時初值
  27.         T2H = 0xFD;                    // 設定定時初值
  28.         AUXR |= 0x01;                // 串口1選擇定時器2為波特率發生器
  29.         AUXR |= 0x10;                // 啟動定時器2
  30.         TI=1;
  31. }

  32. void JiShuQ_Init()            // 計數器初始化,T0和T1共2路計數脈沖輸入
  33. {
  34.         TMOD=0x55;                 // 設置T1、T0工作于計數方式,16位計數
  35.         HT0=0;TH0=0;TL0=0;HT1=0;TH1=0;TL1=0;                      // 清空計數器
  36.         TR0=1;TR1=1;            //開啟計數器0 /計數器1                                                
  37.         ET0=1;ET1=1;                // 開啟計數器0與1的中斷                                               
  38. }
  39. void DingSQ_Iint_5mS()        // PCA定時器初始化為5mS中斷
  40. {         
  41.         CMOD=0x80;                 // #10000000B   空閑模式下停止PCA計數器工作
  42.                                              // 選擇PCA時鐘源為fOSC/12,禁止PCA計數器溢出時中斷
  43.         CCON=0;                    // 清0 PCA計數器溢出中斷請求標志位CF
  44.                                                    // CR = 0, 不允許 PCA 計數器計數;清0 PCA 各模塊中斷請求標志位CCFn
  45.         CL=0;               // 清0 PCA 計數器
  46.         CH=0;
  47.         CCAP0L=0;                // 給PCA模塊0的CCAP0L置初值
  48.         CCAP0H=0x24;        // 給PCA模塊0的CCAP0H 置初值
  49.         CCAPM0=0x49;        // 設置PCA模塊0為16位軟件定時器
  50.                                                 // ECCF0=1允許PCA模塊0中斷
  51.                                             // 當[CH,CL]=[CCAP0H,CCAP0L]時,CCF0=1,產生中斷請求
  52.         EA=1;               // 開整個單片機所有中斷共享的總中斷控制位
  53.         CR=1;               // 啟動PCA計數器(CH,CL)計數        
  54. }
  55. void PCA(void) interrupt 7          // PCA中斷服務程序,每5ms中斷一次
  56. {
  57.         union
  58.         {                                   // 定義一個聯合,以進行16位加法
  59.             unsigned int num;
  60.                    struct
  61.                 {                               // 在聯合中定義一個結構
  62.                         unsigned char Hi,Lo;
  63.         }Result;
  64.     }temp;
  65.           
  66.         temp.num=(unsigned int)(CCAP0H<<8)+CCAP0L+0x2400;        //0X1200=0.500112S,        0X11FF=0.500003S,
  67.     CCAP0L=temp.Result.Lo;      // 取計算結果的低8位
  68.     CCAP0H=temp.Result.Hi;             // 取計算結果的高8位
  69.         CCF0=0;                             // 清 PCA 模塊0 中斷標志
  70.         Count--;                                     // 修改中斷計數
  71.     if(Count==0)
  72.     {
  73.                 Count=200;              // 恢復中斷計數初值        200*5mS = 1S
  74.                 LED_1s =!LED_1s;            // 在P0.0輸出脈沖寬度為1秒鐘的方波(周期2S)
  75.                 TR0=0;TR1=0;                    // 關閉計數器0與1 ,防止讀數錯誤
  76.                 CR=0;                   // 關閉16位PCA計數器(CH,CL)
  77.                
  78.                 Read_HT0=HT0;Read_TH0=TH0;Read_TL0=TL0;                // 讀取計數值
  79.             Read_HT1=HT1;Read_TH1=TH1;Read_TL1=TL1;                // 讀取計數值

  80.                 HT0=0;TH0=0;TL0=0;                                                        // 清空計數器
  81.                 HT1=0;TH1=0;TL1=0;

  82.                 TR0=1;TR1=1;                        // 開啟計數器0與1 ,防止讀數錯誤
  83.                  CR=1;                       // 開啟16位PCA計數器(CH,CL)
  84.             flag=1;                                        // 需要主程序處理數據
  85.         }
  86. }

  87. void Timer0(void) interrupt 1        // 定時器T0 中斷函數
  88. {
  89.         HT0++;           // 超過16位計數值變量一次變量加1       
  90.         LED_T0_Over=!LED_T0_Over;               
  91. }
  92. void Timer1(void) interrupt 3        // 定時器T1 中斷函數
  93. {
  94.         HT1++;           // 超過16位計數值變量一次變量加1       
  95.         LED_T1_Over=!LED_T1_Over;
  96. }
  97. void SendBuf()
  98. {
  99.         unsigned long tmp;
  100.         tmp= Read_HT0*65536+Read_TH0*256+Read_TL0;
  101.         printf("F1: %ldHz     ",tmp);
  102.         tmp= Read_HT1*65536+Read_TH1*256+Read_TL1;
  103.         printf("F2: %ldHz\n",tmp);
  104. }
  105. void main()
  106. {         
  107.         Uart_Init();                   // 串口初始化
  108.         JiShuQ_Init();                   // 計數器初始化
  109.         DingSQ_Iint_5mS();               // PCA定時器5mS初始化
  110.         while(1)
  111.         {
  112.                 if (flag==1)               // 需要通過串口向電腦發送數據的標志
  113.                 {         
  114.                         SendBuf();
  115.                         flag=0;               
  116.                 }
  117.         }
  118. }

復制代碼



第16章 頻率檢測.rar

69.72 KB, 下載次數: 63, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:211279 發表于 2017-6-14 19:32 | 只看該作者
感謝樓主的分享,謝謝。
回復

使用道具 舉報

板凳
ID:153412 發表于 2017-9-5 14:05 | 只看該作者
感謝分享,非常實用
回復

使用道具 舉報

地板
ID:243825 發表于 2017-10-29 05:02 | 只看該作者
非常實用,謝謝  
回復

使用道具 舉報

5#
ID:161115 發表于 2019-4-29 16:58 | 只看該作者
非常好的教程,感謝樓主無私的分享
回復

使用道具 舉報

6#
ID:388809 發表于 2019-8-16 13:52 | 只看該作者
樓主  這個頻率可以檢測到多高  能到200K以上么?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人深夜小视频 | 成人精品视频在线观看 | 精品国产鲁一鲁一区二区张丽 | 另类专区成人 | 亚洲电影成人 | 天天爽综合网 | 岛国av一区二区 | 91精品国产综合久久精品 | 国产在视频一区二区三区吞精 | 欧美一区不卡 | 蜜桃在线一区二区三区 | 国产精品久久毛片av大全日韩 | 免费成人高清在线视频 | 懂色av色香蕉一区二区蜜桃 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美精品网站 | 亚洲最大看片网站 | 久久久片 | 伊人伊人 | 在线看片福利 | 久久中文字幕一区 | 午夜精品一区二区三区在线观看 | 欧美一区二区成人 | 精品九九在线 | 成年人在线观看视频 | 精品一区二区视频 | 我爱操| 极品国产视频 | 999国产精品视频 | 黄色网络在线观看 | 日本超碰| 成人精品毛片国产亚洲av十九禁 | 四虎成人精品永久免费av九九 | 国产精品久久久久久妇女 | 涩涩视频在线播放 | 性色av香蕉一区二区 | 国产精品欧美大片 | 国产精品视频网站 | 欧美视频成人 | 国产日韩一区二区 | 国产在线观看一区二区 |