ADC0809仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
捕獲.PNG (113.99 KB, 下載次數: 23)
下載附件
2018-1-19 14:53 上傳
0.png (46.36 KB, 下載次數: 33)
下載附件
2018-1-19 20:47 上傳
0.png (9.64 KB, 下載次數: 23)
下載附件
2018-1-19 20:48 上傳
單片機源程序如下:
- ;本程序用到單元(30H~34H,3DH,3EH)
- ;(30H~34H)用于存放顯示數據,(30H~33H)用于存放測量數據,34H用于存放通道號
- ;R1用于存放0809檢測出來的8個數據
- ;(3DH、3EH)用于存放0809檢測出來數據計算結果
- ORG 0000H
- AJMP MAIN
- ORG 0013H
- AJMP INT1
- ORG 0030H
- ;======================================
- ;主程序
- MAIN: MOV R0,#30H ;存放數據首地址
- MOV R2,#0FH ;計算數據存放單元個數
- CLR A
- QING: MOV @R0,A ;將數據存放單元清零
- INC R0
- DJNZ R2,QING
- MOV R4,#08H ;8路計數初值
- MOV 34H,#00H ;初始通道顯示單元為1號通道
- SETB IT1 ;INT1置為邊沿觸發
- SETB EA ;開中斷
- SETB EX1 ;允許INT1中斷
- MOV DPTR,#7FF8H ;指向0809通道0
- MOV A,#00H ;此指令可缺省
- MOVX @DPTR,A ;啟動A/D轉換
- HERE: ACALL JI_SUAN
- AJMP HERE ;等待中斷
- ;==========================================
- ;中斷子程序
- INT1: CLR EX1
- PUSH PSW ;保護現場
- MOVX A,@DPTR ;讀A/D轉換結果
- MOV R1,A ;存數據
- INC DPTR ;更新通道
- MOV A,34H
- INC A
- MOV 34H,A
- DJNZ R4,LOOP ;巡回未完繼續
- MOV R4,#08H ;重新賦初值
- MOV DPTR,#7FF8H
- LOOP:
- MOVX @DPTR,A ;啟動A/D轉換
- POP PSW
- RETI ;返回中斷
- ;========================================
- ;數據計算
- JI_SUAN:
- MOV A,R1
- MOV B,#20 ;基準電壓為5伏,分辨率為5/256約為20毫伏
- MUL AB ;顯示數值單位為毫伏
- MOV R7,A ;測量出來的數據乘20毫伏即為實際電壓值,但還是十六進制
- MOV A,B ;高位存放在R6里,低位存放在R7里
- MOV R6,A
- MOV R5,#16
- ;=========================================
- ;雙字節十六進制轉雙字節BCD碼
- SBIN_SBCD:
- MOV 3DH,#00H ;數據計算結果清零
- 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并調整后送回
- MOV 3DH,A
- MOV A,3EH
- ADDC A,3EH
- DA A ;T_M乘2并調整后送回
- MOV 3EH,A
- DJNZ R5,SBIN_SBCD1 ;循環運行24次得到BCD碼結果
- ;=====================================
- ;雙字節BCD碼制轉4個單字節BCD碼
- SBCD_DBCD:
- MOV A,3DH
- MOV B,A
- ANL A,#0FH ;將T_S里面的數據存放寄存器B里后再進行與操作得到低四位
- MOV 30H,A ;并存放到數碼管顯示的第一位地址40H里面
- MOV A,B
- SWAP A ;從寄存器取回原來保存的數,再進行高低位互換
- ANL A,#0FH ;進行與操作后得到高四位
- MOV 31H,A ;最后存放到數碼管顯示的第二位地址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 ;顯示循環次數,即改變顯示延時刷新時間
- DIS1: MOV R1,#30H ;把顯示數據第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R1里
- MOV R3,#05H ;把顯示的長度放在R2里
- DIS2: MOV A,@R1
- ANL A,#0FH ;屏蔽顯示數據的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數據到P0顯示
- LCALL DELY4ms ;調用延時4ms
- INC R1 ;取下一個顯示數據
- 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
復制代碼
所有資料51hei提供下載:
ADC0809.rar
(46.85 KB, 下載次數: 34)
2018-1-19 14:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|