首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

电压不能准确采集?(PROTUES上仿真出错)

2013-03-26 
电压不能正确采集?(PROTUES上仿真出错)还没做出实物,在protues上仿真时采集0.5V的电压出现的却是1.71V,如

电压不能正确采集?(PROTUES上仿真出错)
还没做出实物,在protues上仿真时采集0.5V的电压出现的却是1.71V,如图所示,[img=http://hi.csdn.net/space-3394646-do-album-picid-756407.html][/img]代码如下,
#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
sbit ST=P3^0; 
sbit OE=P3^1; 
sbit CLK=P3^2; 
sbit EOC=P3^3; 
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sfr LedPort=0x90;  //P1口接段码
sfr DataPort = 0x80;
void init();
float AD();
void delay(uint z);
void display(uint b);
 uint jisuan(float m);

uint   suhuanchong[4]={0,0,0,0};
uchar code ntable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
,0x00};   //不带小数点编码表
                     
uchar code htable[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
,0x80};  //带小数点编码表

               
void init() 
{
TMOD=0x01;
TH0=(65536-45)/256;
TL0=(65536-45)%256;
   EA=1;
ET0=1;
TR0=1;
}
float AD()
{  uint getdata;
 float result;
OE=0;
ST=0;
ST=1;
delay(1);
ST=0;
while(!EOC);
OE=1;
getdata=DataPort;
OE=0;
result=getdata*5/256.0;
return  result;
}


 uint jisuan(float m)
{   uint b;
   uint shi,ge,xiao1,xiao2;
   uint x;float y;
   
    //m=m*5/256;
    x=(int)m;  // 整数部分
    y=m-x;   // 小数部分
     
  if(x>=100)
 b=1;  
 shi=x/10;       //  求十位
   ge=x%10;  //  求个位
   xiao1= (int)(y*10);  //   求小数点后第一位
   xiao2=(int)(y*100)%10;//   求小数点后第二位

   if(shi==0)
      {
        shi=10;  //如最高位为0则消隐
      if(ge==0) //如最高位为0且次高位也为0则都消隐
         ge=10;      
      }
   suhuanchong[0]=shi;//把计算出来的各位存入临时数组
   suhuanchong[1]=ge;
   suhuanchong[2]=xiao1;
   suhuanchong[3]=xiao2;
   
    return b;

void display(uint b)
{   P2 = 0xff;       //关所有的位选        
 if(b!=1)
{
  LedPort = ntable[suhuanchong[0]];  //动态扫态
P20 = 0;
delay(1);
P20 = 1;

LedPort = htable[suhuanchong[1]];
P21 = 0;
delay(1);
P21 = 1;

LedPort = ntable[suhuanchong[2]];
P22 = 0;
delay(1);
P22 = 1;

LedPort = ntable[suhuanchong[3]];
P23 = 0;
delay(1);
P23 = 1;
}
 
              


}

void t0(void) interrupt 1 using 1
{
TH0=(65536-45)/256;
   TL0=(65536-45)%256;
CLK=~CLK;
}
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
 for(y=110;y>0;y--);
}

void main()
{float x;
   uint y;
init();
while(1)
{
x=AD();
y=jisuan(x);
display(y);

}
}
我找了很久了,实在找不出错误,旁边又没有什么学单片机的,在网上求解,谢谢。
[解决办法]
float AD()?? 浮点 ??
ad是几位? 什么编码(偏移2进制 ?),什么对齐方式 ?
[解决办法]
ADC0808是单极性(0-》+5V)8位的,所以简单(没有 偏移2进制 ,对齐方式等问题)。
你把它转成浮点的,不好,1。单片机没浮点处理器,用软件仿真很慢。
2。另外你的float AD() 恐怕也不对。
[解决办法]
uint getdata;
太小了吧
[解决办法]
改之前 uint getdata;太小了吧
改制后 uint n;太小了吧


[解决办法]
查查硬件,AD转换开始信号,AD的读信号,EOC信号,编一个专门测AD的小程序,如读AD的时序对不对。

热点排行