基于51单片机的波形发生器(5种波形,固定频率)原理图、流程图、物料清单、仿真图、源代码
51单片机
波形发生器
用一个按键切换5种波形,正弦波,方波,三角波,梯形波,锯齿波。
固定频率
#include <reg51.h>
#include <intrins.h>
#include <PCF8591.h>
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar wave=0;//波形指示变量。0正弦波、1方波、2三角波、3梯形波、4锯齿波
uint time=0;//计时变量
uchar tixing=0;//梯形波变量
uchar sanjiao=0;//三角波变量
uchar code sin_data[]={
128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,171,173,175,177,180,182,184,186,188,190,191,
193,195,197,199,201,203,204,206,208,210,211,213,215,216,218,220,221,223,224,226,227,228,230,231,232,234,235,236,237,238,239,
240,242,243,243,244,245,246,247,248,249,249,250,251,251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,254,254,254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,240,238,237,236,235,
234,232,231,230,228,227,226,224,223,221,220,218,217,215,213,212,210,208,206,205,203,201,199,197,195,194,192,190,188,186,184,
182,180,178,176,174,171,169,167,165,163,161,159,156,154,152,150,148,146,143,141,139,137,134,132,130,128,125,123,121,119,117,
114,112,110,108,105,103,101,99,97,95,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,51,49,47,45,44,42,40,39,
37,36,34,33,31,30,28,27,25,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,7,6,5,5,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,9,10,10,11,12,13,14,15,16,18,19,20,21,22,24,25,26,28,29,31,32,34,35,37,38,40,42,43,45,47,48,
50,52,54,56,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,88,90,92,94,96,98,101,103,105,107,109,112,114,116,118,120,123,125};
/**************************************************************************/
void main()//主函数
{
init_1602();
write_string(1,0,"sine wave");
TMOD=0X01; //T0方式1。
TH0=0XFC; //定时1ms
TL0=0X18;
ET0=1; //打开定时器0中断允许
TR0=1;
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1; //打开总中断
while(1)
{
}
}
/**************************************************************************/
void Timer0() interrupt 1//定时器0中断
{
TH0=0XFC; //定时1ms
TL0=0X18;
switch(wave)
{
case 0://正弦波
if(time<360) //360度
time++;
else
time=0;
PCF8591_write(sin_data[time]); //输出DA
break;
case 1://方波
if(time<100)
time++;
else
time=0;
if(time<50)
PCF8591_write(0xfe);
else
PCF8591_write(0);
break;
case 2://三角波
if(sanjiao==0)
{
if(time<255)
time++;
else
sanjiao=1;
}
else
{
if(time>0)
time--;
else
sanjiao=0;
}
PCF8591_write(time);
break;
case 3://梯形波
if(tixing==0)//上升沿
{
PCF8591_write(time);
if(time<255)
time++;
else
{
tixing=1;
time=0;
}
}
if(tixing==1)//中间平坦区间
{
if(time<255)
time++;
else
tixing=2;
}
if(tixing==2)//下降沿
{
if(time>0)
time--;
else
tixing=3;
PCF8591_write(time);
}
if(tixing==3)//中间平坦区间
{
if(time<255)
time++;
else
{
tixing=0;
time=0;
}
}
break;
case 4://锯齿波
if(time<255)
time++;
else
time=0;
PCF8591_write(time);
}
}
/**************************************************************************/
void Int0() interrupt 0 //外部中断0的中断函数
{
if(wave<4)
wave++;//下一个波形
else
wave=0;
switch(wave)
{
case 0:write_string(1,0,"sine wave");break;
case 1:write_string(1,0,"square wave");break;
case 2:write_string(1,0,"triang wave");break;
case 3:write_string(1,0,"trape wave");break;
case 4:write_string(1,0,"zigzag wave");
}
}