基于51单片机ADC0809的基础使用

  对于ADC0809这种基础的模拟转数字的芯片,在现实生活中是很常用的,所以本人再此讲一讲自己做的心得体会。

    首先我们的框架图如下:


                                                                    

接下来我们需要了解ADC0809,其引脚图如下:

                                       

其中

1.IN(0~7):代表的是模拟输号输入通道,可以选择(0~7脚)进行采集;

2.ADD(A~C):这3个脚是用来选择模拟通道输入口的,其真值表如下:

3.START:这个引脚是启动ADC0809的当有一个脉冲输入时,ADC0809会开始转换;

4.ALE:这个引脚是用来装载地址的,当有一个正脉冲输入时,所选的ADD(A~C)会装载在芯片里;

5.EOC:这个引脚是输出脚,当ADC0809处如转换期,或者没有工作时处于低电平状态,当芯片转换成功时会变成高电平;

6.2^(-1~-8):这8个脚是输出脚,从MSB到LSB分别对应的是(128,64......1),在程序中只需将其加起来再除以256*(V_REF+)即得所转换的电压;

7.OUTPUT ENABLE:这个引脚是控制输出的引脚,当为低电平时,输出呈高阻态,数据不输出,当为高电平时,数据输出;

8.CLOCK:时钟信号输入脚其范围为(10KHz到640KHz,根据厂家的不同,其最大输入时钟信号也会有所不同);

9.V_REF+:正基准电压,这里我选择5V;

10.V_REF-:负基准电压,这里我们将其接地;

11.VCC:这里我们接+5V;

12.GND:接地。


写程序时,我们需要了解其时序图,时序图如下:



  从时序图中可以看出,我们在程序中先写地址,然后装载地址,再启动START,当EOC为高时,启动OUTPUT ENABLE,数据输出,单片机读数据。


  从表中可以看出,每个电平的持续时间都是ns级的,51单片机(以12MHz晶振为例),这里我们的机器周期为1us,us<ns,所以在写程序时就不需要进行延时。


  其单片机与ADC0809的连接图如下:



其程序如下:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char


sbit ADDA=P1^0;			   //   地址A
sbit ADDB=P1^1;			   //	地址B
sbit ADDC=P1^2;			   //	地址C
sbit START_ALE=P1^4;	   //	地址装载,转换启动脚
sbit OE=P1^5;			   //	输出使能
sbit EOC=P1^6;			   //	 转换标志位
sbit key_start=P3^2;	   //	 开始转换按键
sbit key_end=P3^3;		   //	  停止转换按键

uchar ADC_Date=0;
uint i;

void ADC_START()		  //ADC转换开始函数
{
	
	START_ALE=1;				  //一个正脉冲
	START_ALE=0;
	while(!EOC);
	OE=1;
}

void usart_timer_init()			  //串口初始化,定时器初始化
{
    TMOD=0x22;					  //定时器1,定时器0都设为方式2
	TH1=253;
	TL1=253;
	TH0=131;
	TL0=131;
	TR1=1;						 //开定时器1
	REN=0;						//不开起串口接收
	SM0=0;						//波特率不加倍,且为方式 1
	SM1=1;
	EA=1;					   //开总中断
} 

void key_scan()					 //按键扫描函数
{
    if(key_start==0)
	{
	   
    	ET0=1;
	    TR0=1;
	   while(1)
	   {
	        if(key_end==0)
			{
				ET0=0;
				TR0=0;
			    break;
			}
	   }		 
	}
}
void main()
{
   ADDA=0;
   ADDB=0;
   ADDC=0;
   START_ALE=0;
   usart_timer_init(); 
   
   while(1)
   {

      key_scan();  
   }
}


void pick() interrupt 1				  //定时器0中断服务函数
{
     ADC_START();
	 ADC_Date=P0;
	 SBUF=ADC_Date;
	 while(!TI);
	 TI=0;
	 OE=0;

}




  • 32
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值