温度計(No.0009)







配線図



温度センサーに温度サーミスタを使用すると価格は安いが補償回路を付けなければならず、それだけで大変な仕事になりますので、今回は 温度に比例した電圧を出してくれる便利なIC ”LM35”を使用してLCD表示の温度計をつくりました。LM35は、1℃あたり10mVですから 100℃で、100℃×10mV=1.00Vになります。
PIC 16F873へのA/Dコンバータへは100℃で5Vの入力で設計しましたので、オペアンプ"LM358"で5倍増幅します。

オペアンプの増幅度 A=1+R2/R1=1+22.4/5.6=5

オペアンプの1番ピンからの温度に比例した出力電圧は、PIC 16F873のRA0に入れA/D変換します。
PIC 16F873では、RA0のアナログ電圧を10ビットのデジタル信号に変換します。10ビットは10進数で1023ですので、10で割れば 約100ですので都合よく100℃で5V→100.0を表示にすることが出来ます。

大きなICがPIC16F873 右後がLM358 手前右がLM35 ボリュウムはオペアンプの増幅調整用 LCDのコネクタは10Pを使用



LCD液晶表示器に10Pコネクタ接続




LCD温度表示 プログラム



;***********************************************
;  2005/2/9     
;  LM35 LCD表示温度計  0℃〜100℃
;     pic16f873   クロック 10MHZ 
;
;************************************************

	LIST	P=PIC16F873,R=DEC
	INCLUDE	"P16F873.INC"
	__CONFIG	_HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

;
;**************************************************
;	変数
;**************************************************

DLYH	EQU	H'20'
DLYL	EQU	H'21'
SAVE1	EQU	H'22'
CNT04M	EQU	H'24'
CNT10M	EQU	H'25'
CNT50M	EQU	H'26'
CNT20M	EQU	H'27'
CNT20U	EQU	H'28'
BCD1	EQU	H'33'		
BCD10	EQU	H'34'
BCD100	EQU	H'35'
BCD1000	EQU	H'36'
BCD_BIT_L	EQU	H'37'
BCD_BIT_H	EQU	H'38'
BCD_CNT		EQU	H'39'
BCD_SAVE	EQU	H'40'
CNT1SEC		EQU	H'41'


;****************************************************
;	定数
;*****************************************************

RS	SET	1	;RS
RW	SET	2	;RW
E	SET	3	;E

	ORG	0
	GOTO	MAIN

;****************************************************
;	MAIN
;****************************************************

MAIN	CALL	INIT		;初期設定
	CALL	INIT_LCD		;LCDの初期化

	MOVLW	B'00000001'	;SET CUR
	CALL	OUTLCD0
	CALL	DLY20MS
	MOVLW	H'3D'		;=オンド=を表示
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'B5'		
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'DD'		
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'C4'		
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'DE'		
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'B9'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'B2'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'		
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'3D'
	CALL	OUTLCD1
	CALL	DLY20MS

;********************************************************
;	1秒間隔で温度測定
;********************************************************

LOOP	MOVLW	B'10000001'	;Fosc/32 RA0 A/D ON
	MOVWF	ADCON0
	CALL	DLY20US		;20us待機
	BSF	ADCON0,GO	;A/D変換スタート
AD_LOOP	BTFSC	ADCON0,GO	;A/D変換完了チェック
	GOTO	AD_LOOP
	MOVF	ADRESH,W
	ANDLW	B'00000011'
	MOVWF	BCD_BIT_H
	BSF	STATUS,RP0
	MOVF	ADRESL,W
	BCF	STATUS,RP0
	MOVWF	BCD_BIT_L
	CALL	DISP_ONDO	;温度表示
	MOVLW	B'00000010'
	XORWF	PORTA,F		;LED点滅
	CALL	DLY1SEC		;1秒間隔で温度チェック
	GOTO	LOOP

;***************************************************
;	DISP_ONDO
;***************************************************

DISP_ONDO	
	CALL	BCD16BIT		;BCD変換へ
	MOVF	BCD1000,W	
	BTFSS	STATUS,Z		;0なら表示しない
	GOTO	B1000
	MOVF	BCD100,W
	BTFSS	STATUS,Z		;0なら表示しない
	GOTO	B100
	GOTO	SET10
B1000	MOVLW	H'C5'		;LCD表示位置
	CALL	OUTLCD0
	CALL	DLY20MS
	GOTO	SET1000
B100	MOVLW	H'C6'		;LCD表示位置
	CALL	OUTLCD0
	CALL	DLY20MS
	GOTO	SET100

;	温度表示************************************
SET1000	MOVF	BCD1000,W	;100の位
	IORLW	H'30'		;ASCIIコードに
	CALL	OUTLCD1
	CALL	DLY20MS
SET100	MOVF	BCD100,W		;10の位
	IORLW	H'30'
	CALL	OUTLCD1
	CALL	DLY20MS
SET10	MOVLW	H'C7'		;LCD表示位置
	CALL	OUTLCD0
	CALL	DLY20MS
	MOVF	BCD10,W		;1の位
	IORLW	H'30'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	'.'		;小数点
	CALL	OUTLCD1
	CALL	DLY20MS
SET1	MOVF	BCD1,W		;0.1の位
	IORLW	H'30'
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'DF'		;°
	CALL	OUTLCD1
	CALL	DLY20MS
	MOVLW	H'43'		;C
	CALL	OUTLCD1
	CALL	DLY20MS
	RETURN

;***************************************************
;	BCD変換
;***************************************************

BCD16BIT
	MOVLW	H'33'		;BCD1
	MOVWF	FSR
	CALL	BCD_16		;1の位
	CALL	BCD_16		;10の位
	CALL	BCD_16		;100の位
	CALL	BCD_16		;1000の位
	RETURN

BCD_16	MOVLW	D'16'
	MOVWF	BCD_CNT
	CLRF	BCD_SAVE
BCD_LOOP
	BCF	STATUS,C
	RLF	BCD_BIT_L,F
	RLF	BCD_BIT_H,F
	RLF	BCD_SAVE,F
	MOVLW	D'246'
	ADDWF	BCD_SAVE,W
	BTFSS	STATUS,C
	GOTO	BCD_END
	MOVWF	BCD_SAVE
	INCF	BCD_BIT_L,F
BCD_END
	DECFSZ	BCD_CNT,F
	GOTO	BCD_LOOP
	MOVF	BCD_SAVE,W
	MOVWF	INDF		;10で割った余りをFSRのアドレスに格納
	INCF	FSR,F		;FSRプラス1でメモリ移動
	RETURN



;***************************************************
;	INIT
;***************************************************

INIT	BSF	STATUS,RP0	;ページ1
	MOVLW	B'10001110'
	MOVWF	ADCON1		;右詰、RA0アナログ、
	MOVLW	B'00000001'	;RA0 IN
	MOVWF	TRISA
	MOVLW	B'00000000'	
	MOVWF	TRISB
	MOVWF	TRISC
	BCF	STATUS,RP0	;ページを戻す
	CLRF	PORTA
	CLRF	PORTB
	CLRF	PORTC
	RETURN

;****************************************************
;	LCD_INIT
;****************************************************

INIT_LCD
	CALL	DLY50MS
	MOVLW	B'00110000'
	CALL	OUTLCDL
	CALL	DLY20MS
	MOVLW	B'00110000'
	CALL	OUTLCDL
	CALL	DLY20MS
	MOVLW	B'00110000'
	CALL	OUTLCDL
	CALL	DLY20MS
	MOVLW	B'00100000'
	CALL	OUTLCDL
	CALL	DLY20MS
	MOVLW	B'00101000'
	CALL	OUTLCD0
	CALL	DLY20MS
	MOVLW	B'00001100'
	CALL	OUTLCD0
	MOVLW	B'00000001'
	CALL	OUTLCD0
	CALL	DLY50MS
	MOVLW	B'00000110'
	CALL	OUTLCD0
	CALL	DLY50MS
	RETURN



;**********************************************
;	LCD CONT
;**********************************************
;*****    コマンド 出力       ****************
OUTLCD0				;CMD
	MOVWF	SAVE1
	ANDLW	0F0H
	CALL	OUTLCDL
	SWAPF	SAVE1,W
	ANDLW	0F0H
	CALL	OUTLCDL
	RETURN
OUTLCDL
	MOVWF	PORTB
	BCF	PORTB,RW		;RW0 書き込みモード
	BCF	PORTB,RS		;RS0 コマンドモード
	BSF	PORTB,E		;E1  Hでストロープ
	NOP
	BCF	PORTB,E 		;E0
	RETURN


;*****	LCDへデータ出力  **********************
OUTLCD1				;DATA
	MOVWF	SAVE1
	ANDLW	0F0H
	CALL	OUTLCD
	SWAPF	SAVE1,W
	ANDLW	0F0H
	CALL	OUTLCD
	RETURN
OUTLCD
	MOVWF	PORTB
	BCF	PORTB,RW		;RW0 書き込みモード
	BSF	PORTB,RS		;RS1 データモード
	BSF	PORTB,E		;E1  動作信号の設定 Hでストロープ
	NOP
	BCF	PORTB,E		;E0
	RETURN

;******************************************
;	TIME DELAY
;******************************************

DLY20US	MOVLW	D'15'		;20usec
	MOVWF	CNT20U
LOOP20U	DECFSZ	CNT20U,F
	GOTO	LOOP20U
	RETURN

DLY1SEC	MOVLW	D'100'		;1SEC
	MOVWF	CNT1SEC
LOOP1S	CALL	DLY10MS
	DECFSZ	CNT1SEC,F
	GOTO	LOOP1S
	RETURN

TIM04	MOVLW	D'249'		;0.4MSEC
	MOVWF	CNT04M
LOOP04M	NOP
	DECFSZ	CNT04M,F
	GOTO	LOOP04M
	RETURN
DLY10MS	MOVLW	D'25'		;10MSEC
	MOVWF	CNT10M
LOOP10M	CALL	TIM04
	DECFSZ	CNT10M,F
	GOTO	LOOP10M
	RETURN

DLY50MS	MOVLW	D'5'
	MOVWF	CNT50M		;50MSEC
LOOP50M	CALL	DLY10MS
	DECFSZ	CNT50M,F
	GOTO	LOOP50M
	RETURN

DLY20MS	MOVLW	D'2'
	MOVWF	CNT20M		;20MSEC
LOOP20M	CALL	DLY10MS
	DECFSZ	CNT20M,F
	GOTO	LOOP20M
	RETURN

	END







CCS社のC言語で組んでみました。


HEXファイル
PIC電子工作 目次に戻る

-- トップペ-ジ -- アマチュア無線 -- 14MHzトランシーバー -- ホビー電子工作 -- ラジオ雑学クラブ -- PIC電子工作 -- DIARY -- プリント基板配布 -- リンクのページ --










トップペ-ジに戻る