标题: 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
ADC0809没有输出数据
作者: erli122 时间: 2018-9-6 16:08
我也在学习 AD转换 但是我用的是STC单片机自身带的
作者: 九零后大将 时间: 2018-9-7 16:26
我这边单片机不带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)
实例82 ADC0808查询方式A-D(ALE输出CLK)
实例83 ADC0808延时方式A-D(ALE输出CLK)
实例84 ADC0808并行A-D(虚拟CLK)
先Proteus仿真一下,确认有效。以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社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
多谢。。。。。。。。。。。。。
作者: 九零后大将 时间: 2018-10-30 14:53
谢啦,我再研究一下
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |