51的ADC0832

2019-07-16 06:00发布

这是我写的ADC0832的采样和数码管显示程序  通过按键切换采样通道,调了很久都不行  真心求助高手
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS   = P1^3;
sbit Clk = P1^0;
sbit DAti = P1^1;
sbit DATO = P1^2;
sbit xsd=P0^7;
sbit s1=P2^2;
sbit we1=P2^7;
sbit we2=P2^6;
sbit we3=P2^5;
sbit we4=P2^4;
uchar tab[]={0XEC,0XD8,0XC4,0XB0,0X9C,0X92,0X90,0X8E,0X8C,0XFC,0XFA,0XF8,0XF6,0XEC,0XD8,
0XC4,0XB0,0X9C};//显示0-9段码
uint i,ge,shi,bai,qian,getdata,number;
unsigned char dat;
void delayms(uint x);                //可控延时函数
void display0();
void AD();
void key();
void key()
{
        P2=0xff;

        if(s1==0)
                {
                        delayms(5);//延时判断5ms
                        if(s1==0)
                        {
                                number++;
                                if(number==3)
                                        number=0;
                                        while(!s1);// 松手检测
                        }

                }

}

main()
{
        number=0;       
        while(1)
        {
                AD();
                display0();
                key();
        }
                       
}


void delayms(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=240;j>0;j--);
}

void AD()

{
        unsigned char i,test,adval;
        adval=0x00;
    test=0x00;
        Clk=0;       //初始化
    DATI=1;
        _nop_();
        _nop_();
    CS=0;
    _nop_();
        _nop_();
    Clk=1;
        _nop_();
        _nop_();
        if(number==1)//通道选择
        {
                Clk=0;
        DATI=1;//通道0的第一位
        _nop_();
                _nop_();       
                Clk=1;
                _nop_();
                _nop_();       
                Clk = 0;
        DATI = 0; //通道0的第二位
        _nop_();
                _nop_();       
        Clk = 1;
        _nop_();
               
     }
    else
    {
                Clk=0;
        DATI=1; //通道1的第一位
                _nop_();      
                _nop_();
        Clk=1;
                _nop_();
                _nop_();               
                Clk=0;
        DATI=1;  //通道1的第二位
                _nop_();      
                _nop_();
        Clk=1;
        _nop_();
               
    }
                Clk=0;
                DATI=1;
        for(i=0;i<8;i++ ) //从高位向低位读取8位AD值  
    {
       
                _nop_();
                adval<<=1;
        Clk=1;
                _nop_();      
                _nop_();
        Clk=0;
        if(DATO)
          adval|=0x01;
        else
          adval|=0x00;
    }

        for(i=0;i<8;i++) //从低位向高位读取8位AD值
                {
                        test>>=1;
            if(DATO)
                    test|=0x80;
            else
                test|=0x00;
                        _nop_();         
                        _nop_();
            Clk=1;
            _nop_();
                        _nop_();               
            Clk=0;
        }

                dat=test;
                _nop_();       
                _nop_();
        CS = 1;   //释放ADC0832
        DATO = 1;
        Clk = 1;
                getdata=dat;
}
void display0()
{
       
                qian=(getdata*49*5/25)/1000;//读得的数据乘以2再乘以98%,再乘以5倍的分压除以1000得千位
                bai=((getdata*49*5/25)%1000)/100;//数值对1000求余后的得剩下几位,对100整除后得百位
                shi=(((getdata*49*5/25)%1000)%100)/10;//分出十位
                ge=(((getdata*49*5/25)%1000)%100)%10;//分出个位
                P0=tab[qian];//送千位显示
            we1=0;//选择第一个数码管
                delayms(1);
                P0=tab[bai];//送百位显示
                xsd=0;
                we2=0;//选择第二个数码管
                delayms(1);
                P0=tab[shi];//送十位显示
                we3=0;//选择第三个数码管
                delayms(1);
                P0=tab[ge];//送各位显示
                we4=0;//选择第四个数码管
                delayms(1);                       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。