微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC89C51与ADC0809的问题

STC89C51与ADC0809的问题

时间:10-02 整理:3721RD 点击:
小弟是初学者,想用单片机和ADC0809做一个测两路电压并显示比值的程序,可是运算结果老是不对,并且不稳定(相同电压测出的值变化也很大),求指教。下面是编写的程序,不知道有什么问题,求指教。74HC573控制共阴极数码管。初来论坛,也不知道怎么感谢大家,先说声谢谢了
#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar b,s,g,h1,h2,flag;
uint temp1,temp2,temp3,temp4;
float voltage,voltage1,voltage2;
long int disdata;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};  //不带小数点儿的数码表
uchar code table1[]={
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};   //带小数点的数码表
sbit D26=P2^6;
sbit D27=P2^7; //数码管控制端口
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CP=P3^3;   //ADC控制端口
sbit KEY1=P3^6;
sbit KEY2=P3^7;  //按键操作
void initial();
void delay(uint z);
void display(uchar b,uchar s,uchar g,uchar h1,uchar h2);
main()
{
    initial();
while(1)
{
  if(KEY1==0)
  {
   delay(5);
   if(KEY1==0)
   {
    P2=0x00;
    OE=0;
    ST=0;
    ST=1;
    ST=0;
    while(EOC==0);
    OE=1;
    temp1=P1;
    OE=0;
    delay(50);
       P2=0x02;
    OE=0;
    ST=0;
    ST=1;
    ST=0;
    while(EOC==0);
    OE=1;
    temp2=P1;
    OE=0;
    voltage1=(temp1*5.00)/(temp2*5.00);
   }
  }
  if(KEY2==0)
  {
   delay(5);
   if(KEY2==0)
   {
    P2=0x00;
    OE=0;
    ST=0;
    ST=1;
    ST=0;
    while(EOC==0);
    OE=1;
    temp3=P1;
    OE=0;
    delay(50);
    P2=0x02;
    OE=0;
    ST=0;
    ST=1;
    ST=0;
    while(EOC==0);
    OE=1;
    temp4=P1;
    OE=0;
    voltage2=(temp3*5.00)/(temp4*5.00);
   }
  }

  voltage=voltage2-voltage1;
   
  disdata=(uint)(voltage*100+0.5);   
   b=disdata/10000;
   s=disdata%10000/1000;
   g=disdata%1000/100;
   h1=disdata%100/10;
   h2=disdata%10;
   display(b,s,g,h1,h2);
  }
  
}
void initial()
{
D26=0;
D27=0;
TMOD=0x20;  //设置定时器1为工作方式2
    TH1=0x216;    //216
    TL1=0x216;    //216
    EA=1;       //开总中断
    ET1=1;        //开t1中断
    TR1=1;
}
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void cl() interrupt 3
{
    CP=!CP;
TH1=0x216;   
    TL1=0x216;
}  
void display(uchar b,uchar s,uchar g,uchar h1,uchar h2) //显示数字个十百位
{
D27=1;
P0=0xfd;
D27=0;
P0=0x00;
D26=1;
P0=table[b];
D26=0;
delay(1);
D27=1;
P0=0xfb;
D27=0;
P0=0x00;
D26=1;
P0=table[s];
D26=0;
delay(1);
D27=1;
P0=0xf7;
D27=0;
P0=0x00;
D26=1;
P0=table1[g];
D26=0;
delay(1);
D27=1;
P0=0xef;
D27=0;
P0=0x00;
D26=1;
P0=table[h1];
D26=0;
delay(1);
D27=1;
P0=0xdf;
D27=0;
P0=0x00;
D26=1;
P0=table[h2];
D26=0;
delay(1);
}

你先用proteus仿真一下吧。

0809的数据线是不是接反了。这个很纠结的。很容易接反。接反后电压稍微一变化显示数值就会变化很大。

多谢了    呵呵  感谢的晚了  考研归来   重回论坛

呵呵   解决了最后   但是也不记得怎么解决的了   呵呵  谢谢了  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top