51单片机上AD和DA操作

2023-05-16

一、ADC0804的操作
1、试验板上ADC0804的接线图
在这里插入图片描述
AD芯片上的第5管脚INTR没有接线,因为该实验板读取A/D数据没有用中断法,所以可以不接该引脚。
2、芯片的操作时序图如下
在这里插入图片描述
操作芯片时基本按照此顺序操作各个引脚。操作过程:在此实验中要连续转换连续读取数据,就将CS一直置低,没有用到中断也不用操作INTR引脚,剩下就只用操作WR和RD引脚,首先将WR置低,经过tW(WR)L时间后拉高WR,转换开始,经过1~8个A/D时钟周期1/fCLK和内部Tc时间后,转换完成;接着将RD置低,经过tACC时间后数字输出口上的数据达到稳定状态,此时直接读取数字输出端口数据,读完数据直接拉高RD。
3、用单片机控制ADC0804进行模数转换,当拧动实验板上A/D旁边的电位器Re2时,在数码管前三位以十进制方式动态显示出A/D转换后的数字量(8位A/D转换后数值在0~255变化)。

#include <reg52.h>
sbit ledwela=P2^5;//8个LED灯接在锁存器上,锁存端接P2^5口
sbit dula=P2^6;
sbit wela=P2^7;
sbit adwr=P3^6;//写信号输入,低电平启动A/D转换
sbit adrd=P3^7;//读信号输入,低电平输出端有效
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
void display(uchar num)
{
	dula=1;
	P0=table[num/100];
	dula=0;
	P0=0x7f;//所有的P0最高位都要置低,因为CS片选信号低电平有效,AD启动工作
	wela=1;//其实根据时序图在WR拉高后才进行显示的,但是在此程序中看到数码管只显示255
	P0=0x7e;//说明不置低会出现错误,根据时序图理论上再延时一会应该没问题,我就没有测试了
	wela=0;
	delayms(1);
	wela=1;
	P0=0x7f;
	wela=0;

	dula=1;
	P0=table[num/10%10];
	dula=0;
	P0=0x7f;
	wela=1;
	P0=0x7d;
	wela=0;
	delayms(1);
	wela=1;
	P0=0x7f;
	wela=0;

	dula=1;
	P0=table[num%10];
	dula=0;
	P0=0x7f;
	wela=1;
	P0=0x7b;
	wela=0;
	delayms(1);
	wela=1;
	P0=0x7f;
	wela=0;
}
void main()
{
	uchar num=0,i=0;
	ledwela=1;
	P1=0xff;
	ledwela=0;//控制LED灯不亮,不然看到LED灯随着数码管数字变化。这三行不要就看到数码管显示数字的二进制形式在LED灯上体现
	wela=1;
	P0=0x7f;//因为CS片选信号输入端接在数码管位选锁存器的第八个口
	wela=0;/*片选信号低电平有效,一旦有效,表明ADC被选中,可启动工作。即置低就表示该芯片可被操作
或处于能够正常工作状态。因为我们要连续转换并且连续读取数据,所以一开始置低后就可以了,没有必要每次
置低再拉高,以后只用操作WR和RD就可以了*/
	while(1)
	{
		adwr=0;
		//delayms(1);时序图上要tW(WR)L时长,但可以不加延时,说明tW(WR)L时间非常短
		adwr=1;
		for(i=30;i>0;i--)//相当于delayms(100);AD转换时间。如果时间过短(如果把i改为10)就会出现
		{//拧动电位器数码管没有反应,只有按下复位键后数码管上的数字才会变化,这就是转换的时间不够的原因
			display(num);
		}
		adrd=0;
		//delayms(1);经过tAcc时间后,数字输出口上的数据达到稳定状态.这个延时也可取消,说明时间也很短
		num=P1;//读取P1口	
		adrd=1;
	}
}

AD转换关键在于看懂时序图,根据时序图操作,关键代码如下,记住在WR拉高之后,转换时间要够。
while(1)
{
adwr=0;
adwr=1;
for(i=30;i>0;i–)
{
display(num);
}
adrd=0;
num=P1;
adrd=1;
}
二、DAC0832的操作
1、实验板上的DAC0832接线图
DAC0832芯片数据输入可采用双缓冲、单缓冲和直通三种方式,实验板上的是接成直通方式的。
在这里插入图片描述
在此例程中,DAC0832以电流形式输出,当输出需要转换为电压时可在I(OUT1)和I(OUT2)后外接运算放大器,即将电流转换为电压。在此实验板上I(OUT2)接地,I(OUT1)直接与发光二极管D12相连,由于I(OUT1)电流非常小,所以二极管变化的亮度也很暗。
转换电压的典型接法:
在这里插入图片描述
2、DAC0832内部结构
在这里插入图片描述
3、芯片时序图
在这里插入图片描述
将CS置低后数据总线上数据才开始保持有效数据,再将WR置低,从I(OUT)线看出,在WR置低ts秒后,DA转换完成,I(OUT)输出稳定。在此次例程中要连续转换DA,所以CS和WR一直置低即可,只需一直改变P0口。
4、用单片机控制DAC0832芯片输出电流,让发光二极管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别报警一声,完成整个周期时间控制在5s左右,循环变化。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit csda=P3^2;//片选信号输入端,低电平有效..实验板上只有这两个与单片机连接,对比芯片内部结构图看
sbit dawr=P3^6;//输入寄存器的写选通输入端,负脉冲有效。当CS为0ILE为1,WR1有效时DI0~DI7状态被锁存到输入寄存器
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;//蜂鸣器的FM端接单片机的P2^3口
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
void main()
{
	uchar valtage=0,k=0;
	dula=0;
	wela=0;//关闭数码管的两个锁存器,因为芯片连接P0口
	csda=0;
	dawr=0;//若是一次转换就拉高两位,这里是连续转换,所以一直置低
	//这里出现了一个奇怪的现象,就是在此处定义uchar valtage=0,k=0;时,编译出错,显示valtage和k未定义
	while(1)
	{
		beep=0;//最暗的时候响蜂鸣器
		P0=valtage;
		valtage+=5;//valtage=5
		delayms(50);
		beep=1;
		for(k=0;k<49;k++)
		{
			P0=valtage;
			valtage+=5;//i=48时,valtage=250
			delayms(50);
		}
		P0=valtage;
		valtage+=5;//valtage=255
		delayms(50);
		beep=0;//最亮的时候打开蜂鸣器
		P0=valtage;
		delayms(50);
		beep=1;//关闭蜂鸣器
		for(k=0;k<50;k++)
		{
			valtage-=5;//i=49时,valtage=5
			P0=valtage;
			delayms(50);
		}
		valtage-=5;//valtage=0
	}
}

一个while循环的时间为(1+49+1+50)*50ms=5050ms,约为5s。课本上93页可以看到倒T形电阻网络DAC转换器电流的分流电路图。
蜂鸣器的电路图如下:蜂鸣器的FM端接单片机的P2^3口
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机上AD和DA操作 的相关文章

  • VS远程调试

    文章目录 VS远程调试本地和虚拟机调试准备工作 xff1a 需要注意的几个地方 xff1a VS远程调试 在编程中由于环境 版本等各种原因 xff0c 我们需要模拟出来各种环境来跑不同的版本测试 本地和虚拟机调试 准备工作 xff1a 以V
  • AUTOSAR基础篇之CanNM

    前言 首先 xff0c 问大家几个问题 xff0c 你清楚 xff1a 为什么要引入网络管理呢 xff1f 上电同时启动 xff0c 下电同时关闭 xff0c 它不香吗 xff1f 你知道车上的ECU节点可以分为哪几种类型吗 xff1f 汽
  • CANoe应用案例之DoIP通信

    随着ECU功能和存储容量的不断提高 xff0c 主机厂对于ECU诊断和刷写有了更高的要求 由于带宽的限制 xff0c 传统的汽车总线 xff08 如CAN总线 xff09 存在刷写时间过长的缺点 xff0c 大大降低了生产和维修效率 DoI
  • TRACE32——常用操作

    TRACE 32常用操作 TRACE32软件打开后 xff0c 连上硬件环境 xff0c 我们就可以开始尝试和芯片建立连接 xff0c 并进行基本的调试操作 第一步 xff1a 确认目标板是否上电 第二步 xff1a 打开System Se
  • TRACE32——基于SNOOPer的变量记录

    TRACE32 基于SNOOPer的变量记录 在我们日常调试工作中 xff0c 经常会遇到一种场景 xff1a 对于某些变量或者内存的值 xff0c 希望对其进行监控 当这些变量发生写或者读的时候 xff0c 将这些操作记录下来 xff0c
  • TRACE32——内存填充测试Data.Pattern

    TRACE32 内存填充测试Data Pattern Data Pattern 命令可以用于对内存 xff08 SRAM DDR Flash等 xff09 写入随机值 xff0c 以快速地测试内存是否可以正确读写 命令格式 xff1a 示
  • STM32使用printf重定向

    最近用STM32CubeMX创建了一个demo工程 xff0c 在调试过程中 xff0c printf打印功能一直不能正常打印 xff0c 检查工程中也已将fputc函数进行了实现 奇怪的是用JTAG进行调试时打印恢复了正常 最后发现问题的
  • repo的安装和使用

    前言 Android 采用 Gerrit 提供代码评审服务 xff0c 并且开发了一个客户端工具 repo xff0c 实现多仓库管理 Git 的开发者对服务端的 Git 源码做了扩展 xff0c 使得基于 Git xff08 cgit x
  • repo sync之后不能自动 rebase 的定位

    背景 最近在使用repo sync同步代码时老是报告 xff1a branch xxx is published but not merged and is now 1 commits behind 我之前是由推送过一笔提交 xff0c 但
  • git取指定日期log问题

    库上版本有一个重要bug xff0c 使用了如下命令取一个版本 xff1a repo forall c 39 commitID 61 96 git log before 34 2022 12 09 00 00 00 34 1 pretty
  • ROS读取激光雷达点云数据(RS-Lidar为例)

    一 准备工作 xff1a 1 安装ROS xff08 含有rviz xff09 xff1b 2 安装pcl ros pcl xff08 Point Cloud Library xff09 ros 是ROS中点云和3D几何处理的接口和工具 如
  • 标准预定义的宏

    标准预定义宏是由相关的语言标准规定的 xff0c 所以它们可以在所有执行这些标准的编译器中使用 旧的编译器可能不会提供所有这些宏 它们的名字都以双下划线开头 FILE 这个宏扩展为当前输入文件的名称 xff0c 以 C 字符串常数的形式 这
  • Realsense L515使用

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 主要参考二 基本情况 xff08 一 xff09 ubuntu和ROS情况 xff08 二 xff09 主要步骤 总结
  • 电脑前置摄像头运行ORB-SLAM2 Mono

    ROS本地摄像头 下载安装usb cam包 最好将它放在ROS空间的src文件夹下 xff0c 方便管理 git clone https github com bosch ros pkg usb cam git usb cam cd usb
  • ERROR:cannot launch node of type

    当使用roslaunch启动ros节点时 xff0c 如果出现 ERROR cannot launch node of type 这个错误 xff0c 一般原因是由于没有source bashrc 因此工作空间使用 source bashr
  • Ubuntu 18.04 运行PL-VINS

    代码地址 https span class token operator span span class token comment github com cnqiangfu PL VINS span 安装过程出错参考 PL VINS配置
  • rosbag.bag.ROSBagUnindexedException: Unindexed bag

    rosbag bag ROSBagUnindexedException Unindexed bag ROSBAG
  • d435i 相机和IMU联合标定

    一 前提 我们已经对RGB摄像头和IMU进行了单独标定 参考之前博文 RGB标定 IMU kalibr官方WIKI Kalibr 二 准备标定文件 2 1 标定板yaml文件 标定下载链接 Aprilgrid 6x6 0 5x0 5 m u
  • opencv版权nofree问题

    找到3 1 0中cpp文件拷贝到3 4 12中 xff0c 重新cmake编译 xff0c 即可使用 nofree解决方案
  • realsense d435i 自制Euroc数据集

    参考 提取bag Python程序地址 span class token operator span home span class token operator span yang span class token operator sp

随机推荐