Transcript 電壓表
電壓表
姓名:陳奕全
學號:B09322003
指導老師:王志湖 老師
班級:通訊二甲
目錄
1.
2.
3.
4.
5.
題目
系統方塊圖
電路圖
程式流程圖
程式及註解
題目
試用DAC0804設計一個-2.5V~2.5V的電壓表,
使用二元搜尋法或位移搜尋法來撰寫,電壓結
果需顯示於七段顯示器上
系統方塊圖
七段顯示器
Vx
比較器
DAC轉換器
uC
PC
電路圖
P2.0
R1
Q1
1
2
Q2N3906
10k
DG4
P2.1
R2
a
f
DG3
DG2
b
Q2
1
2
Q2N3906
10k
P2.2
R3
e
Q3
1
2
d
dot
c
g
DG1
Q2N3906
10k
P2.3
Q2N3906
10k
P2.2
Q4
2
P2.1
R4
1
P2.0
P2.3
82
P0.0
a
1
2
P0.1
b
1
2
P0.2
c
1
2
P0.3
C3
d
1
2
P0.4
8051
e
1
2
P0.5
f
1
2
P0.6
g
1
2
P0.7
dot
1
2
R16
0.1uF
+5V
5k
13
P0.7
msb1
P0.6
B2
P0.5
B3
P0.4
B4
P0.3
B5
0
Iout
R15
4
-5V
Iout
2
P3.0
2
P0.0
lsbB8
vlc
1
COMP
16
2
5k
+
OS 2
5
OUT
5
4
+5V
3
C1
0.1uF
0.01uF
Vx
0
0
1
2
10k
-
Q5
R13
2
Q2N2222
-5V
5k
C2
3
6
LM3 39
R20
+
V+
OS 1
OUT
3
V-
0
-
10k
1
V-
B7
4
14 1
B6
2
R18
U1A
LM7 41
1
12
vrf(+)
P0.1
0
5k
V+
DAC0800
V-
15
7
vrf(-)
2
1k
R14
+5V
R19
P0.2
1
-2.5V
0
電路原理
Iref=2.5V/5k=0.5mA
Ifs=0.5mA x 255/256=0.498mA
Io=0.5mA x 127/256=0.248mA
Ifs=Io+Io => Io=Ifs-Io=0.498-0.248=0.25mA
V3=-0.25 x 5k=-1.25V V2=V3=-1.25V
V6=V2+5k x 0.248mA= -0.01V
程式流程圖
Main
1
二元搜尋法
七段顯示器
判斷正負號
並計算
實際電壓
Delay
1
END
二元搜尋法
二元搜尋法
Low=w
定義初始值
Low=0,Up=255
i=0
i++
W=(Up+Low)/2
yes
i=7?
P1=W
no
Volt=W
yes
COMPARE_PORT=0?
no
Up=w
return
判斷正負號並計算實際電壓
判斷正負號
取出小數點
第一第二位個位數
m=volt-128
op[2]=小數第二位
op[1]=小數第一位
op[0]=個位數
<
M:0
>=
為正
return
為負
return
七段顯示器
七段顯示器輸出值
P2^0=0,給小數點
Delay
i=0
P0=~scan[i]
輸出數值
P0遮沒
i++
P2=OP[i]
Yes
i<=3?
no
i=2?
yes
no
End
主程式
#include <reg51.h>
#include <math.h>
unsigned char value,volt,op[4]; //宣告變數
int i;
sbit compare_port=P3^4;
//比較器傳回的數值
sbit P2_0=P2^0;
//小數點
unsigned char code seg7[12]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6,0x00,0x02};
// 0 1
2
3 4
5
6
7
8
9
+
unsigned char code scan[4]={0x01,0x02,0x04,0x08};//掃描陣列
//--------------宣告副程式------------------------------------------void convert(void);
//二元搜尋法
void voltage(void);
//判斷正負電壓
void delay(int);
//延遲
void seg(void);
//七段輸出
//--------------主程式--------------------------------------void main(void)
{
while(1)
{
convert();
//轉換電壓
voltage();
//判斷正負電壓
seg();
//七段輸出
}
}
二元搜尋法
//----------------------二元搜尋法-------------------------------------void convert(void)
{
int low=0,up=255,w; //設定初始值為0~255
for(i=7;i>=0;i--)
//總共搜尋8次
{
w=(up+low)/2;
P2=w;
//輸出至DAC
delay(1);
if (compare_port==0) //if compare為0
up=w;
//比較上限變更為up(0~127)
else
//否則
low=w;
//比較上限變更為low(127~255)
}
volt=w;
}
判斷正負號並計算實際電壓
//-----------正負電壓判斷------------------------------------void voltage(void)
{
char f;
f=(volt-128);
//以128為基準以判斷正負號
if(f>=0)
{
op[3]=seg7[10];
//op[3]為正負號所亮之位子,seg7為選擇正負號之位子
}
else
{
op[3]=seg7[11];
}
value=abs(f*2);
//取絕對值後*2
op[0]=seg7[(value%100)%10];
//小數點第一位
op[1]=seg7[(value%100)/10];
//小數點第二位
op[3]=seg7[volt/100];
//個位數
}
七段顯示器&Delay
//-----------七段顯示器---------------------------------------void seg(void)
{
for(i=0;i<=3;i++)
//依序輸出4次數值
{
P0=0xFF;
//遮沒
P2=~op[i];
//依序輸出鍵表裡的數值
if(i==2)
//當等於個位數時
P2_0=0;
//強迫小數點亮燈
P0=~scan[i];
//輸出為亮燈之位子
delay(100);
}
}
//------------延遲----------------------------------------------void delay(int x)
{
int i;
for(i=1;i<=x;i++);
}