目录
一、主要功能
1、LCD1602液晶显示波形、频率
2、按键切换波形、频率、占空比
3、正弦波、方波、三角波、锯齿波
二、使用步骤
本项目使用Proteus8仿真以51系列单片机为核心控制器结合数模转换(DAC)电路、运放芯片和按键输入模块和显示单元,在Proteus等仿真环境中实现多种波形的生成与频率、占空比参数调节功能。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、运算放大芯片
4、DAC数模转换芯片
5、LCD1602显示模块
四、软件设计
#include <reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^3;
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit K5=P2^4;
uchar WaveChoice=1;
uchar ys=30;
uchar i,a=0;
uchar sqar_num=128;
uint freq;
uchar code Sin[]={"Sine "};
uchar code Squ[]={"Square "} ;
uchar code Tri[]={"Triangle "};
uchar code Saw[]={"Sawtooth "} ;
uchar code No[]={"No Signal out "};
uchar code Wave[]={"Wave :"};
uchar code Fre[]={"Freq :"};
void DelayMS(uchar ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void Delay1(uint y)
{
uint i;
for(i=y;i>0;i--);
}
uchar Busy_Check()
{
uchar LCD_Status;
RS=0; // 寄存器选择
RW=1; //读状态寄存器
EN=1; // 开始读
DelayMS(1);
LCD_Status=P1;
EN=0;
return LCD_Status;
}
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80); //忙等待
RS=0; //选择命令寄存器
RW=0; //写
EN=0;
P1=cmd;EN=1;DelayMS(1);EN=0;
}
void Write_LCD_Data(uchar dat)
{
while((Busy_Check()&0x80)==0x80); //忙等待
RS=1; RW=0; EN=0; P1=dat;EN=1;DelayMS(1);EN=0;
}
void Init_LCD()
{
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01);
DelayMS(1);
Write_LCD_Command(0x06);
DelayMS(1);
Write_LCD_Command(0x0C);
DelayMS(1);
}
void Write_freq(uint k)
{
uchar qian,bai,shi,ge;
qian=k/1000;
bai=k/100%10;
shi=k/10%10;
ge=k%10;
Write_LCD_Command(0x86+0x40);
Write_LCD_Data(0x30+qian);
Write_LCD_Data(0x30+bai);
Write_LCD_Data(0x30+shi);
Write_LCD_Data(0x30+ge);
Write_LCD_Data(0x48);
Write_LCD_Data(0x5a);
}
void main()
{
Init_LCD();
IE=0X81;
IT0=1;
Write_LCD_Command(0x80);
DelayMS(5);
while (1)
{
keyscanf();
Out_Wave(WaveChoice);
if(!(K1&K2&K3))
Xianshi_f();
}
}
void EX_INT0() interrupt 0
{
WaveChoice++;
if(WaveChoice==5) WaveChoice=1;
Write_wave(WaveChoice);
}

