|
51單片機驅(qū)動單片機ADC0809做的數(shù)據(jù)采集系統(tǒng)原理圖如下(注意proteus中沒有ADC0809采用ADC0808代替也是一樣的):
0.png (41.4 KB, 下載次數(shù): 103)
下載附件
2016-9-27 20:19 上傳
0.png (54.99 KB, 下載次數(shù): 89)
下載附件
2016-9-27 20:21 上傳
0.png (50.75 KB, 下載次數(shù): 82)
下載附件
2016-9-27 20:21 上傳
所有的資料打包下載:
ADC0809 8路數(shù)據(jù)采集系統(tǒng).zip
(52.37 KB, 下載次數(shù): 200)
2016-9-27 20:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
AT89C51采用內(nèi)部的12MHz晶振,
ALE引腳的頻率是單片機時鐘周期頻率
的1/6,即2MHz。要想使ADC0808得到
500KHz的時鐘基準(zhǔn),必須要把ALE輸出
進行4分頻,這樣ADC0808才能可靠的
工作。這里由于仿真軟件的原故,所以
直接給ADC0808的CLOCK端加了一個
500KHz的時鐘信號。
控制線如下:
(1)、P0.0、P0.1、P0.2控制ADC0808
的8個通道。
(2)、P2.7和/WR、/RD控制ADC0808
的啟動、地址鎖存和輸出
ADC0809 8路數(shù)據(jù)采集源碼:
- ;本程序用到單元(30H~34H,3DH,3EH)
- ;(30H~34H)用于存放顯示數(shù)據(jù),(30H~33H)用于存放測量數(shù)據(jù),34H用于存放通道號
- ;R1用于存放0809檢測出來的8個數(shù)據(jù)
- ;(3DH、3EH)用于存放0809檢測出來數(shù)據(jù)計算結(jié)果
- ORG 0000H
- AJMP MAIN
- ORG 0013H
- AJMP INT1
- ORG 0030H
- ;======================================
- ;主程序
- MAIN: MOV R0,#30H ;存放數(shù)據(jù)首地址
- MOV R2,#0FH ;計算數(shù)據(jù)存放單元個數(shù)
- CLR A
- QING: MOV @R0,A ;將數(shù)據(jù)存放單元清零
- INC R0
- DJNZ R2,QING
- MOV R4,#08H ;8路計數(shù)初值
- MOV 34H,#00H ;初始通道顯示單元為1號通道
- SETB IT1 ;INT1置為邊沿觸發(fā)
- SETB EA ;開中斷
- SETB EX1 ;允許INT1中斷
- MOV DPTR,#7FF8H ;指向0809通道0
- MOV A,#00H ;此指令可缺省
- MOVX @DPTR,A ;啟動A/D轉(zhuǎn)換
- HERE: ACALL JI_SUAN
- AJMP HERE ;等待中斷
- ;==========================================
- ;中斷子程序
- INT1: CLR EX1
- PUSH PSW ;保護現(xiàn)場
- MOVX A,@DPTR ;讀A/D轉(zhuǎn)換結(jié)果
- MOV R1,A ;存數(shù)據(jù)
- INC DPTR ;更新通道
- MOV A,34H
- INC A
- MOV 34H,A
- DJNZ R4,LOOP ;巡回未完繼續(xù)
- MOV R4,#08H ;重新賦初值
- MOV DPTR,#7FF8H
- LOOP:
- MOVX @DPTR,A ;啟動A/D轉(zhuǎn)換
- POP PSW
- RETI ;返回中斷
- ;========================================
- ;數(shù)據(jù)計算
- JI_SUAN:
- MOV A,R1
- MOV B,#20 ;基準(zhǔn)電壓為5伏,分辨率為5/256約為20毫伏
- MUL AB ;顯示數(shù)值單位為毫伏
- MOV R7,A ;測量出來的數(shù)據(jù)乘20毫伏即為實際電壓值,但還是十六進制
- MOV A,B ;高位存放在R6里,低位存放在R7里
- MOV R6,A
- MOV R5,#16
- ;=========================================
- ;雙字節(jié)十六進制轉(zhuǎn)雙字節(jié)BCD碼
- SBIN_SBCD:
- MOV 3DH,#00H ;數(shù)據(jù)計算結(jié)果清零
- MOV 3EH,#00H
- SBIN_SBCD1:
- MOV A,R7 ;R7左移一位并送回
- RLC A
- MOV R7,A
- MOV A,R6 ;R6左移一位并送回
- RLC A
- MOV R6,A
- MOV A,3DH
- ADDC A,3DH
- DA A ;T_S乘2并調(diào)整后送回
- MOV 3DH,A
- MOV A,3EH
- ADDC A,3EH
- DA A ;T_M乘2并調(diào)整后送回
- MOV 3EH,A
- DJNZ R5,SBIN_SBCD1 ;循環(huán)運行24次得到BCD碼結(jié)果
- ;=====================================
- ;雙字節(jié)BCD碼制轉(zhuǎn)4個單字節(jié)BCD碼
- SBCD_DBCD:
- MOV A,3DH
- MOV B,A
- ANL A,#0FH ;將T_S里面的數(shù)據(jù)存放寄存器B里后再進行與操作得到低四位
- MOV 30H,A ;并存放到數(shù)碼管顯示的第一位地址40H里面
- MOV A,B
- SWAP A ;從寄存器取回原來保存的數(shù),再進行高低位互換
- ANL A,#0FH ;進行與操作后得到高四位
- MOV 31H,A ;最后存放到數(shù)碼管顯示的第二位地址41H里面
- MOV A,3EH ;同上
- MOV B,A
- ANL A,#0FH
- MOV 32H,A
- MOV A,B
- SWAP A
- ANL A,#0FH
- MOV 33H,A
- ;=======================================
- ;顯示子程序
- DIS: MOV R5,#50 ;顯示循環(huán)次數(shù),即改變顯示延時刷新時間
- DIS1: MOV R1,#30H ;把顯示數(shù)據(jù)第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R1里
- MOV R3,#05H ;把顯示的長度放在R2里
- DIS2: MOV A,@R1
- ANL A,#0FH ;屏蔽顯示數(shù)據(jù)的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數(shù)據(jù)到P0顯示
- LCALL DELY4ms ;調(diào)用延時4ms
- INC R1 ;取下一個顯示數(shù)據(jù)
- DEC R2
- DJNZ R3,DIS2 ;四位顯示晚后重新開始顯示
- DJNZ R5,DIS1
- MOV A,34H ;顯示完后判斷通道好是否為8
- CJNE A,#08H,HUI
- MOV 34H,#00H
- HUI: SETB EX1 ;顯示完畢再允許中斷
- RET
- ;=====================================
- ;延時子程序
- DELY4ms: MOV R6,#8 ;延時4毫秒
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- END
復(fù)制代碼
ADC0808中斷檢測源碼:
- ;占用單元R0,R1,A,DPTR,30H~37H
- ORG 0000H
- AJMP MAIN
- ORG 0013H
- AJMP INT1
- ORG 0030H
- MAIN: MOV R0,#30H ;數(shù)據(jù)暫存區(qū)首地址
- MOV R1,#08H ;8路計數(shù)初值
- SETB IT1 ;INT1置為邊沿觸發(fā)
- SETB EA ;開中斷
- SETB EX1 ;允許INT1中斷
- MOV DPTR,#7FF8H ;指向0808通道0
- MOV A,#00H ;此指令可缺省
- MOVX @DPTR,A ;啟動A/D轉(zhuǎn)換
- HERE: NOP
- AJMP HERE ;等待中斷
- INT1: PUSH PSW
- MOVX A,@DPTR ;讀A/D轉(zhuǎn)換結(jié)果
- MOV @R0,A ;存數(shù)
- INC DPTR ;更新通道
- INC R0 ;更新暫存單元
- DJNZ R1,HUI ;巡回未完繼續(xù)
- MOV R0,#30H ;數(shù)據(jù)暫存區(qū)首地址
- MOV R1,#08H ;8路計數(shù)初值
- MOV DPTR,#7FF8H ;指向0808通道0
- HUI: MOVX @DPTR,A ;再次啟動A/D轉(zhuǎn)換
- POP PSW
- RETI ;返回中斷
復(fù)制代碼
ADC0808查詢檢測源程序:
- ;占用單元R0,R1,A,DPTR,30H~37H
- ORG 0000H
- AJMP MAIN
- ORG 0030H
- MAIN: MOV R0,#30H ;數(shù)據(jù)暫存區(qū)首地址
- MOV R1,#08H ;8路計數(shù)初值
- MOV DPTR,#7FF8H;指向0808通道0
- MOV A,#00H ;此指令可缺省
- MOVX @DPTR,A ;啟動A/D轉(zhuǎn)換
- L1: JB P3.3,L1 ;查詢INT1是否為0
- MOVX A,@DPTR ;若INT1為0,者轉(zhuǎn)換結(jié)束,讀出數(shù)據(jù)
- MOV @R0,A ;存數(shù)
- INC DPTR ;更新通道
- INC R0 ;更新暫存單元
- MOVX @DPTR,A ;再次啟動A/D轉(zhuǎn)換
- DJNZ R1,L1 ;判斷8路查詢是否完畢
- AJMP MAIN ;跳回重新開始
- END
復(fù)制代碼 |
|