51单片机AD转换电路设计实现
关于AD转换的原理,大家在《数字电子技术》中已经学过,这里做过多的介绍,本文介绍一款经典的8位AD转换芯片ADC0804,基于51单片机设计AD转换电路,并完成测量值的转换。
1 芯片引脚介绍
CS:片选信号,低电平有效,即CS=0时候芯片才能正常工作,单独一个ADC0804芯片时候直接置零。当有多个芯片时候可以通过片选信号实现分时复用。
WR:低电平有效,当WR信号由高到低时候实现一次ADC转换。
RD:低电平有效,RD=0时候可以读取数据。
Vin+:模拟电压输入端。
Vin-:一般接地,当模拟电压是双边输入时候Vin+和Vin-分别接模拟电压的正负极。
VREF/2:参考电压接入引脚,可悬空或接外界电压。接外电压时候芯片的参考电压为所接电压的两倍。悬空时候芯片参考电压为VCC。
CLKR/CLKIN:外接RC电路产生转换所需的时钟信号,CLK=1/1.1RC。
AGND和DGND:模拟和数字地。
INTR:中断请求信号输出引脚,当完成一次AD转换后该引脚为低电平,一般与单片机的中断信号相连。
DB0~DB7:输出转换后的八位二进制结果。
2 ADC0804的一般接法:
Proteus仿真电路:
3 ADC0804的工作时序:
启动转换时序
先将CS置低电平,芯片开始工作,WR随后置低,经过一段时间的低电平之后,WR拉高,AD转换启动,经过1-8个A/D时钟周期后,模数转换完成,INTR引脚拉低,通知单片机本次转换完成。
数据读取时序
当INTR为低电平时,先将CS置低,接着RD置低,经过一段时间后数字输出口上的数据达到稳态,此时单片机可以读取数据,读取完成后将RD拉高,最后将CS拉高。INTR自动变化,无需人为操作。一般在只有一片ADC0804芯片时候,可以一直将CS置低。
4 仿真实现
51单片机读取ADC0804数据的方式有两种,一种是通过不断扫描的方式读取;另一种是将ADC0804的INTR引脚接单片机的中断引脚,当AD转换完成后,通过外部中断的方式通知单片机读取数据。
4.1 扫描的方式
Proteus仿真电路图
源代码:
#include <reg51.h>
#include <intrins.h>
sbit CS=P3^5;
sbit adrd=P3^7;
sbit adwr=P3^6;
unsigned char code display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char com[]={0x01,0x02,0x04,0x08};
unsigned char num,num2=0,time[4]={0,0,0,0},val;
float val2;
unsigned int val3;
void main()
{
TMOD=0x01;
TH0=(65536-917)/256;
TL0=(65536-917)%256;;
EA=1;
ET0=1;
TR0=1;
CS=0;
while(1){
adwr = 1;//
_nop_();
adwr = 0;//
_nop_();
adwr = 1;//
P1 = 0xff;//
adrd = 1;//
_nop_();
adrd = 0;//
_nop_();
val = P1;//
adrd = 1;//
val2=((val*1.0/255)*5.0);
val3=val2*1000;
time[0]=val3/1000;
time[1]=val3%1000/100;
time[2]=val3%100/10;
time[3]=val3%10;
}
}
void Timer0() interrupt 1
{
TH0 = (65536-917)/256;
TL0 = (65536-917)%256;;
num++;
if(num==10){
num=0;
P0=~com[num2];
P2=0xff;
if(num2==0)
{P2=display[time[num2]]|0x80;}
else
{P2=display[time[num2]];}
num2++;
if(num2>=4)
num2=0;
}
}
4.2 外部中断的方式
Proteus仿真电路
源代码:
#include <reg51.h>
#include <intrins.h>
sbit CS=P3^5;
sbit adrd=P3^7;
sbit adwr=P3^6;
unsigned char code display[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char com[]={0x01,0x02,0x04,0x08};
unsigned char num,num2=0,time[4]={0,0,0,0},val;
float val2;
unsigned int val3;
void Delay50ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
TMOD=0x01;
TH0=(65536-917)/256;
TL0=(65536-917)%256;;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0 = 0;
CS=0;
while(1){
adwr = 1;//
_nop_();
adwr = 0;//
_nop_();
adwr = 1;//
Delay50ms();
}
}
void Timer0() interrupt 1
{
TH0 = (65536-917)/256;
TL0 = (65536-917)%256;;
num++;
if(num==10){
num=0;
P0=~com[num2];
P2=0xff;
if(num2==0)
{P2=display[time[num2]]|0x80;}
else
{P2=display[time[num2]];}
num2++;
if(num2>=4)
num2=0;
}
}
void Init0() interrupt 0
{
adrd = 1;//
_nop_();
adrd = 0;//
_nop_();
val = P1;//
adrd = 1;//
val2=((val*1.0/255)*5.0);
val3=val2*1000;
time[0]=val3/1000;
time[1]=val3%1000/100;
time[2]=val3%100/10;
time[3]=val3%10;
}
文章浏览阅读460次,点赞5次,收藏8次。3 axios 第三方ajax,只有ajax,没有别的,小--》底层还是基于XMLHttpRequest。提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分。# 1 使用jq的ajax ===》不好---》引入了jq框架,好多功能用不到。number:数字开头,只保留数字,后面的字母不保留;lazy:等待input框的数据绑定时区焦点之后再变化。# 2 原生js fetch。trim:去除首位的空格。_input v-modal原生并实现lazy
文章浏览阅读158次。设置控件,这里用rVar,gVar,bVar来储存rgb数值,用Scale制作滑块。_tkinter 颜色16进制代码大全
文章浏览阅读185次。【代码】全角半角互相转换。_r如何切换全角半角
文章浏览阅读178次。研发管理(Research and Development Management,R&D Management)是一种系统性的管理活动,是以产品开发流程为基础的项目管理体系,旨在规划、组织、协调和监督研发项目,对研发项目的人员、计划、质量、成本等进行综合管理,从而打造高效能的研发团队,更好更快地实现项目目标。研发管理的本质是从流程化,标准化,制度化等维度建立管理机制。最终的核心目标是通过管理的法治建立标准化的操作规范,再通过标准化的规范提升人员的协作效率、监督机制、系统稳定性/安全性等。
文章浏览阅读1.3k次。简要介绍了磁盘访问性能相关指标,CPU的交互方式,和RAID_吞吐量和raid关系
文章浏览阅读2k次,点赞3次,收藏4次。塑胶类产品的生产依赖于模具(Tooling),曾经为公司做过一个塑胶模具的报价系统。模具的成本,与ERP中的产品成本原理相似,材料费,人工费和制造费用,再加上企业利润,构成基本的价格。 常用的公式如下所示 模具价格=模具材料费+模具加工费+税金+利润 其中材料费占20%~30%,加工费50%~60%;一般模具利润率10%~30%,大型模具利润率20%~35% 模具时间与成本的关系如下 ..._塑胶模报价计算公式
文章浏览阅读437次。react 里面的东西居中。_react图片居中
文章浏览阅读5.2k次。1.linux下安装完zookeeper之后,进入conf目录编辑zoo.cfg文件,找到dataDir属性更改其路径为zookeeper目录下的zkData文件夹.(因为其默认的目录在Linux下会定清理)(1)进入到zookeeper目录下的bin目录启动zookeeper,使用sh zkServer.sh命令启动zookeeper(或者zkServer.sh start命令启动).(2) 继续在bin目录下使用sh zkCli.sh命令启动zoo..._zookeeper访问地址
文章浏览阅读572次。下面是js的脚本,100G为例:// JS var num = 100Math.ceil(Math.ceil(num*1024/7.84423828125)*7.84423828125)使用方法,只要有浏览器就行,打开浏览器进入开发者模式F12,选择控制台将上面的代码粘贴到控制台中,红字部分为100G应分配的M数.如需其它容量大小自行修改100为对应的值..._win7分盘100g公式
文章浏览阅读70次。《Windows黑客编程技术详解》面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。理论技术与实战操作相辅相成,凸显“道与术”庖丁解牛式剖析Windows用户层和内核层黑客技术原理代码兼容性高,支持Windows 7到Windows 10全平台系统近年来,全球大规模爆发勒索病毒和挖..._demongan
文章浏览阅读5.2k次,点赞7次,收藏18次。很多小伙伴都会有疑惑,有的大神可以有自己独特的加载界面,其实这个编辑过程很简单,今天带大家来一起Try一Try! 长话短说,如果我们不做改变,每一个编辑器加载时的界面都是一样的,那我们怎么样去根据自己的喜好来改变这个logo呢?1.打开虚幻编辑器,项目设置2.项目设置中找到这个更改界面,然后把鼠标放在logo上,我们可以看到这个图片是虚幻自带的文件中原本就默认存在的,那我们就..._ue4 splash image
文章浏览阅读154次。90%的dp问题都能转化为最短路问题,拓扑图可以转化为dp问题。记住模型,到相似题目就会有更清晰的思路,不会到无从下手。_acwing提高课