專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命
提供開發工具、應用測試 完善的開發代碼案例庫分享
從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!
基于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