写个51单片机的波形发生器:(1)基础功能:采用DAC实现输出至少三种波形(三角波、矩形波、正弦波);(2)按键控制输出波的频率和幅度。代码,用LCD显示屏进行显示波形
时间: 2024-01-19 18:03:17 浏览: 23
好的,以下是一个基于51单片机的波形发生器的代码。这个代码实现了三种基本波形(正弦波、矩形波、三角波),并通过按键来控制波形的频率和幅度,同时还使用了LCD显示屏来显示波形。
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_DB P2
sbit LCD_RS = P3^5;
sbit LCD_RW = P3^6;
sbit LCD_EN = P3^4;
unsigned char code sine_table[] = {128, 147, 166, 185, 203, 220, 236, 250, 253, 255, 253, 250, 236, 220, 203, 185, 166, 147, 128, 109, 90, 71, 53, 36, 20, 6, 3, 1, 3, 6, 20, 36, 53, 71, 90, 109}; // 正弦波表
unsigned char code triangle_table[] = {0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 255, 240, 220, 200, 180, 160, 140, 120, 100, 80, 60, 40, 20};
unsigned char code square_table[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0};
unsigned char wave_type = 0; // 波形类型,默认为正弦波
unsigned char frequency = 10; // 波形频率,默认为10Hz
unsigned char amplitude = 128; // 波形幅度,默认为128
void LCD_Init(); // LCD初始化
void LCD_WriteCmd(unsigned char cmd); // 写入LCD指令
void LCD_WriteData(unsigned char dat); // 写入LCD数据
void LCD_ShowWave(); // 显示波形
void DAC_Output(unsigned char dat); // DAC输出
void main()
{
unsigned char i;
unsigned int j;
LCD_Init(); // LCD初始化
while(1)
{
// 按键扫描
if(P3 != 0xff)
{
_nop_();
if(P3 != 0xff) // 确认按键按下
{
if(P3 == 0xfe) // K1按下,切换波形类型
{
wave_type++;
if(wave_type == 3) wave_type = 0;
LCD_ShowWave();
}
else if(P3 == 0xfd) // K2按下,增加波形频率
{
frequency++;
if(frequency == 100) frequency = 1;
LCD_ShowWave();
}
else if(P3 == 0xfb) // K3按下,增加波形幅度
{
amplitude++;
if(amplitude == 255) amplitude = 0;
LCD_ShowWave();
}
}
while(P3 != 0xff); // 等待按键释放
}
// 根据波形类型输出波形信号
switch(wave_type)
{
case 0: // 正弦波
for(i=0;i<40;i++)
{
for(j=0;j<500/frequency;j++); // 根据频率控制延时
DAC_Output(sine_table[i]*amplitude/255);
}
break;
case 1: // 矩形波
for(i=0;i<40;i++)
{
for(j=0;j<500/frequency;j++); // 根据频率控制延时
DAC_Output(square_table[i]*amplitude/255);
}
break;
case 2: // 三角波
for(i=0;i<40;i++)
{
for(j=0;j<500/frequency;j++); // 根据频率控制延时
DAC_Output(triangle_table[i]*amplitude/255);
}
break;
default:
break;
}
}
}
void LCD_Init()
{
LCD_WriteCmd(0x38); // 8位数据总线,2行显示,5*7点阵
LCD_WriteCmd(0x0c); // 光标不显示,光标不闪烁
LCD_WriteCmd(0x06); // 文字不移动,自动加1
LCD_WriteCmd(0x01); // 清屏
}
void LCD_WriteCmd(unsigned char cmd)
{
LCD_DB = cmd;
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_WriteData(unsigned char dat)
{
LCD_DB = dat;
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void LCD_ShowWave()
{
LCD_WriteCmd(0x80); // 第一行显示波形类型
LCD_WriteData('W');
LCD_WriteData('a');
LCD_WriteData('v');
LCD_WriteData('e');
LCD_WriteData(':');
switch(wave_type)
{
case 0:
LCD_WriteData('S');
LCD_WriteData('i');
LCD_WriteData('n');
break;
case 1:
LCD_WriteData('S');
LCD_WriteData('q');
LCD_WriteData('u');
break;
case 2:
LCD_WriteData('T');
LCD_WriteData('r');
LCD_WriteData('i');
break;
default:
break;
}
LCD_WriteCmd(0x8c); // 第二行显示波形频率和幅度
LCD_WriteData('F');
LCD_WriteData(':');
LCD_WriteData(frequency/10+'0');
LCD_WriteData(frequency%10+'0');
LCD_WriteData('H');
LCD_WriteData('z');
LCD_WriteData(' ');
LCD_WriteData('A');
LCD_WriteData(':');
LCD_WriteData(amplitude/100+'0');
LCD_WriteData(amplitude%100/10+'0');
LCD_WriteData(amplitude%10+'0');
}
void DAC_Output(unsigned char dat)
{
unsigned int i;
P0 = dat; // P0口输出DAC信号
for(i=0;i<10;i++); // 延时控制DAC输出速率
}
```
这段代码使用了一个DAC芯片来输出波形信号,同时使用了LCD显示屏来显示波形类型、频率和幅度。按键K1用于切换波形类型,K2用于增加波形频率,K3用于增加波形幅度。根据波形类型选择对应的波形表,并根据频率和幅度来控制波形的输出。需要注意的是,这段代码中使用的DAC芯片需要外接运放,以便将信号放大到合适的范围。