欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

        標題: 單片機ADC0809 8路數據采集 查詢和中斷法 帶匯編程序和proteus仿真 [打印本頁]

        作者: 51黑ff    時間: 2016-9-27 20:27
        標題: 單片機ADC0809 8路數據采集 查詢和中斷法 帶匯編程序和proteus仿真
        51單片機驅動單片機ADC0809做的數據采集系統原理圖如下(注意proteus中沒有ADC0809采用ADC0808代替也是一樣的):


        所有的資料打包下載: ADC0809 8路數據采集系統.zip (52.37 KB, 下載次數: 200)


            AT89C51采用內部的12MHz晶振,
        ALE引腳的頻率是單片機時鐘周期頻率
        的1/6,即2MHz。要想使ADC0808得到
        500KHz的時鐘基準,必須要把ALE輸出
        進行4分頻,這樣ADC0808才能可靠的
        工作。這里由于仿真軟件的原故,所以
        直接給ADC0808的CLOCK端加了一個
        500KHz的時鐘信號。
        控制線如下:
        (1)、P0.0、P0.1、P0.2控制ADC0808
        的8個通道。
        (2)、P2.7和/WR、/RD控制ADC0808
        的啟動、地址鎖存和輸出


        ADC0809 8路數據采集源碼:
        1. ;本程序用到單元(30H~34H,3DH,3EH)
        2. ;(30H~34H)用于存放顯示數據,(30H~33H)用于存放測量數據,34H用于存放通道號
        3. ;R1用于存放0809檢測出來的8個數據
        4. ;(3DH、3EH)用于存放0809檢測出來數據計算結果
        5.       ORG 0000H
        6.       AJMP MAIN
        7.       ORG 0013H
        8.       AJMP INT1
        9.       ORG 0030H
        10. ;======================================
        11. ;主程序
        12. MAIN: MOV R0,#30H      ;存放數據首地址
        13.       MOV R2,#0FH      ;計算數據存放單元個數
        14.       CLR A
        15. QING: MOV @R0,A        ;將數據存放單元清零
        16.       INC R0
        17.       DJNZ R2,QING
        18.       MOV R4,#08H      ;8路計數初值
        19.       MOV 34H,#00H     ;初始通道顯示單元為1號通道
        20.       SETB IT1         ;INT1置為邊沿觸發
        21.       SETB EA          ;開中斷
        22.       SETB EX1         ;允許INT1中斷
        23.       MOV DPTR,#7FF8H  ;指向0809通道0
        24.       MOV A,#00H       ;此指令可缺省
        25.       MOVX @DPTR,A     ;啟動A/D轉換
        26. HERE: ACALL JI_SUAN
        27.       AJMP HERE        ;等待中斷
        28. ;==========================================
        29. ;中斷子程序
        30. INT1: CLR EX1
        31.       PUSH PSW         ;保護現場
        32.       MOVX A,@DPTR     ;讀A/D轉換結果
        33.       MOV R1,A         ;存數據
        34.       INC DPTR         ;更新通道
        35.       MOV A,34H
        36.       INC A
        37.       MOV 34H,A
        38.       DJNZ R4,LOOP     ;巡回未完繼續
        39.       MOV R4,#08H      ;重新賦初值
        40.       MOV DPTR,#7FF8H
        41. LOOP:
        42.       MOVX @DPTR,A     ;啟動A/D轉換
        43.       POP PSW
        44.       RETI             ;返回中斷

        45. ;========================================
        46. ;數據計算
        47. JI_SUAN:
        48.       MOV A,R1
        49.       MOV B,#20        ;基準電壓為5伏,分辨率為5/256約為20毫伏
        50.       MUL AB           ;顯示數值單位為毫伏
        51.       MOV R7,A         ;測量出來的數據乘20毫伏即為實際電壓值,但還是十六進制
        52.       MOV A,B          ;高位存放在R6里,低位存放在R7里
        53.       MOV R6,A
        54.       MOV R5,#16
        55. ;=========================================
        56. ;雙字節十六進制轉雙字節BCD碼
        57. SBIN_SBCD:
        58.       MOV 3DH,#00H     ;數據計算結果清零
        59.       MOV 3EH,#00H
        60. SBIN_SBCD1:
        61.       MOV A,R7  ;R7左移一位并送回
        62.       RLC A
        63.       MOV R7,A
        64.       MOV A,R6  ;R6左移一位并送回
        65.       RLC A
        66.       MOV R6,A
        67.       MOV A,3DH
        68.       ADDC A,3DH
        69.       DA A       ;T_S乘2并調整后送回
        70.       MOV 3DH,A
        71.       MOV A,3EH
        72.       ADDC A,3EH
        73.       DA A       ;T_M乘2并調整后送回
        74.       MOV 3EH,A
        75.       DJNZ R5,SBIN_SBCD1 ;循環運行24次得到BCD碼結果
        76. ;=====================================
        77. ;雙字節BCD碼制轉4個單字節BCD碼
        78. SBCD_DBCD:
        79.       MOV A,3DH
        80.       MOV B,A
        81.       ANL A,#0FH ;將T_S里面的數據存放寄存器B里后再進行與操作得到低四位
        82.       MOV 30H,A  ;并存放到數碼管顯示的第一位地址40H里面
        83.       MOV A,B
        84.       SWAP A     ;從寄存器取回原來保存的數,再進行高低位互換
        85.       ANL A,#0FH ;進行與操作后得到高四位
        86.       MOV 31H,A  ;最后存放到數碼管顯示的第二位地址41H里面
        87.       MOV A,3EH  ;同上
        88.       MOV B,A
        89.       ANL A,#0FH
        90.       MOV 32H,A
        91.       MOV A,B
        92.       SWAP A
        93.       ANL A,#0FH
        94.       MOV 33H,A

        95. ;=======================================
        96. ;顯示子程序

        97. DIS:     MOV R5,#50      ;顯示循環次數,即改變顯示延時刷新時間
        98. DIS1:    MOV R1,#30H      ;把顯示數據第一位放在R0里
        99.          MOV R2,#04H      ;把顯示的位碼放在R1里
        100.          MOV R3,#05H      ;把顯示的長度放在R2里
        101. DIS2:    MOV A,@R1
        102.          ANL A,#0FH       ;屏蔽顯示數據的高四位
        103.          MOV B,A
        104.          MOV A,R2
        105.          ANL A,#0FH       ;屏蔽位碼的高四位
        106.          SWAP A
        107.          ORL A,B
        108.          MOV P0,A         ;送總顯示數據到P0顯示
        109.          LCALL DELY4ms    ;調用延時4ms
        110.          INC R1           ;取下一個顯示數據
        111.          DEC R2
        112.          DJNZ R3,DIS2     ;四位顯示晚后重新開始顯示
        113.          DJNZ R5,DIS1
        114.          MOV A,34H        ;顯示完后判斷通道好是否為8
        115.          CJNE A,#08H,HUI
        116.          MOV 34H,#00H
        117. HUI:     SETB EX1         ;顯示完畢再允許中斷
        118.          RET
        119. ;=====================================
        120. ;延時子程序
        121. DELY4ms: MOV R6,#8         ;延時4毫秒
        122. D1:      MOV R7,#248
        123.          DJNZ R7,$
        124.          DJNZ R6,D1
        125.          RET
        126.          END
        復制代碼

        ADC0808中斷檢測源碼:
        1. ;占用單元R0,R1,A,DPTR,30H~37H
        2. ORG 0000H
        3. AJMP MAIN
        4. ORG 0013H
        5. AJMP INT1
        6. ORG 0030H
        7. MAIN: MOV R0,#30H      ;數據暫存區首地址
        8.       MOV R1,#08H      ;8路計數初值
        9.       SETB IT1         ;INT1置為邊沿觸發
        10.       SETB EA          ;開中斷
        11.       SETB EX1         ;允許INT1中斷
        12.       MOV DPTR,#7FF8H  ;指向0808通道0
        13.       MOV A,#00H       ;此指令可缺省
        14.       MOVX @DPTR,A     ;啟動A/D轉換
        15. HERE: NOP
        16.       AJMP HERE        ;等待中斷

        17. INT1: PUSH PSW
        18.       MOVX A,@DPTR     ;讀A/D轉換結果
        19.       MOV @R0,A        ;存數
        20.       INC DPTR         ;更新通道
        21.       INC R0           ;更新暫存單元
        22.       DJNZ R1,HUI      ;巡回未完繼續
        23.       MOV R0,#30H      ;數據暫存區首地址
        24.       MOV R1,#08H      ;8路計數初值
        25.       MOV DPTR,#7FF8H  ;指向0808通道0
        26. HUI:  MOVX @DPTR,A     ;再次啟動A/D轉換
        27.       POP PSW
        28.       RETI             ;返回中斷
        復制代碼

        ADC0808查詢檢測源程序:
        1. ;占用單元R0,R1,A,DPTR,30H~37H
        2. ORG 0000H
        3. AJMP MAIN
        4. ORG 0030H
        5. MAIN: MOV R0,#30H    ;數據暫存區首地址
        6.       MOV R1,#08H    ;8路計數初值
        7.       MOV DPTR,#7FF8H;指向0808通道0
        8.       MOV A,#00H     ;此指令可缺省
        9.       MOVX @DPTR,A   ;啟動A/D轉換
        10. L1:   JB P3.3,L1     ;查詢INT1是否為0
        11.       MOVX A,@DPTR   ;若INT1為0,者轉換結束,讀出數據
        12.       MOV @R0,A      ;存數
        13.       INC DPTR       ;更新通道
        14.       INC R0         ;更新暫存單元
        15.       MOVX @DPTR,A   ;再次啟動A/D轉換
        16.       DJNZ R1,L1     ;判斷8路查詢是否完畢
        17.       AJMP MAIN      ;跳回重新開始
        18.       END
        復制代碼

        作者: qq2203049    時間: 2017-4-9 22:49
        謝謝樓主分享
        作者: 老哥舊人LOVE    時間: 2017-5-15 15:59
        謝謝樓主,很有用..
        作者: 老哥舊人LOVE    時間: 2017-5-15 16:00
        感謝樓主
        作者: hashjkxkj    時間: 2020-6-17 10:50
        樓主有C語言版本的程序嗎,沒學過匯編
        作者: jach09    時間: 2021-6-25 10:20
        居然還有人在用匯編,很懷舊啊!




        歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1