天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234

技術支持

基于Pic16f873的數字溫度計及其源程序

更新時間: 2019-03-23

基于Pic16f873的數字溫度計及其源程序

list  p=16f877    ;
include;
cnt      equ    023h  ;
sou      equ   024h  ;
souh     equ   025h  ;
rlt       equ   026h  ;
rlth      equ   027h  ;
temp1    equ   028h  ;
temp2    equ   029h  ;
temp3    equ   02ah  ;
soub     equ   02bh  ;
souhb    equ   02ch  ;
;***********復位向量*************
org    0000h  ;
nop           ;
 ;*************主程序***************
main     
;*****************初始化***********************
bsf    status,rp0        ;選RAM體1
          movlw    b’10001110’   ;結果右對齊
          movwf    adcon1       ;AN0作為模擬信號輸入口,參考電壓為vdd,vss
          movlw  b’11010110’     ;設置RC口狀態
          movwf   trisc          ;只要SDI腳為輸入
          clrf      sspstat        ;主要清除SMP和CKE位
          bcf      status,rp0      ; 選RAM體0
          movlw   01000001b     ;
          movwf     adcon0      ;設置時鐘源8tosc,使能adc,an0信道被選中
          bcf           pir1,adif  ;
          movlw   b’00110010’   ;設置控制寄存器:設置fosc/64
          movwf   sspcon        ;SPI主控方式;CKP=1
;******************** A/D轉換********************
;入口參數:模擬信號加在RA0/AN0上。
;出口參數:10位轉換結果在右對齊的souh:sou中。
start          bsf           adcon0,go    ;開啟A/D轉換
             btfsc         adcon0,go     ;A/D轉換完成了嗎?
             goto          $-1          ;未完,等待
             movf          adresh,w     ;
             movwf         souh        ;結果高位
             bsf           status,rp0     ;
             movf          adresl,w     ;
             bcf           status,rp0     ;
             movwf         sou         ;
;********判斷sou:souh是否大于1000,即是否大于100℃?****
;入口參數:被減數在souhb:soub中,減數在rlth:rlt中。
;出口參數:結果在souhb:soub中,借位標志在STATUS:C中,'0'表示有借位。
movf       sou,w     ;
movwf      soub     ;
movf       souh,w    ;
movwf      souhb    ;
movlw      0e7h     ;
movwf      rlt       ;
movlw      03h      ;
movwf      rlth      ;
dusub       movf        rlt,w     ;
            subwf       soub     ;
            movf        rlth,w    ;
            btfss       status,c    ;
            incfsz      rlth,w     ;
            subwf       souhb,f   ;
btfsc        status,c   ;是否大于100℃?
goto         dbtbcd  ;否,轉向雙字節二進制數轉化成壓縮BCD碼
movlw       71h    ;是,rlth:rlt;souh:sou分別賦值71h,送顯,顯示FFF.F℃
movwf       sou     ;
movwf       souh    ;
movwf       rlt      ;
movwf       rlth     ;
goto         display  ;
;***********雙字節二進制數轉化成壓縮BCD碼***************
;入口參數:原二進制數在souh:sou中。
;出口參數:結果在rlt:souh:sou中。
dbtbcd       movf        sou,w    ;
            movwf       temp2    ;
            movf        souh,w    ;
            movwf       temp3    ;
            clrf        sou        ;
            clrf        souh       ;
            clrf        rlt         ;
            bcf         status,c    ;
            movlw       .16      ;
            movwf       cnt      ;
loopc1      rlf         temp2,f     ;
rlf         temp3,f    ;
rlf         sou,f      ;
rlf         souh,f     ;
rlf         rlt,f       ;
decfsz      cnt,f      ;
goto        adjdec1   ;     
goto       dcobcdtu   ;整個雙字節二進制數轉化成壓縮BCD碼結束
                     ;跳轉到雙字節壓縮BCD碼轉化為非壓縮BCD碼
adjdec1      movlw       sou       ;
movwf       fsr       ;
call        adjbcd1     ;調整rlt
movlw       souh      ;
movwf       fsr       ;
call        adjbcd1     ;調整rlth
movlw       rlt        ;
movwf       fsr       ;
call        adjbcd1     ;調整temp1
goto        loopc1     ;
;********************調整BCD********************
adjbcd1      movlw       03h       ;
            addwf       indf,w      ;低四位加3
            movwf       temp1     ;暫存
            btfsc       temp1,3     ;結果大于7,
            movwf       indf      ;則存起來
            movlw       30h       ;
            addwf       indf,w     ;高四位加3
            movwf       temp1     ;          
            btfsc       temp1,7     ;結果大于7,
            movwf       indf       ;則存起來
            retlw       0          ;
;*****************雙字節壓縮BCD碼轉化為非壓縮BCD碼************
;入口參數:原BCD碼數在souh:sou中。
;出口參數:結果在rlth:rlt:souh:sou中。
;說明:由于溫度不大于100.0℃,精確到0.1℃,所以取四位BCD碼
dcobcdtu     swapf        souh,w   ;
            andlw        0fh      ;
            movwf       rlth      ;
            movlw       0fh      ;
            andwf      souh,w   ;
            movwf       rlt       ;
            swapf        sou,w    ;
            andlw        0fh      ;
            movwf       souh     ;
            movlw       0fh      ;
            andwf      sou,f    ;
;****************非壓縮BCD碼轉化為七段碼*****************
movf       rlth,w    ;
call        convert   ;
movwf     rlth       ;
movf      rlt,w      ;
call       convert    ;
movwf     rlt        ;
movf      souh,w    ;
call       convert    ;
movwf      souh     ;
movf       sou,w    ;
call        convert   ;
movwf     sou       ;
goto       display    ;
convert      addwf      pcl,f   ;把W內容疊加到PC的低8位上
retlw      03fh   ;返回字符“0”的筆段碼(bit7-bit0=a,b,……dp)
retlw      06h     ;“1”的筆段碼
retlw      5bh     ;“2”的筆段碼
retlw      4fh     ;“3”的筆段碼
retlw      66h     ;“4”的筆段碼
retlw      6dh     ;“5”的筆段碼
retlw      7dh     ;“6”的筆段碼
retlw      07h     ;“7”的筆段碼
retlw      7fh     ;“8”的筆段碼
retlw      6fh     ;“9”的筆段碼
;*******************發送顯示************************
display      movf     sou,w    ;
call      out_in    ;
movf     souh,w   ;
call      out_in    ;
movf     rlt,w     ;
call      out_in    ;
movf     rlth,w    ;
call      out_in    ;
goto     delay     ;   
out_in       movwf   sspbuf   ;送數據給SSPBUF后開始發送
loop1       bcf      status,rp1   ; 選RAM體1
bsf      status,rp0   ;
btfss     sspstat,bf   ;查詢發送/接收完否
goto    loop1       ;否,繼續查詢
bcf     status,rp0    ;是,選RAM體1
movf   sspbuf,w ;從SSPBUF中取出接到數據,即使數據無用也應騰空緩沖器
goto    delay        ;   跳轉到延時
;********************延時1秒********************
delay    
lp0         movlw       0ah     ;
           movlw       0ffh     ;
           movwf       32h     ;
           movwf       30h     ;
lp1        movlw       0ffh     ;
movwf       31h    ;
lp2         decfsz        31h    ;
goto          lp2    ;
decfsz        30h    ;
goto           lp1   ;
decfsz         32h   ;
goto           lp0   ;
goto           start  ;
end

404
返回首頁 |  返回上一頁
联系我们: 叶城县| 夏邑县| 武宁县| 陆川县| 灯塔市| 高安市| 潮州市| 阿拉尔市| 惠安县| 布拖县| 三台县| 房山区| 呼和浩特市| 尚义县| 汉中市| 赣榆县| 治县。| 龙南县| 梧州市| 蓬莱市| 兴化市| 沧源| 吴桥县| 曲沃县| 高清| 伊金霍洛旗| 沐川县| 南木林县| 陕西省| 牡丹江市| 新野县| 仁化县| 武城县| 沈阳市| 长寿区| 健康| 皋兰县| 怀宁县| 尤溪县| 西青区| 凯里市|