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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2329|回復: 1
收起左側

我做的單片機頻率計 MB506+BF998

[復制鏈接]
ID:284522 發表于 2023-5-25 14:55 | 顯示全部樓層 |閱讀模式
電路原理圖.gif
  1. /********************************************************
  2. 項  目:51單片機頻率計
  3. 單片機:STC89c52RC                        
  4. 元  件:24MHZ晶振、1602液晶、MB506超高頻分頻器、
  5.         74HC393二進制脈沖計數器、BF998雙刪極場效應管、
  6.                 74HC14施密特觸發器。
  7. 設計思路:參考網上“diy頻率計”帖子重新整理編程。利
  8.                 用T0做定時器、T2做計數器,在一秒內T2計數脈沖
  9.                 數計算頻率
  10.                 測試信號頻率32MHZ到2.4GHZ時,開關撥到高頻位置,
  11.             信號經MB506放大分頻再輸入到BF998放大——74HC14整
  12.                 形——74HC393計數后由Q1Q2Q3Q4送到單片機的P14 P15
  13.                 P16 P17腳,其中Q4也送到單片機的P1.0腳,從
  14.                 而記錄Q4的脈沖個數,計算出信號頻率。                    
  15.                      測試信號頻率低于32MHZ時,開關撥到低頻位置,
  16.                 被測試信號不經過MB506直接到BF998放大,后面同上         
  17. 編  程:
  18. ********************************************************/

  19. #include<at89x52.h>

  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. unsigned char code table[]="f=    M   K   Hz"; //兆hz 千hz
  23. unsigned char code table1[]="T=    m   u   ns";//微妙 納秒 皮秒
  24. unsigned char code table2[]="0123456789";

  25. sbit lcdrs=P2^7;
  26. sbit lcdrw=P2^6;
  27. sbit lcden=P2^5;         
  28. sbit LS393_MR=P1^3;
  29. sbit k200Hz=P2^0;
  30. sbit GP=P2^1;
  31. sbit k=P1^2;        

  32. unsigned int jishu,i;
  33. unsigned long f=0,T,irtime;
  34. bit a=0;   //標志位,為1表示本次測試結束,可進行下次測試


  35. /****************以下延時函數******************/

  36. void yanshi500us(uint x)
  37. {
  38.         uint y;
  39.         
  40.         for(x;x>0;x--)
  41.                 for(y=122;y>0;y--);        
  42. }
  43. void delay1s(void)   //誤差 0us
  44. {
  45.     unsigned char a,b,c,n;
  46.     for(c=167;c>0;c--)
  47.         for(b=39;b>0;b--)
  48.             for(a=152;a>0;a--);
  49.     for(n=1;n>0;n--);
  50. }

  51. //================以下是LCD操作=========================

  52. void read_busy() /*LCD1602 忙等待*/
  53. {
  54.     lcdrs = 0;
  55.     lcdrw = 1;
  56.     lcden = 1;
  57.     P0 = 0xff;
  58.     while (P0&0x80);
  59.     lcden = 0;

  60. }

  61. void lcdrw_com(unsigned char com) //寫命令
  62. {
  63.         read_busy();
  64.         lcdrw=0;
  65.         lcdrs=0;
  66.         P0=com;
  67.         yanshi500us(1);
  68.         lcden=1;
  69.         yanshi500us(1);
  70.         lcden=0;
  71. //        lcdrs=1;
  72.         yanshi500us(10);        
  73. }

  74. void lcdrw_dat(unsigned char dat) //寫數據
  75. {
  76.         read_busy();
  77.         lcdrw=0;
  78.         lcdrs=1;
  79.         P0=dat;
  80.         yanshi500us(1);
  81.         lcden=1;   
  82.         yanshi500us(2);
  83.         lcden=0;
  84. //        lcdrs=1;
  85.         yanshi500us(10);        
  86. }
  87. void write_lcd(uchar COM,uchar dat)//向LCD寫一個字
  88. {
  89.         lcdrw_com(COM);
  90.         lcdrw_dat(dat);
  91.         
  92. }
  93.                                          
  94. void lcdinit()
  95. {
  96.         yanshi500us(30);
  97.         lcdrw_com(0x38);   //設置16*2屏顯,5*7點陣,8位數據接口
  98.         yanshi500us(10);
  99.         lcdrw_com(0x38);
  100.         yanshi500us(10);
  101.         lcdrw_com(0x38);
  102.         yanshi500us(10);
  103.         lcdrw_com(0x08);   //關閉顯示
  104.         lcdrw_com(0x01);   //清屏
  105.         lcdrw_com(0x06);   //讀寫一個字符后指針加一光標加一
  106.         lcdrw_com(0x0c);   //開顯示,顯示光標,光標閃爍
  107.         
  108.                 for(i=0;i<17;i++)
  109.         {
  110.                 lcdrw_dat(table[i]); //寫第一行數據f=    M   K   HZ

  111.         }        
  112.         
  113.         lcdrw_com(0x80+0x40);         //第二行起始位

  114.         for(i=0;i<16;i++)
  115.         {
  116.                 lcdrw_dat(table1[i]); //寫第二行數據T=    u   n   ps

  117.         }
  118.          
  119. }                        


  120. /*******************定時器0中斷服務函數**********************/

  121. void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
  122. {
  123.         unsigned int fl;
  124.         float ff; //用于計算帶小數點的頻率
  125.         irtime++;          //用于計數2個下降沿之間的時間

  126.         if(k200Hz==0)
  127.         {
  128.                 if(jishu==2)
  129.                 {
  130.                         TR0=0;
  131.                         TR2=0;
  132.                         ff=4000000.00/((irtime)*25); //精確到小數點后兩位
  133.                         f=ff*100; //使000.00類型的小數變為00000整數,
  134.                                           //從而容易分解個十百整數及小數點后兩位小數
  135.                 //        f=4*f;                 

  136.          
  137.                         if(irtime==0)
  138.                         {
  139.                                 f=0;T=0;
  140.                         }
  141.                         else
  142.                                 T=(1000000000/ff);        //周期ns
  143.                         a=1;
  144.                         delay1s();                        
  145.                 }
  146.         }                  
  147.         else
  148.         {                                
  149.                 if(irtime==20000)        //計時夠2秒
  150.                 {
  151.                         fl=P1>>4; //少于16個脈沖的脈沖數
  152.                         TR2=0;    //關計數器2
  153.                         TR0=0;    //關定時器0
  154.                         irtime=0;
  155.                         
  156.                         fl=P1>>4; //少于16個脈沖的脈沖數
  157.                         f=((jishu*65536+(TH2*256+TL2))*16+fl)/2;//2秒內總脈沖數即頻率
  158.                         if(GP==0)
  159.                         {
  160.                                 f=2*f*64;
  161.                         }
  162.                         else
  163.                                 f=2*f;

  164.                         if(f==0)
  165.                                 T=0;
  166.                         else                        //下載時使用6T模式
  167.                                 T=1000000000/f;        //周期ns
  168.                         a=1;                          
  169.                 }
  170.         }
  171. }



  172. void TIM0init(void)//定時器0初始化
  173. {
  174.         TMOD=0x02;//定時器0工作方式2,8位初值自動重裝,TH0是重裝值,TL0是初值         
  175.           ET0=1;    //開中斷
  176.                
  177.         if(k200Hz==0)
  178.         {
  179.                 TH0=0xce;//初始值
  180.                   TL0=0xce;//自動重裝值,定時25um        
  181.                 TR2=1;         //開計數器2
  182.                 TR0=0;   //關定時器0
  183.         }
  184.         else
  185.         {
  186.                 TH0=0x38;//初始值
  187.                   TL0=0x38;//自動重裝值,定時100um
  188.                 TR2=1;         //開計數器2
  189.                 TR0=1;   //開定時器0               
  190.         }               
  191. }

  192.                           
  193. /*******************T2計數器初始化***********************/

  194. void t2Init(void) //t2初始化
  195. {
  196.       TR2=0;          //停止計數器2         
  197.           T2CON=0x2;  //計數器
  198.           T2MOD=0x00;
  199.          
  200.           if(k200Hz==0)
  201.           {
  202.                    RCAP2H=0xff;        
  203.                    RCAP2L=0xfe; // 自動重裝,接收1個脈沖中斷
  204.           }
  205.           else
  206.           {
  207.                   RCAP2H=0x0;        
  208.                   RCAP2L=0x0; // 自動重裝,接收65536個脈沖中斷        
  209.           }
  210.           TH2=RCAP2H;
  211.           TL2=RCAP2L; //定時器2賦初值
  212.           EA=1;  //開總中斷
  213.           ET2=1; // 開外定時器2中斷

  214. }



  215. /*********************T2計數器***************************/

  216. void timer2() interrupt 5
  217. {
  218.          TF2=0;        //!!!注意!!! 定時器2必須由軟件對溢出標志位清零,硬件不能清零,這里與定時器0和定時器1不同!!!
  219.          jishu++;//T2中斷次數,如果k200Hz=0,來一個脈沖中斷一次,否則65536個脈沖中斷一次
  220.          if(k200Hz==0)
  221.          {
  222.                  if(jishu==1) //收到第一個脈沖時開啟計時器
  223.                 {
  224.                         TR0=1;
  225.                 }
  226.          }
  227. }


  228. /*****************74LS393 復位*******************/

  229. void  LS393_rest()
  230. {

  231.         LS393_MR=0;
  232.         LS393_MR=1;
  233.         LS393_MR=0;        
  234. }


  235. void main()
  236. {        
  237.         yanshi500us(100);
  238.         lcdinit();
  239.         t2Init();
  240.         TIM0init();
  241.         
  242.         yanshi500us(100);
  243.         LS393_rest();
  244.         while(1)
  245.         {        
  246.                 if(k200Hz==0)
  247.                 {
  248.                         write_lcd(0x80+9,'z');
  249.                         write_lcd(0x80+8,'H');
  250.                         write_lcd(0x80+5,'.');
  251.                         write_lcd(0x80+10,' ');
  252.                         write_lcd(0x80+14,' ');
  253.                         write_lcd(0x80+15,' ');
  254.         
  255.                     write_lcd(0x80+2,table2[f%100000/10000]);
  256.                         write_lcd(0x80+3,table2[f%10000/1000]);
  257.                         write_lcd(0x80+4,table2[f%1000/100]);
  258.                         write_lcd(0x80+6,table2[f%100/10]);
  259.                         write_lcd(0x80+7,table2[f%10]);
  260.                         delay1s();
  261.                                 
  262.                 }
  263.                 /********************以下顯示頻率*********************/
  264.                 else
  265.                 {
  266.                         write_lcd(0x80+2,table2[f/1000000000]);
  267.                         write_lcd(0x80+3,table2[f%1000000000/100000000]);
  268.                         write_lcd(0x80+4,table2[f%100000000/10000000]);
  269.                         write_lcd(0x80+5,table2[f%10000000/1000000]);
  270.                         write_lcd(0x80+7,table2[f%1000000/100000]);
  271.                         write_lcd(0x80+8,table2[f%100000/10000]);
  272.                         write_lcd(0x80+9,table2[f%10000/1000]);
  273.                         write_lcd(0x80+11,table2[f%1000/100]);
  274.                         write_lcd(0x80+12,table2[f%100/10]);
  275.                         write_lcd(0x80+13,table2[f%10]);
  276.                 }
  277.         /**********************以下顯示周期***************************/

  278.             write_lcd(0x80+0x40+2,table2[T/1000000000]);
  279.                 write_lcd(0x80+0x40+3,table2[T%1000000000/100000000]);
  280.                 write_lcd(0x80+0x40+4,table2[T%100000000/10000000]);
  281.                 write_lcd(0x80+0x40+5,table2[T%10000000/1000000]);
  282.                 write_lcd(0x80+0x40+7,table2[T%1000000/100000]);
  283.                 write_lcd(0x80+0x40+8,table2[T%100000/10000]);
  284.                 write_lcd(0x80+0x40+9,table2[T%10000/1000]);
  285.                 write_lcd(0x80+0x40+11,table2[T%1000/100]);
  286.                 write_lcd(0x80+0x40+12,table2[T%100/10]);
  287.                 write_lcd(0x80+0x40+13,table2[T%10]);
  288.                 if(a==1)
  289.                 {
  290.                         a=0;
  291.                         jishu=0;
  292.                         irtime=0;
  293.                         t2Init();                                                                                
  294.                         LS393_rest();
  295.                         TIM0init();                                   
  296.                 }                                                                                       
  297.         }        
  298. }                                                           
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:78901 發表于 2023-5-25 20:06 | 顯示全部樓層
為何不做成等精度頻率計呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人国产精品久久 | 色接久久| 午夜影院视频在线观看 | 久久久久久久香蕉 | 亚洲国产一区视频 | 欧美做暖暖视频 | 日韩欧美三区 | 免费午夜剧场 | 欧美一区二区三区四区视频 | 国产日韩欧美在线观看 | 亚洲成a人片| 亚洲精品一区二三区不卡 | 午夜精品一区二区三区在线视 | 四虎成人免费电影 | 久久中文网 | 精品国产网 | 天天影视亚洲综合网 | 久久九精品 | 久久久这里都是精品 | 日韩中文字幕在线视频观看 | 亚洲成人精品国产 | 精品www | 欧美a级成人淫片免费看 | 成年人网站免费 | 国产精品视频导航 | 风间由美一区二区三区在线观看 | 自拍偷拍中文字幕 | 欧美一区二区三区 | 伊人久久免费 | 中文字幕视频在线 | 视频三区 | 男人影音 | 中文字幕成人 | 国产馆 | 国内精品免费久久久久软件老师 | 天天操综合网站 | 夜夜夜夜夜夜曰天天天 | 日韩毛片| 欧美一级在线观看 | 国产一区二区精品在线 | 国产福利观看 |