您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页ADC0809模块制作

ADC0809模块制作

来源:华佗小知识
 基于51的ADC0809的AD转换模块

一.模块介绍:

本模块用ADC0809采集模拟信号后在LCD1602上显示数字量

1.ADC0809芯片的引脚介绍

电源地引脚:GND,VCC

输入引脚: IN0~IN7:模拟量8通道的输入 VREF+,VREF-:正负参考电压输入

输出引脚: D0~D7:数字量8位输出(和单片机连接时注意D0为最高位)

通道选择引脚:CBA: 对应二进制为所选输入通道(如:000 为通道0) ALE: Address latch enable. Input to latch in the digital address (ADDR2–0) on the rising edge of the multiplexer. (通道使能:上升沿使能)

控制引脚: ST: Start of conversion. Active high digital input pulse initiates conversion.(开始转换信号,输入高电平脉冲有效)

EOC:End of conversion. This output goes low after a START pulse occurs, stays low for the entire A/D conversion, and goes high after

conversion is completed. Data on DB0–DB7 is valid on rising edge of EOC and stays valid until next EOC rising edge.(转换结束信

号,转换开始时拉低,拉高后转换结束)

OE:Output enable input.When OE = 1,DB0–DB7 active outputs.(置高时 输出使能)

CLK:Clock. Clock input provides timing for A/D converter, S/H, and digital Interface. (转换时钟信号,范围100KHZ~1024KHZ) 2.LCD1602

引脚介绍:

电源地引脚:VDD,A(背光电源) Vss,K(背光地)

VO: 接一电位器分压来调节LCD亮度

输入引脚: DB0~DB7 在控制引脚的情况下输出 数据或指令 控制引脚: RS: 数据命令选择(H~数据 L~命令) R/W:读写选择 (H~读 L~写)

二.仿真分析:

1.仿真图:

LCD1LM016LVSSVDDVEERSRWE45612371011121314D0D1D2D3D4D5D6D7RP1U11918XTAL1XTAL2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617D0D1D2D3D4D5D6D712345679U3(IN0)V=0.208798293031RSTPSENALEEARV12627281231000k45C3C2C1STVCCV=525242322121%U3IN0IN1IN2IN3IN4IN5IN6IN7ADD AADD BADD CALEVREF(+)VREF(-)ADC0809CLOCKSTARTEOCOUT1OUT2OUT3OUT4OUT5OUT6OUT7OUT8OE10672120191881514179CLKSTEOCD7D6D5D4D3D2D1D0OEOEEOCSTCLKC3C2C112345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7ATC51LCD1LM016LVSSVDDVEERSRWE45612371011121314D0D1D2D3D4D5D6D7 U3(IN0)V=0.208798RV14%1000kC32.49999 2.42 -0.4% 4.68766 4.6844 -0.06% 2.数据记录: Vin(V) Vout(V) 误差 3.67734 3.6848 +0.2% 5.0 4.9980 -0.04% 0.208798 0.2156 3.257% 3.数据分析:

由表中可知:仿真数据精度满足要求!

三.硬件制作: 1.PCB原理图:

2.PCB图:

193210123112141212852111227613227143261542515338165242411126233755103472248669821168772015788712101914699634111813510105121712411114131611312123141510213132129114141123315152161614321

3.实物图: ADC0809

LCD1602

4.测试方法:将板上参考电压分压后的电压ref(如图中)接入IN0~IN7中的一个通道,连接好其他的各数据接口后,调节电位器,将在LCD1602上看到相应的电压值,并用电压表测出ref的电压记录后可得到精确度!(注意给ADC0809提供的电源电压要求是稳定直流电压,其中芯片参考电压加接了一个跳帽用来接VCC或外部稳定直流电压)

四.软件分析: 源代码:

文件1:AD0809.c

头文件:#include

#include \"1602.h\" //自己编写的头文件

宏定义:sbit OE = P1^0; sbit EOC = P1^1; sbit START = P1^2;

sbit CLK = P1^3; //ADC0809控制端口

sbit AD_A = P1^4; sbit AD_B = P1^5; sbit AD_C = P1^6;

sbit ALE = P1^2; //ADC0809通道选择

#define Data_OUT P3 //ADC0809数据输出 全局变量:long int dat; //AD数据输出量 long int result; //AD数据转换后的量 long int a[5]; //转换量存入数组

unsigned char *b = {\"01234567\//1602显示字符

函数接口:

1.adc转换函数接口:

void adc0809() {

AD_A = 0; AD_B = 0;

AD_C = 0; //选好通道0

START = 0; OE = 0; START = 1;

START = 0; //开始数模转化

while(EOC == 0); //等待转化结束 OE = 1; //数据输出使能 dat = Data_OUT;

DelayMs(10); //延时等待输出转换结果

OE = 0;

result = dat*196; //模拟转换为数字量,每位数字

约为Vref/255 = 0.0196,此处Vref为5V }

2.1602显示函数接口: void display(int a[])

{

int i;

a[0] = result/10000;

a[1] = result%10000/1000; a[2] = result%1000/100; a[3] = result%100/10;

a[4] = result%10; //将数字量存入数组a中

LCD_Init(); //LCD1602初始化 LCD_Write_String(0,0,\"volit:\"); LCD_Write_Char(12,0,'V'); LCD_Write_Char(7,0,'.'); LCD_Write_Char(6,0,b[a[0]]); for(i=0; i<4; i++) {

LCD_Write_Char(8+i,0,b[a[i+1]]); } }

//写入要显示的数据及提示信息

3.主函数: void main()

{

SCON=0x50;

TMOD=0x01; //定时器0工作于方式一 TH0=(65536-2)/256;

TL0=(65536-2)%256;//初始化T0的计数寄存器,2uss 溢出申请中断

//定时器中断,提供AD转换的时钟源

EA=1; //打开总中断 ET0=1; //打开定时器零中断

TR0=1; //暂不启动T0

while(1) {

adc0809();

DelayMs(150); //每150ms转换更新一次

display(a); //显示转换结果 }

}

4.中断函数:(为AD提供时钟信号) void t0(void) interrupt 1

{

TH0=0xff;

TL0=(65536-2)%256; //重装定时器中断值 CLK=~CLK; //电平反向得到时钟脉冲

}

//AD时钟频率范围 100khz~1024khz

文件2:1602.h //1602头文件 void DelayUs2x(unsigned char t); //延时~ T=2*t + 5us

void DelayMs(unsigned char t); //延时tMs bit LCD_Check_Busy(void);

//判断忙

void LCD_Write_Com(unsigned char com); //写命令 void LCD_Write_Data(unsigned char Data); //写数据 void LCD_Clear(void);

//清屏

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); //在坐标(x,y)处写字符

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);

//从坐标(x,y)处开始写字符串

//初始化

void LCD_Init(void);

文件3:1602.c 头文件及宏定义:

#include

sbit RS = P2^0; //数据(1)命令(0)选择位 sbit RW = P2^1; //读(1)写(0)选择位 sbit EN = P2^2; //使能信号(高有效) #define DATA_IN P0 //数据接口 函数接口:

1.延时函数接口(两个)

void DelayUs2x(unsigned char t) {

while(--t);

} //延时约为2*t+5us

void DelayMs(unsigned char t) {

while(t--) {

DelayUs2x(245);

DelayUs2x(245);

} }

2.1602函数接口 判断忙函数:(函数返回值为 bit )

bit LCD_Check_Busy(void)

{

DATA_IN = 0XFF; RS = 0; RW = 1;

EN = 0; //读(1)命令(0) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 return (bit)(DATA_IN & 0X80); }

写命令函数:

void LCD_Write_Com(unsigned char com)

{

while(LCD_Check_Busy()); //判断忙 RS = 0;

DATA_IN = com; RW = 0;

EN = 0; //写(0)命令(0) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 }

写数据函数:

void LCD_Write_Data(unsigned char Data) {

while(LCD_Check_Busy()); //判断忙 RS = 1;

DATA_IN = Data; RW = 0;

EN = 0; //写(0)数据(1) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 }

清屏函数:

void LCD_Clear(void)

{

LCD_Write_Com(0x01); DelayMs(5); //等待清屏完成 }

写字符串函数:

void LCD_Write_String(unsigned y,unsigned char *s) {

if (y == 0) {

LCD_Write_Com(0x80 + x); } else {

LCD_Write_Com(0xC0 + x); } while (*s) {

LCD_Write_Data( *s); s ++; } }

char x,unsigned

char 写字符函数:

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {

if (y == 0) {

LCD_Write_Com(0x80 + x); } else {

LCD_Write_Com(0xC0 + x); }

LCD_Write_Data( Data); }

初始化函数:

void LCD_Init(void) {

LCD_Write_Com(0x38); /*显示模式设置*/ LCD_Write_Com(0x08); /*显示关闭*/ LCD_Clear(); /*显示清屏*/

LCD_Write_Com(0x06); /*显示光标移动设置*/ LCD_Write_Com(0x0C); /*显示开及光标设置*/

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务