Galway-Zhang 发表于 2010-12-15 08:37

ADC0832+8951做电压表.显示为0000

用ADC0832和8951做了一个电压表.但数码管只是显示0000,不能显示当前电压值.
请高人指点.
#include"reg52.h"

sbit        DO        =P1^2;
sbit        CS        =P1^0;
sbit        CLK        =P1^1;

unsigned char adval;        //AD值

unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴
unsigned char code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阳

unsigned char A_D(bit CH)
{
        unsigned char i;
        CS=0;                        //片选
        CLK=0;                        //时钟拉低
        CLK=1;                        //时钟拉高
        DO=1;                        //启动信号
        if(CH==0)
        {
                CLK=0;
                CLK=1;
                DO=1;                //通道0的第1位

                CLK=0;
                CLK=1;
                DO=0;                //通道0的第2位

        }
        else
        {
                CLK=0;
                CLK=1;
                DO=1;                //通道1的第1位

                CLK=0;
                CLK=1;
                DO=1;                //通道1的第2位
        }
        CLK=1;
        CLK=0;
        for(i=0;i<8;i++)
        {
                CLK=1;
                CLK=0;
                if(DO)
                        adval=(adval>>1)|0x80;
                else
                        adval=(adval>>1)|0x00;
        }
        CS=1;
        return(adval);
}
void delay(void)
{
        int k;
        for(k=0;k<600;k++);
}

void display(int k)
{
        P2=0xfe;                //1111 0111
        P0=tab1;
        delay();

        P2=0xfd;
        P0=tab1;
        delay();

        P2=0xfb;
        P0=tab1;
        delay();

        P2=0xf7;
        P0=tab1;
        delay();
        P2=0xff;
}

void main(void)
{
        P2=0xff;
        P0=0xff;
        while(1)
        {
                A_D(0x00);
                display(adval);
        }
}

shell.albert 发表于 2010-12-15 09:08

proteus? 网上有许多实例,下载看看。

arao 发表于 2010-12-15 09:31

楼主的图不怎么清晰啊,能不能放大一点

arao 发表于 2010-12-16 12:25

楼主弄出来了吗

Galway-Zhang 发表于 2010-12-16 13:30

还不行..折腾了好久了..ADC0832的CLK也对的..通道也是对的..就是出不来电压显示.总感觉程序不对.
这个程序是在书上照着用的..

lhkjg 发表于 2010-12-16 13:40

中国的教科书上程序你也敢相信啊!
看看.ADC0832的PDF文档

Galway-Zhang 发表于 2010-12-17 08:12

6# lhkjg

不信与否..但是我在网上找了N多.也还是不行...CS.CLK.DIO定义都接对了.

看了PDF...工作时钟都对的.就是好像少了点什么..数据处理?

arao 发表于 2010-12-17 11:14

DI呢,好像没有定义吧

anycrying 发表于 2010-12-17 11:18

首先,你的图不正确,即ADC0832的DI和DO,最好不要连在一起,而是单独控制。其次,就是操作ADC0832的时序不正确,具体请看ADC0832的datasheet。再次就是,ADC0832的DO是先输出高位,所以你位操作时可以直接左移就行,而不用右移。最后,你那个读AD位的程序不正确。

Galway-Zhang 发表于 2010-12-19 01:04

9# anycrying

DI与DO是可以连在一起的..DI只是在AD启动时.未开始数据转换时.在他们之间存在有意义...也就是在前三个周期下降沿时.才有效..这时可以选择AD的通道.或者AD的输入CH0 CH1的功能.

所以接在一起是OK的..

是因为少了数据处理..虽然转换完成了.但是如果没有处理转换后的数据.MCU不知道拿什么显示出来.
页: [1]
查看完整版本: ADC0832+8951做电压表.显示为0000