[讨论] ADC0808为啥仿真出来的数字不正确呢,算法都正确啊,但是

1322685712   2014-9-7 13:06 楼主

#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;                          
}                                                       这个例子应该很简单,但是不知道哪里有差错,就是数值不对,哪位大神有空帮忙看看,先谢谢了。我上次看了个网上资料也是这样,我就纳闷,为啥都没人帮人家指出来呢!
  • xu.jpg

回复评论 (13)

2推荐 jxw82284134 

你需要改两个地方:
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。改过后就能正常显示

点赞  2014-9-8 16:12
                 这个好上面的 keil文件和仿真图  ,那位大神有空可以看看   哈哈              我一直感觉好纳闷  

    AD转换.zip (2014-9-7 20:01 上传)

    113.28 KB, 下载次数: 74

点赞  2014-9-7 20:03
我记得有个使能端好像不用关来关去的!!!
点赞  2014-9-8 10:49
你试试接下地~
点赞  2014-9-8 10:50
while(!EOC); OE=1;
         a=P1; OE=0;  delay(10);
         VOL=a*500/255;                                    哥,你指的是OE吗,还是,这个是自锁功能呀,接地的 话,  OE=0; 就会输不出结果呀

点赞  2014-9-8 13:24
引用: jxw82284134 发表于 2014-9-8 16:12
你需要改两个地方:
1、uint a,b,c,d,e,VOL;改为uint a,b,c,d,e,VOL  因为要显示5v,uchar型范围不够,超 ...


点赞  2014-9-8 16:16
引用: jxw82284134 发表于 2014-9-8 16:12
你需要改两个地方:
1、uint a,b,c,d,e,VOL;改为uint a,b,c,d,e,VOL  因为要显示5v,uchar型范围不够,超 ...

    虽然我昨晚仿真好了 ,但是你回答的太完美了  谢了              哈哈

点赞  2014-9-9 09:28
引用: 1322685712 发表于 2014-9-9 09:28
虽然我昨晚仿真好了 ,但是你回答的太完美了  谢了              哈哈

不用客气
点赞  2014-9-12 15:07
正在学习中..................................
点赞  2014-11-20 10:27


你好。现在能正常运行吗。我也遇到了同样问题
点赞  2016-4-28 12:19


能看到吗
点赞  2016-4-28 12:20


你好。我也有这个问题。
点赞  2016-4-28 12:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复