用c51写一个信号发生器可以用按键调频调幅和选择输出波形的程序
时间: 2024-05-15 22:14:25 浏览: 188
以下是基于C51的信号发生器程序,可以通过按键控制调频、调幅和选择输出波形。
```c
#include <reg51.h>
#define FREQ_INC 100 // 调频增量
#define AMP_INC 5 // 调幅增量
sbit sine_pin = P1^0; // 正弦波输出引脚
sbit square_pin = P1^1; // 方波输出引脚
sbit triangle_pin = P1^2; // 三角波输出引脚
unsigned int freq = 1000; // 初始频率为1kHz
unsigned char amp = 50; // 初始幅度为50%
unsigned char waveform = 0; // 初始波形为正弦波
void delay_us(unsigned int us)
{
while (us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms)
{
while (ms--)
{
delay_us(1000);
}
}
void set_freq(unsigned int new_freq)
{
freq = new_freq;
}
void set_amp(unsigned char new_amp)
{
amp = new_amp;
}
void set_waveform(unsigned char new_waveform)
{
waveform = new_waveform;
}
void generate_sine_wave(void)
{
unsigned int i;
for (i = 0; i < 360; i++)
{
sine_pin = (unsigned char)(amp * (1 + sin(i * 3.1415926 / 180)));
delay_us(1000000 / (freq * 360));
}
}
void generate_square_wave(void)
{
unsigned int i;
for (i = 0; i < freq / 2; i++)
{
square_pin = 1;
delay_us(1000000 / (freq * 2));
square_pin = 0;
delay_us(1000000 / (freq * 2));
}
}
void generate_triangle_wave(void)
{
unsigned int i;
unsigned char j;
for (i = 0; i < freq; i++)
{
for (j = 0; j < 2; j++)
{
triangle_pin = j * 255;
delay_us(1000000 / (freq * 2));
}
}
}
void main(void)
{
unsigned char key;
while (1)
{
// 获取按键输入
key = P0 & 0x0F;
switch (key)
{
case 0x01: // 按键1,频率加
set_freq(freq + FREQ_INC);
break;
case 0x02: // 按键2,频率减
set_freq(freq - FREQ_INC);
break;
case 0x04: // 按键3,幅度加
set_amp(amp + AMP_INC);
break;
case 0x08: // 按键4,幅度减
set_amp(amp - AMP_INC);
break;
case 0x03: // 按键1和2,选择正弦波
set_waveform(0);
break;
case 0x05: // 按键1和3,选择方波
set_waveform(1);
break;
case 0x09: // 按键1和4,选择三角波
set_waveform(2);
break;
default:
break;
}
// 根据当前波形生成信号
switch (waveform)
{
case 0: // 正弦波
generate_sine_wave();
break;
case 1: // 方波
generate_square_wave();
break;
case 2: // 三角波
generate_triangle_wave();
break;
default:
break;
}
}
}
```
该程序使用了C51单片机,通过按键控制频率、幅度和波形,输出正弦波、方波和三角波。其中,调频和调幅的增量可以通过宏定义进行修改。正弦波的生成使用了sin函数,通过计算每个角度对应的正弦值进行输出;方波和三角波的生成则使用了直接的输出方式,根据频率和周期进行占空比的切换。注意,在生成信号时需要调整延时时间,以保证输出的波形正确。
阅读全文