我用51单片机控制ad0809转换0~5v电压,程序如下,经led灯检查AD转换结果没错,但到数码管显示不出0~2.5
电压从5v下降到2.5v显示正常,但是过了2.5v数码管又从5v开始下降,当电压为0v时显示2.5v。在程序中如果把uintvoltage相关变量更改成uchar型,结果...
电压从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,证明显示转换也是正常,真不知道为什么了 展开
#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,证明显示转换也是正常,真不知道为什么了 展开
4个回答
展开全部
你的计算还是有一点小问题。同时,你的显示程序肯定有问题。
“直接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显示到十位。再把个位数直接送到个位显示。这个方法是没有错的。
那就是显示程序出问题了!
由于你的显示程序无法看懂(没有具体的电路),所以,这段程序,你必须自己根据硬件重新写过!
“直接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显示到十位。再把个位数直接送到个位显示。这个方法是没有错的。
那就是显示程序出问题了!
由于你的显示程序无法看懂(没有具体的电路),所以,这段程序,你必须自己根据硬件重新写过!
展开全部
你jg的类型换成uchar,把voltage和getc都改成uchar型。把getc=getc*49/25;这一句改成(uint)getc=((uint)getc*49)/25;试试。
追问
按你的方法改了 没有结果了,显示全0
追答
getc=getc*49/25 你这一句是干什么用的?你用proteus单步一下,看看各个变量值是不是你预想的东西。
给我你的邮箱,我直接发给你一个程序得了,还有proteus仿真图。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-08-18
展开全部
建议 去 我的领地 5d6d 的 proteus 论坛看看
那里有很多 单片机仿真实例,包括proteus 仿真图 和 源码
那里有很多 单片机仿真实例,包括proteus 仿真图 和 源码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
proteus 论坛
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询