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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數字頻率計單周期實現 2015電賽F題答案

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:


單片機源程序如下:
  1. #include<reg51.h>      
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. //單周期定閘門時間測量盡量降低誤差
  5. //后續待實現:實現多周期定閘門時間測量以降低誤差

  6. static bit end= 0;        //周期開始結束標志,為減少中斷服務工作量定義為全局變量
  7. uchar m=0;         //保存定時器清零次數
  8. uchar u=0;
  9. uint xL,xH=0;                //剩余計數次數
  10. unsigned long t0,c;                //分別保存被測信號的周期和頻率
  11. uchar a[]={'F',':','w','a','i','t','.','.','.','.','.','H','z'};          //頻率數據結果保存

  12. sbit lcdrw=P1^6;
  13. sbit lcdrs=P1^7;
  14. sbit lcden=P2^4;

  15. void delay(uint s)//延時1MS
  16. {
  17.   uint r,g;
  18.    for(r=s;r>0;r--)
  19.      for(g=10;g>0;g--); //原值為110,我改為了10,做實際產品時可能要改回去
  20. }

  21. /////////////////LCD1602的設置//////////////////
  22. void write_com(uchar com) // 寫指令
  23. {  
  24.    lcdrs=0;                //低電平0時選擇指令寄存器
  25.    P0=com;
  26.    delay(5);
  27.    lcden=1;                //高電平(1)時讀取信息
  28.    delay(5);
  29.    lcden=0;                //負跳變時執行指令
  30. }
  31. void write_data(uchar date) // 寫數據
  32. {  
  33.    lcdrs=1;                 //高電平1時選擇數據寄存器
  34.    P0=date;
  35.    delay(5);   //高電平(1)時讀取信息
  36.    lcden=1;
  37.    delay(5);
  38.    lcden=0;           //負跳變時執行指令
  39. }
  40. void initlcd()//初始化LCD1602
  41. {
  42.   lcdrw=0;        //低電平(0)時進行寫操作
  43.   lcden=0;          //負跳變時執行指令
  44.   write_com(0x38);//顯示模式設置
  45.   write_com(0x0c); //顯示開,開游標,不閃爍  
  46.   write_com(0x06); // 字符時整體不移動  
  47. }
  48. ////////////LCD1602設置///////////////////////

  49. ///////////定時計數器外部中斷設置//////////////
  50. void CTINT0_init()                 //定時計數器0和外部中斷0初始化
  51. {       
  52.         TMOD = 0x1;             //T0工作在模式1,定時方式FHP
  53.         TH0=0;                         //定時計數器初值清零
  54.         TL0=0;
  55.         EA=1;                                  //開總中斷
  56.         ET0=1;                         //開Timer0中斷
  57.         EX0=1;                                  //開外部中斷0
  58.         IT0=1;                                  //設置外部中斷方式為下降沿觸發
  59. }
  60. ///////////定時計數器外部中斷設置//////////////

  61. ////////////////中斷服務函數//////////////////
  62. void ITC0() interrupt 0   //外部中斷0服務程序
  63. {       
  64.         if(end)         //FHP被測信號一個周期結束做三件事情:1、記錄周期相關數據;2、定時計數器清零并停止;3、告知下次中斷為周期開始
  65.         {
  66.                 u=m;                                  //讀定時計數器0溢出次數
  67.                 TR0=0;        //停止計時器
  68.                 xH=TH0;                  //讀定時計數器0當前值
  69.                 xL=TL0;
  70.                 end = 0;                //設置下次中斷為周期開始
  71.         }
  72.         else        //FHP被測信號一個周期開始做一件事情:啟動計時器
  73.         {
  74.                 TH0=TL0=0;                         //定時計數器初值清零
  75.                 TR0=1;        //啟動計時器
  76.                 m=0;                                  //溢出次數清零
  77.                 end = 1;        //                //設置下次中斷為周期結束
  78.         }
  79. }
  80. void TIME0() interrupt 1  //定時計數器0溢出中斷服務程序
  81. {
  82.         m++;                                  //溢出次數加1
  83. }
  84. ////////////////中斷服務函數//////////////////

  85. void main()
  86. {
  87.         uchar i;
  88.         CTINT0_init();                  //定時計數器外部中斷初始化       
  89.         initlcd();                          //液晶顯示初始化       
  90.         while(1)
  91.         {                               
  92.                         t0=u*65536 + xH*256 + xL;                                   //計算周期
  93.                         c=1000000000/t0;                           //計算頻率,保存的是頻率擴大了1000倍的值
  94.                         //計算結果逐位保存,首先是小數點后三位
  95.                         a[10]=c%10+'0';
  96.                         a[9]=(c/10)%10+'0';
  97.                         a[8]=(c/100)%10+'0';
  98.                         c /= 1000;//下面是整數部分
  99.                         a[6]=c%10+'0';
  100.                         a[5]=(c/10)%10+'0';
  101.                         a[4]=(c/100)%10+'0';
  102.                         a[3]=(c/1000)%10+'0';
  103.                         a[2]=(c/10000)%10+'0';
  104.                         write_com(0x80);
  105.                         for(i=0;i<=12;i++)
  106.                         {  
  107.                                 write_data(a[i]);
  108.                                 delay(2);                //現在延時只有0.2ms,實際做產品時可能要加長
  109.                         }         
  110.          }
  111. }
復制代碼

所有資料51hei提供下載:
數字頻率計單周期實現.rar (563.21 KB, 下載次數: 87)


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

使用道具 舉報

沙發
ID:1004677 發表于 2022-2-11 17:46 | 只看該作者
這個看原理圖就知道不行了啊
回復

使用道具 舉報

板凳
ID:121859 發表于 2022-5-10 10:38 | 只看該作者
嗯,測低頻還是可以的,中高頻就有些吃力了。
回復

使用道具 舉報

地板
ID:1012735 發表于 2022-5-10 16:36 | 只看該作者
簡單的事搞復雜了!
回復

使用道具 舉報

5#
ID:1117165 發表于 2024-4-18 14:14 | 只看該作者
這樣連RS  RW  E不會亮的 直接連
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂亚洲 | 国产精品久久久久久久岛一牛影视 | 亚洲日本乱码在线观看 | jav成人av免费播放 | 久久久久久蜜桃一区二区 | 午夜影院在线 | 亚洲精品一区中文字幕乱码 | 爱综合 | www.中文字幕.com | 操操日| 天天干天天干 | 久久精品一 | 黄色网址在线免费观看 | 国产一二三区在线 | 国产精品色一区二区三区 | 久久久久久久综合 | 中文一区二区 | 色本道 | 亚洲日本视频 | 日韩二区三区 | 亚洲国产精品一区二区第一页 | 国产高清视频一区 | 国产精品日韩一区 | 一级日批片 | 国外成人在线视频网站 | www.伊人.com| 中文字幕国产精品视频 | 精品久久久久久久久久久 | 日韩一区二区av | 成人国产精品一级毛片视频毛片 | 人妖无码 | 亚卅毛片 | 韩国av一区二区 | 毛片一级片 | 国内精品视频在线观看 | 免费国产视频在线观看 | 毛片99| 噜久寡妇噜噜久久寡妇 | 久久久精彩视频 | 成人精品一区二区 | 精品一区二区久久久久久久网站 |