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

合集下载

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

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

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

以下是一个基于单片机波形发生器的频率调节的基本过程:
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的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;。

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

相关文档
最新文档