#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit ST=P2^4;
sbit EOC=P2^5;
sbit OE=P2^6;
sbit CLOCK=P2^7;
uchar a,b,c,d,VOL;
unsigned char code table1[]={"VOL:"};
void delay1ms()
{ unsigned int x,y; for(x=0;x<10;x++) for(y=33;y>0;y--); }
void delay(unsigned int z)
{ unsigned char x; for(x=z;x>0;x--) delay1ms();}
void write_com(unsigned char com)
{
lcdrs=0;
P3=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(unsigned char dat)
{
lcdrs=1;
P3=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init(void)
{
lcden=0;
lcdrw=0;
write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
}
void display(void)
{
unsigned int i=0;
write_com(0x80);
{
while(table1!='\0')
{
write_data(table1);
i++;
}
}
}
void readtemp()
{
OE=0;ST=0;ST=1;ST=0;
while(!EOC); OE=1;
a=P1; OE=0; delay(10);
VOL=a*500/255;
b=VOL/100;c=VOL/10%10;d=VOL%10;
write_com(0x85); write_data(b+48);write_data(0x2e);write_data(c+48);
write_data(d+48);
write_data('V');
}
void main()
{
init();
TMOD=0x01;
TH0=(65536-2)/256;
TL0=(65536-2)%256;
TR0=1;
ET0=1;
EA=1;
CLOCK=0;
display();
while(1)
{
readtemp();
}
}
void t0(void) interrupt 1 using 0 //这个中断左右是使CLOCK产生500kHZ的脉冲
{
TH0=(65536-2)/256;
TL0=(65536-2)%256;
CLOCK=!CLOCK;
} 这个例子应该很简单,但是不知道哪里有差错,就是数值不对,哪位大神有空帮忙看看,先谢谢了。我上次看了个网上资料也是这样,我就纳闷,为啥都没人帮人家指出来呢!
-
你需要改两个地方:
1、uint a,b,c,d,e,VOL;改为uint a,b,c,d,e,VOL 因为要显示5v,uchar型范围不够,超过2.55V就显示不正常
2、VOL=a*500/256;改为VOL=a*1.0/256*500;这个应该是和分辨率有关,ADC0808是8位并行,分辨率就是1/256.
另外,仿真电路中ADC0808的输出顺序和标号是相反的,不是1对1,而是1对8。改过后就能正常显示
这个好上面的 keil文件和仿真图 ,那位大神有空可以看看 哈哈 我一直感觉好纳闷
-
AD转换.zip
(2014-9-7 20:01 上传)
113.28 KB, 下载次数: 74
while(!EOC); OE=1;
a=P1; OE=0; delay(10);
VOL=a*500/255; 哥,你指的是OE吗,还是,这个是自锁功能呀,接地的 话, OE=0; 就会输不出结果呀
引用: jxw82284134 发表于 2014-9-8 16:12
你需要改两个地方:
1、uint a,b,c,d,e,VOL;改为uint a,b,c,d,e,VOL 因为要显示5v,uchar型范围不够,超 ...
虽然我昨晚仿真好了 ,但是你回答的太完美了 谢了 哈哈
正在学习中..................................