ADC0809电压表

2019-07-16 01:22发布

设计图如下, 设计图
由于已经硬件实现,无法更改,现附上程序,求高手挑错。
//---------------------------------------
// AD0809 by maomaochong
// Date: 2011/8/31
// time: 15:54
// Function: ADDA-ADDC connect to P2.0-P2.2 to choose AD channel
//---------------------------------------

#include "reg51.h"

sbit ST_ALE=P3^0;                //START and ALE both connect to P3.0
sbit EOC=P3^1;                        //EOC connect to P3.1                                       
sbit OE=P3^2;                        //OE conect to P3.2
sbit CLK=P3^3;                        //CLK connect to P3.3
unsigned char CHANNEL;        //AD channel variable
unsigned char LED[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//common cathode LED code
unsigned char CHECK[4]={0xFE,0xFD,0xFB,0xF7};        //choose LED channel

void delay(unsigned char time)
{
        unsigned char i,j;
        for(i=time;i>0;i--)
                for(j=250;j>0;j--)
                ;
}

void display()
{
        unsigned long temp;
        unsigned char DATA,digit[4];
        unsigned int k,l;
        DATA=P1;                                        //save AD data
        temp=DATA;                                        //the temporary variable
    temp=temp*1000/51;                        //AD formula:D=A*5/255
        digit[0]=temp/1000;                        //the thousands place
        digit[1]=temp%1000/100;                   //the hundreds place
        digit[2]=temp%1000%100/10;         //the tens place
        digit[3]=temp%1000%100%10;        //the ones place
        DATA=P2;                                          //save P2
        for(k=0;k<1000;k++)
        {
        /*        lighten each LED and equal the below for loop
                P1=LED[digit[0]]+0x80;
                P2_4=0;
                P2_4=1;
                P1=LED[digit[1]];
                P2_5=0;
                P2_5=1;
                P1=LED[digit[2]];
                P2_6=0;
                P2_6=1;
                P1=LED[digit[3]];
                P2_7=0;
                P2_7=1;
        */
                for(l=0;l<4;l++)
                {
                        P2=P2|0x0F;                        //avoid LED residual
                        P0=LED[digit[l]]+0x80*(l==0);        //LED code
                        P2=DATA&CHECK[l];        //choose LED channel
                }
        }
        P2=DATA;                                        //restore P2       
}

void main()
{

        ST_ALE=0;                        //START and ALE default
        OE=0;                                //OE default
        TMOD=0x02;                        //T0 operate in mode 2
       
        EA=1;                                //all interrupt enable
        ET0=1;                                //T0 interrupt enable
        TR0=1;                                //T0 run
        while(1)
        {
               
                ST_ALE=1;                //lock the AD channel address
                ST_ALE=0;                //AD run
                while(EOC==0);        //wait until AD over
                OE=1;                        //enable to transmit AD data
                display();                //view the AD result and diaplay LED
               
       
               
        }       
}

void T1_TIME() interrupt 1 using 0
{
        CLK=~CLK;                        //CLK 500 kHz
}

具体问题为数码管显示数值和滑动变阻器显示数值不同,求解。若需要源设计,请发邮件到994504828@qq.com。新手小白一个,请大神指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。