Upload
arwen
View
35
Download
0
Embed Size (px)
DESCRIPTION
電壓表. 姓名 : 陳奕全 學號 :B09322003 指導老師 : 王志湖 老師 班級 : 通訊二甲. 目錄. 題目 系統方塊圖 電路圖 程式流程圖 程式及註解. 題目. 試用 DAC0804 設計一個 -2.5V~2.5V 的電壓表 , 使用二元搜尋法或位移搜尋法來撰寫 , 電壓結果需顯示於七段顯示器上. 系統方塊圖. 七段顯示器. Vx. uC. DAC 轉換器. 比較器. PC. 電路圖. 電路原理. Iref=2.5V/5k=0.5mA Ifs=0.5mA x 255/256=0.498mA - PowerPoint PPT Presentation
Citation preview
電壓表
姓名 : 陳奕全學號 :B09322003指導老師 : 王志湖 老師班級 : 通訊二甲
目錄1. 題目2. 系統方塊圖3. 電路圖4. 程式流程圖5. 程式及註解
題目
試用 DAC0804 設計一個 -2.5V~2.5V 的電壓表 ,
使用二元搜尋法或位移搜尋法來撰寫 , 電壓結果需顯示於七段顯示器上
系統方塊圖
uCDAC轉換器比較器
七段顯示器
PC
Vx
電路圖
a
Q5
Q2N2222
B3
P2.2
Vx
P0.6
82
21
b
B2
P2.1
R16
5k+5V
P0.7
R20
5k
a
P2.0
R15
1k
21
-2.5V
16
C1
0.01uF
R14
10k
2
1
P0.7
COMP
R3
10k
21
+5V
1
0
P0.6
DG1
21
vlc
-5V
14
P0.5
DG2
vrf(+)R13
10k
21
Q1
Q2N3906
R18
5k
21
+5V
150
P0.4
DG3
21
vrf(-)
-5V
2
21
Q3
Q2N3906
P0.3
DG4
msb1
Q4
Q2N3906
Q2
Q2N3906
R1
10k
21
P2.3
4
P0.0
8051
0
P0.1
P3.0
e
21
21
Iout
P2.2
13
P0.1
P0.0
dot
d
R2
10k
21
Iout
P0.2
U1A
LM339
5
4
312
2
+
-
V+
V-
OUT
DAC0800
g
dot
lsbB8
P0.2
C2
0.1uF
P2.1
R19
5k
f
c
B7
P0.3
P2.0
21
e
g
0
C3
0.1uF
B6
P0.4
0
d
b
LM741
3
2
74
6
1
5+
-
V+
V-
OUT
OS1
OS2
B5
P0.5
P2.3
3
c
f
0
R4
10k
21
B4
V-
21
電路原理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
1
Delay
END
二元搜尋法二元搜尋法
定義初始值Low=0,Up=255
i=0
W=(Up+Low)/2
P1=W
COMPARE_PORT=0? Up=w
yes
Low=w
no
i++
i=7?yes
Volt=W
no
return
判斷正負號並計算實際電壓
return
判斷正負號
m=volt-128
op[2]= 小數第二位op[1]= 小數第一位op[0]= 個位數
為負
M : 0
為正
return
>=
<
取出小數點
第一第二位個位數
七段顯示器七段顯示器輸出值
End
i=0
P0 遮沒
P2=OP[i]
i=2?
P2^0=0, 給小數點
P0=~scan[i]輸出數值
i++
i<=3?
yes
no
Yes
Delay
no
主程式#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++);}