基于51单片机的可调节占空比四种三种波形发生器proteus仿真

news2024/7/6 19:28:31

简介:

  1. 该系统显示器为LCD1602,可实时显示波形的参数情况
  2. 可显示四种波形,分别是正弦波 三角波方波以及锯齿波
  3. 该系统可以通过按键调节波形的占空比
  4. 波形输出通过仿真软件的示波器可以查看得到
  5. 波形发生器的核心芯片是利用DAC0832产生+运放LM324经过放大之后输出
  6. 其中正弦波和方波输出频率范围100-180HZ,三角波范围为180-500HZ,锯齿波范围也是180-500HZ
  7. 在使用的过程中需要注意的是刚切换波形的时候,LCD上的显示频率还不稳定,需要按频率降低按键来操作回到正常值

DAC0832芯片的简要介绍:

DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。图1-1和图1-2分别为DAC0832的引脚图和内部结构图。
其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10-10)V,供电电源为(+5+15)V,逻辑电平输入
与TTL兼容。从图1-1中可见,在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DA
C寄存器,它的锁存信号也称为通道控制信号 /XFER。
图1-1中,当ILE为高电平,片选信号 /CS 和写信号 /WR1为低电平时,输入寄存器控制信号为1,这种情况下,输入寄存器的输出随输入而
变化。此后,当 /WR1由低电平变高时,控制信号成为低电平,此时,数据被锁存到输入寄存器中,这样输入寄存器的输出端不再随外部数
据DB的变化而变化。
对第二级锁存来说,传送控制信号 /XFER 和写信号 /WR2同时为低电平时,二级锁存控制信号为高电平,8位的DAC寄存器的输出随输入而
变化,此后,当 /WR2由低电平变高时,控制信号变为低电平,于是将输入寄存器的信息锁存到DAC寄存器中。
图1-1中其余各引脚的功能定义如下:
(1)、DI7~DI0 :8位的数据输入端,DI7为最高位。
(2)、IOUT1 :模拟电流输出端1,当DAC寄存器中数据全为1时,输出电流最大,当 DAC寄存器中数据全为0时,输出电流为0(3)、IOUT2 :模拟电流输出端2, IOUT2与IOUT1的和为一个常数,即IOUT1+IOUT2=常数。
(4)、RFB :反馈电阻引出端,DAC0832内部已经有反馈电阻,所以 RFB端可以直接接到外部运算放大器的输出端,这样相当于将一个反馈
电阻接在运算放大器的输出端和输入端之间。
(5)、VREF :参考电压输入端,此端可接一个正电压,也可接一个负电压,它决定0255的数字量转化出来的模拟量电压值的幅度,VREF
范围为(+10-10)V。VREF端与D/A内部T形电阻网络相连。
(6)、Vcc :芯片供电电压,范围为(+5~ 15)V。
(7)、AGND :模拟量地,即模拟电路接地端。
(8)、DGND :数字量地。


LM324的简要介绍:

LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图所示。它的内部包含四组形式完全相同的运算放大器,
除电源共用外,四组运放相互独立。 
每一组运算放大器可用图1所示的符号来表示,它有5个引出脚,其中“+”、“-”为两个信号输入端,“
V+”、“V-”为正、负电源端,“Vo”为输出端。两个信号输入端中,Vi--)为反相输入端,表示运放输出端Vo的信号
与该输入端的相位相反;Vi++)为同相输入端,表示运放输出端Vo的信号与该输入端的相位相同。LM324的引脚排列见图2

下面是仿真图:
在这里插入图片描述
仿真图2简介:

本系统采用C51单片机作为系统的MCU,该系统显示器为LCD1602,可实时显示波形的参数情况
可显示三种波形,分别是正弦波 三角波方波,其中三角波频率范围是50-500HZ,方波的频率范围是20-2000HZ,正弦波范围是10-100HZ
该设计不支持调节波形的占空比
波形输出通过仿真软件的示波器可以查看得到
波形发生器的核心芯片是利用DAC0832产生+运放经过放大之后输出
三个功能按键分别是波形选择、频率增加、频率减少
在这里插入图片描述

参考代码如下:

#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 :"};
uchar code tosin[256]=
{0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,
0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,
0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,
0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,
0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,
0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,
0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,
0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,
0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,
0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e ,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; 
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 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);
  }
}
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;
	}
}

资料地址:http://www.jh-tec.cn/archives/8351

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins部署的Windows爬虫机如何配置

文章目录一 安装软件1. Python爬虫必备安装包2. Visual Studio Code3. Git3.1. 备选 - OneDrive4. Java5. 向日葵二 配置Chrome1. 查看Chrome版本2. 下载ChromeDriver3. 解压放入Python的Scripts文件夹有时候, 一台Windows只是用来部署一些任务, 例如爬虫任务. 这个时候需要简单…

【人见人爱报错系列】GIt常见问题解决大全

前言 在使用的github\gitlab各种hub的过程中&#xff0c;会遇到各种各样的小问题&#xff0c;这些会给程序员们带来五光十色的烦恼&#xff0c;本文总结使用git的各种问题并持续更新。 一、Git用户名邮箱设置 使用git过程中&#xff0c;会切换不同项目但是发现提交人都是一样…

M1 芯片 MacBook 结合 MAMP 集成环境配置 PHP 环境变量

MacOS Catalina 版本之后 shell 改为使用 zsh 。 可以使用 echo $SHELL 命令查看。 配置文件分为系统级&#xff08;所有用户生效&#xff09;和用户级&#xff08;当前登录用户生效&#xff09;&#xff0c;可以自行了解&#xff0c;一般不经常切换用户的话&#xff0c;用户…

【Java多数据源实现教程】实现动态数据源、多数据源切换方式

前言 本文为 【Java多数据源实现教程】 相关知识&#xff0c;由于自己最近在做导师的项目的时候需要使用这种技术&#xff0c;于是自学了相关技术原理与实现&#xff0c;并将其整理如下&#xff0c;具体包含&#xff1a;多数据源的典型使用场景&#xff08;包含业务复杂场景、读…

JavaWeb:JavaWeb技术架构演进

Java Web&#xff0c;是用 Java 技术来解决相关web互联网领域的技术栈。web 包括&#xff1a;web 服务端和 web 客户端两部分。Java 在客户端的应用有 Java Applet&#xff0c;不过使用得很少&#xff0c;Java 在服务器端的应用非常的丰富&#xff0c;比如 Servlet&#xff0c;…

【MySQL数据库笔记 - 进阶篇】(四)视图/存储过程/触发器

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;暂定 &#x1f4dd;视频地址&#xff1a;黑马程序员 MySQL数据库入门到精通 &#x1f4e3;专栏定位&#xff1a;这个专栏我将会整理 B 站黑马程序员的 MySQL…

将多张图片制作gif

如何将多张图片制作gif&#xff1f;gif其实也是一种比较常见的图片格式&#xff0c;不过gif和其它图片有很大区别&#xff0c;gif是一种动态图片&#xff0c;相信很多小伙伴都知道。我们每天几乎也会看到或者使用到gif动图&#xff0c;有些gif动图是由几张静态的普通图片合并而…

深入理解java虚拟机-1.自动内存管理

文章目录1、自动内存管理1.1 Java内存区域与内存溢出异常1.1.1 运行时数据区域程序计数器程序计数器为什么是私有的?java虚拟机栈本地方法栈虚拟机栈和本地方法栈为什么是私有的?Java堆创建的对象一定会放在堆中吗&#xff1f;方法区运行时常量池直接内存1.1.2 HotSpot虚拟机…

渗透测试之信息收集

信息收集1.域名信息收集1.1.whois查询1.1.1.whois解释1.1.2.whois收集  1.1.2.1.在线网站查询  1.1.2.2.工具查询1.2.反查1.3.备案信息查询1.3.1.备案信息收集1.4.子域名收集1.4.1.子域名解释1.4.2.子域名收集  1.4.2.1.在线网站收集  1.4.2.2.工具收集  1.4.2.3.Goo…

【教学类-13-03】20221118《数字色块图5*7*8-A4横板-横切》(大班主题《》)

效果展示&#xff08;一张8个图&#xff0c;对半横切&#xff08; 打印效果图、中间剪开成2分&#xff08;白色废纸&#xff09; 背景需求&#xff1a; 前期中3班制作5*7 *9张数字图&#xff0c;幼儿找出数字的人数更多 我还希望在大班进行数字图涂色练习。为了增加难度&#…

Wireshark TS | 访问网页失败

前言 访问网页失败也是日常比较常见的问题之一&#xff0c;导致问题的原因可能有很多种&#xff0c;像是客户端、浏览器、服务器或者网络等等&#xff0c;自然具体问题得具体分析。本篇以一个实际案例来说明下 TCP 连接相关的问题&#xff0c;该数据包仍然来自于 Wireshark sh…

视频m4v怎么转换成mp4?

在平时我们所使用的视频格式中除了常见的mp4&#xff0c;还有几十种不同的格式种类&#xff0c;不同的视频格式适用不同的播放设备&#xff0c;同时在画质&#xff0c;体积&#xff0c;编码&#xff0c;兼容性等方面都各具特色有所区别。其中m4v格式的视频就是适用于苹果系统的…

这波服装设计作品对女性美的诠释,十分到位

女性是温柔的、美丽的&#xff0c;多样的&#xff0c;莱佛士学生Xu Xinyi作品《Femininity&Softness》便是围绕女性展开创作。而Xinyi的作品想要传达的是&#xff1a;女性不应该被物化&#xff0c;她们是美丽且具有多样性的。 莱佛士服装设计专业学生作品在设计中&#xff…

海外直播公会Tik Tok,蓝海项目官方火热招募中

时过境迁&#xff0c;国内营销越来越成熟&#xff0c;国内公会(MCN机构)开始出现严重内卷。2022年国内公会/MCN公司已有40000多家;国内公会发展成熟&#xff0c;头部主播形成市场垄断;主播招墓难;孵化主播成本高。找她&#xff08;HS3873&#xff09;快速拿官方后台 有多少国内…

最短路径条数

在一个m行n列的网格中&#xff0c;每个网格的各边的长度均相等&#xff0c;求由A(x1,y1)点到达B(x2,y2)点的最短路径条数&#xff0c;其中1<m,n<30。输入保证x2>x1,y2>y1 如有下图网格&#xff0c;起点和终点分别是A(1,1),B&#xff08;2&#xff0c;3&#xff09;…

MySQL8.0优化 - 事务的状态

文章目录学习资料事务的状态活动的&#xff08;active&#xff09;部分提交的&#xff08;partially committed&#xff09;失败的&#xff08;failed&#xff09;中止的&#xff08;aborted&#xff09;提交的&#xff08;committed&#xff09;学习资料 【MySQL数据库教程天…

Pandas知识点-读写Excel最全参数总结(收藏)

Pandas知识点-读写Excel最全参数总结&#xff08;收藏&#xff09; pandas文件读写工具汇总 pandas中的文件读写工具由一组read的函数&#xff08;执行Input&#xff09;和一组write的对象方法&#xff08;执行Output&#xff09;组成&#xff0c;具体见下表。 本文总结最常用…

指纹识别系统设计(VC++)

目 录 摘 要 I Abstract II 1绪论 1 1.1选题背景及意义 1 1.2研究现状 2 1.3研究主要内容 2 2技术介绍 3 2.1软件环境 3 2.1.1 C的产生和发展以及特点简介 3 2.1.2 Visual C6.0简介及其优点 5 2.2硬件环境 5 3指纹识别系统需求分析 6 3.1业务需求分析 6 3.2功能需求分析 6 3.3性…

四招教你样式化界面组件KendoReact,让应用程序主题更个性化

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for React能够为客户提供更好的用户体验&#xff0c;并且能够更快地构建更好的应用程序。 开发人员在应用程序主题色的选择…

省重点实验室成果转化:24h在线的专业数字朋友,不用欠人情的网上解答神器~

数据解决大师 一个适合所有人的 数据问题咨询小程序 海量数据如何安全储存&#xff1f; 电脑系统崩溃&#xff0c;关键文档丢失怎么办&#xff1f; 手机被格式化&#xff0c;视频文档等数据如何恢复&#xff1f; 毕业论文遭恶意破坏&#xff0c;如何操作能将损失降至最低&…