当前位置: 首页 > news >正文

基于51单片机的四种波形信号发生器仿真设计(仿真+程序源码+设计说明书+讲解视频)

本设计

基于51单片机信号发生器仿真设计

(仿真+程序源码+设计说明书+讲解视频)

仿真原版本:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0015

这里写目录标题

  • 基于51单片机信号发生器仿真设计
  • 1 设计说明:
  • 2 讲解视频:
  • 3 仿真电路:
    • 程序
      • LCD1602显示
      • 按键扫描
      • 主函数
        • 正弦波发生子程序
        • 矩形波发生子程序
        • 三角波发生子程序
        • 锯齿波发生子程序
  • 设计说明书
  • 资料清单
  • 资料下载链接

1 设计说明:

1、本设计采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和LCD1602液晶显示电路。

2、电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波、锯齿波和三角波四种波形。

3、通过键盘来控制四种波形的类型选择、频率变化,并通过液晶1602显示其各自的波形类型以及频率数值。

本设计硬件电路简单,软件功能完善,控制系统可靠,性价比较高,具有一定的实用价值和参考价值

2 讲解视频:

包含程序讲解和代码讲解

51单片机数字多种波形信号发生器仿真设计(程序+仿真+报告+代码讲解)

3 仿真电路:

imgimgimgimg

程序

image-20220903210034666

程序设计流程图

img

LCD1602显示

//----------------------------
//写LCD命令
//---------------------------------
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;	
}
//------------------------------------
//LCD初始化			   
//-----------------------------------------
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);
}//--向LCD写频率值
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);
}//--LCD上显示不同波形频率void Xianshi_f()		   
{if(WaveChoice==1){freq=(10000000/(50000+2860*ys));Write_freq(freq);}if(WaveChoice==2){freq=(10000000/(50000+2300*ys));Write_freq(freq);}if(WaveChoice==3){freq=(10000000/(14000+2300*ys));Write_freq(freq);}if(WaveChoice==4){freq=(10000000/(15000+2300*ys));Write_freq(freq);}
}
//--LCD上写波形类型
void Write_wave(uchar  t )
{switch(t){case 0://-- 无输出Write_LCD_Command(0x86);DelayMS(5);for (i=0;i<sizeof(No)-1;i++){Write_LCD_Data(No[i]);DelayMS(5);}break;case 1://--正弦波ys=25;Write_LCD_Command(0x86);DelayMS(5);for (i=0;i<sizeof(Sin)-1;i++){Write_LCD_Data(Sin[i]);DelayMS(5);}break;case 2://---矩形波ys=30;Write_LCD_Command(0x86);DelayMS(5);for (i=0;i<sizeof(Squ)-1;i++){Write_LCD_Data(Squ[i]);DelayMS(5);}break;case 3://---三角波ys=30;Write_LCD_Command(0x86);DelayMS(5);for (i=0;i<sizeof(Tri)-1;i++){Write_LCD_Data(Tri[i]);DelayMS(5);}break;case 4://----锯齿波ys=30;Write_LCD_Command(0x86);//液晶显示位置DelayMS(5);for (i=0;i<sizeof(Saw)-1;i++){Write_LCD_Data(Saw[i]);DelayMS(5);}break;}
}

按键扫描

//----按键扫描
void keyscanf()
{	if(K2==0){DelayMS(5);if(K2==0){while(!K2);ys--;if(ys==0)ys=20;}}if(K3==0){DelayMS(5);if(K3==0){while(!K3);ys++;if(ys>22)ys=20;}}if(K4==0){DelayMS(5);if(K4==0){while(!K4);if(WaveChoice==2)sqar_num=sqar_num+2;if(sqar_num==238)sqar_num=128;}}if(K5==0){DelayMS(5);if(K5==0){while(!K5);if(WaveChoice==2)sqar_num=sqar_num-2;if(sqar_num==18)sqar_num=128;			}}
} 

主函数

//----主程序--- 
void main()
{Init_LCD();IE=0X81;IT0=1;Write_LCD_Command(0x80);//--显示wave:DelayMS(5);	 	for (i=0;i<sizeof(Wave)-1;i++){Write_LCD_Data(Wave[i]);DelayMS(5);}Write_LCD_Command(0x80+0X40);//----显示freq:DelayMS(5);for (i=0;i<sizeof(Fre)-1;i++){Write_LCD_Data(Fre[i]);DelayMS(5);}Write_wave(WaveChoice);while (1){keyscanf();Out_Wave(WaveChoice);if(!(K1&K2&K3))Xianshi_f();}	  
}

本系统采用编程的方法,来输出四种不同的波形即正弦波、矩形波、三角波、锯齿波。各种波形的产生方法如下。

正弦波发生子程序

正弦波的产生比较特殊,它不能由单片机直接产生,只能由如图17所示的阶梯波来向正弦波逼近。很显然,在一个周期内阶梯波的阶梯数目越多,单片机输出的波形也就越接近正弦波。

img

图17 正弦波信号的产生

先假定正弦波的振幅是2.56 V,则波谷对应的数字量为最小值00H,波峰对应的数字量为最大值FFH。将正弦波的第一个周期的波形按角度均分为若干等份,并计算出各点对应的电压值,电压值计算方法:Vx=2.5·(1+sinθ),因为00H~FFH对应的数字量为0~255,所以根据算出的电压就可直接写出各点所对应的数字量。单片机将一个周期的数字量存入一定的存储区域中,然后依次循环取出这些数字量,并送D/A电路转换成阶梯波,即近似的正弦波输出。图18为正弦波产生的流程图。

img

图18 正弦波产生的流程图

矩形波发生子程序

如图19所示,矩形波的实现比较简单。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于squa_num,将P0口赋值为0xFF;若i的值大于squa_num,则将P0口赋值为0x00。当i自加到256后又自动变为0,以此循环,即可得到矩形波。当squa_num=128时,此时输出的为方波。调节squa_num的大小,即可实现矩形波占空比的调节;调节延时时间的大小,即可实现矩形波频率的改变。

img

图19 矩形波产生流程图

三角波发生子程序

三角波中的斜线用一个个小台阶来逼近,当台阶间隔很小时,波形基本上近似一直线。首先定义一个无符号字符型变量i=0,使自变量i不断的自动加1,若i的值小于128,将P0口赋值为i;若i的值大于128,则将P0口赋值为256-i。当i自加到256后又自动变为0,以此循环,从而P0口实现了周期性的数字量变换,在经过数模转换后转变成模拟信号,经运算放大电路后就得到了周期性的三角波。三角波产生流程图如图20所示。

img

​ 图20 三角波发生流程图

锯齿波发生子程序

锯齿波的实现过程与三角波类似,也是定义一个变量i=0,并使P0=i,自变量i不断的自动加1,直到加到255,然后i又可以自动归为0,再不断的重复上过程。在此过程中,P0口的值也随着i一样变化,经数模转换DAC0832后,周期性逐一变化的数字量就转换为锯齿波输出了。通过调节P0口每相邻两个值之间的延迟时间,就可以改变锯齿波的频率。图21为锯齿波发生流程图。

img

图21 锯齿波发生流程图

设计说明书

image-20231026123744873

信号发生器是一种常用的信号源,广泛地应用于电子电路、自动控制系统和教学实验等领域。 本设计采用AT89C51单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、运放电路(LM324)、按键和LCD液晶显示电路。电路采用单片机和一片DAC0832数模转换器组成数字式低频信号发生器,可产生正弦波、矩形波、锯齿波和三角波四种波形。系统通过单片机产生数字信号,通过DAC0832转换为模拟信号,再通过放大器LM324就可以得到双极性的各种波形,最终由示波器显示出来。通过键盘来控制四种波形的类型选择、频率变化,并通过液晶1602显示其各自的波形类型以及频率数值。

本设计硬件电路简单,软件功能完善,控制系统可靠,性价比较高,具有一定的实用价值和参考价值。

关键词: AT89C51 单片机; 函数信号发生器;DAC0832;LCD液晶显示

资料清单

0、常见问题 必读!!!!
1、源程序
2、proteus仿真
3、开题报告
4、论文报告
5、讲解视频
Altium Designer 安装破解
filename.bat
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

image-20231026123822944

资料下载链接

相关文章:

基于51单片机的四种波形信号发生器仿真设计(仿真+程序源码+设计说明书+讲解视频)

本设计 基于51单片机信号发生器仿真设计 &#xff08;仿真程序源码设计说明书讲解视频&#xff09; 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0015 这里写目录标题 基于51单片机信号发生…...

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…...

C#序列化与反序列化详解

在我们深入探时C#序列化和反序列化&#xff0c;之前我们先要明白什么是序列化&#xff0c;它又称串行化&#xff0c;是.ET运行时环境用来支持用户定义 类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去&#xff0c;反序列化就是在适当的时候把这个文件再…...

如何在k8s的Java服务镜像(Linux)中设置中文字体

问题描述&#xff1a;服务是基于springboot的Java服务&#xff0c;在项目上是通过Maven的谷歌插件打包&#xff0c;再由k8s部署的。k8s的镜像就是一个Java服务&#xff0c;Java服务用到了中文字体。 解决这个问题首先需要搞定镜像字体的问题。有很多类似的解决方案&#xff0c;…...

CT 扫描的 3D 图像分类-预测肺炎的存在

介绍 此示例将展示构建 3D 卷积神经网络 (CNN) 所需的步骤,以预测计算机断层扫描 (CT) 扫描中是否存在病毒性肺炎。2D CNN 通常用于处理 RGB 图像(3 通道)。3D CNN 就是 3D 的等价物:它以 3D 体积或一系列 2D 帧(例如 CT 扫描中的切片)作为输入,3D CNN 是学习体积数据表…...

整合管理案例题分析

本文摘自江山老师文档 五个过程 制定项目章程 1.没有写项目章程&#xff0c;没有颁布 2.项目经理自己颁布项目章程 3.项目经理修改项目章程 4.项目章程授权不够&#xff0c;项目经理没有权限&#xff0c;下面的人不听话 5.项目章程的内容不完整 制定项目管理计划 1.项目…...

mysql4

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 primary key name VARCHAR(50) 否 否 是 否 否 not null glass VARCHAR(50) 否 否 是 否 否 not nullsch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun …...

Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法&#xff0c;一种是基于tensorflow的keras框架&#xff0c;另一种是继承父类自定义class类&#xff0c;本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…...

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中&#xff0c;PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档&#xff0c;用户可以快速找出文档增加、删除和修改的内容&#xff0c;更好地了解文档的演变过程&#xff0c;轻松地管理…...

压敏电阻有哪些原理?|深圳比创达电子EMC

压敏电阻是一种金属氧化物陶瓷半导体电阻器。它以氧化锌(ZnO)为基料&#xff0c;加入多种(一般5&#xff5e;10种)其它添加剂&#xff0c;经压制成坯体&#xff0c;高温烧结&#xff0c;成为具有晶界特性的多晶半导体陶瓷组件。氧化锌压敏电阻器的微观结构如下图1所示。 氧化锌…...

【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …...

C51--PWN-舵机控制

PWM开发sg90舵机 1、简介 PWM&#xff08;pulse width modulation&#xff09;是脉冲宽度调制缩写。 通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码&#xff0c;通过调节占空比的变化来…...

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…...

【k8s】kubeadm安装k8s集群

一、环境部署 master192.168.88.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.88.30docker、kubeadm、kubelet、kubectl、flannelhub.lp.com192.168.88.40 docker、docker-compose harbor-offli…...

三、虚拟机的迁移和删除

虚拟机的本质就是文件(放在文件夹的)。因此虚拟机的迁移很方便&#xff0c;可以把安装好的虚拟系统这个文件夹整体拷贝或者剪切到另外的位置使用。删除也很简单&#xff0c;使用vmware进行移除&#xff0c;再点菜单->从磁盘删除即可&#xff0c;或者手动删除虚拟系统对应的文…...

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange&#xff08;扇形&#xff09;Direct Exchange&#xff08;直连&#xff09;opic Exchange&#xff08;主题&#xff09;Headers Exchange&#xff08;头部&#xff09; 2.Fanout Exchange 2.1 简介 Fanout 扇形的&#xff0c;散开的&#xff1…...

【C++进阶】pair容器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

Linux--进程等待

1.什么是进程等待 1.通过系统调用wait/waitid,来对子进程进行进行检测和回收的功能。 2.为什么有进程等待 1.对于每个进程来说&#xff0c;如果子进程终止&#xff0c;父进程没有停止&#xff0c;就会形成僵尸进程&#xff0c;导致内存泄露&#xff0c;为了防止僵尸进程的形成…...

VMware CentOS 虚拟机扩容

参考文章&#xff1a; VMware中centos磁盘扩容 - 简书 看这篇文章进行操作&#xff01;扩展根分区报错&#xff0c;xfs_growfs 提示 / is not a mounted XFS filesystem-CSDN博客 [rootnode001 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/…...

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…...

学习笔记-MongoDB(命令增删改查,聚合,权限管理,索引,java使用)

基础概念 1 什么是mogodb&#xff1f; MongoDB 是一个基于分布式文件/文档存储的数据库&#xff0c;由 C 编写&#xff0c;可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库中功…...

第13期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…...

OpenCV学习(一)——图像读取

1. 图像入门 读取图像显示图像写入图像 import cv2# 读取图像 img cv2.imread(lena.jpg) print(img.shape)# 显示图像 cv2.imshow(image, img) cv2.waitKey(0) cv2.destroyAllWindows()# 写入图像 cv2.imwrite(image.jpg, img)1.1 读取图像 读取图像cv.imread(filename, fl…...

并发编程- 线程池ForkJoinPool工作原理分析(实践)

数据结构加油站&#xff1a; Comparison Sorting Visualization 并发设计模式 单线程归并排序 public class MergeSort {private final int[] arrayToSort; //要排序的数组private final int threshold; //拆分的阈值&#xff0c;低于此阈值就不再进行拆分public MergeSort…...

小程序原生开发中的onLoad和onShow

在小程序的原生开发中&#xff0c;onLoad和onShow是两个常用的生命周期函数&#xff0c;用于管理页面的加载和显示。 onLoad&#xff1a;该函数会在页面加载时触发。当页面第一次加载时&#xff0c;它会被调用一次&#xff0c;之后切换到其他页面再返回时不会再触发。可以在on…...

springcloud技术栈以及相关组件

常用中间件 注册中心—nacos分布式服务之间的交互工具—Feign服务安全入口中间件—Gateway各个服务的异步通信组件—rabbitmqRabbitMq分布式场景的应用配置微服务的容器部署–docker分布式检索引擎—elasticSearches在分布式场景的应用分布式事务协调中间间— seata分布式服务…...

An Early Evaluation of GPT-4V(ision)

本文是LLM系列文章&#xff0c;针对《An Early Evaluation of GPT-4V(ision)》的翻译。 GPT-4V的早期评估 摘要1 引言2 视觉理解3 语言理解4 视觉谜题解决5 对其他模态的理解6 结论 摘要 在本文中&#xff0c;我们评估了GPT-4V的不同能力&#xff0c;包括视觉理解、语言理解、…...

Vue在移动端实现图片的手指缩放

使用V-View点击图片进行预览&#xff1a; npm install v-viewer --save 在main.js进行引入 在图片下方会有 轮播箭头下一张上一张等&#xff0c;因此要用配置来关闭。 import Viewer from v-viewer // viewer.js一种图片预览处理工具 import viewerjs/dist/viewer.css …...

Failed to prepare the device for development

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…...