打印

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

[复制链接]
3113|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Galway-Zhang|  楼主 | 2010-12-15 08:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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[k/1000];
        delay();

        P2=0xfd;
        P0=tab1[k%1000/100];
        delay();

        P2=0xfb;
        P0=tab1[k%100/10];
        delay();

        P2=0xf7;
        P0=tab1[k%10];
        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 | 只看该作者
楼主弄出来了吗

使用特权

评论回复
5
Galway-Zhang|  楼主 | 2010-12-16 13:30 | 只看该作者
还不行..折腾了好久了..ADC0832的CLK也对的..通道也是对的..就是出不来电压显示.总感觉程序不对.
这个程序是在书上照着用的..

使用特权

评论回复
6
lhkjg| | 2010-12-16 13:40 | 只看该作者
中国的教科书上程序你也敢相信啊!
看看.ADC0832的PDF文档

使用特权

评论回复
7
Galway-Zhang|  楼主 | 2010-12-17 08:12 | 只看该作者
6# lhkjg

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

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

使用特权

评论回复
8
arao| | 2010-12-17 11:14 | 只看该作者
DI呢,好像没有定义吧

使用特权

评论回复
9
anycrying| | 2010-12-17 11:18 | 只看该作者
首先,你的图不正确,即ADC0832的DI和DO,最好不要连在一起,而是单独控制。其次,就是操作ADC0832的时序不正确,具体请看ADC0832的datasheet。再次就是,ADC0832的DO是先输出高位,所以你位操作时可以直接左移就行,而不用右移。最后,你那个读AD位的程序不正确。

使用特权

评论回复
10
Galway-Zhang|  楼主 | 2010-12-19 01:04 | 只看该作者
9# anycrying

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

所以接在一起是OK的..

是因为少了数据处理..虽然转换完成了.但是如果没有处理转换后的数据.MCU不知道拿什么显示出来.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:LED电源,移动电源,充电器开发,PCBlayout, 电池研发设备开发,动力电池保护板 电池测试仪 QQ:551708558 E-mail:dy188@qq.com 淘宝:http://diy-power.taobao.com

0

主题

267

帖子

2

粉丝