本波形发生器可以改变频率、幅值。有正弦、三角、方波,均可在一定的范围变幅、变频。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
总体布局
单片机源程序如下:
- #include<reg51.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 带小数点的0-9
- uchar ds[]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};
- uchar code sin_param[64]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};
- uchar code Triangle[64]={0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
- 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0};
- uchar flag=1,time=0,sum=0,timer=0;
- unsigned long frequency=10,volt=50,chuzhi=20000;
- double acc=1;
- uint SH=0xff,SL=0x38,SQH=0xb1,SQL=0xe0;
- sbit key1=P2^0;
- sbit key2=P2^1;
- sbit key3=P2^2; // 三种波按钮
- sbit key4=P2^3; // 频率-
- sbit key5=P2^4; // 频率+
- sbit key6=P2^5; // 幅值+
- sbit key7=P2^6; // 幅值-
- sbit fsw=P3^4;
- sbit fgw=P3^5;
- sbit vgw=P3^6;
- sbit vxw=P3^7;
- void delay()
- {
- uchar i;
- for(i=0;i<125;i++)
- ;
- }
- void init_ST()
- {
- uint schuzhi;
- schuzhi=(15625/frequency);
- SH=(65536-schuzhi)/256;
- SL=(65536-schuzhi)%256;
-
- }
- void init_Sq()
- {
- if(frequency>=8)
- chuzhi=500000/frequency;
- else
- chuzhi=50000/frequency;
- SQH=(65536-chuzhi)/256;
- SQL=(65536-chuzhi)%256;
- }
- void display()
- {
- fsw=0;
- P0=tab1[frequency/10];
- delay();
- P0=0x00;
- fsw=1;
- fgw=0;
- P0=tab1[frequency%10];
- delay();
- P0=0x00;
- fgw=1;
- vgw=0;
- P0=tab2[volt/10];
- delay();
- P0=0x00;
- vgw=1;
- vxw=0;
- P0=tab1[volt%10];
- delay();
- P0=0x00;
- vxw=1;
-
- }
-
- void main()
- {
- TMOD=0X11;
- EA=1;
- IT0=1;
- ET0=1;
- ET1=1;
- EX0=1;
- TH0=0xff;
- TL0=0x38; //200us
- TH1=(65536-20000)/256;
- TL1=(65536-20000)%256;
- TR0=1;
- while(1)
- {
-
- display();
-
- }
- }
- void zhongduan0() interrupt 1
- {
- TH0=SH;
- TL0=SL;
- time++;
- if(time==64)
- time=0;
- if(flag==1)
- {
- sum=ds[time];
- P1=sum;
-
- }
- if(flag==2)
- {
- sum=ds[time];
- P1=sum;
-
- }
-
- if(flag==3)
- {
- TR0=0;
- TR1=1;
- }
-
- }
- void zhongduan1() interrupt 3
- {
-
- TH1=SQH;
- TL1=SQL;
- timer++;
- if(flag==3)
- {
- if(frequency>=8)
- {
- sum=0xff*acc;
- if(timer%2==0)
- P1=0x00;
- else
- P1=sum;
- }
- else
- {
- sum=0xff*acc;
- if((timer/10)%2==0)
- P1=0x00;
- else
- P1=sum;
-
- }
-
- }
- if(flag==1||flag==2)
- {
- TR1=0;
- TR0=1;
- }
- if(timer==100)
- timer=0;
-
-
-
- }
-
-
-
-
- void keyscanFV() interrupt 0
- {
- uchar i;
- EX0=0;
- delay();
- if(key1==0)
- {
- flag=1;
- for(i=0;i<64;i++)
- ds[i]=sin_param[i];
- }
- if(key2==0)
- {
- flag=2;
- for(i=0;i<64;i++)
- ds[i]= Triangle[i];
- }
- if(key3==0)
- flag=3;
-
- if (key4==0)
- {
- if(frequency<99)
- {
- frequency++;
- init_ST();
- init_Sq();
- }
- }
- else if(key5==0)
- {
- if(frequency>0)
- {
- frequency--;
- init_ST();
- init_Sq();
- }
- }
- else if(key6==0)
- {
- if(volt<50)
- {
- volt++;
- acc=(5.1*volt)/255;
- if(flag==1)
- {
- for(i=0;i<64;i++)
- ds[i]=sin_param[i]*acc;
- }
- else if(flag==2)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(仿真程序):
信号发生器.7z
(58.14 KB, 下载次数: 32)
|