资源描述
STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制
此程序能输出两路通道,三路波形,利用STM32的DAC,TIM,LCD,和DMA控制的发射出正弦波,锯齿波和三角波,每种波形频率可调,独立输出,独立显示频率,使能。最高频率达12.5KHz。三种波形都是有一个简易小UI界面,电阻式触摸屏,能够完全手动控制通道的选择,波形的选择频率的选择以及各种波形的使能。
/********************************************************************************************
使用手册:
0.初学即兴所敲,不喜勿喷。
1.通道1和通道2只能分开输出。
2.只有选中响应的波形选择框,才能设置频率或者使能。
3.使能端只能在通道1或者通道2打开的情况下才能被使按下操作有效。
4.每次使能一个波形,其他波形使能将自动关闭。
5.当通道1和通道2都关闭,使能将自动无效。
6.通道1和通道2切换,必须重新使能。
7.开发平台为STM32战舰版。
USER:Zhang Changhao
*********************************************************************************************/
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "24cxx.h"
#include "flash.h"
#include "touch.h"
#include "STM32_WaveOutput.h"
u8 t,Mode1,Mode2,Mode1_Flag,Mode2_Flag;
u8 sinewave_flag,sawtooth_flag,triangle_flag,
sinewave_mode,sawtooth_mode,triangle_mode;
u8 sinewave_en,sawtooth_en,triangle_en;
u8 sinewave_fre,sawtooth_fre,triangle_fre;
u8 output_wave;
u16 output_fre;
#define MODE1 1
#define MODE2 2
#define sinewave 1
#define sawtooth 2
#define triangle 3
void wave_show(u8 wavemode);
void en_show(u8 wavemode);
void Mode_Show(u8 mode);
void wave_fre(u8 wavemode);
void judge_tongdao();
void judge_wave();
void judge_en();
void judge_fre();
void show_init();
void fengbi_tongdao();
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
tp_dev.init();
show_init();
while(1)
{
t=TP_Scan(0);
if(t)
{
t=0;
// printf("%d,%d\r\n",tp_dev.x[0],tp_dev.y[0]);
judge_tongdao();
judge_wave();
judge_en();
judge_fre();
if(sinewave_en==1||sawtooth_en==1||triangle_en==1)
{
if(Mode1_Flag!=DISABLE)
{
if(sinewave_en)
{
output_wave=sinewave;
output_fre=sinewave_fre*100;
}
else if(sawtooth_en)
{
output_wave=sawtooth;
output_fre=sawtooth_fre*100;
}
else if(triangle_en)
{
output_wave=triangle;
output_fre=triangle_fre*100;
}
printf("%d,%d\r\n",output_wave,output_fre);
Wave_Init((output_wave-1),output_fre,ENABLE,(output_wave-1),output_fre,DISABLE);
// printf("%d\r\n",TIM_TimeBaseStructure.TIM_Period);
// Set_WaveFre(0,output_fre);
}
else if(Mode2_Flag!=DISABLE)
{
if(sinewave_en)
{
output_wave=sinewave;
output_fre=sinewave_fre*100;
}
else if(sawtooth_en)
{
output_wave=sawtooth;
output_fre=sawtooth_fre*100;
}
else if(triangle_en)
{
output_wave=triangle;
output_fre=triangle_fre*100;
}
Wave_Init((output_wave-1),output_fre,DISABLE,(output_wave-1),output_fre,ENABLE);
printf("%d,%d\r\n",output_wave,output_fre);
}
}
else
{
Wave_Init(0,1,DISABLE,0,1,DISABLE);
}
} //if(t)
LED1=!LED1;
delay_ms(100);
}
}
void show_init()
{
//清屏
LCD_Clear(CYAN);
POINT_COLOR=BROWN;//设置字体为红色
LCD_Fill(0,0,2,320,BROWN);
LCD_Fill(0,0,240,2,BROWN) ;
LCD_Fill(0,318,240,320,BROWN);
LCD_Fill(238,0,240,320,BROWN);
LCD_Fill(7,7,9,313,BROWN);
LCD_Fill(7,7,233,9,BROWN) ;
LCD_Fill(7,311,233,313,BROWN);
LCD_Fill(231,7,233,313,BROWN);
LCD_DrawLine(0,0,7,7);
LCD_DrawLine(233,313,240,320);
LCD_DrawLine(233,7,240,0);
LCD_DrawLine(7,313,0,320);
//通道1 2的初始化
POINT_COLOR=RED;//设置字体为红色
LCD_Fill(20,20,110,65,MAGENTA);
LCD_ShowString(38,35,80,16,16,"Output1");
LCD_Fill(130,20,220,65,MAGENTA);
LCD_ShowString(148,35,80,16,16,"Output2");
//正弦初始化
LCD_Fill(50,80,145,110,LIGHTGREEN) ;
LCD_ShowString(67,88,64,16,16,"SineWave");
LCD_Fill (155,80,200,110,RED) ;
POINT_COLOR=GREEN;
Draw_Circle(55,125,13);
LCD_DrawLine(42,125,68,125);
LCD_DrawLine(55,112,55,138);
POINT_COLOR=BROWN;
Draw_Circle(168,125,13);
LCD_DrawLine(155,125,181,125) ;
LCD_ShowString(72,120,80,16,16,"Fre:0.0KHz");
//锯齿初始化
POINT_COLOR=RED;
LCD_Fill(50,150,145,180,DARKBLUE);
LCD_ShowString(67,158,64,16,16,"SawTooth");
LCD_Fill (155,150,200,180,RED) ;
POINT_COLOR= GREEN;
Draw_Circle(55,195,13);
LCD_DrawLine(42,195,68,195);
LCD_DrawLine(55,182,55,208);
POINT_COLOR=BROWN;
Draw_Circle(168,195,13);
LCD_DrawLine(155,195,181,195);
LCD_ShowString(72,190,80,16,16,"Fre:0.0KHz");
//三角初始化
POINT_COLOR=RED;
LCD_Fill(50,220,145,250,YELLOW) ;
LCD_ShowString(63,228,64,16,16,"triangle");
LCD_Fill(155,220,200,250,RED) ;
POINT_COLOR= GREEN;
Draw_Circle(55,265,13);
LCD_DrawLine(42,265,68,265);
LCD_DrawLine(55,252,55,278);
POINT_COLOR= BROWN;
Draw_Circle(168,265,13);
LCD_DrawLine(155,265,181,265);
LCD_ShowString(72,260,80,16,16,"Fre:0.0KHz");
LED0=0;
//张长浩
POINT_COLOR=DARKBLUE;
LCD_ShowString(65,295,168,16,16,"BY:Zhang Changhao^_^");
POINT_COLOR= BROWN;
}
void judge_tongdao()
{
//通道1 2 的识别操作
if((tp_dev.x[0]>19)&&(tp_dev.x[0]<111)
&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66))
{ printf("\r\n");
if(Mode1_Flag)
{
Mode1_Flag=0;
Mode1=DISABLE;
//fengbi_tongdao();
Mode_Show(MODE1);
}
else
{
Mode1_Flag=1;
if(Mode2_Flag)
{
Mode2=0;
Mode2_Flag=0;
Mode_Show(MODE2) ;
}
Mode1=ENABLE;
Mode_Show(MODE1);
}
fengbi_tongdao();
}
else if((tp_dev.x[0]>129)&&(tp_dev.x[0]<221)
&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66))
{
if(Mode2_Flag)
{
Mode2_Flag=0;
Mode2=DISABLE;
//fengbi_tongdao();
Mode_Show(MODE2);
}
else
{
Mode2_Flag=1;
if(Mode1_Flag)
{
Mode1=0;
Mode1_Flag=0;
Mode_Show(MODE1);
}
Mode2=ENABLE;
Mode_Show(MODE2) ;
}
fengbi_tongdao();
}
}
void judge_wave()
{
//三个波的识别操作
if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146)
&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111))
{
if(sinewave_flag)
{
sinewave_flag=0;
sinewave_mode=DISABLE;
wave_show(sinewave);
}
else
{
sinewave_flag=1;
if(sawtooth_flag)
{
sawtooth_flag=0;
sawtooth_mode=0;
wave_show(sawtooth) ;
}
else if(triangle_flag)
{
triangle_flag=0;
triangle_mode=0;
wave_show(triangle) ;
}
sinewave_mode=ENABLE;
wave_show(sinewave);
}
}
///////////////
else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146)
&&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181))
{
if(sawtooth_flag)
{
sawtooth_flag=0;
sawtooth_mode=DISABLE;
wave_show(sawtooth);
}
else
{
sawtooth_flag=1;
if(sinewave_flag)
{
sinewave_flag=0;
sinewave_mode=0;
wave_show(sinewave) ;
}
else if(triangle_flag)
{
triangle_flag=0;
triangle_mode=0;
wave_show(triangle) ;
}
sinewave_mode=ENABLE;
wave_show(sawtooth);
}
}
///////////////////////////////////
else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146)
&&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251))
{
if(triangle_flag)
{
triangle_flag=0;
triangle_mode=DISABLE;
wave_show(triangle);
}
else
{
triangle_flag=1;
if(sinewave_flag)
{
sinewave_flag=0;
sinewave_mode=0;
wave_show(sinewave) ;
}
if(sawtooth_flag)
{
sawtooth_flag=0;
sawtooth_mode=0;
wave_show(sawtooth) ;
}
triangle_mode=ENABLE;
wave_show(triangle);
}
}
}
void judge_en()
{
//三种波的使能显示
if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201)
&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111))
{
if(sinewave_flag&&(Mode1||Mode2))
{
if(sinewave_en)
{
sinewave_en=0;
en_show(sinewave);
}
else
{
sinewave_en=1;
if(sawtooth_en)
{
sawtooth_en=0;
en_show(sawtooth) ;
}
else if(triangle_en)
{
triangle_en=0;
wave_show(triangle) ;
}
en_show(sinewave);
}
}
else
{
sinewave_en=0;
en_show(sinewave);
}
}
///////////////
else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201)
&&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181))
{
if(sawtooth_flag&&(Mode1||Mode2))
{
if(sawtooth_en)
{
sawtooth_en=0;
en_show(sawtooth);
}
else
{
sawtooth_en=1;
if(sinewave_en)
{
sinewave_en=0;
en_show(sinewave) ;
}
else if(triangle_en)
{
triangle_en=0;
en_show(triangle) ;
}
en_show(sawtooth);
}
}
else
{
sawtooth_en=0;
en_show(sawtooth);
}
}
///////////////////////////////////
else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201)
&&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251))
{
if(triangle_flag&&(Mode1||Mode2))
{
if(triangle_en)
{
triangle_en=0;
en_show(triangle);
}
else
{
triangle_en=1;
if(sinewave_en)
{
sinewave_en=0;
en_show(sinewave) ;
}
if(sawtooth_en)
{
sawtooth_en=0;
en_show(sawtooth) ;
}
en_show(triangle);
}
}
else
{
triangle_en=0;
en_show(triangle);
}
} //使能判断
if(triangle_en==0||sawtooth_en==0||sinewave_en==0)
{
TIM_Cmd(TIM6, DISABLE);
TIM_Cmd(TIM2, DISABLE);
}
}
void judge_fre()
{
// 频率检测
if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150)
{
if(sinewave_flag)
{
sinewave_fre+=1;
wave_fre(sinewave);
}
}
else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150)
{
if(sinewave_flag)
{
sinewave_fre-=1;
wave_fre(sinewave);
}
}
else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150)
{
if(sawtooth_flag)
{
sawtooth_fre+=1;
wave_fre(sawtooth);
}
}
else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150)
{
if(sawtooth_flag)
{
sawtooth_fre-=1;
wave_fre(sawtooth);
}
}
else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150)
{
if(triangle_flag)
{
triangle_fre+=1;
wave_fre(triangle);
}
}
else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150)
{
if(triangle_flag)
{
triangle_fre-=1;
wave_fre(triangle);
}
} //判断频率
}
void Mode_Show(u8 mode)
{
u16 color;
color = POINT_COLOR;
if(mode==1) //如果是模式1 就对模式1进行操作
{
if(Mode1==1)
{
//横打印
LCD_Fill(20,20,110,25,BLACK);
LCD_Fill(20,60,110,65,BLACK);
//竖打印
LCD_Fill(105,20,110,65,BLACK);
LCD_Fill(20,20,25,65,BLACK);
}
else
{ //横打印
LCD_Fill(20,20,110,25,MAGENTA);
LCD_Fill(20,60,110,65,MAGENTA);
//竖打印
LCD_Fill(105,20,110,65,MAGENTA);
LCD_Fill(20,20,25,65,MAGENTA);
}
}
else
{
if(Mode2==1)
{
//横打印
LCD_Fill(130,20,220,25,BLACK);
LCD_Fill(130,60,220,65,BLACK);
//竖打印
LCD_Fill(215,20,220,65,BLACK);
LCD_Fill(130,20,135,65,BLACK);
}
else
{ //横打印
LCD_Fill(130,20,220,25,MAGENTA);
LCD_Fill(130,60,220,65,MAGENTA);
//竖打印
LCD_Fill(215,20,220,65,MAGENTA);
LCD_Fill(130,20,135,65,MAGENTA);
}
}
POINT_COLOR=color;
}
void wave_show(u8 wavemode)
{
u16 color;
color = POINT_COLOR;
if(wavemode==1) //如果是sine 就对模式2进行操作
{
if(sinewave_flag==1)
{
//横打印
LCD_Fill(50,80,145,85,BLACK);
LCD_Fill(50,105,145,110,BLACK);
//竖打印
LCD_Fill(50,80,55,110,BLACK);
LCD_Fill(140,80,145,110,BLACK);
}
else
{
//横打印
LCD_Fill(50,80,145,85,LIGHTGREEN);
LCD_Fill(50,105,145,110,LIGHTGREEN);
//竖打印
LCD_Fill(50,80,55,110,LIGHTGREEN);
LCD_Fill(140,80,145,110,LIGHTGREEN);
}
}
else if(wavemode==2) //如果是saw 就对模式2进行操作
{
if(sawtooth_flag==1)
{
//横打印
LCD_Fill(50,150,145,155,BLACK);
LCD_Fill(50,175,145,180,BLACK);
//竖打印
LCD_Fill(50,150,55,180,BLACK);
LCD_Fill(140,150,145,180,BLACK);
}
else
{
LCD_Fill(50,150,145,155,DARKBLUE);
LCD_Fill(50,175,145,180,DARKBLUE);
//竖打印
LCD_Fill(50,150,55,180,DARKBLUE);
LCD_Fill(140,150,145,180,DARKBLUE);
}
}
else if(wavemode==3) //如果是tri 就对模式3进行操作
{
if(triangle_flag==1)
{
//横打印
LCD_Fill(50,220,145,225,BLACK);
LCD_Fill(50,245,145,250,BLACK);
//竖打印
LCD_Fill(50,220,55,250,BLACK);
LCD_Fill(140,220,145,250,BLACK);
}
else
{
//横打印
LCD_Fill(50,220,145,225,YELLOW);
LCD_Fill(50,245,145,250,YELLOW);
//竖打印
LCD_Fill(50,220,55,250,YELLOW);
LCD_Fill(140,220,145,250,YELLOW);
}
}
POINT_COLOR=color;
}
void en_show(u8 wavemode)
{
u16 color;
color = POINT_COLOR;
if(wavemode==1) //如果是sine 就对模式2进行操作
{
if(sinewave_flag==1)
{
if(sinewave_en)
{
LCD_Fill(155,150,200,180,RED);
LCD_Fill(155,220,200,250,RED);//切换波形后 吧其他波形给关了
LCD_Fill(155,80,200,110,GREEN);
}
else
{
LCD_Fill(155,80,200,110,RED);
}
}
}
if(wavemode==2) //如果是saw 就对模式2进行操作
{
if(sawtooth_flag==1)
{
if(sawtooth_en)
{
LCD_Fill(155,80,200,110,RED);
LCD_Fill(155,220,200,250,RED);
LCD_Fill(155,150,200,180,GREEN);
}
else
{
LCD_Fill(155,150,200,180,RED);
}
}
}
if(wavemode==3) //如果是saw 就对模式2进行操作
{
if(triangle_flag==1)
{
if(triangle_en)
{
LCD_Fill(155,150,200,180,RED);
LCD_Fill(155,80,200,110,RED);
LCD_Fill(155,220,200,250,GREEN);
}
else
{
LCD_Fill(155,220,200,250,RED);
}
}
}
POINT_COLOR=color;
}
void wave_fre(u8 wavemode)
{
if(wavemode==1) //如果是sine 就对模式2进行操作
{
if(sinewave_flag==1)
{
LCD_ShowNum(104,120,(sinewave_fre/10),1,16);
LCD_ShowNum(120,120,(sinewave_fre%10),1,16);
}
}
if(wavemode==2) //如果是sine 就对模式2进行操作
{
if(sawtooth_flag==1)
{
LCD_ShowNum(104,190,(sawtooth_fre/10),1,16);
LCD_ShowNum(120,190,(sawtooth_fre%10),1,16);
}
}
if(wavemode==3) //如果是sine 就对模式2进行操作
{
if(triangle_flag==1)
{
LCD_ShowNum(104,260,(triangle_fre/10),1,16)
展开阅读全文