標題: 單片機數(shù)字頻率計仿真設(shè)計0~9000hz 數(shù)碼管顯示 帶源碼 [打印本頁]

作者: 51hei學(xué)習(xí)技術(shù)中    時間: 2017-3-17 23:21
標題: 單片機數(shù)字頻率計仿真設(shè)計0~9000hz 數(shù)碼管顯示 帶源碼
今天給51黑電子論壇的朋友們分享一個51單片機做的數(shù)字頻率計,用數(shù)碼管顯示,有詳細的程序代碼.
仿真原理圖如下:



部分單片機源碼預(yù)覽:
freCountMain.c文件:
  1. /*************************************************************************
  2. *實例名稱:頻率計
  3. *實例說明:實現(xiàn)0~9000hz頻率計的統(tǒng)計
  4. *作者:yd
  5. *時間:09.06.20
  6. *************************************************************************/
  7. #include "target.h"
  8. #include "led.h"
  9. uchar displayBuff[4]={'0','0','0','0'}; //數(shù)碼管顯示緩沖區(qū),千,百,十,個
  10. const uchar displayMode=0x00;           //后四位分別對應(yīng)緩沖區(qū)中每位的數(shù)據(jù)類型,1為任意字符顯示,0為數(shù)字顯示
  11. void main()
  12. {
  13.   uint get_fre;
  14.   target_init();
  15.   init_led();
  16.   sei();
  17.   while(1)
  18.   {
  19.     get_fre=get_fre_number();
  20.         if(get_fre/1000<0x0A)
  21.         {
  22.           displayBuff[0]=get_fre/1000+'0';            //計算頻率千位,放在緩沖區(qū)第0位
  23.         }
  24.         displayBuff[1]=(get_fre/100)%10+'0';          //計算頻率百位,放在緩沖區(qū)第1位
  25.     displayBuff[2]=(get_fre%100)/10+'0';          //計算頻率十位,放在緩沖區(qū)第2位
  26.         displayBuff[3]=get_fre%10+'0';                          //計算頻率個位,放在緩沖區(qū)第3位
  27.     ledSweepDisplay(displayBuff,displayMode,0x04);//循環(huán)顯示數(shù)碼管緩沖區(qū)中數(shù)據(jù)
  28.   }

  29. }
復(fù)制代碼

led.c文件:
  1. #define LED_GLOBAL 1
  2. #include "led.h"
  3. /*******************************************************************************************
  4. *函數(shù)名稱:delay_us(uint us)
  5. *函數(shù)功能:實現(xiàn)微秒級的延時
  6. *函數(shù)入口:us,延時函數(shù)循環(huán)后期數(shù)
  7. *函數(shù)出口:無
  8. *******************************************************************************************/
  9. void delay_us(uint us)
  10. {
  11.   uint i;
  12.   while(us--)
  13.   {
  14.     for(i=0;i<100;i++);
  15.   }
  16. }
  17. /*******************************************************************************************
  18. *函數(shù)名稱:led_init(void)
  19. *函數(shù)功能:四位七段數(shù)碼管顯示初始化
  20. *函數(shù)入口:無
  21. *函數(shù)出口:無
  22. *******************************************************************************************/
  23. void init_led(void)
  24. {
  25.    LED=segLedCode[0];
  26.    LED_CS1=0;
  27.    LED_CS2=0;
  28.    LED_CS3=0;
  29.    LED_CS4=0;
  30. }
  31. /*******************************************************************************************
  32. *函數(shù)名稱:ledWrite(uchar c,uchar n,uchar mod)
  33. *函數(shù)功能:對一組數(shù)碼管的某一位進行短暫顯示
  34. *函數(shù)入口:c,要顯示的數(shù)據(jù);n,顯示一組數(shù)碼管中的第n位;mod,c的數(shù)據(jù)形式
  35. *函數(shù)出口:無
  36. *說明:當(dāng)mod==DIGITAL時,c為數(shù)字0~9的ANCII碼形式,此時在n位數(shù)碼管上顯示想用數(shù)字
  37.        當(dāng)mod==CHARACTER,直接將c輸出數(shù)據(jù)口
  38. *******************************************************************************************/
  39. void ledWrite(uchar c,uchar n,uchar mod)
  40. {
  41.    if(CHARACTER==mod)
  42.    {
  43.           LED=c;  
  44.    }
  45.    else if(DIGITAL==mod)
  46.            {
  47.               if((c-'0')<0x0a)
  48.                   {
  49.                     LED=segLedCode[c-'0'];
  50.                   }
  51.                   else
  52.                   {  
  53.                         LED=segLedCode[0];
  54.                   }
  55.            }
  56.    switch(n)
  57.    {
  58.                 case 0x01:
  59.                 {
  60.                   LED_CS1=0;
  61.                   delay_us(10);
  62.                   LED_CS1=1;
  63.                   break;
  64.                 }
  65.                 case 0x02:
  66.                 {
  67.                   LED_CS2=0;
  68.                   delay_us(10);
  69.                   LED_CS2=1;
  70.                   break;
  71.                 }
  72.                 case 0x03:
  73.                 {
  74.                   LED_CS3=0;
  75.                   delay_us(10);
  76.                   LED_CS3=1;
  77.                   break;
  78.                 }
  79.             case 0x04:
  80.                 {
  81.                   LED_CS4=0;
  82.                   delay_us(10);
  83.                   LED_CS4=1;
  84.                   break;
  85.                 }
  86.                 default:
  87.                   break;

  88.    }

  89. }
  90. /*******************************************************************************************
  91. *函數(shù)名稱:ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  92. *函數(shù)功能:循環(huán)在數(shù)碼管上顯示緩沖區(qū)中的數(shù)據(jù)
  93. *函數(shù)入口:segCode,指向顯示緩沖區(qū)中的指針;segCodeMod,0~7位為1或0標示1~8位數(shù)碼管顯示的數(shù)據(jù)的類型(DIGITAL或者CHARACTER);segNumber,代表要顯示數(shù)碼管的位數(shù)
  94. *函數(shù)出口:無
  95. *說明:本函數(shù)主要實現(xiàn)將顯示緩沖區(qū)中的數(shù)據(jù)在數(shù)碼管上顯示出來
  96. *******************************************************************************************/                     
  97. void ledSweepDisplay(uchar *segCode,uchar segCodeMod,uchar segNumber)
  98. {
  99.            uchar segCount;
  100.         for(segCount=0;segCount<segNumber;segCount++)
  101.         {
  102.            if(segCodeMod&0x01)           /*1代表此處顯示任意字符 */
  103.            {
  104.              ledWrite(segCode[segCount],segCount+1,CHARACTER);
  105.            }
  106.            else
  107.            {
  108.              ledWrite(segCode[segCount],segCount+1,DIGITAL);
  109.            }
  110.            segCodeMod=segCodeMod>>1;
  111.         }
  112. }
復(fù)制代碼



全部資料下載(含仿真工程文件和完整代碼而且經(jīng)過51hei.com測試通過):
數(shù)字頻率計.rar (20.4 KB, 下載次數(shù): 98)


作者: 因為我向往    時間: 2020-5-29 17:28
感謝分享
作者: 安靜1429    時間: 2020-5-29 21:37
感謝分享
作者: 55ok    時間: 2020-5-29 21:42
看暈了 ,天書一樣
作者: Dollyz    時間: 2020-12-29 21:47
優(yōu)秀,我的設(shè)計跟這個也有關(guān)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1