⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdand18b20.asm

📁 PIC与温度传感器DS18B20汇编编程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;18B10温度测量+LCD1602显示温度

;实战目的
;1、学习18B20单总线温度传感器的使用。
;2、学习LCD的使用。
;3、学习10进制转10进制的方法。

;所有资源:
;1、TMRO定时器。产生温度转换所需要的延时时间。
;2、PORTA口。即做LCD显示时可控制端口,RA2同时做18B20的数据接口
;3、PORTC口。做LCD显示时的数据口。

;功能说明
;1、通过18B20采集当前环境
;最高温度可显示127.9375,最低温度可显示0.0625(无负温度处理部分)
;2、将温度在LCD上显示(3位整数,4位小数)

;硬件连接
;1,在18B20按DEMO板上的标识插在插座U8上
;2,拨码开关S13第4位置ON
;3,其他所有拨码开关都置OFF

;深圳市乾龙盛电子科技有限公司(PIC单片机学习网)
;网站 http://www.pic16.com   讨论论坛:http://pic16.com/bbs/
;实例编制:技术部 钟闺田(工程师)   论坛网名:zhongruntian
;版权所有,转载请注明出处,并不能去掉或改变文件中的说明文字。
;程序文件名“LCDAND18B20.ASM“

;源程序如下:
 LIST P=PIC16F877
 TITLE="LCD DISPLAY"
 ERRORLEVEl -302           ;去掉编译时的302号提示信息
;__CONFIG B'000010010101' ;代码保护开启;WRT_ENABLE;CPD_ENABLE;LVP_DISABLE;BODEN_ENABLE
                         ;PWRTE_ENABLE;WDT_ENABLE;OSC_XT

;*****************以下是暂存器的定义*****************************
#INCLUDE<P16F877A.INC>
#DEFINE RS PORTA,1         ;LCD控制信号
#DEFINE RW PORTA,2         ;LCD控制信号
#DEFINE E  PORTA,3         ;LCD控制信号
#DEFINE DAT PORTC          ;LCD数据线
#DEFINE DQ PORTA,2         ;18B20数据口

 
    CBLOCK 20H
DQ_DELAY1
DQ_DELAY2
TEMP
TEMP1
TEMP2                         ;存放采样到的温度值
COUNT
COUNT1
 ENDC
TMR0_VALUE        EQU  0AH   ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000us
DQ_DELAY_VALUE1   EQU  0FAH
DQ_DELAY_VALUE2   EQU  4H

;***********************以下是宏定义****************************
READ_STATE  MACRO           ;读18B20的状态
    BCF    RS
    BSF    RW
    BSF    E
    ENDM

WRITE_COMMAND MACRO         ;写命令
    BCF    RS
    BCF    RW
    BCF    E
    ENDM

WRITE_DATA MACRO            ;写数据
    BSF    RS
    BCF    RW
    BCF    E
    ENDM
;**********************以下是程序的开始************************
	ORG    00H              
    NOP   
	GOTO   MAIN             ;入口地址
	ORG    04H
    RETFIE                  ;在中断入口出放置一条中断返回指令,防止干扰产生中断
   

;***************************主程序*******************************
MAIN
    CLRF     PORTC
    CLRF     PORTA
    BANKSEL  TRISA
    CLRF     TRISA              ;A口所有先设置为输出
    CLRF     TRISC
	MOVLW    01H
    MOVWF    OPTION_REG         ;分频比1:4,定时器,内部时钟源
    MOVLW    06H
    MOVWF    ADCON1             ;关闭所有A/D口
	BCF      STATUS,RP0
    MOVLW    00H
	MOVWF    INTCON             ;关闭所有中断,且同时清零T0IF
    
	CLRF     TEMP
    CLRF     TEMP1
    CLRF     TEMP2              ;清零临时寄存器
  
     
;****************************循环处理部分************************

;先启动18B20温度转换程序,在判断温度转换是否完成(需750us)
;未完成则调用显示子程序,直到完成温度转换
;完成后读取温度值
;送LCD显示
LOOP 
    CALL     RESET_18B20      ;调用复位18B20子程序
    MOVLW    0CCH 
    MOVWF    TEMP
    CALL     WRITE_18B20      ;SKIP ROM命令
    MOVLW    44H
    MOVWF    TEMP
    CALL     WRITE_18B20      ;温度转换命令   
    CLRF     STATUS
    BCF     INTCON,T0IF       
    CALL     DELAY_750MS      ;调用温度转换所需要的750MS延时
    NOP
    CALL     RESET_18B20      
    MOVLW    0CCH 
    MOVWF    TEMP
    CALL     WRITE_18B20      ;SKIP ROM命令
    MOVLW    0BEH 
    MOVWF    TEMP
    CALL     WRITE_18B20      ;读温度命令
    CALL     READ_18B20       ;调用读温度低字节
    MOVFW    TEMP
    MOVWF    TEMP1            ;保存到TEMP1
    CALL     READ_18B20       ;调用读温度高字节
    MOVFW    TEMP
    MOVWF    TEMP2            ;保存到TMEP2
	CALL     RESET_18B20      
    CALL     TEMP_CHANGE      ;调用温度转换程序
    CALL     DISPLAY          ;调用LCD显示程序
    GOTO     LOOP             ;循环工作

;***************************LCD显示子程序************************
DISPLAY
;LCD模块初始化,由厂家提供的资料显示,其初始化过程为:

;6----写指令38H,此条指令是将LCD显示模块设置为8位数据线,双行,5X7点阵显示
;7----检测Busy信号;
;8----写指令08H,关闭显示
;9----检测Busy信号;
;10---写指令01H,显示清屏
;以后写入光标等的控制指令.
    BANKSEL  TRISA
    CLRF     TRISA           ;A口为LCD控制信号,全输出
    BANKSEL  PORTA

	NOP    
    MOVLW   38H
    CALL    COMMAND_WRITE    ;显示模式设置:16*2显示,5*7点阵,8位数码接口
    MOVLW   08H
    CALL    COMMAND_WRITE    ;显示关闭,不显示光标
    MOVLW   01H
    CALL    COMMAND_WRITE    ;显示清屏
    MOVLW   06H
    CALL    COMMAND_WRITE    ;显示光标移动设置(右移),整屏显示不移动
    MOVLW   0CH
    CALL    COMMAND_WRITE    ;显示开及光标设置,不显示光标
DISPLAY0
    MOVLW   84H
    CALL    COMMAND_WRITE    ;设置显示起始位置
    CALL    BUSY             ;判忙
   
    MOVLW   8H               ;共8个数据需要显示
    MOVWF   COUNT
    MOVLW   37H              ;取数地址
    MOVWF   FSR
DISPLAY1
    INCF    FSR,1            ;取数地址加1
    MOVFW   INDF
    CALL    DATA_WRITE       ;调用写数据子程序
    DECFSZ  COUNT,1
    GOTO    DISPLAY1         	  
    RETURN

;*****************************写命令子程序***********************
COMMAND_WRITE   
    WRITE_COMMAND            ;设置写命令所需要的控制信号
    MOVWF    DAT             ;把命令字送数据口
    BSF      E
    NOP
    BCF      E              
    CALL     BUSY            ;判忙
    RETURN
;**************************判总线忙子程序************************
BUSY       
    BSF      STATUS,RP0
    MOVLW    80H
    MOVWF    TRISC           ;数据口最高位置为输入口
    BCF      STATUS,RP0
    READ_STATE
    NOP
    BCF      E
    BTFSC    DAT,7           ;是否忙
    GOTO     BUSY            ;是,继续判断
    BANKSEL  TRISC
    CLRF     TRISC           ;否,数据最高位恢复为输出状态
    BCF      STATUS,RP0
    RETURN
;*************************写数据子程序***************************
DATA_WRITE
    WRITE_DATA
    MOVWF    DAT
    BSF      E
    NOP
    BCF      E
    CALL     BUSY
    RETURN
   
;*********************复位DS18B20子程序**************************
RESET_18B20
;根据DATASHEET介绍,写数据时应遵照如下规定:
;主控制器把总线拉低至少480us,
;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号  	
    BANKSEL  TRISA
    BCF      TRISA,2
    BCF      STATUS,RP0
    BCF      DQ
    MOVLW    0A0H
    MOVWF    COUNT           ;160US
    DECFSZ   COUNT,1
    GOTO     $-1             ;拉低480us
    BSF      DQ              ;释放总线  
    MOVLW    14H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -