新闻  |   论坛  |   博客  |   在线研讨会
MAX1167 16位AD
0750long | 2009-06-16 12:50:41    阅读:1756   发布文章

MAX1167 16位AD

 

rarMAX1167  16位AD

压缩包里面有MAX1167的器件手册,还有我自己的笔记等。

包含两个程序,测试通过(∩_∩)

一个是用LED显示二进制数据

一个是用液晶1602显示模拟电压和16位二进制数据

希望对大家有用:-)

呵呵,该芯片是同学给我的,从美信公司申请的,免费的16位ADC

概述:
MAX1167为低功耗、多通道、16位逐次逼近型模数转换器(ADC)
具有集成的+4.096V基准、一个基准缓冲器、一个内部振荡器、自动关断等特点
并带有一个高速SPI/QSPI/MICROWIRE兼容的接口
MAX1167采用单+5V模拟电源工作,且具有独立的数字电源
允许直接与+2.7V至+5.5V的数字逻辑接口。

器件引脚图

单电源供电测试电路图

点击开大图


以下为MAX1167头文件
/*--------------------------------------------------------------*/
//File:   MAX1167.H
//Data:   16:51 2009-6-15
//Version:  Ver0.1


/*--------------------------------------------------------------*/
//防止被重复定义
#ifndef  __MAX1167_H__
#define __MAX1167_H__


/*--------------------------------------------------------------*/
//接口定义
sbit AD_DOUT = P2^7;  //数据输出
sbit AD_SCLK = P2^6;  //时钟
sbit AD_DIN   = P2^5;  //数据输入
sbit AD_EOC   = P2^4;  //转换结束
sbit AD_CS  = P2^3;  //片选


/*--------------------------------------------------------------*/
//指令、配置、控制、寄存器设置
//000   00    00   1   //0x01
//通道AIN_0、单通道无扫描、内置参考电压、内部转换时钟

//通道选择
#define AIN_0 0x00 //通道AIN_0
#define AIN_1 0x20 //通道AIN_1
#define AIN_2 0x40 //通道AIN_2
#define AIN_3 0x60 //通道AIN_3

//扫描方式
#define SM_0 0x00 //单通道无扫描
#define SM_1 0x08 //扫描0~AIN_n AIN_n <= 3
#define SM_2 0x10 //扫描2~AIN_n 2 <= AIN_n <= 3
#define SM_3 0x18 //单通道AIN_n扫描四次

//参考电压、省电模式
#define REF_PD_0 0x00 //参考电压内部、内置参考电压开启、参考缓冲开启(转换之间)
#define REF_PD_1 0x02 //参考电压内部、内置参考电压关闭、参考缓冲关闭(转换之间)
#define REF_PD_2 0x04 //参考电压内部、内置参考电压开启、参考缓冲关闭(转换之间)
#define REF_PD_3 0x06 //参考电压外部、内置参考电压关闭、参考缓冲关闭(一直)

//选择转换时钟
#define EXT_CLK  0x00 //外部转换时钟
#define INT_CLK  0x01 //内部转换时钟


/*--------------------------------------------------------------*/
//函数声明
void ad_write_byte(unsigned char dat);  //写入一个字节
unsigned int ad_read_word(void);   //读出一个字
unsigned int ad_read_dat(unsigned char dat);//写入指令并读出一个字
void ad_read_scan_dat(unsigned char dat, unsigned int *scan_dat, unsigned char n);//写入指令并读出n个字


/*--------------------------------------------------------------*/
//写入一个字节
void ad_write_byte(unsigned char dat)
{
 unsigned char i;

 for(i = 8; i != 0; i--)
 {
  AD_SCLK = 0;
  AD_DIN  = (bit)(dat & 0x80); //先发送最高位
  AD_SCLK = 1;     //上升沿写入数据 
  dat <<= 1;
 }
 AD_SCLK = 0;      //拉低时钟线避免干扰
}


/*--------------------------------------------------------------*/
//读出一个字
unsigned int ad_read_word(void)
{
 unsigned char i;
 unsigned int  dat;

 dat = 0;       //初始化变量
 for(i = 16; i != 0; i--)
 {
  dat <<= 1;
  dat |= (unsigned int)(AD_DOUT); //先收到最高位
  AD_SCLK = 1;
  AD_SCLK = 0;
 }
 return (dat);
}


/*--------------------------------------------------------------*/
//写入指令并读出一个字
unsigned int ad_read_dat(unsigned char dat)
{
 unsigned int read_dat;

 AD_CS = 0;    //启动AD
 ad_write_byte(dat);   //写入指令配置
 while(AD_EOC);    //等待转换结束
 read_dat = ad_read_word(); //读出数据
 AD_CS = 1;    //关闭AD
 return (read_dat);
}


/*--------------------------------------------------------------*/
//写入指令并读出n个字
void ad_read_scan_dat(unsigned char dat, unsigned int *scan_dat, unsigned char n)
{
 unsigned char i;

 AD_CS = 0;    //启动AD
 ad_write_byte(dat);   //写入指令配置
 while(AD_EOC);    //等待转换结束
 for(i = 0; i < n; i++)
 {
  *scan_dat = ad_read_word(); //读出数据
  scan_dat++;
 }
 AD_CS = 1;    //关闭AD
}


/*--------------------------------------------------------------*/
#endif

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客