压缩包里面有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
用户79732 2009-7-21 15:52
用户545094 2009-6-20 21:22