專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
基于Pic16f873的數(shù)字溫度計(jì)及其源程序
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 ;
;***********復(fù)位向量*************
org 0000h ;
nop ;
;*************主程序***************
main
;*****************初始化***********************
bsf status,rp0 ;選RAM體1
movlw b’10001110’ ;結(jié)果右對齊
movwf adcon1 ;AN0作為模擬信號輸入口,參考電壓為vdd,vss
movlw b’11010110’ ;設(shè)置RC口狀態(tài)
movwf trisc ;只要SDI腳為輸入
clrf sspstat ;主要清除SMP和CKE位
bcf status,rp0 ; 選RAM體0
movlw 01000001b ;
movwf adcon0 ;設(shè)置時(shí)鐘源8tosc,使能adc,an0信道被選中
bcf pir1,adif ;
movlw b’00110010’ ;設(shè)置控制寄存器:設(shè)置fosc/64
movwf sspcon ;SPI主控方式;CKP=1
;******************** A/D轉(zhuǎn)換********************
;入口參數(shù):模擬信號加在RA0/AN0上。
;出口參數(shù):10位轉(zhuǎn)換結(jié)果在右對齊的souh:sou中。
start bsf adcon0,go ;開啟A/D轉(zhuǎn)換
btfsc adcon0,go ;A/D轉(zhuǎn)換完成了嗎?
goto $-1 ;未完,等待
movf adresh,w ;
movwf souh ;結(jié)果高位
bsf status,rp0 ;
movf adresl,w ;
bcf status,rp0 ;
movwf sou ;
;********判斷sou:souh是否大于1000,即是否大于100℃?****
;入口參數(shù):被減數(shù)在souhb:soub中,減數(shù)在rlth:rlt中。
;出口參數(shù):結(jié)果在souhb:soub中,借位標(biāo)志在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 ;否,轉(zhuǎn)向雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)化成壓縮BCD碼
movlw 71h ;是,rlth:rlt;souh:sou分別賦值71h,送顯,顯示FFF.F℃
movwf sou ;
movwf souh ;
movwf rlt ;
movwf rlth ;
goto display ;
;***********雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)化成壓縮BCD碼***************
;入口參數(shù):原二進(jìn)制數(shù)在souh:sou中。
;出口參數(shù):結(jié)果在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 ;整個雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)化成壓縮BCD碼結(jié)束
;跳轉(zhuǎn)到雙字節(jié)壓縮BCD碼轉(zhuǎn)化為非壓縮BCD碼
adjdec1 movlw sou ;
movwf fsr ;
call adjbcd1 ;調(diào)整rlt
movlw souh ;
movwf fsr ;
call adjbcd1 ;調(diào)整rlth
movlw rlt ;
movwf fsr ;
call adjbcd1 ;調(diào)整temp1
goto loopc1 ;
;********************調(diào)整BCD********************
adjbcd1 movlw 03h ;
addwf indf,w ;低四位加3
movwf temp1 ;暫存
btfsc temp1,3 ;結(jié)果大于7,
movwf indf ;則存起來
movlw 30h ;
addwf indf,w ;高四位加3
movwf temp1 ;
btfsc temp1,7 ;結(jié)果大于7,
movwf indf ;則存起來
retlw 0 ;
;*****************雙字節(jié)壓縮BCD碼轉(zhuǎn)化為非壓縮BCD碼************
;入口參數(shù):原BCD碼數(shù)在souh:sou中。
;出口參數(shù):結(jié)果在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碼轉(zhuǎn)化為七段碼*****************
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內(nèi)容疊加到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”的筆段碼
;*******************發(fā)送顯示************************
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 ;送數(shù)據(jù)給SSPBUF后開始發(fā)送
loop1 bcf status,rp1 ; 選RAM體1
bsf status,rp0 ;
btfss sspstat,bf ;查詢發(fā)送/接收完否
goto loop1 ;否,繼續(xù)查詢
bcf status,rp0 ;是,選RAM體1
movf sspbuf,w ;從SSPBUF中取出接到數(shù)據(jù),即使數(shù)據(jù)無用也應(yīng)騰空緩沖器
goto delay ; 跳轉(zhuǎn)到延時(shí)
;********************延時(shí)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