原创 ADC0832程序

2008-10-26 16:44 2672 5 5 分类: MCU/ 嵌入式

#include <reg51.H>
#include "intrins.h"



#define uint unsigned int
#define uchar unsigned char


//ADC0832的引脚
sbit ADCS =P1^0;  //ADC0832 chip seclect
sbit ADDI =P1^2;  //ADC0832 k in
sbit ADDO =P1^2;  //ADC0832 k out
sbit ADCLK =P1^1;  //ADC0832 clock signal


unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,/*0xfe,0xef,0xdf,0xbf,0x7f*/};  //位扫描
unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};  //共阳数码管字段码
unsigned char dispbuf[3];
uint temp;
uchar getdata; //获取ADC转换回来的值



void delayms(void)  //12mhz delay 1.01ms
{
   unsigned char x,y;  
   x="10";
   while(x--)
  {
       y="4";
       while(y--);
    }
}
void display(void)  //数码管显示函数
{
  char k;
 for(k=0;k<3;k++)
  {


  P0 = dispbitcode[k];
  P2 = dispcode[dispbuf[k]];
   delayms();
  if(k==2)   //加上数码管的dp小数点
   P2&=0x7f;
  delayms();
    P0=0xff;
  }
}


/************
读ADC0832函数
************/


//采集并返回
unsigned int Adc0832(unsigned char channel)     //AD转换,返回结果
{
    uchar i="0";
    uchar j;
    uint dat="0";
    uchar ndat="0";


    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI="1";
    _nop_();
    _nop_();
    ADCS="0";//拉低CS端
    _nop_();
    _nop_();
    ADCLK="1";//拉高CLK端
    _nop_();
    _nop_();
    ADCLK="0";//拉低CLK端,形成下降沿1
    _nop_();
    _nop_();
    ADCLK="1";//拉高CLK端
    ADDI="channel"&0x1;
    _nop_();
    _nop_();
    ADCLK="0";//拉低CLK端,形成下降沿2
    _nop_();
    _nop_();
    ADCLK="1";//拉高CLK端
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK="0";//拉低CLK端,形成下降沿3
    ADDI="1";//控制命令结束
    _nop_();
    _nop_();
    dat="0";
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK="1";
        _nop_();
        _nop_();
        ADCLK="0";//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    } 
    for(i=0;i<8;i++)
    {
        j="0";
        j="j|ADDO";//收数据
        ADCLK="1";
        _nop_();
        _nop_();
        ADCLK="0";//形成一次时钟脉冲
        _nop_();
        _nop_();
        j="j"<<7;
        ndat="ndat|j";
        if(i<7)ndat>>=1;
    }
    ADCS="1";//拉低CS端
    ADCLK="0";//拉低CLK端
    ADDO="1";//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k
}



void main(void)

  while(1)
  {
  getdata="Adc0832"(0);
  temp="getdata"*1.0/255*500;  //电压值转换,5V做为参考电压,分成256份。
  dispbuf[0]=temp%10;  //个位
  dispbuf[2]=temp/10%10; //十位
  dispbuf[1]=temp/100; //百位
  display();
  }
}



 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条