140 likes | 299 Views
電壓表. 姓名 : 陳奕全 學號 :B09322003 指導老師 : 王志湖 老師 班級 : 通訊二甲. 目錄. 題目 系統方塊圖 電路圖 程式流程圖 程式及註解. 題目. 試用 DAC0804 設計一個 -2.5V~2.5V 的電壓表 , 使用二元搜尋法或位移搜尋法來撰寫 , 電壓結果需顯示於七段顯示器上. 系統方塊圖. 七段顯示器. Vx. uC. DAC 轉換器. 比較器. PC. 電路圖. 電路原理. Iref=2.5V/5k=0.5mA Ifs=0.5mA x 255/256=0.498mA
E N D
電壓表 姓名:陳奕全 學號:B09322003 指導老師:王志湖 老師 班級:通訊二甲
目錄 • 題目 • 系統方塊圖 • 電路圖 • 程式流程圖 • 程式及註解
題目 試用DAC0804設計一個-2.5V~2.5V的電壓表, 使用二元搜尋法或位移搜尋法來撰寫,電壓結果需顯示於七段顯示器上
系統方塊圖 七段顯示器 Vx uC DAC轉換器 比較器 PC
電路原理 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 END 1
二元搜尋法 二元搜尋法 Low=w 定義初始值 Low=0,Up=255 i=0 i++ W=(Up+Low)/2 i=7? yes P1=W no Volt=W COMPARE_PORT=0? yes Up=w return no
判斷正負號並計算實際電壓 判斷正負號 取出小數點 第一第二位個位數 m=volt-128 M : 0 op[2]=小數第二位 op[1]=小數第一位 op[0]=個位數 < >= 為正 為負 return return
七段顯示器 七段顯示器輸出值 P2^0=0,給小數點 Delay i=0 P0=~scan[i] 輸出數值 End P0遮沒 i++ P2=OP[i] Yes i<=3? no i=2? no yes
主程式 #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++); }