找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5184|回复: 11
收起左侧

A/D转换测量电压,并将结果显示在数码管上,电压显示为0?

[复制链接]
ID:74777 发表于 2018-9-6 09:30 | 显示全部楼层 |阅读模式
1黑币
利用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;                        //时钟信号
}


回复

使用道具 举报

ID:303383 发表于 2018-9-6 11:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:74777 发表于 2018-9-6 13:28 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-9-6 11:11
你好!无法的软件和硬件的问题
1、器件端口连接和程序,是否对应
2、ADC0809 对时钟有要求,是否满足

ADC0809没有输出数据
回复

使用道具 举报

ID:98992 发表于 2018-9-6 16:08 | 显示全部楼层
我也在学习 AD转换 但是我用的是STC单片机自身带的
回复

使用道具 举报

ID:74777 发表于 2018-9-7 16:26 | 显示全部楼层
erli122 发表于 2018-9-6 16:08
我也在学习 AD转换 但是我用的是STC单片机自身带的

我这边单片机不带ADC功能
回复

使用道具 举报

ID:388197 发表于 2018-9-9 23:42 | 显示全部楼层
没必要用0809了,0809价格贵,而且只有8位,还需要提供时钟,占用IO口也多,现在随便一款4块钱一片的51片上集成ADC性能完爆0809
回复

使用道具 举报

ID:332997 发表于 2018-9-10 10:52 | 显示全部楼层
可以用一个简单的14脚 IC 搞定,如 芯海 义隆 九齐 华润 晟矽微 等等
回复

使用道具 举报

ID:387733 发表于 2018-9-10 12:51 | 显示全部楼层
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;
回复

使用道具 举报

ID:111634 发表于 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)
回复

使用道具 举报

ID:209126 发表于 2018-9-12 10:13 | 显示全部楼层
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;
回复

使用道具 举报

ID:74777 发表于 2018-10-30 10:31 | 显示全部楼层
shang1205 发表于 2018-9-12 10:13
g2=sum/100%10;        //十分位,这条语句是错的,正确的应该是:g2=sum%100/10;

多谢。。。。。。。。。。。。。
回复

使用道具 举报

ID:74777 发表于 2018-10-30 14:53 | 显示全部楼层
zl2168 发表于 2018-9-12 07:45
介绍你几个参考案例,自己去对照研究。
实例81  ADC0808中断方式A-D(ALE输出CLK)

谢啦,我再研究一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表