找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1885|回复: 3
收起左侧

频谱仪STM32单片机代码

[复制链接]
ID:299766 发表于 2019-7-29 13:07 | 显示全部楼层 |阅读模式
代码初学者写的代码,可能不太规范,但是代码简单分方便理解,希望对大家有帮助

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "system.h"
  4. #include "SysTick.h"
  5. #include "beep.h"
  6. #include "dtube.h"
  7. #include "key.h"
  8. #include "text.h"
  9. #include "lcd.h"
  10. #include "dac.h"
  11. #include "usart.h"
  12. #include "ADF4351.h"
  13. #include "adc.h"

  14. float fre_max_ini = 100;
  15. float fre_min_ini = 80;
  16. float  static fre_max = 100 ;
  17. float  static fre_min = 80 ;
  18. float  static fre_num = 100 ;

  19. double RMS_adc_get(void)   //有效值adc采样
  20. {
  21.        
  22.         float value = 0;
  23.         float x=1.75;
  24.         double y=0;
  25.        
  26.         value = Get_ADC_Value(ADC_Channel_1,5);
  27.         x = (float)value*(3.3/4096);
  28.         y = 62.0805 - 18.64 * x  ;
  29.        
  30.        
  31.         return y ;
  32. }

  33. void key_fre(void)     //锁相环单独控制
  34. {
  35.         float  static num = 100.0 ;
  36.         short flag = 0;
  37.         char a[6];
  38.         short count = 0;
  39.         int key = 0;
  40.         int i=1;
  41.         POINT_COLOR=RED;
  42.        
  43.         sprintf(a,"%.1f",num);
  44.         LCD_ShowString(60,60,a,POINT_COLOR);
  45.        
  46.         while(i!=0)
  47.         {
  48.         key = Key_Scan();
  49.        
  50.         switch (key){
  51.                         case 1://1
  52.                                 if(flag)
  53.                                         num += 0.1;
  54.                                 else
  55.                                 {
  56.                                 num *= 10;
  57.                                 num += 1;                       
  58.                                 }
  59.                                 sprintf(a,"%.1f",num);
  60.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  61.                                 break;
  62.                         case 2://2
  63.                                 if(flag)
  64.                                         num += 0.2;
  65.                                 else
  66.                                 {
  67.                                 num *= 10;
  68.                                 num += 2;
  69.                                
  70.                                 }
  71.                                 sprintf(a,"%.1f",num);
  72.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  73.                                 break;
  74.                         case 3://3
  75.                                 if(flag)
  76.                                         num += 0.3;
  77.                                 else
  78.                                 {
  79.                                 num *= 10;
  80.                                 num += 3;
  81.                                
  82.                                 }
  83.                                 sprintf(a,"%.1f",num);
  84.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  85.                                 break;
  86.                         case 4://point
  87.                                 flag = 1;
  88.                                 break;
  89.                         case 5://4
  90.                                 if(flag)
  91.                                         num += 0.4;
  92.                                 else
  93.                                 {
  94.                                 num *= 10;
  95.                                 num += 4;
  96.                                
  97.                                 }
  98.                                 sprintf(a,"%.1f",num);
  99.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  100.                                 break;
  101.                         case 6://5
  102.                                 if(flag)
  103.                                         num += 0.5;
  104.                                 else
  105.                                 {
  106.                                 num *= 10;
  107.                                 num += 5;
  108.                                
  109.                                 }
  110.                                 sprintf(a,"%.1f",num);
  111.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  112.                                 break;
  113.                         case 7://6
  114.                                 if(flag)
  115.                                         num += 0.6;
  116.                                 else
  117.                                 {
  118.                                 num *= 10;
  119.                                 num += 6;
  120.                                
  121.                                 }
  122.                                 sprintf(a,"%.1f",num);
  123.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  124.                                 break;
  125.                         case 8://
  126.                                 i=0;
  127.                           LCD_Clear(BLACK);
  128.                                 break;
  129.                         case 9://7
  130.                                 if(flag)
  131.                                         num += 0.7;
  132.                                 else
  133.                                 {
  134.                                 num *= 10;
  135.                                 num += 7;
  136.                                
  137.                                 }
  138.                                 sprintf(a,"%.1f",num);
  139.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  140.                                 break;
  141.                         case 10://8
  142.                                 if(flag)
  143.                                         num += 0.8;
  144.                                 else
  145.                                 {
  146.                                 num *= 10;
  147.                                 num += 8;
  148.                                
  149.                                 }
  150.                                 sprintf(a,"%.1f",num);
  151.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  152.                                 break;
  153.                         case 11://9
  154.                                 if(flag)
  155.                                         num += 0.9;
  156.                                 else
  157.                                 {
  158.                                 num *= 10;
  159.                                 num += 9;
  160.                                
  161.                                 }
  162.                                 sprintf(a,"%.1f",num);
  163.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  164.                                 break;
  165.                         case 12://reset
  166.                                 num = 100.0;
  167.                                 flag = 0;
  168.                                 LCD_Clear(BLACK);
  169.                                 sprintf(a,"%.1f",num);
  170.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  171.                                 break;
  172.                         case 13://left
  173.                                 num -= 1;
  174.                                 sprintf(a,"%.1f",num);
  175.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  176.                                 break;
  177.                         case 14://0
  178.                                 if(flag)
  179.                                         num += 0.0;
  180.                                 else
  181.                                 {
  182.                                 num *= 10;
  183.                                
  184.                                 }sprintf(a,"%.1f",num);
  185.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  186.                                 break;
  187.                         case 15://right
  188.                                 num += 1;
  189.                                 sprintf(a,"%.1f",num);
  190.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  191.                                 break;
  192.                         case 16://ok
  193.                                 LCD_Clear(BLACK);
  194.                                 if(num < 35.0)
  195.                                         num = 35.0;
  196.                                 if(num > 4400.0)
  197.                                         num = 4400.0;
  198.                                 count = 0;
  199.                                 sprintf(a,"%.1f",num);
  200.                                 LCD_ShowString(60,60,a,POINT_COLOR);
  201.                                 //ADF4351WriteFreq(num);
  202.                                 break;
  203.                         default:
  204.                                 break;
  205.                 }
  206.         }
  207. }

  208. void draw_hand(void)   //手动扫频
  209. {
  210.         int key;
  211.         int i;
  212.         char a[6];
  213.         double static dbm = 0;
  214.         float num = fre_min;
  215.         while(i)
  216.         {
  217.                 //ADF4351WriteFreq(num);
  218.                 LCD_ShowString(60,180," fre: ",POINT_COLOR);
  219.                 LCD_ShowString(60,210," dbm: ",POINT_COLOR);
  220.                 sprintf(a,"%.1f",num);
  221.                 LCD_ShowString(120,180,a,POINT_COLOR);
  222.                
  223.                 key = Key_Scan();
  224.                 switch (key){
  225.                         case 15:      // +
  226.                                 num += 0.1;
  227.                           //ADF4351WriteFreq(num);
  228.                           led();
  229.                           dbm = RMS_adc_get();
  230.                           sprintf( a ,"%.1f", num );
  231.                     LCD_ShowString(120,180, a ,POINT_COLOR);
  232.                           sprintf( a ,"%.3f", dbm );
  233.                     LCD_ShowString(120,210, a ,POINT_COLOR);
  234.                                 break;
  235.                         case 13:      // -
  236.                                 num -= 0.1;
  237.                           //ADF4351WriteFreq(num);
  238.                           led();
  239.                           dbm = RMS_adc_get();
  240.                           sprintf(a,"%.1f",num);
  241.                     LCD_ShowString(120,180,a,POINT_COLOR);
  242.                           sprintf( a ,"%.3f", dbm );
  243.                     LCD_ShowString(120,210, a ,POINT_COLOR);
  244.                        
  245.                                 break;
  246.                         case 8:      //退出   
  247.                                 i=0;
  248.                           LCD_Clear(BLACK);
  249.                                 break;
  250.                         default:
  251.                                 break;
  252.           }
  253.         }
  254.        
  255. }


  256. void draw_outo(void)    //自动扫频
  257. {
  258.         char a[6];
  259.         int key;
  260.         int i=1;
  261.         double static dbm = 0;
  262.         float num = fre_min;
  263.        
  264.         while(i)
  265.         {
  266.                 LCD_ShowString(60,120," please press ok or quit",POINT_COLOR);
  267.                 LCD_ShowString(60,180," fre: ",POINT_COLOR);
  268.                 LCD_ShowString(60,210," dbm: ",POINT_COLOR);
  269.                 sprintf(a,"%.1f",num);
  270.                 LCD_ShowString(120,180,a,POINT_COLOR);
  271.                 key = Key_Scan();
  272.                 switch (key){
  273.                         case 16:      //开始自动扫频
  274.                                 while(num < fre_max)
  275.                                 {
  276.                                         //ADF4351WriteFreq(num);
  277.                                         led();
  278.                                         dbm = RMS_adc_get();
  279.                                         sprintf(a,"%.1f",num);
  280.                                         LCD_ShowString(120,180,a,POINT_COLOR);               
  281.                                         sprintf( a ,"%.3f", dbm );
  282.                       LCD_ShowString(120,210, a ,POINT_COLOR);
  283.                                         num += 0.1;
  284.                                 }
  285.                                 break;
  286.                         case 8:      //退出   
  287.                                 i=0;
  288.                           LCD_Clear(BLACK);
  289.                                 break;
  290.                         default:
  291.                                 break;
  292.           }
  293.   }
  294. }

  295. u16 key_con(float num , int y ,float num_ini)    //高低频率设置
  296. {
  297.         int i=1;
  298.         char a[6];
  299.         int key;
  300.         short count = 0;
  301.         short flag = 0;
  302.         fre_num = num ;
  303.        
  304.         sprintf(a,"%.1f", fre_num);
  305.         LCD_ShowString( 120 , y , a , POINT_COLOR );
  306.        
  307.         while(i)
  308.         {
  309.                 key = Key_Scan();
  310.                 switch (key){
  311.                         case 1://1
  312.                                 if(flag)
  313.                                         fre_num += 0.1;
  314.                                 else
  315.                                 {
  316.                                 fre_num *= 10;
  317.                                 fre_num += 1;                       
  318.                                 }
  319.                                 sprintf(a,"%.1f",fre_num);
  320.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  321.                                 break;
  322.                         case 2://2
  323.                                 if(flag)
  324.                                         fre_num += 0.2;
  325.                                 else
  326.                                 {
  327.                                 fre_num *= 10;
  328.                                 fre_num += 2;
  329.                                
  330.                                 }
  331.                                 sprintf(a,"%.1f",fre_num);
  332.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  333.                                 break;
  334.                         case 3://3
  335.                                 if(flag)
  336.                                         fre_num += 0.3;
  337.                                 else
  338.                                 {
  339.                                 fre_num *= 10;
  340.                                 fre_num += 3;
  341.                                
  342.                                 }
  343.                                 sprintf(a,"%.1f",fre_num);
  344.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  345.                                 break;
  346.                         case 4://point
  347.                                 flag = 1;
  348.                                 break;
  349.                         case 5://4
  350.                                 if(flag)
  351.                                         fre_num += 0.4;
  352.                                 else
  353.                                 {
  354.                                 fre_num *= 10;
  355.                                 fre_num += 4;
  356.                                
  357.                                 }
  358.                                 sprintf(a,"%.1f",fre_num);
  359.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  360.                                 break;
  361.                         case 6://5
  362.                                 if(flag)
  363.                                         fre_num += 0.5;
  364.                                 else
  365.                                 {
  366.                                 fre_num *= 10;
  367.                                 fre_num += 5;
  368.                                
  369.                                 }
  370.                                 sprintf(a,"%.1f",fre_num);
  371.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  372.                                 break;
  373.                         case 7://6
  374.                                 if(flag)
  375.                                         fre_num += 0.6;
  376.                                 else
  377.                                 {
  378.                                 fre_num *= 10;
  379.                                 fre_num += 6;
  380.                                
  381.                                 }
  382.                                 sprintf(a,"%.1f",fre_num);
  383.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  384.                                 break;
  385.                         case 8://
  386.                                 fre_num = num ;
  387.                                 i=0;
  388.                           sprintf(a,"%.1f",fre_num);
  389.                           LCD_ShowString(120,y,a,POINT_COLOR);
  390.                                 break;
  391.                         case 9://7
  392.                                 if(flag)
  393.                                         fre_num += 0.7;
  394.                                 else
  395.                                 {
  396.                                 fre_num *= 10;
  397.                                 fre_num += 7;
  398.                                
  399.                                 }
  400.                                 sprintf(a,"%.1f",fre_num);
  401.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  402.                                 break;
  403.                         case 10://8
  404.                                 if(flag)
  405.                                         fre_num += 0.8;
  406.                                 else
  407.                                 {
  408.                                 fre_num *= 10;
  409.                                 fre_num += 8;
  410.                                
  411.                                 }
  412.                                 sprintf(a,"%.1f",fre_num);
  413.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  414.                                 break;
  415.                         case 11://9
  416.                                 if(flag)
  417.                                         fre_num += 0.9;
  418.                                 else
  419.                                 {
  420.                                 fre_num *= 10;
  421.                                 fre_num += 9;
  422.                                
  423.                                 }
  424.                                 sprintf(a,"%.1f",fre_num);
  425.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  426.                                 break;
  427.                         case 12://reset
  428.                                 LCD_ShowString(120,y, "                " ,POINT_COLOR);
  429.                                 fre_num = (float)num_ini;
  430.                                 flag = 0;
  431.                                 sprintf(a,"%.1f",fre_num);
  432.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  433.                                 break;
  434.                         case 13://left
  435.                                 fre_num -= 1;
  436.                                 sprintf(a,"%.1f",fre_num);
  437.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  438.                                 break;
  439.                         case 14://0
  440.                                 if(flag)
  441.                                         fre_num += 0.0;
  442.                                 else
  443.                                 {
  444.                                 fre_num *= 10;
  445.                                
  446.                                 }sprintf(a,"%.1f",fre_num);
  447.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  448.                                 break;
  449.                         case 15://right
  450.                                 fre_num += 1;
  451.                                 sprintf(a,"%.1f",fre_num);
  452.                                 LCD_ShowString(120,y,a,POINT_COLOR);
  453.                                 break;
  454.                         case 16://ok
  455.                           i = 0 ;
  456.                           return fre_num;
  457.                                 break;
  458.                         default:
  459.                                 break;
  460.                 }
  461.         }
  462.         //return fre_num;
  463. }

  464. void fre_set(void)  //  set
  465. {
  466.         int i=1;
  467.         char a[6];
  468.         int key;
  469.         int y = 60;
  470.        
  471.         LCD_ShowString( 10 , 60 , " fre_max(1): " , POINT_COLOR );
  472.         sprintf(a,"%.1f",fre_max);
  473.         LCD_ShowString( 120 , 60 , a , POINT_COLOR );
  474.        
  475.         LCD_ShowString( 10 , 80 , " fre_min(2): " , POINT_COLOR );
  476.         sprintf(a,"%.1f",fre_min);
  477.         LCD_ShowString( 120 , 80 , a , POINT_COLOR );
  478.        
  479.         while(i)
  480.         {
  481.                 key = Key_Scan();
  482.                 switch (key){
  483.                         case 1:      //fre_max       
  484.                                 y = 60 ;
  485.                           fre_max = key_con( fre_max , y , fre_max_ini );
  486.                                 break;
  487.                         case 2:      //fre_min
  488.                                 y = 80;
  489.                           fre_min = key_con( fre_min , y , fre_min_ini);
  490.                                 break;
  491.                         case 8:      //退出   
  492.                                 i=0;
  493.                           LCD_Clear(BLACK);
  494.                                 break;
  495.                         default:
  496.                                 break;
  497.           }
  498.   }
  499. }

  500. void draw_fre(void)   //频谱仪
  501. {
  502.        
  503.         char a[6];
  504.         int key;
  505.         int i=1;
  506.        
  507.         while(i)
  508.         {
  509.                 LCD_ShowString(60,60," please press 1,2,3 or quit ",POINT_COLOR);
  510.           key = Key_Scan();
  511.                 switch (key){
  512.                         case 1:      //手动扫频
  513.                                 LCD_Clear(BLACK);
  514.                           draw_hand();
  515.                                 break;
  516.                         case 2:      //自动扫频
  517.                                 LCD_Clear(BLACK);
  518.                           draw_outo();
  519.                                 break;
  520.                         case 3:      //设置
  521.                                 LCD_Clear(BLACK);
  522.                           fre_set();
  523.                                 break;
  524.                         case 8:      //退出   
  525.                                 i=0;
  526.                           LCD_Clear(BLACK);
  527.                                 break;
  528.                         default:
  529.                                 break;
  530.           }
  531.   }       
  532. }






  533. /*******************************************************************************
  534. * 函 数 名         : main
  535. * 函数功能                   : 主函数
  536. * 输    入         : 无
  537. * 输    出         : 无
  538. *******************************************************************************/
  539. int main()
  540. {
  541.         float num;
  542.         char a[6];
  543.         int key;
  544.        
  545.         SysTick_Init(72);
  546.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
  547.         USART1_Init(9600);
  548.         KEY_Init();
  549.         LED_Init();
  550.         LCD_Init();                        //LCD初始化
  551.         ADCx_Init();
  552.         GPIO_ADF4351_Configuration();//ADF4351GPIO初始化
  553.         //ADF4351Init();//ADF4351输出初始化(70M)                                                       
  554.         LCD_Clear(BLACK);
  555.         POINT_COLOR=RED;
  556.        
  557.         GPIO_ResetBits(GPIOE,GPIO_Pin_6);
  558.        
  559.         LCD_ShowString(60,60," please press 1 or 2",POINT_COLOR);
  560.        
  561.         while(1)
  562.         {
  563.                 key = Key_Scan();
  564.                 switch (key){
  565.                         case 1:      //锁相环单独控制
  566.                                 LCD_Clear(BLACK);
  567.                                 key_fre();
  568.                           LCD_ShowString(60,60," please press 1 or 2 ",POINT_COLOR);
  569.                                 break;
  570.                         case 2:      //频谱仪
  571.                                 LCD_Clear(BLACK);
  572.                                 draw_fre();
  573.                           LCD_ShowString(60,60," please press 1 or 2 ",POINT_COLOR);
  574.                                 break;
  575.                         default:
  576.                                 break;
  577.                 }
  578.         }
  579.        
  580.                
  581.        
  582.                
  583. }
复制代码

所有资料51hei提供下载:
频谱仪.7z (218.36 KB, 下载次数: 37)
回复

使用道具 举报

ID:1 发表于 2019-7-29 17:00 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:1023716 发表于 2023-1-19 02:40 | 显示全部楼层
楼主真是个好心人, 但这些代码比较不好用,因为没有电路图,涉及到射频电路中的锁相环,没有电路图可能很难理解它的实用价值,望楼主补上电路图.
回复

使用道具 举报

ID:1066888 发表于 2023-3-16 21:35 | 显示全部楼层
确实不知道是使用啥显示屏啥电路图,黑币有限,不敢下载了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表