|
最近用ADC0804学习数据转换,正常,可用ADC0808在proteus上仿真时出现不能正确解析中间量的问题:调节电位器在最大时能显示“0”v,调节电位器最小时,能采集并显示“5”v,可是调节到中间位置时就乱了。百思不得要领,还请个位老师和大虾指点,非常感谢!
程序如下:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 qian,bai,shi,ge;
u8 code shuju[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit clk=P3^0;
sbit start=P3^1;
sbit eoc=P3^2;
sbit oe=P3^3;
sbit ada=P3^4;
sbit adb=P3^5;
sbit adc=P3^6;
sbit dp=P1^7;
void inittime()//定时器初始化
{
TMOD=0x02;
TH0=0xfb;
TL0=0xfb;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1//定时器函数
{
clk=~clk;
}
void delay(u8 z)//延时函数
{
while(z--);
}
void display()//数码管显示函数
{
P2=0xfe|0x80;//指定哪位数码管显示,不影响高4位的值
P1 = shuju[qian];
dp=1;//增加小数点
delay(50);
P2=0xfd|0x80;
P1 = shuju[bai];
//dp=1;
delay(50);
P2=0xfb|0x80;
P1 = shuju[shi];
//dp=1;
delay(50);
P2=0xf7|0x80;
P1 = shuju[ge];
delay(50);
}
void adc_get()//ADC采集及转换函数
{
u16 temp = 0; //转换电压值
u8 x = 0; //存储P0口的数值
ada=adb=adc=0;
start=0;
start=1;
delay(5);
start=0;
while(eoc!=1);
oe=1;
x=P0;
oe=0;
temp = x * (1.0/255)*5*1000; //读取的电压扩大1000倍
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
}
void main()
{
inittime();
while(1)
{
adc_get();
display();
}
}
|
-
1.jpg
(225 KB, 下载次数: 80)
-
2.jpg
(230.11 KB, 下载次数: 85)
|