ADC0832检测模拟电压值_Devin_新浪博客

=============================================================================================

`````````````````````````````` 程序思想`````````````````````````````

AD0832与AD08004有所不同,AD0804的数据是并行输出,而AD0832是串行输出,其思想略有复杂。

根据ADC0832的时序,首先选通芯片,在第一个脉冲下沿前让addi为高,在第二个下沿前给addi1位数据,在第三个下沿前给addi1位数据,
两位数据为10时选通CH0,为11时选通CH1; 在第三个下沿后开始接收数据。

数据接收核心思想:
1、以dat来接收从高位到低位传回来的数据,分8次依次接收。 dat每接收一位后向高位移1位,最低位与下一位接收到的数据
 相或,直到接收到8位。
2、以ndat来接收从低位到高位传回来的数据,分8次依次接收。   用参数j来接收1位数据,ndat来存储接收到的8位数据。当j接收到1位数据以后
 向左移7位,到最高位,然后与ndat相或,即将数据传给ndat,ndat每接收到1位以后,其数据向右移1位,直到7位传完。最后将接收到的数据传回即可。

AD00832接收数据共分为19个时钟脉冲,由单片机提供。前三个为初始化,第四个到第11个为高位在先数据,第11到第19个为低位在先数据。

从AD中读到的数据并非为真实的电压值,只是一个虚拟量。真是的电压值为

   V=date*VREF/256,(VREF为外部提供的基准电压,即AD给供电的VCC)

 

*********************转载请注明出处,谢谢!*********************

==============================================================================================

 

#include<reg52.h>
#include <intrins.h>
#define  uchar unsigned char
#define  uint  unsigned int
uchar code table[]={0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
     };

//端口定义
sbit adcs=P3^3;    //芯片选通信号,低有效
sbit adclk=P3^2;   //芯片时钟信号
sbit addo=P3^7;    //通道0
sbit addi=P3^6;    //通道1
uchar date;
int a,b,c;

void delay(uchar z)//延时函数
{
 uchar x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

void delay1()  //延时两个空指令
{
 _nop_();
 _nop_();
}


int ADconvert()   //AD转换


{
 uchar i=0;
 uchar j;
 uint dat=0;
 uchar ndat=0;

addi=1;
 delay1();
 adcs=0;   //芯片选通
 delay1();
 adclk=1;  //
 delay1();
 adclk=0; //下降沿1
 delay1(); 
 adclk=1; //
 addi=0;
 delay1();
 adclk=0; //下降沿2
 delay1();
 adclk=1; //
 addi=1;    //选择通道
 delay1();
 adclk=0; //下降沿3 
 addi=1;
 delay1();
 dat=0;
 for(i=0;i<8;i++)  //串行接收数据 高位在前
 {
  dat|=addo;  //将addo数据给dat
  adclk=1;   //拉高
  delay1();
  adclk=0; //拉低,循环时钟
  delay1();
  dat<<=1; //将数据向左移动1位,方便低位接收下一位数据
  if(i==7)
   dat|=addo; //最后一位数据直接赋给dat
 }
 for(i=0;i<8;i++)   //串行接收数据 低位在前
 {
  j=0;   //每次接收前复位为0
  j|=addo; //j用来接收1位数据
  adclk=1;   //拉高
  delay1();
  adclk=0; //拉低,循环时钟
  delay1();
  j<<=7;  //将接收到的数据移动到最高位
  ndat=ndat|j;  //将接收到的数据传给ndat
    if(i<7)
   ndat>>=1; //每接收到1为数据,ndat向右移动1位
 }
   adcs=1;
   adclk=0;
   addo=1;   //回到初始状态
   dat<<=8;   //int型数据为16位,将接收到的8位数据移到高8位,
   dat|=ndat;
   return(dat);
}

void display()     //数码管显示
{
  P1=0xf0;
  P2=table[a];
  delay(10);
  P1=0xf2;
  P2=table[b];
  delay(10);
  P1=0xf4;
  P2=table[c];
  delay(10);
 
}

void main()
{
  int num; 
 delay(500);
 adcs=1;

while(1)
 {
  date=ADconvert(); //获取转换数据
     a=date/100;
  b=date0/10;
  c=date;
  for(num=255;num>0;num--)
  {
    display();
  }

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值