该知识点来源于B站知弦,本章便是对其电子电压表应用的简单总结!!!
一、ADC0808/0809(模拟信号转数字信号)
1、其概述如下图所示,LSB为5V/2^8
2、芯片内部结构(如下图)
IN0-IN7:模拟信号输入端
D0-D7:单片机接口端,也就是芯片输出端
COLOCK:时钟信号端,常为500KHz
ADDA、ADDB、ADDC:对IN0-IN7地址选择
ALE:对地址锁存,一般与START相连
EOC:模拟转数字信号反馈(A/D转化反馈),转化完成则为1
OE:控制D0-D7是否输出,为0否,为1则输出
VREF(+)接5V,VREF(-)接地
3、时序
看时序图写程序,大致流程如下,时序图如下:
开始的时候
START=0;
OE=0;
选择地址
START=1
ADDA=0;ADDB=0;ADDC=0//选择000地址即IN0口
delay(5);//延时5毫秒
等待转化完成读取结果
START=0;//EOC此时为0,开始AD转化
while(!EOC);//等待转化结束
OE=1;//准备传输数据到单片机上
delay(5);
temp=P1;//输出口接单片机P1口,将其数据取出
OE=0;//结束转换
二、仿真
器件搜索:89c51、pot-hg(可变电阻)、LM016(LCD1602)、ADC0808
三、程序
功能:将可变电阻的电压显示出来
#include "reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
sbit EOC=P3^3;
sbit OE=P3^4;
sbit start=P3^5;
unsigned int vol=0;
unsigned char s[]={"VOLTAGE:"};
unsigned char s1[]={"0123456789"};
sbit A=P0^0;
sbit B1=P0^1;
sbit C=P0^2;
void delay(unsigned int n )
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void initADC() //ADC初始化(根据时序图)
{
start=0;
OE=0;
start=1;
A=0;B1=0;C=0;//选中000地址
delay(5);
start=0;
while(!EOC);
OE=1;
delay(5);
vol=P1;
OE=0;
}
void writecom(unsigned char com)
{
RS=0;
RW=0;
E=0 ;
P2=com;
delay(5);
E=1;
E=0;
}
void writedat(unsigned char dat)
{
RS=1;
RW=0;
E=0 ;
P2=dat;
delay(5);
E=1;
E=0;
}
void initlcd() // LCD初始化
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
}
void display() //显示函数
{
int i=0,j=0,temp1=0,temp2=0,temp3=0;
writecom(0x80);
delay(5);
while(s[i]!='\0')
{
writedat(s[i]) ;
delay(5);
i++;
}
vol=vol*100/51; //乘以100为了显示小数部分,除以51:256/5V=51,即为了转化为可观察的电压值
temp1=vol/100;
temp2=(vol/10)%10;
temp3=vol%10;
writecom(0x80+0x45);
writedat(s1[temp1]);
delay(5);
writedat('.');
delay(5);
writedat(s1[temp2]);
delay(5);
writedat(s1[temp3]);
delay(5);
writedat('V');
delay(5);
}
void main()
{
initlcd();
while(1)
{
initADC();
display();
}
}
四、总结
学会ADC0808的连线
能够根据时序图写程序
电压值一开始并不能显示,是在仿真之后找关系才能做相应的程序处理,进而显示电压值!
本文含有隐藏内容,请 开通VIP 后查看