用Proteus学习51单片机之AD转换
現實中的很多量,都是模擬量,如溫度,壓力等,單片機要去了解它們,首先就要把這些量進行數字化,AD轉換即把模擬量轉變為數字量。這次書上介紹的AD芯片為ADC0804,8位并行AD轉換芯片。關于AD轉換的詳細原理,我就不抄了,網上有的是。
ADC0804的使用,比前面用過的鎖存器74LS573難用得多,主要是讀寫數據都要根據時序圖,進行電位的變化,而且芯片的接法也相對麻煩一點。下面記錄一下引腳定義:
VIN(+),VIN(-):待測量的模擬信號輸入
DB0~DB7:測量結果輸出
AGND:模擬信號地
DGND:數字信號地
CLK:時鐘信號輸入端
CLKR:內部時鐘發生器的外接電阻端,與CLK端配合可由芯片自身產生時鐘脈沖,其頻率為1/(1.1RC)
:片選信號,低電平有效
:寫信號輸入,低電平啟動A/D轉換
:讀信號輸入,低電平有效
:A/D轉換結束信號,低電平表示本次轉換已經完成
VREF/2:參考電平輸入,決定量化單位(可以調節該電平,調節最終準確度)
VCC:電源輸入
關于時鐘:如果使用內部時鐘的話,官方的建議是用10K電阻和150pF電容,如上圖;
模擬地和數字地一般直接接地即可。參考電平在2.5V左右,我試了一下,調到2.55的時候比較準確。關于待測量的模擬信號,如電壓,可以向上圖一樣連接,負直接接地即可。
這里沒有用到,即沒用中斷,而是直接用延時的方法,等待A/D轉換完成后,讀取DB0~DB7的值。
--------------------------------------------------------------------
讀寫芯片都要根據芯片的時序來,其寫時序如下:
可以看到,首先要使片選信號置低電平,然后寫信號下降,上升后,芯片開始A/D轉換,轉換完成后通知已經完成。
讀時序如下:
可以看到,轉換完成后,選使片選有效,然后使讀引腳下降,再上升,即可讀取數據。
由于不管讀寫,都要使片選有效,即CS腳置低,所以CS腳置一次低就可以了。
void main()
{
uchar val = 0;
//允許AD芯片
ad_cs = 0;
while(1)
{
ad_write = 0;//WR腳置低
_nop_();
ad_write = 1;//WR腳置高,完成時序,轉換開始
delay(50);//稍等后轉換會完成,由于沒用中斷,所以采用延時50毫秒
P1 = 0xff;//先把數據端口全部置1,避免原先數據影響
ad_read = 0;//RD腳置高
_nop_();
val = P1;//把數據存入臨時變量
ad_read = 1;//RD腳置低
show((val>>4)*0.32 + (val&0x0f)*0.02);//根據換算規則,把數據換算成實際電壓
}
}
換算的規則是,8位數據的高四位,相當于每單位0.32V,低四位,相當于每單位0.02V,所以總電壓就是:
(val>>4)*0.32 + (val&0x0f)*0.02)
這次沒有使用中斷,直接采用延時讀取,實在是有些不爽,有時間的話,把程序改一下,改成使用中斷通知的。
延時方式的工程和源代碼下載:點擊下載
--------------------------------------------------------------
嘗試了一下,完成了由中斷實現的A/D轉換,不再需要時刻去檢驗了,提高了程序的運行效率。原理圖需要稍微改一下,由于用到了外部中斷0,即P3.2腳,而這個腳本來連接到了ADC0804的片選引腳,所以要把片選改到P3.5,然后把芯片的INTR連接到P3.2腳才能引發中斷。具體請下載查看。
中斷方式的工程和源代碼下載:點擊下載
Technorati 標簽: 51單片機,Proteus,仿真,AD轉換,電壓表,源代碼,下載
總結
以上是生活随笔為你收集整理的用Proteus学习51单片机之AD转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼:持续加大在中国的研发投入,中短期聚
- 下一篇: 【案例】舒邑:一个女装品牌的奇葩打法-@