用单片机输出方波三角波及锯齿波

合集下载

89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形

89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形

波形发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。

本次课程设计使用的AT89S51 单片机构成的发生器可产生锯齿波、三角波、正弦波等多种波形,波形的周期可以用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。

在本设计的基础上,加上按钮控制和LED显示器,则可通过按钮设定所需要的波形频率,并在LED上显示频率、幅值电压,波形可用示波器显示。

二、系统设计波形发生器原理方框图如下所示。

波形的产生是通过AT89S51 执行某一波形发生程序,向D/A转换器的输入端按一定的规律发生数据,从而在D/A转换电路的输出端得到相应的电压波形。

在AT89S51的P2口接5个按扭,通过软件编程来选择各种波形、幅值电压和频率,另有3个P2口管脚接TEC6122芯片,以驱动数码管显示电压幅值和频率,每种波形对应一个按钮。

此方案的有点是电路原理比较简单,实现起来比较容易。

缺点是,采样频率由单片机内部产生故使整个系统的频率降低。

1、波形发生器技术指标1)波形:方波、正弦波、锯齿波;2)幅值电压:1V、2V、3V、4V、5V;3)频率:10HZ、20HZ、50HZ、100HZ、200HZ、500HZ、1KHZ;2、操作设计1)上电后,系统初始化,数码显示6个…-‟,等待输入设置命令。

2)按钮分别控制“幅值”、“频率”、“方波”、“正弦波”、“锯齿波”。

3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。

4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环。

三、硬件设计本系统由单片机、显示接口电路,波形转换(D/A)电路和电源等四部分构成。

电路图2附在后1、单片机电路功能:形成扫描码,键值识别、键处理、参数设置;形成显示段码;产生定时中断;形成波形的数字编码,并输出到D/A接口电路和显示驱动电路。

利用单片机AT89C52采用程序设计方法产生锯齿波

利用单片机AT89C52采用程序设计方法产生锯齿波

1 引言本系统利用单片机AT89C52采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,能产生10Hz—10kHz的波形。

通过键盘来控制四种波形的类型选择、拨码开关控制频率的变化,并通过液晶屏1602显示其各自的类型以及数值,系统大致包括信号发生部分、数/模转换部分以及液晶显示部分三部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。

2设计方案2.1系统硬件设计概述经过考虑,我们确定方案如下:利用AT89C52单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。

2.2、设计要求1)、利用单片机采用软件设计方法产生四种波形2)、四种波形可通过键盘选择3)、波形频率可调4)、需显示波形的种类及其频率2.1.2方案设计与论证1.2.1 信号发生电路方案论证方案一:通过单片机控制D/A,输出四种波形。

此方案输出的波形不够稳定,抗干扰能力弱,不易调节。

但此方案电路简单、成本低。

方案二:使用传统的锁相频率合成方法。

通过芯片IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利用过零比较器转换成方波,积分电路转换成三角波。

此方案,电路复杂,干扰因素多,不易实现。

方案三:利用MAX038芯片组成的电路输出波形。

MAX038是精密高频波形产生电路,能够产生准确的锯齿波、三角波、方波和正弦波四种周期性波形。

但此方案成本高,程序复杂度高。

以上三种方案综合考虑,选择方案一。

1.2.2 单片机的选择论证方案一:AT89C52单片机是一种高性能8位单片微型计算机。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd ,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 ,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。

单片机产生各种波形及其程序图

单片机产生各种波形及其程序图

,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe
9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5
,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xfe,0xfd ,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0x e9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb 1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0 x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 ,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0 x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0 x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0 x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0 x80 }; void delayms(uint t) {

用单片机输出方波三角波及锯齿波

用单片机输出方波三角波及锯齿波

实验四实验任务:AT89C51单片机的数字式低频信号发生器。

采用AT89C51 单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键等。

通过按键控制可产生方波、锯齿波、三角波。

原理图:注:1.如上图所示2.此原理图应用Proteus 7 ISIS 7.5 SP3绘制,所选用晶体振荡器频率为12MHz。

其余元件参数见图上标注。

程序内容:#include<absacc.h>#include<reg51.h>#define DA0832 XBYTE[0xfffe] #define uchar unsigned char #define uint unsigned int sbit juchi=P1^0;sbit sanjiao=P1^1;sbit fangbo=P1^2;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void aa(){uchar n;if(juchi==0){while(1){for(n=0;n<=255;n=n++) {DA0832=n;}}}}void bb(){uchar n;if(sanjiao==0){while(1) {for(n=0;n<=256;n=n++){if(n<128)DA0832=n;elseDA0832=256-n;}}}}void cc(){uchar n;if(fangbo==0){while(1){for(n=0;n<=255;n=n++){if(n<128) DA0832=0; else DA0832=255;}}}}void main(){aa();bb();cc();}程序流程图::。

单片机产生方波、锯齿波、三角波程序

单片机产生方波、锯齿波、三角波程序
sbit S0=P3^0; //波形选择,每次按下将产生不同的波形
sbit S1=P3^1; //频率减
sbit S2=P3^2; //频率加
sbit S3=P3^3; //调节方波的占空比
uchar code SinTab[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5
单片机产生方波、锯齿波、三角波程序
单片机产生方波、锯齿波、三角波程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char x=0,m=0,y=128;
sbit WR_DA=P2^1;
sbit CS_DA=P2^0;//DA与单片机的接口
,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e
,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };
if(S0==0) m++;
while(!S0);//松手检测
}
if(S1==0)
{
delayms(10);
if(S1==0) x=x+1;

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

以多种波形发生器为对象,选择单片机、独立按键及D/A转换器,设计相应的电路构成多种波形发生器。

功能要求:1.有4个功能键,分别用来选择输出:三角波、锯齿波、梯形拨、方波。

2.按下某个功能键,进入中断,在中断程序中查询、确定是哪个功能键,并输出对应的波形。

3.显示器2位,显示功能号01、02、03、04,代表输出三角波、锯齿波、梯形拨、方波。

设计任务:1、完成单片机最小系统电路设计。

2、完成按键电路设计。

3、完成D/A转换及接口电路的设计。

4、完成显示电路的设计。

电路图如下:(proteus仿真通过)其一仿真图:源程序如下:ORG 00HSTART:LJMP MAINORG 0003H;外部xxxxLJMP INSER;转到xx服务程序ORG 0030HMAIN:MOV DPTR,#7FFFH;DAC0832地址SETB EX0;允许xxSETB IT0;负边沿触发方式SETB EA;开xxHERE:JB 20H.0,ST;锯齿波处理JB 20H.1,TRI;三角波处理JB 20H.2,SQ;方波处理JB 20H.3,TXB;梯形波处理SJMP HERE;等待xxINSER:JNB P1.0, LL1;中断服务程序,查询按键SJMP L1LL1:MOV 20H,#00HSETB 20H.0;设置锯齿波标志SJMP RTL1:JNBP1.2, LL2SJMP L2LL2:MOV 20H,#00HSETB 20H.1;设三角梯波标志SJMP RTL2:JNB P1.4, LL3SJMP L3LL3:MOV 20H,#00HSETB 20H.2;设置方波标志SJMP RTL3:JNB P1.6, LL4SJMP RTLL4:MOV 20H,#00HSETB 20H.3;设置梯形波标志RT:RETI;xx返回ST:1.1;锯齿波CLR P1.3SETB P1.5CLR P1.7MOVA,#00HLOOPP:MOVX@DPTR,A;启动D/A转换INCAJB20H.0,LOOPP;连续输出波形LJMPHERETRI:CLR P1.1;三角波CLR P1.3CLR P1.51.7MOVA,#00HUP:MOVX@DPTR,A;启动D/A转换INCA;上升沿CJNEA,#0FFH,UPDOWN:MOVX@DPTR,A;启动D/A转换DECA;下降沿CJNEA,#00H,DOWNJB20H.1,UP;连续输出波形LJMPHERESQ:CLR P1.1;方波SETB P1.3CLR P1.5CLR P1.7MOVA,#00HMOVX@DPTR,A;DAC输出低电平ACALLDELAY;xx1MOVA,#0FFHMOVX@DPTR,A;DAC输出高电平ACALLDELAY;xx2JB20H.2, SQ;连续输出波形LJMPHERETXB:CLR P1.1;梯形波CLR P1.3SETB P1.5SETB P1.7MOV A,#00HMOVX @DPTR,AACALL DELAYLOOP:MOVX @DPTR,AINC ACJNE A,#0FFH,LOOP ACALL DELAY MOVX @DPTR,A LOOP1:DEC A MOVX @DPTR,A CJNE A,#00H,LOOP1 MOVX @DPTR,A ACALL DELAYJB 20H.3,LOOP DELAY:MOVR4,#0FHLOOP11:MOVR5,#10H LOOP22: NOPNOPNOPDJNZR5,LOOP22 DJNZR4,LOOP11 RETEND;xx子程序。

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

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

STM32产生频率可调正弦波、锯齿波、三角波 amp;LCD界面控制STM32产生频率可调正弦波、锯齿波、三角波&amp;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 3void 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(); uart_init(9600); LED_Init();LCD_Init(); KEY_Init(); tp_dev.init(); show_init(); while(1){ t=TP_Scan(0); if(t) { t=0; //延时函数初始化 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 //串口初始化为9600 //LED端口初始化// // //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]&gt;19)&amp;&amp;(tp_dev.x[0]&lt;111)&amp;&amp;(tp_dev.y[0]&gt;19)&amp;&amp;(tp_dev.y[0]&lt;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]&gt;129)&amp;&amp;(tp_dev.x[0]&lt;221)&amp;&amp;(tp_dev.y[0]&gt;19)&amp;&amp;(tp_dev.y[0]&lt;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]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;79)&amp;&amp;(tp_dev.y[0]&lt;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); /////////////// elseif((tp_dev.x[0]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;149)&amp;&amp;(tp_dev.y[0]&lt;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); } }/////////////////////////////////// elseif((tp_dev.x[0]&gt;49)&amp;&amp;(tp_dev.x[0]&lt;146)&amp;&amp;(tp_dev.y[0]&gt;219)&amp;&amp;(tp_dev.y[0]&lt;251)) { } }void judge_en() {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); } //三种波的使能显示if((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;79)&amp;&amp;(tp_dev.y[0]&lt;111)){ if(sinewave_flag&amp;&amp;(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); } /////////////// elseif((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;149)&amp;&amp;(tp_dev.y[0]&lt;181)){ if(sawtooth_flag&amp;&amp;(Mode1||Mode2)) { if(sawtooth_en){ sawtooth_en=0; en_show(sawtooth); } else { sawtooth_en=1;if(sinewave_en) { sinewave_en=0; en_show(sinewave) ; } elseif(triangle_en) { triangle_en=0; en_show(triangle) ; }} en_show(sawtooth); } } else { sawtooth_en=0; en_show(sawtooth); } /////////////////////////////////// elseif((tp_dev.x[0]&gt;154)&amp;&amp;(tp_dev.x[0]&lt;201)&amp;&amp;(tp_dev.y[0]&gt;219)&amp;&amp;(tp_dev.y[0]&lt;251)){ if(triangle_flag&amp;&amp;(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])&lt;150) { if(sinewave_flag) { sinewave_fre+=1;wave_fre(sinewave); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(125-tp_dev.y[0])*(125-tp_dev.y[0])&lt;150) { if(sinewave_flag) { sinewave_fre-=1;wave_fre(sinewave); } } elseif((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(195-tp_dev.y[0])*(195-tp_dev.y[0])&lt;150) { if(sawtooth_flag) { sawtooth_fre+=1;wave_fre(sawtooth); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(195-tp_dev.y[0])*(195-tp_dev.y[0])&lt;150) { if(sawtooth_flag)} { } sawtooth_fre-=1; wave_fre(sawtooth); elseif((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(265-tp_dev.y[0])*(265-tp_dev.y[0])&lt;150) { if(triangle_flag) { triangle_fre+=1; wave_fre(triangle); } } elseif((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(265-tp_dev.y[0])*(265-tp_dev.y[0])&lt;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) { if(sawtooth_flag==1) { //如果是saw 就对模式2进行操作 //横打印 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);LCD_ShowNum(120,260,(triangle_fre%10),1,16); } }}void fengbi_tongdao(){sinewave_en=0;sawtooth_en=0;triangle_en=0;LCD_Fill(155,150,200,180,RED); LCD_Fill(155,220,200,250,RED); LCD_Fill(155,80,200,110,RED); if(Mode1==DISABLE){TIM_Cmd(TIM2, DISABLE);}if(Mode2==DISABLE){TIM_Cmd(TIM6, DISABLE);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档