51单片机上AD和DA操作

发布者:温暖微风最新更新时间:2022-05-24 来源: eefocus关键字:51单片机 手机看文章 扫描二维码
随时随地手机看文章

一、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

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

#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口

在这里插入图片描述

关键字:51单片机 引用地址:51单片机上AD和DA操作

上一篇:一个定时中断产生N个软件定时器
下一篇:51单片机的键盘检测原理

推荐阅读最新更新时间:2024-11-13 11:58

基于51单片机的热释电红外检测报警器程序
两种模式:一种紧急报警模式,另一种布防报警模式。 三个LED指示灯:红色为报警指示灯(检测到有人报警时闪亮)、绿色为布防指示灯(等待布防时1s一闪、进入布防状态时常亮)、黄色为传感器信号指示灯(有信号就亮,否则灭)。 按下布防键,系统计时20秒进入布防状态(此时绿色的led灯闪烁),20秒后系统进入布防状态(此时绿色的led亮长亮),此时当有人靠近时,黄色信号灯亮,红外热释电传感器将信号输送给单片机,单片机接收到信号蜂鸣器响,红色led灯亮,实现声光报警。 当遇到特殊情况时,按下按键1(紧急报警键),系统马上报警。 红外热释电传感器感应人体,当感应到人输出高电平,没感应到人输出低电平。 四个按键:按键1
[单片机]
通过MSP430F1232最小系统测试单片机AD10程序
工作记录:测试单片机程序,包括单片机初始化设置,时钟等,主要是AD模块的设置,通过TI官网的1232例程进行程序的编写。 1、创建IAR项目,对项目的option进行设置,添加TI的例程c文件,编译。没有问题就可以连接JTAG向单片机中烧程序了。 2、单片机程序需要解决的几个问题: (1) 单片机时钟 上电默认情况下,主系统时钟(MCLK)和子系统时钟(SMCLK)采用的是内部DCO(采用内部电阻)产生的800KHz的时钟,辅助系统时钟采用的是片内超低功耗12KHz的内部振荡器(VLOCLK)产生的12KHz时钟。 Msp430F1232时钟源有两个,一个是LFXT1CLK,一个是内部的DCOCLK。ACLK只
[单片机]
C51单片机地址指针及其应用
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令: MOVX A,@DPTR MOVX @DPTR,A MOVX A,@RI MOVX @RI,A 其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。 MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。 执行 MOVX A,@DPTR 和 MOVX @DPTR,A 指令时,在读
[单片机]
在MCS-51单片机中对特殊功能寄存器的C51定义
在开始讲对C51单片机中特殊寄存器(SPR)的定义前,先简单介绍下我们在进行51单片机开发时经常看到的两个关键字 sbit”和 sfr“: sfr用于将一个单片机的特殊功能寄存器(specialfunctionregister)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(referto)该寄存器 sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。 接着我们以STC系列的51单片机为例简单的了解下单片机的特殊功能寄存器布局,如下: MCS-51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄
[单片机]
在MCS-<font color='red'>51单片机</font>中对特殊功能寄存器的C51定义
基于51单片机的pwm波产生
利用定时器的中断来实现PWM调制。如果我们设定脉冲的周期为1000毫秒;每20毫秒产生一次中断,则知道要中断50次。 那么我们可以这样编写程序 TH0=0XFF; TL0=0XEC;这是定时器0产生一次中断的时间,即20毫秒产生一次中断。我们再定义一个计数的变量NUM,让NUM从0开始加到50,程序如下 void Timer0Interrupt(void) interrupt 1 { TH0 = 0x0FE; TL0 = 0x0C; NUM++; if(NUM==33) { NUM=0; } if(NUM =PWM)P1=0x00; if(NUM PWM)P1=0
[单片机]
51单片机汇编程序,温度报警项目
大学时的单片机汇编作品,项目地址 https://github.com/jan-bar/Temperature 该项目需要protues运行,下面是可用的下载地址 链接: https://pan.baidu.com/s/13gSiLTenkSV3a5niS3untQ 提取码:7x48 安装破解汉化方法如下: 1、下载解压,得到proteus pro 8.9 sp0原程序、patch破解文件和汉化补丁; 2、首先双击文件 P8.9.sp0.exe 安装软件,接受协议后,选择 Use a locally installed license key ; 3、在许可证安装界面,浏览指定patch破解文件夹中的Licence.lxk许
[单片机]
<font color='red'>51单片机</font>汇编程序,温度报警项目
利用51单片机的LED点阵输出生日快乐
Led点阵原理图 D0-D7口接在74HC595芯片上,芯片的输入端口为P34、P35、P36端口; 控制每一列的为P00-P07端口 LED点阵工作原理 根据点阵原理图,P00-P07接低电平,D0-D7接高电平时led点亮,由于单片机控制端口有限,于是只能每次点亮一列,逐列扫描,利用人眼的视觉暂留形成同时点亮的现象。将要点亮的LED灯标记为1,每一列根据D0-D7的高低电平,转换成2进制数,再转换成16进制数,于是得到每一个汉字所对应的数组,通过74HC595移位输出(这里可以通过IC资料查看74HC595工作原理编程)。 程序代码
[单片机]
利用<font color='red'>51单片机</font>的LED点阵输出生日快乐
51单片机的特殊功能寄存器(SFR)
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下: 符号 地址 功能介绍 B F0H B寄存器 ACC   E0H 累加器 PSW   D0H 程序状态字 IP   B8H 中断优先级控制寄存器 P3   B
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved