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

合集下载

单片机波形发生器频率调节

单片机波形发生器频率调节

单片机波形发生器频率调节
单片机波形发生器是一种能够生成各种波形(如方波、三角波、锯齿波、正弦波等)的设备,其频率调节通常通过软件编程实现。

以下是一个基于单片机波形发生器的频率调节的基本过程:
1. 初始化单片机:首先,需要对单片机进行初始化,包括设置时钟、I/O端口、中断等。

2. 编写波形生成程序:根据需要生成的波形类型,编写相应的程序。

例如,生成正弦波需要计算每个采样点的正弦值,生成方波则需要在一个周期内输出高低电平。

3. 频率计算:根据所要生成的波形的频率,计算出每个周期内需要多少个时钟周期,以及每个时钟周期内需要多长时间。

4. 定时器设置:在单片机中设置一个定时器,用于定时产生中断,从而控制波形的输出。

定时器的时钟源可以是系统时钟、外部时钟或者定时器自身产生的时钟。

5. 中断服务程序:当定时器达到预设的计数值时,将产生中断。

在中断服务程序中,根据波形生成程序的指令,改变输出波形的电平状态。

6. 输出波形:通过单片机的I/O端口,输出波形信号。

如果需要,可以通过DAC(数字模拟转换器)将数字信号转换为模拟信号。

7. 频率调节:通过改变定时器的计数值或者波形生成程序的参数,可以实现波频率的调节。

例如,增加计数器的值将降低输出频率,减少计数器的值则提高输出频率。

8. 测试与校准:对生成的波形进行测试,确保其频率和形状符合要求。

如有必要,进行校准。

在实际应用中,可能还需要考虑波形的非线性失真、噪声、电源波动等因素,这些因素都可能影响波形的质量。

因此,频率调节不仅仅是简单的数字操作,还需要结合实际的硬件特性进行细致的调整。

利用单片机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接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。

利用单片机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; //开启总中断与定时器}。

TLC5615信号发生器程序正弦波,锯齿波,方波,三角波

TLC5615信号发生器程序正弦波,锯齿波,方波,三角波
uint k1=0,k2=0,k3=0,k4=0,i=0,j=0,x=0,z,p; while(1) { /* w2=0; delay(500);
w2=1; delay(500); */ if(key1==0)//按键 1 检测 { k1=1; k2=0,k3=0,k4=0; while(!key1); } if(key2==0) //按键 2 检测 { k2=1; k3=0,k1=0,k4=0; while(!key2); } if(key3==0)//按键 3 检测 { k3=1; k1=0,k2=0,k4=0; while(!key1); } if(key4==0)//按键 4 检测 {
scl=0; scl=1; din=date1; scl=0; scl=1; din=date0; scl=0; scl=1; } void write_5615(uint k) {
k>8);//送高八位 write_sip5615(k);//送低八位 cs1=1; } void main() {
TLC5615 信号发生器程序-正弦波,锯齿波, 方波,三角波
/****************简易信号发生器 ****************************
程序功能:输出正弦波、锯齿波、方波、三角波 涉及芯片:TLC5615 ************************************************* *********/ #include #define uint unsigned int #define uchar unsigned char sbit din=P3^0; sbit scl=P3^1; sbit cs1=P3^2; sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; //sbit w2= P1^0; uchar code sine_tab[256]={ //输出电压从 0 到最大值(正弦波 1/4 部分)

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

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

,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;

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);}}。

方波,三角波锯齿波产生程序

方波,三角波锯齿波产生程序

ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fangbo isport(clk,reset:in std_logic;q:out std_logic_vector(7 downto 0)); end;architecture behave of fangbo issignal a:std_logic;beginprocess(clk,reset)variable tmp:std_logic_vector(7 downto 0); begin if reset='0' then a<='0';elsif clk'event and clk='1' thenif tmp="11111111" thentmp:="00000000";elsetmp:=tmp+1;end if;if tmp<="10000000" thena<='1';else a<='0';end if;end if;end process;process(clk,a)beginif clk'event and clk='1' thenif a='1' thenq<="11111111";else q<="00000000";end if;end if;end process;end;三脚脖library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sanjiaobo isport(reset:in std_logic;clk:in std_logic;q:out std_logic_vector(7 downto 0));architecture behave of sanjiaobo isbeginprocess(clk,reset)variable tmp:std_logic_vector(7 downto 0);variable a:std_logic;beginif reset='0' then q<="00000000";elsif clk'event and clk='1' thenif a='0' thenif tmp="11111110" thentmp:="11111111";a:='1';else tmp:=tmp+1;end if;elseif tmp="00000001" then tmp:="00000000";a:='0';else tmp:=tmp-1;end if;end if;end if;q<=tmp;end process;end;正选library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Zhengxuanbo isport(clk,reset:in std_logic;d:out integer range 0 to 255);end;architecture behave of Zhengxuanbo isbeginprocess(clk,reset)variable tmp:integer range 0 to 63;beginif reset='0' thend<=0;elsif clk'event and clk='1' thenif tmp=63 thentmp:=0;elsetmp:=tmp+1;end if;case tmp iswhen 00=>d<=255; when 01=>d<=254; when02=>d<=252;when 03=>d<=249; when 04=>d<=245; when05=>d<=239;when 06=>d<=233; when 07=>d<=225; when08=>d<=217;when 09=>d<=207; when 10=>d<=197; when 11=>d<=186;when 12=>d<=174; when 13=>d<=162; when14=>d<=150;when 15=>d<=137; when 16=>d<=124; when17=>d<=112;when 18=>d<=99; when 19=>d<=87; when20=>d<=75;when 21=>d<=64; when 22=>d<=53; when23=>d<=43;when 24=>d<=34; when 25=>d<=26; when26=>d<=19;when 27=>d<=13; when 28=>d<=8; when29=>d<=4;when 30=>d<=1; when 31=>d<=0; when32=>d<=0;when 33=>d<=1; when 34=>d<=4; when35=>d<=8;when 36=>d<=13; when 37=>d<=19; when38=>d<=26;when 39=>d<=34; when 40=>d<=43; when41=>d<=53;when 42=>d<=64; when 43=>d<=75; when 44=>d<=87;when 45=>d<=99; when 46=>d<=112; when47=>d<=124;when 48=>d<=137; when 49=>d<=150; when50=>d<=162;when 51=>d<=174; when 52=>d<=186; when53=>d<=197;when 54=>d<=207; when 55=>d<=217; when56=>d<=225;when 57=>d<=233; when 58=>d<=239; when59=>d<=245;when 60=>d<=249; when 61=>d<=252; when62=>d<=254;when 63=>d<=255; when others=>null;end case;end if;end process;end;选择其LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Xuanzeqi ISPORT ( sel: in std_logic_vector(1 downto 0); d1,d2,d3,d4:in std_logic_vector(7 downto 0); q:out std_logic_vector(7 downto 0)); END;ARCHITECTURE behave OF Xuanzeqi is BEGINPROCESS(sel)BEGINCASE sel ISWHEN "00"=>q<=d1; --三角波WHEN "01"=>q<=d2; --方波WHEN "10"=>q<=d3; --正弦波WHEN "11"=>q<=d4;WHEN OTHERS=>null;END CASE;END PROCESS;END;分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport(clk:in std_logic;d:in std_logic_vector(7 downto 0);fout:out std_logic);end;architecture one of fenpin issignal full:std_logic;beginp_reg:process(clk)variable cnt8:std_logic_vector(7 downto 0); beginif clk'event and clk='1' thenif cnt8="11111111" thencnt8:=d; full<='1';else cnt8:=cnt8+1; full<='0';end if;end if;end process p_reg;p_div:process(full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;if cnt2='1' then fout<='1';else fout<='0';end if;end if;end process p_div;end;00000library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sintra isport(clk,reset:in std_logic;k:in integer range 15 downto 0;d:out integer range 255 downto 0);end sintra;architecture dacc of sintra issignal q: integer range 63 downto 0;beginprocess(clk)beginif (clk'event and clk='1') thenq<=q+k;end if;end process;process(q)begincase q iswhen 00=>d<=255;when 01=>d<=247;when 02=>d<=239;when 03=>d<=231;when 04=>d<=223;when 05=>d<=215;when 06=>d<=207;when 08=>d<=191; when 09=>d<=183; when 10=>d<=175; when 11=>d<=167; when 12=>d<=159; when 13=>d<=151; when 14=>d<=143; when 15=>d<=135; when 16=>d<=128; when 17=>d<=115; when 18=>d<=103; when 19=>d<=90; when 20=>d<=79; when 21=>d<=67; when 22=>d<=57; when 23=>d<=47; when 24=>d<=37; when 25=>d<=29; when 26=>d<=21; when 27=>d<=15; when 28=>d<=10; when 29=>d<=5; when 30=>d<=2; when 31=>d<=1; when 32=>d<=0; when 33=>d<=1; when 34=>d<=2; when 35=>d<=5; when 36=>d<=10; when 37=>d<=15; when 38=>d<=21; when 39=>d<=29; when 40=>d<=37; when 41=>d<=47; when 42=>d<=57; when 43=>d<=67; when 44=>d<=79; when 45=>d<=90; when 46=>d<=103; when 47=>d<=115; when 48=>d<=127; when 49=>d<=135; when 50=>d<=143;when 52=>d<=159;when 53=>d<=167;when 54=>d<=175;when 55=>d<=183;when 56=>d<=191;when 57=>d<=199;when 58=>d<=207;when 59=>d<=215;when 60=>d<=223;when 61=>d<=231;when 62=>d<=239;when 63=>d<=247;when others=>null;end case;end process;end dacc;。

单片机课程设计产生三角波、正弦波、方波

单片机课程设计产生三角波、正弦波、方波

STC89C51单片机产生正弦波、方波、三角波LED显示频率源程序#include <stdio.h>#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit LATCH1=P2^6;//定义锁存使能端口段锁存sbit LATCH2=P2^7;// 位锁存unsigned char TempData[8]; //存储显示值的全局变量unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code DuanMa2[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 显示段码值0~9unsigned char code DuanMa1[3]={0x77,0x7c,0x39};unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码#define DataPort P0sbit keyA=P3^3;sbit keyB=P3^4;sbit keyC=P3^5;sbit wc=P1^0;sbit scl=P1^1;sbit sda=P1^2;sbit scl1=P1^3;sbit sda1=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;uint sign,ad;uchar temp[10], temp1[3];//定义显示区域临时存储数组uchar voltage; //定义浮点变量uchar l=0,m=100,n=0;uchar code sin[200] = {52,53,55,56,58,59,61,62,64,65,67,68,70,71,73,74,75,77,78,79,81,82,83,84,85,86,88,89,90,90,91,92,93,94,95,95,96,96,97,97,98,98,98,99,99,99,99,100,100,100,100,100,9 9,99,99,99,98,98,98,97,97,96,96,95,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,79,7 8,77,75,74,73,71,70,68,67,65,64,62,61,59,58,56,55,53,52,50,48,47,45,44,42,41,39,38,3 6,34,33,32,30,29,27,26,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,5,4,4,3,2,2,2,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,2,2,2,3,4,4,5,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,26,27,29,30,32,33,35,36,38,39,41,42,44,45,47,48,50};void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}void delay(){ ;; }void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}void Delay2(unsigned int t){while(--t);}void Display(){uchar i;for(i=0;i<4;i++){DataPort=WeiMa[i]; //取位码LATCH2=1; //位锁存LATCH2=0;if(i==0) DataPort=DuanMa1[sign-1];else if(i==1) DataPort=DuanMa2[temp1[i]];else DataPort=DuanMa[temp1[i]]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay2(500); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}}//pcf8591void init1(){sda1=1;delay();scl1=1;delay();}void start1() //开始信号{sda1=1;delay();scl1=1;delay();sda1=0;delay();}void stop1() //停止{sda1=0;delay();scl1=1;delay();sda1=1;delay();}void respons1() //应答{uchar i;scl1=1;delay();while((sda1==1)&&(i<250))i++;scl1=0;delay();}void write_byte1(uchar date) {uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl1=0;delay();sda1=CY;delay();scl1=1;delay();}scl1=0;delay();sda1=1;delay();}uchar read_byte1(){uchar i,k;scl1=0;delay();sda1=1;delay();for(i=0;i<8;i++){scl1=1;delay();k=(k<<1)|sda1;scl1=0;delay();}return k;}void write_add1(uchar date) //写入DA{start1();write_byte1(0x90);respons1();write_byte1(0x40);respons1();write_byte1(date);respons1();// delay1(100);stop1();}uchar read_add1( uchar address ) //读AD值{uchar date;start1();write_byte1(0x90);respons1();write_byte1(0x40|address);respons1();start1();write_byte1(0x91);respons1();date=read_byte1();stop1();return date;}//键盘void keyscan(){if(keyA==0){delay1(10);if(keyA==0)sign=1;while(!keyA);}if(keyB==0){delay1(10);if(keyB==0)sign=2;while(!keyB);}if(keyC==0){delay1(10);if(keyC==0)sign=3;while(!keyC);}}//eepromvoid start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date){uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}void write_add(uchar date[],uchar address ) {uchar i,*pdate;pdate=date;for(i=0;i<2;i++){write_byte(0xae);respons();write_byte(address+i);respons();write_byte(*(pdate+i));respons();stop();}}void read_add(uchar date[] ,uchar address ) {uchar i,*pdate;pdate=date;for(i=0;i<2;i++){start();write_byte(0xae);respons();write_byte(address+i);respons();start();write_byte(0xaf);respons();*(pdate+i)=read_byte();stop();}}void sj(){if(l<100){write_add1(l);l++;}if(l>=100&m>0){write_add1(m);m--;}if(l>=100&m<=0){l=0;m=100;}p5=0;p6=1;p7=1;}void zx(){if(l<200){write_add1(sin[l]);l++;}if(l>=200)l=0;p6=0;p7=1;p5=1;}void fb(){if(l<100){write_add1(255);l++;}if(l>=100&n<100){write_add1(0);n++;}if(l>=100&n>=100){l=0;n=0;}p7=0;p5=1;p6=1;}void main(){uchar i,num,tab[2];//定义显示区域临时存储数组wc=0;num=0;tab[0]=0;tab[1]=0;TMOD=0x21;//设置定时器1为工作方式2定时器0为工作方式1 TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;init();init1();for(i=0;i<5;i++)num=read_add1(0);read_add(tab,1);sign=tab[0];ad=(uint)num*100;TH0=(65536-ad)/256;TL0=(65536-ad)%256;ET0=1; //定时器中断打开TR0=1;while(1){keyscan();for(i=0;i<5;i++)num=read_add1(0);voltage=500/num;ad=(uint)num*100;tab[0]=sign;tab[1]=ad;write_add(tab,1);num=read_add1(0);voltage=500/num;temp1[0]=voltage/100;temp1[1]=(voltage%100)/10;temp1[2]=voltage%1000;Display();}}void ser() interrupt 4{RI=0;sign=SBUF;}void T0_time() interrupt 1{ad=(uint)read_add1(0)*100;TH0=(65536-ad)/256;TL0=(65536-ad)%256;if(sign==1) sj(); if(sign==2) zx(); if(sign==3) fb(); }。

AD9833程序,信号发生器,正弦波,方波,三角波输出程序

AD9833程序,信号发生器,正弦波,方波,三角波输出程序
write_ad9833_d16(frequence_MSB); //H14 频率寄存器1为
write_ad9d9833_d16(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
write_ad9833_d16(0x93E3); //L14选择频率寄存器1的低14位输入
write_ad9833_d16(0x8001); //H14 频率寄存器1为2KHz
write_ad9833_d16(0x2000); //设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出1KHz正弦波形
Phs_data=Phase|0xC000;
/*****************************************************************************/
if(frequence_SFR==0) //把数据设置到设置频率寄存器0
write_ad9833_d16(0x0100); //复位AD9833,即RESET位为1
write_ad9833_d16(0x2100); //选择数据一次写入,B28位和RESET位为1
write_ad9833_d16(frequence_LSB); //L14,选择频率寄存器1的低14位输入
frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

单片机按键波形转换

单片机按键波形转换
VREF:基准电压输入线,范围为(-10~+10)V;
AGND:模拟信号地;
DGND:数字信号地。
4.3
系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程。通过编程可得到各种波形。频率的改变可采用插入延时子程序的方法来实现。
实验流程图:
4-2实验流程图
本电路仿真图如下:
我们这个课设选择双缓冲方式,来达到课设目的。
附件(源程序)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P1
#define DATA P0
sbit cs=P3^1;
sbit wr=P3^4;
我们小组利用端口按键判断技术(按键显示数字)中的按键设计。端口按键判断部份由8个轻触按键组成,一端接地,一端由JP48引出,当按下按键时,相应端口为低电平。我们需要这个键盘去对应相应的波形,通过按键盘上的K01,,K02,K03三个按键,实现相应的波形输出。
然后我们应用实验12:DA转换DAC0832的原理与应用来实现波形的变换。锯齿波我们在实验课上就已经实现了,而三角波我们在考试的时候也实现了,剩下的矩形波比较简单,根据书本上的程序就可以得出相应的结果。
接线方法:
1用一个1PIN数据线一端插入CPU部份JP53(P3口)的P3.4,另外一端插入DAC0832部份的输入端JP24的
WR端。
2用一个1PIN数据线一端插入CPU部份JP53(P3口)的P3.1,另外一端插入DAC0832部份的输入端JP24的
CS端。
3用一根8PIN的数据排线,一端插入DAC0832部份的数据输入端JP27,另一端插入CPU部份JP51(P0口)

单片机简易波形

单片机简易波形

目录第一章前言 (5)1.1课程设计内容与要求 (5)1.2单片机的发展前景 (5)第二章总体设计方案 (7)2.1设计总体思路 (7)2.2工作原理 (8)第三章系统硬件设计及说明 (9)3.1 DAC0832简介 (9)3.2 DAC0832引脚图 (10)3.3 DAC0832各引脚功能 (10)3.4 DAC0832三种数据输入方式 (11)第四章系统软件设计 (13)4.1流程总图及各波形流程图 (13)4.2子程序及其说明 (15)第五章总结体会 (18)附录 (19)附录A 系统原理图 (19)附录B 程序清单 (20)第一章前言1.1课程设计内容与要求用单片机与DAC0832 构成的波形发生器,可产生方波、三角波、锯齿波、正弦波等多种波形,波形的周期可用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑、性能优越等特点。

1.2单片机的发展前景当今世界在以电子信息技术为前提下推动了社会跨跃式的进步,科学技术的飞速发展日新月异带动了各国生产力的大规模提高。

由此可见科技已成为各国竞争的核心,尤其是电子信息技术更显得尤为重要,在国民生产各部门电子信息技术得到了广泛的应用。

漫步在繁华的现代化的大都市的大街上,随时都可以看到街上有很多可以用卡取钱的机器(ATM自动柜机),十字路口的交通灯。

我们家里数码电视机、数码音响、遥控器、空调、智能玩具..... 这些“高科技”看上去是如此的神秘,它到底是怎样构成的,它是通过什么样的程序和什么样的方式来完成这一系列指令的呢?让我们取钱更方便、避免城市的交通混乱和交通阻塞……给我们生活带来了处处方便。

其实这也是用单片机来控制的,单片机在我们生活中触手可及,它是如此地贴近我们的生活,单片机给我们的生活带来的有如此多的便利。

目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

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接口电路和显示驱动电路。

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

单片机产生方波、锯齿波、三角波程序
#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与单片机的接口
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
,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xe c,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,0x ff,0xff,0xff,0xfe,0xfd
,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0x e5,0xe3,0xe1,0xde,0xdd,0xda
,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0x ab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99
,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x 63,0x60,0x5d,0x5a,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,0x03,0x02,0x02,0x 01,0x00,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0 x0b,0x0d,0x0e,0x10,0x11,0x13,0x15
,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x 3d,0x40,0x43,0x45,0x48,0x4c,0x4e
,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };
void delayms(uint t)
{
uint i;
while(t--)
{
for (i=0;i<125;i++);//对于11.0592M时钟,约延时1ms
}
}
void delay(uint t)
{
uint i;
for (i=t;i>0;i--);
}
void time0_init()
{
TMOD|=0x01; //定时器设置16位
TH0=-50000/256;
TL0=-50000%256;//初始化值
ET0=1;
TR0=1;
EA=1;
}
void time0_int(void) interrupt 1
{
TR0=0;//关闭定时器
TH0=-50000/256;
TL0=-50000%256;//重装初值
if(S0==0)
{
delayms(10);//按键消抖
if(S0==0) m++;
while(!S0);//松手检测
}
if(S1==0)
{
delayms(10);
if(S1==0) x=x+1;
while(!S1);//松手检测}
if(S2==0)
{
delayms(10);
if(S2==0) x=x-1;
while(!S2);//松手检测}
if(S3==0)
{
delayms(10);
if(S3==0) y=y+5;
while(!S3);//松手检测}
if(y>254) y=0;
if(m>5) m=0;
if(x>50) x=0;
TR0=1;//启动定时器
}
void fangbo() //方波{
uchar i,j;
j=255-y;
CS_DA=0;
WR_DA=0;
for(i=y;i>0;i--)
{
P0=0;
delay(x);
}
while(j--)
{
P0=255;
delay(x);
}
}
void juchi() //锯齿波
{
uchar i;
CS_DA=0;
WR_DA=0;
for(i=255;i>0;i--)
{
P0=i;
delay(x);
}
}
void sanjiao() //三角波{
uchar i;
CS_DA=0;
WR_DA=0;
for(i=0;i<255;i++)
{
P0=i;
delay(x);
}
while(i--)
{
P0=i;
delay(x);
}
}
void tixing() //梯形波{
uchar i=255,j,k;
CS_DA=0;
WR_DA=0;
while(i--)
{
P0=i;
delay(x);
}
for(j=0;j<100;j++)
{
delay(x);
}
for(k=0;k<255;k++)
{
P0=k;
delay(x);
}
}
void sin() //正弦波{
uchar a;
CS_DA=0;
WR_DA=0;
for(a=0;a<255;a++)
{
P0=SinTab[a];
delay(x);
}
}
main()
{
time0_init();
while(1)
{
switch(m)
{
case 0:
fangbo(); //方波
break;
case 1:
juchi(); //锯齿波
break;
case 2:
sanjiao(); //三角波
break;
case 3:
sin(); //正弦波
break;
case 4:
tixing(); //梯形波
default: fangbo();
}
}
}。

相关文档
最新文档