单片机 数字电压表(ADC0809)
单片机 数字电压表(ADC0809)
一、简述
采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4.995、2.5、0.005。
ADC0809是可以将我们要测量的模拟电压信号量转换为数字量从而可以进行存储或显示的一种转换器件。
文件打包:链接: https://pan.baidu.com/s/1F2E135Jw7TG3EmUVx3xKGg 提取码: 5ttz
二、效果
三、工程文件
1、Keil工程
2、仿真电路图
四、源文件
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
uint volt,vtime; //电压值测定值
uchar addr;//测量地址位
sbit LW1=P2^3; //对应第4个数码管
sbit LW2=P2^2; //对应第3个数码管
sbit LW3=P2^1; //对应第2个数码管
sbit LW4=P2^0; //对应第1个数码管
sbit LW5=P1^4;//指示当前显示的是第几个转换值
sbit CLK=P2^4; //时钟信号
sbit START=P2^5; //转换启动开关
sbit EOC=P2^6; //转换结束标志
sbit OE=P2^7;//定义ADC0809各脚
/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址
//调用函数:
//输入参数:x
//输出参数:
//说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
/**********************************************************/
void delay(uint x)
{uchar y,z;for(y=x;y>0;y--)for(z=250;z>0;z--);//该步运行时间约为0.5msvtime++;if(vtime==1000){vtime=0;addr++;if(addr==3) //本例子一共有3个测量输入值,轮流读取这3个值并转换显示addr=0;//以上语句实现测量地址位的改变 }
}
/**********************************************************/
//函数名:ADC()
//功能:数模转换程序
//调用函数:
//输入参数:
//输出参数:
//说明:将转换好的测定值保存在变量volt中
/**********************************************************/
void ADC()
{EA=1;//开中断//确保进入正常AD转换状态?START=0;START=1;START=0;//ad开始转换 while(EOC==0); //等待转换结束OE=1; //输出数据标志为真EA=0;//关中断volt=P3;//获取转换值保存到volt中,(P3为转换后数据)volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)OE=0;//输出转换结束 (要在获取转换值之后)
}
/**********************************************************/
//函数名:display()
//功能:4位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值显示在4位数码管上
/**********************************************************/
void display()
{P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)LW1=0;P0=~led[volt/10000]&0x7f;//带小数点1伏显示位delay(2);P0=0xff;LW1=1;LW2=0;P0=~led[(volt/1000)%10];//100毫伏显示位delay(2);P0=0xff;LW2=1; LW3=0;P0=~led[(volt/100)%10];//10毫伏显示位delay(2);P0=0xff;LW3=1;LW4=0;P0=~led[(volt/10)%10];//1毫伏显示位delay(2);P0=0xff;LW4=1;LW5=0;P0=~led[addr+1];//显示电压测量位delay(2);LW5=1;//指示当前显示的是第几个转换值
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{EA=1;//开总中断 TMOD=0x01;//设定定时计数工作方式//为定时器初赋值TH0=0XFF;TL0=0XB4;ET0=1;//开定时器0中断 TR0=1;//开启定时器0while(1){P1=addr;//装入测量地址LW5=1;ADC();//调用模数转换程序display();//调用显示程序}
}
/**********************************************************/
//函数名:timer() interrupt 1
//功能:定时中断0响应程序
//调用函数:
//输入参数:
//输出参数:
//说明:为ADC提供时钟信号
/**********************************************************/
void timer() interrupt 1
{//初值重置TH0=0XFF;TL0=0XF0;CLK=~CLK;//取反 产生时钟信号
}
五、总结
ADC0809是一种有8路模拟输入、8位并行数字输出的逐次逼近式A/D器件。
1、主要技术指标和特性
(1) 分辨率:8位;
(2) 转换时间:取决于芯片的时钟频率,转换1次所需时间;
(3) 单一电源:+5V;
(4) 模拟输入电压范围:单级性为0~+5V。
2、引脚介绍
管脚功能说明:
IN0-IN7:模拟量输入通道。就是说它可以分时地分别对八个模拟量进行测量转换。
ADDA-C:地址线。也就是通过这三根地址线的不同编码来选择对哪个模拟量进行测量转换。
ALE:地址锁存允许信号。在低电平时向ADDA-C写地址,当ALE跳至高电平后ADDA-C上的数据被锁存
START:启动转换信号。当它为上升沿后,将内部寄存器清0。当它为下降沿后,开始A/D转换。
D0-D7:数据输出口。转换后的数字数据量就是从这输出给S52的。
OE:输出允许信号,是对D0-D7的输出控制端,OE=0,输出端呈高阻态,OE=1,输出转换得到的数据。
CLOCK:时种信号。ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。
EOC:转换结束状态信号。EOC=0,正在进行转换。EOC=1,转换结束,可以进行下一步输出操作
Vref(+)、Vref(-):参考电压。参考电压用来与输入的模拟量进行比较,作为测量的基准。一般Vref(+)=5v ,Vref(-)=0V。
3、时序图与工作过程
时序图:
工作过程:
①在IN0-IN7上可分别接上要测量转换的8路模拟量信号。可只接一路。
②将ADDA-ADDC端给上代表选择测量通道的代码。如000(B)则代表通道0;001(B)代表通道1;111则代表通道7。
③将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后被选中的通道的模拟量送给内部转换单元。
④给START一个正脉冲。当上升沿时,所有内部寄存器清零。下降沿时,开始进行A/D转换;在转换期间,START保持低电平。
⑤EOC为转换结束信号。在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换工作结束。否则,表明正在进行A/D转换。
⑥当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据。
说明:ADC0809的转换工作是在时钟脉冲的条件下完成的,因此首先要在CLOCK端给它一个时钟信号,说明书上给出了可以接入的脉冲信号频率是在10KHz-1280KHz,典型值是640KHz。我们这里取值50KHz。
时序图上的teoc时长为:从START上升沿开始后的8个时钟同期再加2微秒。这一点得注意,因为当START脉冲刚结束进入转换工作时,EOC还没有立即变为低电平而是过了8个时钟周期后才进入低电平的,所以再给出START脉冲后最好延时一会再进行EOC的检测。
一个通道的转换时间一般为64个时钟周期,如时钟频率为640KHz时,时钟周期为1.5625微秒,一个通道的转换时间则为1.5625×64=100微秒,那么1秒种就可以转换1000000÷100=10000次。
4、计算定时器初值:
信号频率取值50KHz,晶振频率是12MHz。
12MHz时钟频率下,12MHz = 12000KHz = 12000000Hz,一个时钟振荡周期就是1/12000000秒,亦即1/12微秒,标准MCS51系列单片机的一个机器周期是12个时钟振荡周期,也就是12 * (1/12) = 1微秒。
要输出50KHz的矩形方波 周期 T = (1/50K)s 等宽 也就是占空比50% 高电平时间是(0.5/50K)s = 0.01 ms = 10us
然而,实际上仿真时这个频率是太快了(不知道是否是计算方法错了),编程中没有使用该初值。
六、Proteus相关操作
1、电压探针元件(显示电压)
2、自定义电源电压
-------------------------------------------------以下是回复 Rainynightsunset 这位兄弟---------------------------
下载打包文件之后:
========================以下回复 木子Jasmine 这位兄弟======================
手动复位效果 (使用轮询方式检测按键有没有按下,因为外部中断引脚被使用了)
测试代码以及仿真文件:链接: https://pan.baidu.com/s/1zC8uhzlbIFRBOkOWuWzAWQ 提取码: wr39
===================以下回复 Leon. 这位兄弟=======================
将程序中的addr最值修改为8,如下:
在仿真上,添加5个模拟输入
效果:(注:想要查看电压,请加上电压探针元件)
============== ===== 以下回复 馨心愢忞 ========================
简单的测量20v(采用分压法:先把电压除以4再进行转换,得到转换的值后再乘以4)
测试例子:链接: https://pan.baidu.com/s/10RzT9lFVbB8db4CO7at_0A 提取码: zwem
测试效果:
分压测量20V说明:
=======================以下回复 yikai0511和validatetoken==============================
以下例子是:按键设置最高电压,当前电压大于等于最高电压时蜂鸣器报警以及LED亮,测试环境为Win10
电压为20V的可以自己设置的,上下限值同时设置暂时没弄好(感觉引脚不够用,需要复用引脚)
例子打包:链接: https://pan.baidu.com/s/1RY18AeWCCsXXqlgUBeTv_w 提取码: pdf7
仿真截图:
效果:
单片机 数字电压表(ADC0809)相关推荐
- 数字电压表单片机 c语言程序,单片机数字电压表(带仿真图C程序).docx
单片机数字电压表(带仿真图C程序) 基于51单片机数字电压表 本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V 看了很多网上的课程设计或者毕业论文,得 ...
- 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)
摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...
- 单片机 数字电压表(TLC2543)
单片机 数字电压表(TLC2543) 一.简述 使用并行ADC会限制系统I/O口的功能扩展,采用串行ADC比较适合那些低速采样而控制管脚又比较多的系统. TLC2543是TI公司的12位串行模数转换器 ...
- 简易数字电压表设计 单片机 仿真 ADC0809
课程设计题二十九:简易数字电压表设计 设计要求: 1. 利用ADC0809设计一个简易数字电压表,要求可以测量0~5V之间8路输入电压 值,电压值由4位LED数码管显示,并在数码管上轮流显示或单路 ...
- 单路电压表c语言编程,单片机数字电压表的设计
第1章 绪论1.1系统的开发背景 在电量的测量中,电压.电流和频率是最基本的三个被测量,其中电压量的测量最为经常.而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少 ...
- 单片机数字电压表设计
摘要: 本设计中利用STC89C52单片机制作了一个简单的数字电压表,主要通过A/D转换器XPT2046把输入的模拟信号即电位器的电压值转换成数字信号,送到1602液晶进行数据显示,并预设了一个警报值 ...
- 44、基于51单片机数字电压表设计电流电压功率表
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 部分代码 八.资料包括 摘要 本次设计要求 ...
- adc0809 c语言程序,51单片机驱动ADC0809的C语言程序
#include#define uchar unsigned char #define uint unsigned int sbit CLK=P1^3; sbit ST=P1^2; sbit EOC= ...
- 单路电压表c语言编程,用AT89C51单片机制作的数字电压表
此数字电压表,利用A/D转换原理将被测模拟量转换成数字量,并通过控制系统用数字方式显示测量结果.本设计采用AT89C51单片机,ADC0809进行模/数转换,能够测量8路0-5V的输入电压值,可用四位 ...
- 基于STC89C51单片机的数字电压表设计
0 引言 数字电压表的设计和开发已有很多类型和款式,传统的数字电压表有自己的特点,它们适合在现场做手工测量,而要完成远程测量并对测量的数据做进一步处理,运用传统的数字电压表是无法完成的.为此,本文设计 ...
最新文章
- P5327-[ZJOI2019]语言【线段树合并,LCA】
- 这位29岁MIT美女博士究竟是如何“造”出人类史上首张黑洞照片的?
- 解开Android应用程序组件Activity的singleTask之谜(3)
- html5——3D转换
- 对于scanf的新理解
- 如何从道客巴巴上下载收费文档之我见
- ftp命令及dos中操作ftp命令
- mysql足球管理系统_基于java的足球队管理系统精选.doc
- 转-注册表对应项详解
- PMP考试有哪些科目
- 基于WebSocket和Redis实现Bilibili弹幕效果
- 大厂与小厂招人的区别,看完多少有点不敢相信
- (翻译)网站品质与配色相关
- openoffice linux 目录,Linux下openoffice的安装
- linux 流量 脚本,实时查看linux网卡流量脚本
- 用HTML+CSS做一个漂亮简单的个人网页~个人相册介绍个人主页模板(6个页面) ~学生HTML个人网页作业作品~
- Ubuntu下将rm命令替换为trash命令
- 2018巅峰极客writeup(Misc)
- 精密注塑制件表面缺陷检测
- Megaupload存储服务计划2017回归 原用户数据将恢复