|
最近用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)
下載附件
2021-4-1 11:08 上傳
-
2.jpg
(230.11 KB, 下載次數: 85)
下載附件
2021-4-1 11:08 上傳
|