C语言程序>>ADC0832

 

/******************************************************************
程序说明:ADC0832子程序
注:(1)单片机:AT89S52晶振Fosc:11.0592MHz编程软件:Keil uVision2;
   (2)芯片:ADC0832A/D转换芯片 双通道 串口8位分辨率F渥罡叻直婵纱?56级,可以适应一般的模拟量转换要求
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在 0~5V之间。芯片转换时间仅为 32μS,据有双数据输出可作为数据
校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,
可以轻易的实现通道功能的选择。
   (3)只用一通道 DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。
   (4)当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将 CS使能端置于低电平并
且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号.
   (5)2位数据为1,0时,只对CH0进行单通道转换(本程序用通道0)
    为1,1时,只对CH1进行单通道转换
             为0,0时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入
    为0,1时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入
   (6)从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。
直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATD0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
******************************************************************/
//-----------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------
#include
#include
//-----------------------------------------------------------------
// ADC0832系列 接口引脚
//-----------------------------------------------------------------
#define ADC0832_CS  P1_2  //片选
#define ADC0832_CLK  P1_1  //脉冲
#define ADC0832_DO   P1_0  //数据输出口

//-----------------------------------------------------------------
// 数据类型宏定义
//-----------------------------------------------------------------
#define uchar unsigned char
#define uint  unsigned int

//-----------------------------------------------------------------
// 全局变量:内RAM存储定义
//----------------------------------------------------------------- 
bit  flag_adc0832;
uint  save_addr=2688,adc0832;

//-----------------------------------------------------------------
// 初始化程序区
//-----------------------------------------------------------------

// 定时器初始化
void Timer_Init(void)
{
 TMOD = 0x21;      //设置中断
 TH0=(65536-600)/256; 
    TL0=(65536-600)%256;
 EA  =1;      //A/D总中断开
 ET0  =1;      //A/D定时器0中断开
 TR0  =0;      //A/D定时器0工作关
   TH1  = 0xfd;     //定时器1初值
    TL1  = TH1;      //定时器1初值
    TR1  = 0;      //定时器1工作关
}
 
//-----------------------------------------------------------------
// 功能程序区
//-----------------------------------------------------------------

// 数据暂存
void save_data(void)
{
 flag_adc0832=0; 
 if(save_addr>AT24C64_END)
 {
  save_addr=AT24C64_START;
 }
 AT24C64_Write_Byte(save_addr,adc0832/4);
 save_addr++; 
}

//-----------------------------------------------------------------
// 中断服务程序区
//-----------------------------------------------------------------

// 定时器0中断
void timer0(void) interrupt 1
{
 uchar i,data1=0x00,data2=0x00;
 TH0=(65536-600)/256; 
 TL0=(65536-600)%256; 
//在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号 
 ADC0832_CLK=0;      //初始化
 ADC0832_DO=1;
 _nop_();
 ADC0832_CS=0;
 _nop_();
 ADC0832_CLK=1;
 _nop_();
//在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能
 ADC0832_CLK=0;     //通道0的第一位
 ADC0832_DO=1;
 _nop_();
 ADC0832_CLK=1;
 _nop_(); 
 ADC0832_CLK=0;     //通道0的第二位
 ADC0832_DO=0;
 _nop_();
 ADC0832_CLK=1;
 _nop_();
 
 ADC0832_CLK=0;
 ADC0832_DO=1;

 for(i=0;i<8;i++)     //读取前8位的值 先高位后低位
 {
  _nop_();
  data1<<=1;
  ADC0832_CLK=1;
  _nop_();
  ADC0832_CLK=0;
  if(ADC0832_DO)
   data1|=0x01;
  else
   data1|=0x00;
 }
 for(i=0;i<8;i++)     //读取后8位的值 先低位后高位
 {
  data2>>=1;
  if(ADC0832_DO)
   data2|=0x80;
  else
   data2|=0x00;
  _nop_();
  ADC0832_CLK=1;
  _nop_();
  ADC0832_CLK=0;
 }
 
 if (data1==data2)     //比较前8位与后8位的值,如果不相同舍去。
 {
  adc0832=data2;
 }
 _nop_();
 ADC0832_CS=1;      //将CS置高电平禁用芯片
 ADC0832_DO=1;
 ADC0832_CLK=1; 
 flag_adc0832=1;
}

//-----------------------------------------------------------------
// END of FILE
//----------------------------------------------------------------- 

你可能感兴趣的:(单片机)