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);
}
#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的数据线是不是接反了。这个很纠结的。很容易接反。接反后电压稍微一变化显示数值就会变化很大。
多谢了 呵呵 感谢的晚了 考研归来 重回论坛
呵呵 解决了最后 但是也不记得怎么解决的了 呵呵 谢谢了