❶ 關於51單片機做數碼電壓表時有段程序始終看不懂,請各位單片機高手們指點迷津
void也可以看成是數據類型,只是他是特殊的數據類型,這個類型就是「沒有東西」。
比如一個函數
int a(int b){ }
表示函數的參數是int類型的,返回值是int類型的。如果沒有返回值,也沒有參數,就都把類型名稱寫成void,既然沒有了,那麼也就沒有名稱了,所以b也可以省了,便成了 void a(void) { }。
函數的定義是很基本的c語言知識,這個說起來很啰嗦,隨便看書就能明白了。
void delay(void) 這個函數沒什麼特別意義,只是一個延時而已。因為單片機運行速度很快,數碼管也不是恆定的點亮一個,而是動態掃描的,就是說,先點亮一個位,然後關閉,點亮另一個位。這個過程很快,由於視覺暫留作用,人眼只能看到所有的位都是同時亮的,這個原理和放電影一樣,不過,如果點亮一個後,立即點亮另一個,會因為點亮時間太短,燈還沒全亮就滅了(本人估計的,但應該也是這樣),造成燈光太暗。所以要延時一下。
單片機的電源電壓是5V,那麼所有埠的承受電壓就一定是5V,如果是3.3V單片機,就一定只能承受3.3V,所以測量量程一定是0 至 5V。如果實際測量量程遠遠小於這個范圍,必須用放大器放大。如果量程大於這個范圍,必須分壓。
void convdata(unsigned char i)
這個 i 明顯就是數模轉換得到的結果,作為參數傳遞給這個函數處理。void以及函數參數等名詞術語,說起來就是一本教科書的量,請自行看書,這是很基本的。
dis[0] = i/51 以及後面的兩句,是一個數學問題。(dis[i]就是一個數組,這個不用多言)。
為什麼是51呢?看他的注釋「將0-255級換算成0.00-5.00的電壓數值」。
也就是說,如果測得的電壓是5V,那麼數模轉換的結果就是255,這是一個8位數的最大值,這個數模轉換器的最大值就是8位,所以5V的電壓轉換得到就是255.
然後就可以照推了,如果測得的值是2.5V,那麼得到的值就是255 / 2 = 127.5。也就是說,實際測得的值和這個轉換值的關系是正比的,他們的比值就是 255 / 5 = 51 ,所以用測到的值去除以51,就得到實際值。明白了嗎?如果這樣說還不明白,那就沒辦法了~
然後,為什麼後面又要搞那兩條式子呢?這是因為,要把一個數值在數碼管上顯示出來,必須把一個數值上每一個位的數字單獨處理給數碼管顯示。比如,上面除以51後,得到的數可能會有小數,比如1.45,那麼要把這個數用數碼管顯示出來,就必須把 1、4、5和小數點都單獨取出來。
以這個(i%51)*10/51*2為例:
i%51 , 是 i 除以 51 後的余數。這個數再除以51,再乘以10,再取整,就是第一個小數了。他這個式子把"乘以10"放在前面,是因為如果先除以51,那麼因為i 和 51 都是int類型,結果也必將是int類型,沒有小數,再乘以10也沒意義了。至於後面為什麼還要乘以2,這個還真不清楚,不過他這個dis數組是用來查表的,就是後面的tab[],要看他的表是怎麼定義的。他第一個數沒有乘以2,但是這個數和小數點的顯示有關,可能不顯示小數點的就要乘以2。
後面的求第二個小數,參照這個解釋自己理解一下。
❷ 基於51單片機的數字電壓表總結與體會
通過與同學的討論與認真計算設計分析所完成的,課程設計的任務是設計、組裝並調試一個數字電壓表測量系統。需要我們綜合運用單片機等課程的知識,通過查閱資料、方案論證與選定;設計和選取電路和元器件;分析指標及討論,完成設計任務。
在這次課程設計中,我學會了怎樣去根據課題的要求去設計電路和調試電路。動手能力得到很大的提高。從中我發現自己並不能很好的熟練去使用我所學到的高頻電路知識。在以後學習中我要加強對使用電路的設計和選用能力。但由於電路比較簡單、定型,而不是真實的生產、科研任務,所以我們基本上能有章可循,完成起來並不困難。把過去熟悉的定型分析、定量計算逐步,元器件選擇等手段結合起來,掌握工程設計的步驟和方法,了解科學實驗的程序和實施方法。這對今後從事技術工作無疑是個很好的訓練。通過這種綜合訓練,我們可以掌握電路設計的基本方法,提高動手組織實驗的基本技能,培養分析解決電路問題的實際本領,為以後畢業設計和從事電子實驗實際工作打下基礎。
還有就是每次在組團做試驗都會感覺特別的充實,我們可以按照自己設計的電路去完成,老師也不是死板的要求我們怎麼怎麼,而是給了我們盡可能大的自己決定的餘地,這次的元器件都是按照我們設計出來的電路參數給定的,而且每位老師都很耐心的為我們解決試驗中所出現的問題,最後真心的感謝老師對我們課程設計的建議和幫助,我們才得以圓滿的完成這次課程設計!
❸ 關於用51單片機和ADC0809做電壓表的問題
我覺得是讀回數據時出錯,問題在這段:::
ch0=0;
Delay(128);
while(E==0);
v=ch0;
問題:
1:Delay(128);試試加長延時。12M晶振下(128)相當於128uS,0809轉換時間為100uS,要是你用24M晶振就會出問題,為了保險加大到1000左右
2:不要用等待中斷,(while(E==0); 用法不太對),加大延時後直接讀回數據就行了
❹ 用單片機製作數字電壓表,待測電壓經A/D轉換器得到的8位數字量進入51單片機後怎樣轉換成實際的電壓數值
假設ADC的參考電壓是Vref,ADC轉換結果是X所示實際電壓V是:
V=Vref×X÷256
要得到兩位小數?如果使用C語言編寫那就沒有問題了。但是還有一種方法,假設Vref=2.56V,即2560mV,所以V=2560×X÷256=10×X,單位是mV,只要自己加小數點就行了,比如X=65H=101,則V=1010mV=1.01V。
❺ 基於51單片機的數字電壓表設計
沒有匯編
只有模擬圖和C,用的是0808