1、可生成常用波形,方波、锯齿波、三角波、阶梯波、正玄波;
2、可通过按键切换不同波形输出;
系统运行后,按下K1键输出方波信号,按下K2键输出锯齿波,按下K3键输出三角波,按下K4键输出阶梯波,按下K5键输出正弦波。可通过示波器测量显示输出波形。
1、51单片机核心模块
2、DAC0832模块
3、按键模块
代码如下:
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define DAC0832 XBYTE[0xfffe]
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit beep=P1^7;
unsigned char mm=0;
unsigned char flag=0;
unsigned char x,y;
uchar code SETTAB[]={ //正弦波数据(正部分)
0x80, 0x83, 0x86, 0x89, 0x8D, 0x90, 0x93, 0x96, //(正上升部分)
0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
0xB1, 0xB4, 0xB7, 0xBA, 0xBC, 0xBF, 0xC2, 0xC5,
0xC7, 0xCA, 0xCC, 0xCF, 0xD1, 0xD4, 0xD6, 0xD8,
0xDA, 0xDD, 0xDF, 0xE1, 0xE3, 0xE5, 0xE7, 0xE9,
0xEA, 0xEC, 0xEE, 0xEF, 0xF1, 0xF2, 0xF4, 0xF5,
0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD,
0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6, //(正下降部分)80
0xF5, 0xF4, 0xF2, 0xF1, 0xEF, 0xEE, 0xEC, 0xEA,
0xE9, 0xE7, 0xE5, 0xE3, 0xE1, 0xDE, 0xDD, 0xDA,
0xD8, 0xD6, 0xD4, 0xD1, 0xCF, 0xCC, 0xCA, 0xC7,
0xC5, 0xC2, 0xBF, 0xBC, 0xBA, 0xB7, 0xB4, 0xB1,
0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99,
0x96, 0x93, 0x90, 0x8D, 0x89, 0x86, 0x83, 0x80,
//正弦波数据(负部分)
0x80, 0x7C, 0x79, 0x78, 0x72, 0x6F, 0x6C, 0x69 , //(负下降部分)128,0x80
0x66, 0x63, 0x60, 0x5D, 0x5A, 0x57, 0x55, 0x51 ,
0x4E, 0x4C, 0x48, 0x45, 0x43, 0x40, 0x3D, 0x3A ,
0x38, 0x35, 0x33, 0x30, 0x2E, 0x2B, 0x29, 0x27 ,
0x25, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16 ,
0x15, 0x13, 0x11, 0x10, 0x0E, 0x0D, 0x0B, 0x0A ,
0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02 ,
0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02 ,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 , //(负上升部分)//80
0x0A, 0x0B, 0x0D, 0x0E, 0x10, 0x11, 0x13, 0x15 ,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x25 ,
0x27, 0x29, 0x2B, 0x2E, 0x30, 0x33, 0x35, 0x38 ,
0x3A, 0x3D, 0x40, 0x43, 0x45, 0x48, 0x4C, 0x4E ,
0x51, 0x55, 0x57, 0x5A, 0x5D, 0x60, 0x63, 0x66 ,
0x69, 0x6C, 0x6F, 0x72, 0x76, 0x79, 0x7C, 0x80
};
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void delay(uint i)
{
while(i--);
}
void sound()
{
uchar i=100;
while(i--)
{
beep=~beep;
delay(100);
}
}
void fangbo()
{
DAC0832=y;
x++;
if(flag==0)
{
y=0xff;
if(x==128)
{
flag=1;
y=0x00;
} //方波+
}
else
{
y=0x00;
if(x==0)
{
flag=0;
y=0xff;
} //方波-
}
}
void juchibo() //锯齿波
{
DAC0832=y;
y+=1;
}
void sanjiaobo() //三角波
{
DAC0832=y;
x++;
if(flag==0)
{
y+=2; //三角波数据(上升部分)
if(x==128)
{
flag=1;
y-=2;
}
}
else
{
y-=2;
if(x==0)
{
flag=0;
y=0;
} //三角波数据(下升部分)
}
}
void jietibo() //阶梯波
{
DAC0832=y;
y+=25;
}
void sin() //正弦波
{
DAC0832=SETTAB[y];
x++;
y++;
}
void read_key()
{
if(k1==0) //方波
{
DelayMS(10);
if(k1==0)
{
mm=1;
while(k1==0);
}
}
else if(k2==0)
{
DelayMS(10);
if(k2==0)
{
mm=2;
while(k2==0);
}
}
else if(k3==0) // 三角波
{
DelayMS(10);
if(k3==0)
{
mm=3;
while(k3==0);
}
}
else if(k4==0)
{
DelayMS(10);
if(k4==0)
{
mm=4;
while(k4==0);
}
}
else if(k5==0) //正弦波
{
DelayMS(10);
if(k5==0)
{
mm=5;
while(k5==0);
}
}
}
void main()
{
TMOD=0x02;
TL0=156;
TH0=156;
TR0=1;
ET0=1;
EA=1;
mm=0;
for(;;)
{
read_key();
}
}
void t_0() interrupt 1 using 2
{
switch(mm)
{
case 1: fangbo();break;
case 2: juchibo();break;
case 3: sanjiaobo();break;
case 4: jietibo();break;
case 5: sin();break;
}
}
B站演示视频:https://space.bilibili.com/444388619
作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。