仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- //文件、端口定义、程序开始
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SQU_K=P1^4; //开关接口定义
- sbit SAW_K=P1^5;
- sbit TRI_K=P1^6;
- sbit SIN_K=P1^7;
- sbit SQU_L=P1^0;
- sbit SAW_L=P1^1;
- sbit TRI_L=P1^2;
- sbit SIN_L=P1^3;
- sbit ST=P3^0; //0808接口定义
- sbit EOC=P3^3;
- sbit OE=P3^4;
- sbit CS=P3^2; //0832接口定义
- sbit W_R=P3^6;
- uchar code sin_tab[]={0,0,0,0,1,1,2,3,4,5,6,8,
- 9,11,13,15,17,19,22,24,
- 27,30,33,36,39,42,46,49,
- 53,56,60,64,68,72,76,80,
- 84,88,92,97,101,105,110,114,
- 119,123,128,132,136,141,145,150,
- 154,158,163,167,171,175,179,183,
- 187,191,195,199,202,206,209,213,
- 216,219,222,225,228,231,233,236,
- 238,240,242,244,246,247,249,250,
- 251,252,253,254,254,255,255,255
- };
- //读ADC0808子程序
- unsigned char adc0808(void)
- {
- uchar dat,i;
- ST=0;
- ST=1;
- ST=0;
- for(i=10;i>0;i--)
- while(!EOC);
- OE=1;
- dat=P2;
- return(dat);
- }
- //方波发生函数
- void square()
- {
- uchar a,b;
- for(a=0;a<127;a++)
- {
- P0=0xff;
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- for(a=0;a<127;a++)
- {
- P0=0;
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- }
- //锯齿波发生函数
- void sawtooth()
- {
- uchar a,b;
- for(a=0;a<255;a++)
- {
- P0=a;
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- }
- //三角波发生函数
- void triang()
- {
- uchar a,b;
- for(a=0;a<254;a=a+2)
- {
- P0=a;
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- for(a;a>1;a=a-2)
- {
- P0=a;
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- }
- //正弦波发生函数
- void sinwave()
- {
- uchar a,b;
- for(a=0;a<92;a++)
- {
- P0=sin_tab[a];
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- for(a=a-1;a>0;a--)
- {
- P0=sin_tab[a];
- P2=0xff;
- b=adc0808();
- b=~b;
- while(b--);
- }
- }
- //主函数
复制代码 全部资料51hei下载地址:
信号发生器.zip
(969.18 KB, 下载次数: 245)
|