标题:
频谱仪STM32单片机代码
[打印本页]
作者:
fuyu6791
时间:
2019-7-29 13:07
标题:
频谱仪STM32单片机代码
代码初学者写的代码,可能不太规范,但是代码简单分方便理解,希望对大家有帮助
单片机源程序如下:
#include "stm32f10x.h"
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "beep.h"
#include "dtube.h"
#include "key.h"
#include "text.h"
#include "lcd.h"
#include "dac.h"
#include "usart.h"
#include "ADF4351.h"
#include "adc.h"
float fre_max_ini = 100;
float fre_min_ini = 80;
float static fre_max = 100 ;
float static fre_min = 80 ;
float static fre_num = 100 ;
double RMS_adc_get(void) //有效值adc采样
{
float value = 0;
float x=1.75;
double y=0;
value = Get_ADC_Value(ADC_Channel_1,5);
x = (float)value*(3.3/4096);
y = 62.0805 - 18.64 * x ;
return y ;
}
void key_fre(void) //锁相环单独控制
{
float static num = 100.0 ;
short flag = 0;
char a[6];
short count = 0;
int key = 0;
int i=1;
POINT_COLOR=RED;
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
while(i!=0)
{
key = Key_Scan();
switch (key){
case 1://1
if(flag)
num += 0.1;
else
{
num *= 10;
num += 1;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 2://2
if(flag)
num += 0.2;
else
{
num *= 10;
num += 2;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 3://3
if(flag)
num += 0.3;
else
{
num *= 10;
num += 3;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 4://point
flag = 1;
break;
case 5://4
if(flag)
num += 0.4;
else
{
num *= 10;
num += 4;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 6://5
if(flag)
num += 0.5;
else
{
num *= 10;
num += 5;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 7://6
if(flag)
num += 0.6;
else
{
num *= 10;
num += 6;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 8://
i=0;
LCD_Clear(BLACK);
break;
case 9://7
if(flag)
num += 0.7;
else
{
num *= 10;
num += 7;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 10://8
if(flag)
num += 0.8;
else
{
num *= 10;
num += 8;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 11://9
if(flag)
num += 0.9;
else
{
num *= 10;
num += 9;
}
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 12://reset
num = 100.0;
flag = 0;
LCD_Clear(BLACK);
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 13://left
num -= 1;
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 14://0
if(flag)
num += 0.0;
else
{
num *= 10;
}sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 15://right
num += 1;
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
break;
case 16://ok
LCD_Clear(BLACK);
if(num < 35.0)
num = 35.0;
if(num > 4400.0)
num = 4400.0;
count = 0;
sprintf(a,"%.1f",num);
LCD_ShowString(60,60,a,POINT_COLOR);
//ADF4351WriteFreq(num);
break;
default:
break;
}
}
}
void draw_hand(void) //手动扫频
{
int key;
int i;
char a[6];
double static dbm = 0;
float num = fre_min;
while(i)
{
//ADF4351WriteFreq(num);
LCD_ShowString(60,180," fre: ",POINT_COLOR);
LCD_ShowString(60,210," dbm: ",POINT_COLOR);
sprintf(a,"%.1f",num);
LCD_ShowString(120,180,a,POINT_COLOR);
key = Key_Scan();
switch (key){
case 15: // +
num += 0.1;
//ADF4351WriteFreq(num);
led();
dbm = RMS_adc_get();
sprintf( a ,"%.1f", num );
LCD_ShowString(120,180, a ,POINT_COLOR);
sprintf( a ,"%.3f", dbm );
LCD_ShowString(120,210, a ,POINT_COLOR);
break;
case 13: // -
num -= 0.1;
//ADF4351WriteFreq(num);
led();
dbm = RMS_adc_get();
sprintf(a,"%.1f",num);
LCD_ShowString(120,180,a,POINT_COLOR);
sprintf( a ,"%.3f", dbm );
LCD_ShowString(120,210, a ,POINT_COLOR);
break;
case 8: //退出
i=0;
LCD_Clear(BLACK);
break;
default:
break;
}
}
}
void draw_outo(void) //自动扫频
{
char a[6];
int key;
int i=1;
double static dbm = 0;
float num = fre_min;
while(i)
{
LCD_ShowString(60,120," please press ok or quit",POINT_COLOR);
LCD_ShowString(60,180," fre: ",POINT_COLOR);
LCD_ShowString(60,210," dbm: ",POINT_COLOR);
sprintf(a,"%.1f",num);
LCD_ShowString(120,180,a,POINT_COLOR);
key = Key_Scan();
switch (key){
case 16: //开始自动扫频
while(num < fre_max)
{
//ADF4351WriteFreq(num);
led();
dbm = RMS_adc_get();
sprintf(a,"%.1f",num);
LCD_ShowString(120,180,a,POINT_COLOR);
sprintf( a ,"%.3f", dbm );
LCD_ShowString(120,210, a ,POINT_COLOR);
num += 0.1;
}
break;
case 8: //退出
i=0;
LCD_Clear(BLACK);
break;
default:
break;
}
}
}
u16 key_con(float num , int y ,float num_ini) //高低频率设置
{
int i=1;
char a[6];
int key;
short count = 0;
short flag = 0;
fre_num = num ;
sprintf(a,"%.1f", fre_num);
LCD_ShowString( 120 , y , a , POINT_COLOR );
while(i)
{
key = Key_Scan();
switch (key){
case 1://1
if(flag)
fre_num += 0.1;
else
{
fre_num *= 10;
fre_num += 1;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 2://2
if(flag)
fre_num += 0.2;
else
{
fre_num *= 10;
fre_num += 2;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 3://3
if(flag)
fre_num += 0.3;
else
{
fre_num *= 10;
fre_num += 3;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 4://point
flag = 1;
break;
case 5://4
if(flag)
fre_num += 0.4;
else
{
fre_num *= 10;
fre_num += 4;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 6://5
if(flag)
fre_num += 0.5;
else
{
fre_num *= 10;
fre_num += 5;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 7://6
if(flag)
fre_num += 0.6;
else
{
fre_num *= 10;
fre_num += 6;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 8://
fre_num = num ;
i=0;
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 9://7
if(flag)
fre_num += 0.7;
else
{
fre_num *= 10;
fre_num += 7;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 10://8
if(flag)
fre_num += 0.8;
else
{
fre_num *= 10;
fre_num += 8;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 11://9
if(flag)
fre_num += 0.9;
else
{
fre_num *= 10;
fre_num += 9;
}
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 12://reset
LCD_ShowString(120,y, " " ,POINT_COLOR);
fre_num = (float)num_ini;
flag = 0;
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 13://left
fre_num -= 1;
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 14://0
if(flag)
fre_num += 0.0;
else
{
fre_num *= 10;
}sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 15://right
fre_num += 1;
sprintf(a,"%.1f",fre_num);
LCD_ShowString(120,y,a,POINT_COLOR);
break;
case 16://ok
i = 0 ;
return fre_num;
break;
default:
break;
}
}
//return fre_num;
}
void fre_set(void) // set
{
int i=1;
char a[6];
int key;
int y = 60;
LCD_ShowString( 10 , 60 , " fre_max(1): " , POINT_COLOR );
sprintf(a,"%.1f",fre_max);
LCD_ShowString( 120 , 60 , a , POINT_COLOR );
LCD_ShowString( 10 , 80 , " fre_min(2): " , POINT_COLOR );
sprintf(a,"%.1f",fre_min);
LCD_ShowString( 120 , 80 , a , POINT_COLOR );
while(i)
{
key = Key_Scan();
switch (key){
case 1: //fre_max
y = 60 ;
fre_max = key_con( fre_max , y , fre_max_ini );
break;
case 2: //fre_min
y = 80;
fre_min = key_con( fre_min , y , fre_min_ini);
break;
case 8: //退出
i=0;
LCD_Clear(BLACK);
break;
default:
break;
}
}
}
void draw_fre(void) //频谱仪
{
char a[6];
int key;
int i=1;
while(i)
{
LCD_ShowString(60,60," please press 1,2,3 or quit ",POINT_COLOR);
key = Key_Scan();
switch (key){
case 1: //手动扫频
LCD_Clear(BLACK);
draw_hand();
break;
case 2: //自动扫频
LCD_Clear(BLACK);
draw_outo();
break;
case 3: //设置
LCD_Clear(BLACK);
fre_set();
break;
case 8: //退出
i=0;
LCD_Clear(BLACK);
break;
default:
break;
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
float num;
char a[6];
int key;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
USART1_Init(9600);
KEY_Init();
LED_Init();
LCD_Init(); //LCD初始化
ADCx_Init();
GPIO_ADF4351_Configuration();//ADF4351GPIO初始化
//ADF4351Init();//ADF4351输出初始化(70M)
LCD_Clear(BLACK);
POINT_COLOR=RED;
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
LCD_ShowString(60,60," please press 1 or 2",POINT_COLOR);
while(1)
{
key = Key_Scan();
switch (key){
case 1: //锁相环单独控制
LCD_Clear(BLACK);
key_fre();
LCD_ShowString(60,60," please press 1 or 2 ",POINT_COLOR);
break;
case 2: //频谱仪
LCD_Clear(BLACK);
draw_fre();
LCD_ShowString(60,60," please press 1 or 2 ",POINT_COLOR);
break;
default:
break;
}
}
}
复制代码
所有资料51hei提供下载:
频谱仪.7z
(218.36 KB, 下载次数: 37)
2019-7-29 16:58 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-7-29 17:00
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
goodmasher
时间:
2023-1-19 02:40
楼主真是个好心人, 但这些代码比较不好用,因为没有电路图,涉及到射频电路中的锁相环,没有电路图可能很难理解它的实用价值,望楼主补上电路图.
作者:
许玩童
时间:
2023-3-16 21:35
确实不知道是使用啥显示屏啥电路图,黑币有限,不敢下载了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1