标题: A/D转换测量电压,并将结果显示在数码管上,电压显示为0? [打印本页]

作者: 九零后大将    时间: 2018-9-6 09:30
标题: A/D转换测量电压,并将结果显示在数码管上,电压显示为0?
利用ADC0809测量电压,并将测量结果显示在数码管上,程序烧录进去,数码管显示为0,时序也没发现什么问题,就是读不出数据?哪位大神帮忙检查一下,谢谢
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //共阴极数码管0~9数码,不带小数点
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //共阴极数码管0~9数码,带小数点

sbit _CLK=P1^7;        //时钟信号输入线
sbit _ST=P1^6;        //转换启动信号
sbit _EOC=P1^5; //转换结束信号
sbit _OE=P1^4;        //输出允许信号
sbit _ALE=P1^3; //地址锁存输入线
sbit _A=P1^0;   //
sbit _B=P1^1;        //
sbit _C=P1^2;        //输入地址线
sbit LED1=P2^0; //数码管1段选控制位,低电平有效
sbit LED2=P2^1; //数码管2段选控制位,低电平有效
sbit LED3=P2^2; //数码管3段选控制位,低电平有效

void delay_us(uint m)                //@12.000MHz
{
        while(m--)
        {
                _nop_();
                _nop_();
                _nop_();
                _nop_();
           }
}
void display(uchar num)
{
        uchar g1,g2,g3;
        uint sum;
        sum=(500/255)*num;//电压转换,5V做外参考电压,分成256份
        g3=sum/100;        //个位
        g2=sum/100%10;        //十分位
        g1=sum%10;        //百分位
               
        P2=0xfe;
        P0=table2[g1];
        delay_us(10);
        P2=0xfd;
        P0=table1[g2];
        delay_us(10);
        P2=0xfb;
        P0=table1[g3];
        delay_us(10);
}
void adc()
{
        uchar num;
        _ST=0;
        _OE=0;
        _ALE=0;
        _A=0;
        _B=0;
        _C=0;        //选择第一个通道即IN0
        _ALE=1;        //上升沿,通道锁存地址
        _ST=1;        //上升沿,对所有寄存器清零
        _ST=0;        //下降沿启动转换
        while(!_EOC);
        _OE=1;
        num=P3;
        _OE=0;
        display(num);
}

void main()
{
        TMOD=0x00;
        TH0=0xFF;
        TL0=0xFA;
        TR0=1;
        ET0=1;
        EA=1;
        while(1)
        {
                adc();
                delay_us(100);
        }

}
void Timer0() interrupt 2
{
        TH0=0xFF;
        TL0=0xFA;       
        _CLK=~_CLK;                        //时钟信号
}



作者: 小猫猫爱吃鱼    时间: 2018-9-6 11:11
你好!无法的软件和硬件的问题
1、器件端口连接和程序,是否对应
2、ADC0809 对时钟有要求,是否满足
3、静态给数码管几个数据,看显示是否正常
4、处理问题的时候,采用排除法
作者: 九零后大将    时间: 2018-9-6 13:28
小猫猫爱吃鱼 发表于 2018-9-6 11:11
你好!无法的软件和硬件的问题
1、器件端口连接和程序,是否对应
2、ADC0809 对时钟有要求,是否满足

ADC0809没有输出数据
作者: erli122    时间: 2018-9-6 16:08
我也在学习 AD转换 但是我用的是STC单片机自身带的
作者: 九零后大将    时间: 2018-9-7 16:26
erli122 发表于 2018-9-6 16:08
我也在学习 AD转换 但是我用的是STC单片机自身带的

我这边单片机不带ADC功能
作者: cjm82    时间: 2018-9-9 23:42
没必要用0809了,0809价格贵,而且只有8位,还需要提供时钟,占用IO口也多,现在随便一款4块钱一片的51片上集成ADC性能完爆0809
作者: 北极泥    时间: 2018-9-10 10:52
可以用一个简单的14脚 IC 搞定,如 芯海 义隆 九齐 华润 晟矽微 等等
作者: sxhwdz    时间: 2018-9-10 12:51
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;
作者: zl2168    时间: 2018-9-12 07:45
本帖最后由 zl2168 于 2018-9-12 12:54 编辑

介绍你几个参考案例,自己去对照研究。
实例81  ADC0808中断方式A-D(ALE输出CLK
实例81 ADC0808A-D( ALE输出CLK,中断方式).rar (54.32 KB, 下载次数: 13)

实例82  ADC0808查询方式A-D(ALE输出CLK
实例82 ADC0808A-D( ALE输出CLK,查询方式).rar (54.04 KB, 下载次数: 7)

实例83  ADC0808延时方式A-D(ALE输出CLK
实例83 ADC0808A-D( ALE输出CLK,延时等待方式).rar (54.13 KB, 下载次数: 7)

实例84  ADC0808并行A-D(虚拟CLK
实例84 ADC0808A-D(虚拟CLK).rar (35.75 KB, 下载次数: 7)

Proteus仿真一下,确认有效。以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1.书中电路和程序设计有详细说明,程序语句条条有注解。

作者: shang1205    时间: 2018-9-12 10:13
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;
作者: 九零后大将    时间: 2018-10-30 10:31
shang1205 发表于 2018-9-12 10:13
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;

多谢。。。。。。。。。。。。。
作者: 九零后大将    时间: 2018-10-30 14:53
zl2168 发表于 2018-9-12 07:45
介绍你几个参考案例,自己去对照研究。
实例81  ADC0808中断方式A-D(ALE输出CLK)

谢啦,我再研究一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1