【51单片机】【protues仿真】 基于51单片机波形发生器系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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);

}

五、实验现象

演示视频:基于51单片机波形发生器仿真https://www.bilibili.com/video/BV1esYyzSE4X/?share_source=copy_web&vd_source=40fca7082622de442c326ebbcf72b8c6

相关推荐
宇木灵19 小时前
C语言基础-十一、递归与分治(完结)
c语言·开发语言·学习·算法
weixin_3954489119 小时前
main.c_0222cursor
c语言·前端·算法
水饺编程20 小时前
第4章,[标签 Win32] :TextOut 测试案例2
c语言·c++·windows·visual studio
国科安芯1 天前
实战验证:ASM1042S2S CANFD收发器的质子单粒子效应试验与在轨性能
网络·人工智能·单片机·嵌入式硬件·物联网·fpga开发
Zevalin爱灰灰1 天前
基于STM32实现OTA&BootLoader 第二章——外设功能开发
stm32·单片机·物联网·嵌入式
2501_918126911 天前
stm32能刷什么程序?
linux·stm32·单片机·嵌入式硬件·学习
国科安芯1 天前
ASP4644S电源芯片引脚功能与参考设计输出电压计算方法
网络·单片机·嵌入式硬件·fpga开发·性能优化
载数而行5201 天前
复杂度问题
c语言·数据结构·c++·算法·排序算法
白太岁1 天前
操作系统开发:(11) RTOS 与 GPOS 的分界线:MMU
c语言·开发语言·汇编·arm开发·系统架构
m0_531237171 天前
C语言-指针进阶
c语言·开发语言