ADC0804信号发生器的仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SQU_K =P3^4;
- sbit SAW_K =P3^5;
- sbit TRI_K =P3^6;
- sbit SIN_K =P3^7;
- sbit SQU_L =P1^0;
- sbit SAW_L =P1^1;
- sbit TRI_L =P1^2;
- sbit SIN_L =P1^3;
- sbit INTad=P3^3;
- sbit CS=P3^0; //使能端
- sbit W_R=P3^2; //写端口
- sbit R_D=P3^1; //读端口
- 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 };
- //*************************************************
- // 读ADC0804子程序
- //*************************************************
- unsigned char adc0804( void )
- { uchar dat,i;
- R_D=1;
- W_R=1;
- INTad=1; //读ADC0804 前准备
- P2=0xff; //P2全部置一准备
- CS=0;
- W_R=0;
- W_R=1; //启动ADC0804开始测电压
- while(INT1==1); //查询等待A/D转换完毕产生的INT信号
- R_D=0; //开始读转换后数据
- i=i; //无意义语句,用于延时等待ADC0804 读数完毕
- dat=P2; //读出的数据赋与addate
- R_D=1;
- CS=1; //读数完毕
- return(dat); //返回最后读出的数据
- }
- //*************************************************
- //方波发生函数
- //*************************************************
- void square()
- {
- uchar a,b;
- for(a=0;a<127;a++)
- {
- P0=0xff;
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--); //调节相位,b的变化越大,相位变化越小
- }
- for(a=0;a<127;a++)
- {
- P0=0;
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- }
- //*************************************************
- //锯齿波发生函数
- //*************************************************
- void sawtooth()
- {
- uchar a,b;
- for(a=0;a<255;a++)
- {
- P0=a;
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- }
- //*************************************************
- // 三角波发生函数
- //*************************************************
- void triang()
- {
- uchar a,b;
- for(a=0;a<254;a=a+2)
- {
- P0=a;
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- for(a;a>1;a=a-2)
- {
- P0=a;
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- }
- //*************************************************
- //正弦波发生函数
- //*************************************************
- void sinwave()
- {
- uchar a,b;
- for(a=0;a<92;a++)
- {
- P0=sin_tab[a];
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- for(a=a-1;a>0;a--)
- {
- P0=sin_tab[a];
- P2=0xff;
- b=adc0804();
- b=~b;
- while(b--);
- }
- }
- //*************************************************
- //主函数
- //*************************************************
- void main()
- {
- P1=0xff;
- P2=0xff;
- P3=0xff;
- while(1)
- {
- P0=0;
- if(SQU_K==0)
- {
- SQU_L=0;
- square();
- }
- SQU_L=1;
- if(SAW_K==0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
6.1.rar
(89.09 KB, 下载次数: 33)
|