收藏 分销(赏)

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制.docx

上传人:xrp****65 文档编号:5964184 上传时间:2024-11-24 格式:DOCX 页数:18 大小:24.21KB 下载积分:10 金币
下载 相关 举报
STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制.docx_第1页
第1页 / 共18页
STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制.docx_第2页
第2页 / 共18页


点击查看更多>>
资源描述
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)
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服