1、 STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制 此程序能输出两路通道,三路波形,利用STM32的DAC,TIM,LCD,和DMA控制的发射出正弦波,锯齿波和三角波,每种波形频率可调,独立输出,独立显示频率,使能。最高频率达12.5KHz。三种波形都是有一个简易小UI界面,电阻式触摸屏,能够完全手动控制通道的选择,波形的选择频率的选择以及各种波形的使能。 /********************************************************************************************
2、 使用手册: 0.初学即兴所敲,不喜勿喷。 1.通道1和通道2只能分开输出。 2.只有选中响应的波形选择框,才能设置频率或者使能。 3.使能端只能在通道1或者通道2打开的情况下才能被使按下操作有效。 4.每次使能一个波形,其他波形使能将自动关闭。 5.当通道1和通道2都关闭,使能将自动无效。 6.通道1和通道2切换,必须重新使能。 7.开发平台为STM32战舰版。 USER:Zhang Changhao *********************************************************
3、/ #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
4、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 tri
5、angle 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(
6、); //延时函数初始化 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
7、],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; }
8、 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
9、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=sinew
10、ave; 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;
11、 } 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); } } v
12、oid 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
13、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);
14、 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_COLO
15、R=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_Ci
16、rcle(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,6
17、4,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"); LE
18、D0=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)
19、 { 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); }
20、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_
21、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))
22、 { 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 i
23、f(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))
24、{ 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(tri
25、angle_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
26、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) ;
27、 } 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)&&
28、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) ; }
29、 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_
30、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
31、) ; } 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]
32、>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) { si
33、newave_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==
34、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);
35、 } } 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(saw
36、tooth_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_de
37、v.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; w
38、ave_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_Fi
39、ll(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
40、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); } } POIN
41、T_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(14
42、0,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(saw
43、tooth_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_
44、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(1
45、40,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
46、 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,
47、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(1
48、55,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 { L
49、CD_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(wave
50、mode==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)






