题目6:基于单片机c51程序的低频波形发生器 功能要求: 1、设计任务:设计一个能产生正弦波、方波、三角波、锯齿波、阶梯波的波形 发生器,输出波形频率范围 0~50kHz 2、输出波形的幅度、频率可调 3、按键选择输出波形 4、液晶屏显示当前波形、幅度、频率
时间: 2023-07-10 09:32:01 浏览: 122
好的,这是一个相当复杂的任务,需要很多硬件和软件方面的知识,但我可以为您提供一个简单的基于C51单片机程序的低频波形发生器的实现。
硬件方面,您需要一个C51单片机、一个LCD屏幕、一些按键、一些电阻、电容和晶体振荡器。
软件方面,您需要使用Keil C51编译器和STC-ISP烧录器。
以下是一个基本的程序框架,您可以根据需要进行修改:
```c
#include <reg52.h>
#include <intrins.h>
#include "lcd.h"
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P1^0;
sbit KEY2 = P1^1;
sbit KEY3 = P1^2;
sbit KEY4 = P1^3;
uchar wave_type = 0; // 波形类型,0=正弦,1=方波,2=三角波,3=锯齿波,4=阶梯波
uint freq = 1000; // 波形频率,单位Hz
uint amplitude = 128; // 波形幅度,0-255
void delay(uint ms)
{
uint i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++) {
_nop_();
}
}
}
void init()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3C; // 定时器初值高位
TL0 = 0xB0; // 定时器初值低位
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
IT0 = 1; // INT0中断触发方式为下降沿触发
EX0 = 1; // 打开INT0中断
EA = 1; // 打开总中断
lcd_init();
lcd_show_string(0, 0, "Wave Generator");
lcd_show_string(0, 1, "Freq:");
lcd_show_string(0, 2, "Ampl:");
lcd_show_string(0, 3, "Wave: Sin");
}
void display_freq()
{
uchar buf[16];
sprintf(buf, "%dHz ", freq);
lcd_show_string(5, 1, buf);
}
void display_amplitude()
{
uchar buf[16];
sprintf(buf, "%d ", amplitude);
lcd_show_string(5, 2, buf);
}
void display_wave_type()
{
switch (wave_type) {
case 0:
lcd_show_string(5, 3, "Sin ");
break;
case 1:
lcd_show_string(5, 3, "Squ ");
break;
case 2:
lcd_show_string(5, 3, "Tri ");
break;
case 3:
lcd_show_string(5, 3, "Saw ");
break;
case 4:
lcd_show_string(5, 3, "Step");
break;
default:
break;
}
}
void timer0_isr() interrupt 1
{
static uint phase = 0;
static uint count = 0;
static uchar value = 0;
TH0 = 0x3C;
TL0 = 0xB0;
if (++count >= (50000 / freq)) { // 50000为定时器的时钟频率,freq为波形频率
count = 0;
switch (wave_type) {
case 0: // 正弦波
value = (uchar)(amplitude * sin(2 * 3.1415926 * phase / 256) + 128);
break;
case 1: // 方波
value = (phase < 128) ? 0 : 255;
break;
case 2: // 三角波
value = (uchar)(amplitude * (phase < 128 ? phase : 256 - phase) / 128);
break;
case 3: // 锯齿波
value = (uchar)(amplitude * phase / 256);
break;
case 4: // 阶梯波
value = (uchar)(amplitude * (phase / 32) % 8 * 32);
break;
default:
break;
}
P2 = value;
phase++;
}
}
void int0_isr() interrupt 0
{
delay(10); // 延时去抖
if (KEY1 == 0) {
wave_type = (wave_type + 1) % 5;
switch (wave_type) {
case 0:
lcd_show_string(5, 3, "Sin ");
break;
case 1:
lcd_show_string(5, 3, "Squ ");
break;
case 2:
lcd_show_string(5, 3, "Tri ");
break;
case 3:
lcd_show_string(5, 3, "Saw ");
break;
case 4:
lcd_show_string(5, 3, "Step");
break;
default:
break;
}
}
if (KEY2 == 0) {
freq += 100;
if (freq > 50000) {
freq = 50000;
}
display_freq();
}
if (KEY3 == 0) {
freq -= 100;
if (freq < 1) {
freq = 1;
}
display_freq();
}
if (KEY4 == 0) {
amplitude += 16;
if (amplitude > 255) {
amplitude = 255;
}
display_amplitude();
}
}
void main()
{
init();
while (1) {
display_wave_type();
}
}
```
该程序使用定时器0产生波形,并使用LCD显示当前波形类型、频率和幅度。在按下按键时,可以更改波形类型、频率和幅度。您可以根据需要更改波形类型的实现、按键的连接和LCD的初始化。
希望这可以回答您的问题!
阅读全文