【单片机基础】使用51单片机制作函数信号发生器(DAC0832使用仿真)

文章目录

  • (1)DA转换
  • (2)DAC0832简介
  • (3)电路设计
  • (4)参考例程
  • (5)参考文献

(1)DA转换

单片机作为一个数字电路系统,当需要采集外界模拟量的使用需要进行AD转换,将模拟量转换成数字量,供单片机使用。51单片机需要外部配置一个AD转换芯片来进行模拟量的采集,如我之前写了一篇ADC0832的使用。高级的单片机如STC12和STM32已经集成了AD转换功能,只需简单配置一下,便可以采集到AD转换后的数据。

AD转换(Analog to Digital)是模拟量转换数字量,那么DA转换(Digital to Analog)便是数字量转换成模拟量。
在这里插入图片描述
使用DAC0832进行数字到模拟的转换,再使用定时器控制输出波形的频率便可以制作一个函数信号发生器。

(2)DAC0832简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CS:低电平有效,片选输入线
WR1:低电平大于500ms有效,输入锁存器
WR2:高电平有效,与XFER结合可将输入锁存器的8位数据传输到DAC寄存器中
XFER:低电平有效,数据传输控制输入线
DI0~DI7:8位数据位并行输入,有效时间大于90ns有效
VCC:电源输入5V-15V
VERF:基准电压输入线-10V~10V
RFB:反馈信号输入,可以看成一个反馈监测
IOUT1:电流输出1,其值随着输入线性变化
IOUT2:电流输出2,与OUT1值之和为一个常数

(3)电路设计

单片机最小系统
在这里插入图片描述
波形切换控制
在这里插入图片描述
(这里由于博主时间有限,例程代码的LED显示功能就没有写了)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)参考例程

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int#define DI	P0											//8位数据输入线//sbit sine_wave_LED1					= P1^0;	//正弦波指示灯
//sbit square_wave_LED2 			= P1^1;	//方波指示灯
//sbit triangular_wave_LED3 	= P1^2;	//三角波指示灯
//sbit sawtooth_wave_LED4			= P1^3;	//锯齿波指示灯
sbit change_wave_Key				= P1^4;	//更换波形uint freq = 3906;										//定时数值×16^(-6)×256 = 波形频率 例程使用1KHZ
uint number=1,n=0,THHL,i;//正弦波段码
unsigned code sin[256]={   0x80,0x83,0x85,0x88,0x8A,0x8D,0x8F,0x92,   0x94,0x97,0x99,0x9B,0x9E,0xA0,0xA3,0xA5,   0xA7,0xAA,0xAC,0xAE,0xB1,0xB3,0xB5,0xB7,   0xB9,0xBB,0xBD,0xBF,0xC1,0xC3,0xC5,0xC7,   0xC9,0xCB,0xCC,0xCE,0xD0,0xD1,0xD3,0xD4,   0xD6,0xD7,0xD8,0xDA,0xDB,0xDC,0xDD,0xDE,   0xDF,0xE0,0xE1,0xE2,0xE3,0xE3,0xE4,0xE4,   0xE5,0xE5,0xE6,0xE6,0xE7,0xE7,0xE7,0xE7,   0xE7,0xE7,0xE7,0xE7,0xE6,0xE6,0xE5,0xE5,   0xE4,0xE4,0xE3,0xE3,0xE2,0xE1,0xE0,0xDF,   0xDE,0xDD,0xDC,0xDB,0xDA,0xD8,0xD7,0xD6,   0xD4,0xD3,0xD1,0xD0,0xCE,0xCC,0xCB,0xC9,   0xC7,0xC5,0xC3,0xC1,0xBF,0xBD,0xBB,0xB9,   0xB7,0xB5,0xB3,0xB1,0xAE,0xAC,0xAA,0xA7,   0xA5,0xA3,0xA0,0x9E,0x9B,0x99,0x97,0x94,   0x92,0x8F,0x8D,0x8A,0x88,0x85,0x83,0x80,   0x7D,0x7B,0x78,0x76,0x73,0x71,0x6E,0x6C,   0x69,0x67,0x65,0x62,0x60,0x5D,0x5B,0x59,   0x56,0x54,0x52,0x4F,0x4D,0x4B,0x49,0x47,   0x45,0x43,0x41,0x3F,0x3D,0x3B,0x39,0x37,   0x35,0x34,0x32,0x30,0x2E,0x2D,0x2C,0x2A,   0x29,0x28,0x26,0x25,0x24,0x23,0x22,0x21,   0x20,0x1F,0x1E,0x1D,0x1D,0x1C,0x1C,0x1B,   0x1B,0x1A,0x1A,0x1A,0x19,0x19,0x19,0x19,   0x19,0x19,0x19,0x19,0x1A,0x1A,0x1A,0x1B,   0x1B,0x1C,0x1C,0x1D,0x1D,0x1E,0x1F,0x20,   0x21,0x22,0x23,0x24,0x25,0x26,0x28,0x29,   0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x34,0x35,   0x37,0x39,0x3B,0x3D,0x3F,0x41,0x43,0x45,   0x47,0x49,0x4B,0x4D,0x4F,0x52,0x54,0x56,   0x59,0x5B,0x5D,0x60,0x62,0x65,0x67,0x69,   0x6C,0x6E,0x71,0x73,0x76,0x78,0x7B,0x7D   };   
//三角波段码
unsigned code thr[256]={      0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,   0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,   0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,   0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,   0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,   0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,   0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,   0xBF,0xBE,0xBD,0xBC,0xBB,0xBA,0xB9,0xB8,   0xB7,0xB6,0xB5,0xB4,0xB3,0xB2,0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,   0xA7,0xA6,0xA5,0xA4,0xA3,0xA2,0xA1,0xA0,   0x9F,0x9E,0x9D,0x9C,0x9B,0x9A,0x99,0x98,   0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,   0x8F,0x8E,0x8D,0x8C,0x8B,0x8A,0x89,0x88,   0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,   0x7F,0x7E,0x7D,0x7C,0x7B,0x7A,0x79,0x78,   0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,   0x6F,0x6E,0x6D,0x6C,0x6B,0x6A,0x69,0x68,   0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,   0x5F,0x5E,0x5D,0x5C,0x5B,0x5A,0x59,0x58,   0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,   0x4F,0x4E,0x4D,0x4C,0x4B,0x4A,0x49,0x48,   0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,   0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,   0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,   0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,   0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,   0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,   0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,   0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,   0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F    }; //方波段码																																	 
unsigned code squ[256]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,													0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,			0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff												};//10ms延时函数
void delay_10ms(uchar i)
{//毫秒级延时函数//在12MHZ下晶振下,大约延时10ms/次uchar a,b,c;for(c = i; c > 0; --c)for(b = 129; b > 0; b--)for(a = 38; a > 0; a--);
}//定时器0初始化
void Timer0Init(void)
{unsigned int THHL;TMOD &= 0xF0;				//定时器1失效TMOD |= 0x01;				//定时器0,16位计数THHL=65536-freq;TL0 =THHL%256;			//设置定时初值TH0 =THHL/256;			//设置定时初值TF0 = 0;						//清除TF0标志TR0 = 1;						//定时器0开始计时ET0=1;							//开定时器0中断EA=1;								//开总中断PT0=0;							//定时器0中断最优
}void main()
{/*指示灯初始化,全部熄灭*/
//	triangular_wave_LED3  = 1;
//	square_wave_LED2			= 1;
//	sine_wave_LED1				= 1;Timer0Init();//初始化定时器0while(1){if(change_wave_Key == 0){delay_10ms(1);//延时消抖if(change_wave_Key == 0){while(!change_wave_Key);//松手检测number++;if(number == 5){number = 0;}}}switch(number){case 1:	{DI=sin[n]; break;}//正弦波case 2: {DI=thr[n]; break;}//三角波case 3: {for(i=0;i<256;i++){DI=squ[i];} break;}//方波case 4:	{DI=256-n; break;}//锯齿波default:{break;}}}
}//定时器0中断处理函数
void Timer0_Routine() interrupt 1
{THHL=65536-freq;TL0=THHL%256;TH0=THHL/256;  if(n>=255) {n=0;} else {n++;}   
}

电路仿真及代码例程
链接:https://share.weiyun.com/ALLrnKTu 密码:cchvph

(5)参考文献

基于51单片机的DAC0832波形发生器

由于作者水平有限,如有错误望指摘。

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

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

相关文章

UE5 运行时生成距离场数据

1.背景 最近有在运行时加载模型的需求&#xff0c;使用DatasmithRuntimeActor可以实现&#xff0c;但是跟在编辑器里加载的模型对比起来&#xff0c;室内没有Lumen的光照效果。 图1 编辑器下加载模型的效果 图2 运行时下加载模型的效果 然后查看了距离场的数据&#xff0c;发现…

华为智选SF5,AITO问界的车怎么样

#华为智选 #赛力斯SF5 #aito问界m5 #aito问界m7 #华为汽车 华为的车&#xff0c;后杠焊两点&#xff0c;拉车的时候&#xff0c;拖车钩断了&#xff0c;后杠拉出来了&#xff0c;这质量可以吗&#xff1f;是否应该全部召回&#xff1f;M5&#xff0c;M7是不是也这样&#xff1f…

蓝桥杯(跳跃 C++)

思路&#xff1a; 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素&#xff0c;由题目可知&#xff0c;可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …

增加并行度后,发现Flink窗口不会计算的问题。

文章目录 前言一、现象二、结论三、解决 前言 窗口没有关闭计算的问题&#xff0c;一直困扰了很久&#xff0c;经过多次验证&#xff0c;确定了问题的根源。 一、现象 Flink使用了window&#xff0c;同时使用了watermark &#xff0c;并且还设置了较高的并行度。生产是设置了…

微服务负载均衡实践

概述 本文介绍微服务的服务调用和负载均衡&#xff0c;使用spring cloud的loadbalancer及openfeign两种技术来实现。 本文的操作是在微服务的初步使用的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 spring boot2.7.12 idea2022 步骤 改造Eu…

Windows下定时下载Linux服务器的数据库备份文件(pscp+bat脚本+定时任务)

下载传输软件pscp Download PuTTY: latest release (0.79) 创建bat执行脚本 echo 删除旧的备份文件 del D:\db_bk\*.dbecho 下载新的备份文件 D:\Programs\pscp -P 22 -pw youPassword youName192.168.1.1:/home/backup/test.db D:\db_bk\ 设置定时任务 1.使用任务计划程…

Halcon 中查看算子和函数的执行时间

1、在Halcol主窗口的底栏中的第一个图标显示算子或函数的执行时间&#xff0c;如下图&#xff1a; 2、在Halcon的菜单栏中选择【窗口】&#xff0c;在下拉框中选择【打开输出控制台】&#xff0c;进行查看算子或函数的执行时间&#xff0c;如下图&#xff1a;

音视频技术开发周刊 | 315

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 OpenAI科学家最新演讲&#xff1a;GPT-4即将超越拐点&#xff0c;1000倍性能必定涌现&#xff01; GPT-4参数规模扩大1000倍&#xff0c;如何实现&#xff1f;OpenAI科学家…

Spring核心扩展点BeanDefinitionRegistryPostProcessor源码分析

我们知道&#xff0c;只要在一个Java类上加上Component、Service、Controller等注解&#xff0c;就可以被加载到Spring容器中&#xff0c;除了以上方式&#xff0c;加了Bean和Import好像也可以将对象添加到Spring容器中&#xff0c;究竟Spring是如何实现这些功能的呢&#xff1…

Redis 主从复制,哨兵,集群——(1)主从复制篇

目录 1. Redis 主从复制是什么&#xff1f; 2. Redis 主动复制能干嘛&#xff1f; 2.1 读写分离 2.2 容灾恢复 2.3 数据备份 2.4 水平扩展支撑高并发 3. Redis 主从复制配置项 3.1 配从库不配主库 3.2 权限密码配置 3.3 基本操作命令 4. 案例演示 4.1 案例说明 4.…

tika解压遇到压缩炸弹如何继续解压

1.问题 项目中要对10层压缩的zip、7z等文件用tika解压遇到错误&#xff1a;tika zip bomb detected 也就是说tika认为这是个压缩炸弹。 “压缩炸弹”是一个压缩包文件的木马程序&#xff0c;通常只有几百KB&#xff0c;解压后会变成上百MB或者上GB庞然大物。把你本地磁盘占满…

迁移conda环境后,非root用户执行pip命令和jupyter命令报错/bad interpreter: Permission denied

移动conda环境&#xff0c;在移动的环境执行pip和jupyter 报错-bash: /data/home/用户名/anaconda3/envs/llm/bin/pip: /root/anaconda3/envs/llm/bin/python: bad interpreter: Permission denied 报错信息 一、原因 原因是当前的这个data/home/用户名/anaconda3/envs/环境名…

2022年亚太杯APMCM数学建模大赛A题结晶器熔剂熔融结晶过程序列图像特征提取及建模分析求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 A题 结晶器熔剂熔融结晶过程序列图像特征提取及建模分析 原题再现&#xff1a; 连铸过程中的保护渣使钢水弯液面隔热&#xff0c;防止钢水在连铸过程中再次氧化&#xff0c;控制传热&#xff0c;为铸坯提供润滑&#xff0c;并吸收非金属夹杂物…

37 WEB漏洞-反序列化之PHPJAVA全解(上)

目录 PHP反序列化演示案例&#xff1a;先搞一把PHP反序列化热身题稳住-无类问题-本地在撸一把CTF反序列化小真题压压惊-无类执行-实例最后顶一把网鼎杯2020青龙大真题舒服下-有类魔术方法触发-实例 https://www.cnblogs.com/zhengna/p/15661109.html 代码在线测试平台&#xff…

k8s-20 hpa控制器

hpa可通过metrics-server所提供pod的cpu 或者内存的负载情况&#xff0c;从而动态拉伸控制器的副本数&#xff0c;从而达到后端的自动弹缩 官网&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ 上传镜像 压测 po…

IPV6 ND协议--源码解析【根源分析】

ND协议介绍 ND介绍请阅读上一篇文章&#xff1a;IPv6知识 - ND协议【一文通透】11.NDP协议分析与实践_router solicitation报文中不携带source link-layer address-CSDN博客 ND协议定义了5种ICMPv6报文类型&#xff0c;如下表所示&#xff1a; NS/NA报文主要用于地址解析RS/…

【数之道 08】走进“卷积神经网络“,了解图像识别背后的原理

卷积神经网络 CNN模型的架构Cnn 的流程第一步 提取图片特征提取特征的计算规则 第二步 最大池化第三步 扁平化处理第四步 数据条录入全连接隐藏层 b站视频 CNN模型的架构 图片由像素点组成&#xff0c;最终成像效果由背后像素的颜色数值所决定的 有这样的一个66的区域&#x…

Datawhale-新能源时间序列赛事学习笔记(1)

1.赛题描述 在电动汽车充电站运营管理中&#xff0c;准确预测充电站的电量需求对于提高充电站运营服务水平和优化区域电网供给能力非常关键。本次赛题旨在建立站点充电量预测模型&#xff0c;根据充电站的相关信息和历史电量数据&#xff0c;准确预测未来某段时间内充电站的充电…

Java基础20问(6-10)

6.Java接口和抽象类的区别&#xff1f; 不同点 1.接口在Java8之前不能写方法实现逻辑&#xff0c;Java8及以后的版本&#xff0c;可以用default关键字写方法的实现。 2.接口中方法都是public的&#xff0c;public可以省略&#xff0c;而抽象类没有这个限制。 3.接口用inter…

【MATLAB第79期】基于MATLAB的数据抽样合集(sobol、LHS、Halton、正交、随机函数)更新中

【MATLAB第79期】基于MATLAB的数据抽样合集&#xff08;sobol、LHS、Halton、正交、随机函数&#xff09;更新中 一、随机函数 1.指定区间随机生成数据&#xff08;小数&#xff09; [a b]区间随机数生成: Aa(b-a)rand(m,n) m&#xff1a;待生成矩阵A的行数 n: 待生成矩阵A…