我用51单片机控制ad0809转换0~5v电压,程序如下,经led灯检查AD转换结果没错,但到数码管显示不出0~2.5

电压从5v下降到2.5v显示正常,但是过了2.5v数码管又从5v开始下降,当电压为0v时显示2.5v。在程序中如果把uint voltage相关变量更改成uchar型,结果就变成0~2.5v正常,过了2.5v又从0开始显示,5v时显示2.5v。请各位高手解答!!!在线等

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit a=P3^0;
sbit b=P3^1;
sbit c=P3^2;
sbit oe=P3^6;
sbit st=P3^7;
sbit eoc=P3^5;
uchar cha,adt;
uint jg;
uchar zx[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
uchar zw[]={0x70,0xb0,0xd0,0xe0};
uchar h[]={0xff,0xff,0xff,0xff};

void delay(uchar m) //误差 0us
{
unsigned char a,b,c;
for(c=m;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay1()
{;;}
void disp(uchar channel,uint voltage)
{
uint getc=voltage;
uchar n;
getc=getc*49/25;
h[0]=channel;
h[1]=getc/100;
h[2]=getc%100/10;
h[3]=getc%10;
for(n=0;n<4;n++)
{
P0=zx[h[n]];
P1=zw[n];
delay(3);
P1=0xf0;
}
}

void ad0809()
{
a=0;
b=0;
c=0;
oe=0;
st=0;
delay1();

st=1;
delay1();
st=0;
delay(1);
while(!eoc);
oe=1;
jg=P2;
oe=0;
}
void main()
{

uchar ch;

while ( 1 )
{
ad0809();
ch=0;
disp(ch,jg);
}
}
另外直接disp(ch,0xff)显示30,证明显示转换也是正常,真不知道为什么了

你的计算还是有一点小问题。同时,你的显示程序肯定有问题。
“直接disp(ch,0xff)显示30?”
你算过没?
255*49/25=499.8.为什么会显示30?
ADC0809 是8 位逐次逼近型A/D转换器。
理论上5/256=0.01953125。
结果你算成了5/255=0.0196,所以你弄了个49/25=1.96.相当于扩大100倍。然后,在显示的时候,再除以100显示到百位。把余数除10显示到十位。再把个位数直接送到个位显示。这个方法是没有错的。
那就是显示程序出问题了!
由于你的显示程序无法看懂(没有具体的电路),所以,这段程序,你必须自己根据硬件重新写过!
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-18
你jg的类型换成uchar,把voltage和getc都改成uchar型。把getc=getc*49/25;这一句改成(uint)getc=((uint)getc*49)/25;试试。追问

按你的方法改了 没有结果了,显示全0

追答

getc=getc*49/25 你这一句是干什么用的?你用proteus单步一下,看看各个变量值是不是你预想的东西。
给我你的邮箱,我直接发给你一个程序得了,还有proteus仿真图。

本回答被提问者采纳
第2个回答  2011-08-18
建议 去 我的领地 5d6d 的 proteus 论坛看看

那里有很多 单片机仿真实例,包括proteus 仿真图 和 源码
第3个回答  2011-08-18
proteus 论坛

单片机数码管显示电压,调节电压大小控制led灯亮度
如图,是亚龙单片机实验模块,这样接好后,调节电压源电压就可以调节电平指示灯。再把AD0809的输出数据用数码管显示即可。AD0809时钟源为500KHZ

懂80C51单片机的进~
1)电路图2)说明(大致主要的引脚功能等设计说明)3)流程图4)ADC0809和LCD1602的驱动子程序我知道不... 条件:80C51单片机,ADC0809,LCD1602及按键。目的:8路PT100温度巡检0~100度。1)电路图 2)说明(大致主要的引脚功能等设计说明)3)流程图 4)ADC0809和LCD1602的驱动子程序我知道不可能有人全做出来,那很费时间的,...

相似回答