单片机低频信号发生器Proteus仿真程序
2019-12-04 来源:elecfans
1、查阅相关资料,完成原理图设计;
2、编写软件,使该系统能输出方波、三角波、锯齿波和梯形波;波形频率均为1khz,双极性输出。
3、用protel软件完成系统的硬件设计,并通过电器规则检查;
4、仿真实现;
5、画pcb图;
仿真原理图如下
电路原理图如下:
Altium Designer画的原理图和PCB图如下:
单片机代码:
#include unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66}// 0 1 2 3 4 unsigned char time1; //////延时函数参数/////// /////////////////////////////变量说明////////////////////////////////////// unsigned char time2; unsigned char time3; unsigned char count; unsigned char ms; ////////////////////////////////////////函数说明//////////////////////////////// void initial(void); ////初始化函数//// //void initial_time0(void); //////定时器0初始化/////// void anjian(void); ////////////按键函数//// void delay(unsigned char time1,time2,time3); ////延时函数//// void disp(unsigned char count); /////静态显示子函数///// void delay1(char ms); void fangbo(void); //方波函数// void sanjiaobo(void); //三角波函数// void juchibo(void); //锯齿波函数// void tixingbo(void); //正弦波函数// void main (void) { initial(); while(1) { anjian(); } } /************************************************************************* //函数名称:void anjian(void) //函数说明:按键函数 //函数功能: // 注意: *************************************************************************/ void anjian(void) { if(P3_7==0) {delay(1,50,248); if(P3_7==0) {count=1; disp(count); fangbo(); } } while(P3_7==0); count=0; disp(count); anjian(); } /************************************************************************* //函数名称:void fangbo(void) //函数说明:方波函数 //函数功能: // 注意: *************************************************************************/ void fangbo(void) { while(1) { unsigned char fangbo_1; fangbo_1+=8; if(fangbo_1>128&fangbo_1<256) {P0=0x00;} if(fangbo_1<128) {P0=0xff;} if(P3_7==0) {delay(1,50,248); if(P3_7==0) { count=2; disp(count); sanjiaobo(); } } while(P3_7==0); } } /************************************************************************* //函数名称:voidsanjiaobo(void) //函数说明:三角波函数 //函数功能: // 注意: *************************************************************************/ void sanjiaobo(void) { while(1) { unsignedchar sanjiaobo_2; if(sanjiaobo_2<=128) {P0=sanjiaobo_2;} else {P0=255-sanjiaobo_2;} sanjiaobo_2+=5; if(sanjiaobo_2>=255) {sanjiaobo_2=0x00;} if(P3_7==0) { delay(1,50,248); if(P3_7==0) {count=3; disp(count); juchibo(); } } while(P3_7==0); } } /************************************************************************* //函数名称:voidjuchibo(void) //函数说明:锯齿波函数 //函数功能: // 注意: *************************************************************************/ void juchibo(void) { while(1) { unsignedchar juchibo_3; if(juchibo_3<180) {P0=juchibo_3;} juchibo_3+=4; if(juchibo_3>=180) {juchibo_3=0x00;} if(P3_7==0) { delay(1,50,248); if(P3_7==0) {count=4; disp(count); tixingbo(); } } while(P3_7==0); } } /************************************************************************* //函数名称:voidtixingbo(void) //函数说明:梯形波函数 //函数功能: // 注意: *************************************************************************/ void tixingbo(void) { while(1) { unsignedchar tixingbo_4; if(tixingbo_4<120) {P0=tixingbo_4;} elseif(tixingbo_4==120) delay1(1); elseif(tixingbo_4<240) {P0=240-tixingbo_4;} if(tixingbo_4==240) {delay1(1);} if(tixingbo_4>240) { tixingbo_4=0x00; } tixingbo_4+=10; if(P3_7==0) {delay(1,50,248); if(P3_7==0) { count=0; disp(count); anjian(); } } while(P3_7==0); } } /************************************************************************* //函数名称:voidinitial(void) //函数说明:初始化函数 //函数功能: // 注意: *************************************************************************/ void initial(void) { P0=0xff; P1=0xff; P2=0xff; P3=0xff; } /************************************************************************* //函数名称:delay(unsignedchar time1,time2,time3) //函数说明:延时函数 //函数功能: //入口参数:unsigned chartime1,time2,time3 //出口参数: // 注意:延时时间的计算:(time1*time2*time3*8us)us time1,time2,time3可以不进行变量说明 *************************************************************************/ void delay(unsigned char time1,time2,time3) { unsigned char i,j,k; for(i=time1;i>0;i--) { for(j=time2;j>0;j--) { for(k=time3;k>0;k--); } } } /************************************************************************* //函数名称:disp(unsignedchar count) //函数说明:静态显示子函数 //函数功能: //入口参数:unsigned charcount //出口参数: // 注意: *************************************************************************/ void disp(unsigned char count) { P2=table[count]; delay(1,5,248); } void delay1(char ms) { char ti; while(ms--) { for(ti=0;ti<16;ti++){} } }