PIC16F877A控制DS18B20汇编程序

发布者:qq8174350最新更新时间:2012-11-27 来源: 21ic 关键字:PIC16F877A  DS18B20  汇编程序 手机看文章 扫描二维码
随时随地手机看文章

;***********************************************
;功能实现:通过DS18B20来读取温度,显示在2位LED上,精确到1度
;硬件连接:(1)RC0-RC7接共阳数码管的段码A-H
;             RA0-RA3接共阳数码管的位码DIG0-DIG3
;***************************************************

;****************************************************
;定义单片机型号为PIC16F877A
;程序包含文件:P16F877A.INC
;定义配置字
;*********************************************************
LIST   P=16F877A                  ;定义本程序所使用的芯片为PIC16F877A
#INCLUDE "P16F877A.INC"            ;定义本程序包含该文件

__CONFIG  3F72H                   ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能
                                  ;低电压编程禁止,代码不保护

#DEFINE   DQ         PORTB,2
#DEFINE   DIR        TRISB,2
        
CBLOCK    20H
      Y1
      Y2
      COUNT1
      COUNT2
      COMD
      DATE
      BIN_L                       ;要进行转换的字节
      GE                          ;转换后的个位
      SHI                         ;转换后的十位
      DATE_L
      DATE_H
      ENDC

;*****************************************************
;复位矢量定义(对于16F877A)
;***************************************************
          ORG     0000H           ;复位矢量地址
          GOTO   MAIN             ;程序跳转到MAIN主程序
;----------------------------------------------------------------------

;***************************************************
;主程序区
;************************************************
         ORG        0005H
MAIN 
         NOP
         CALL      INTIAL      
START    BTFSS     DQ             ;数据线空闲状态为高电平
         GOTO      $-1
         CALL      RESET          ;复位DS18B20
         MOVLW     0CCH           ;跳过读ROM命令
         CALL      WR18B20      
         MOVLW     44H            ;温度转换
         CALL      WR18B20
         CALL      DELAY_750US     ;延时750us
         CALL      RESET          ;复位DS18B20
         MOVLW     0CCH           ;跳过读ROM命令
         CALL      WR18B20   
         MOVLW     0BEH           ;读内部RAM中的9字节内容
         CALL      WR18B20
         NOP
         CALL      RE18B20        ;读数据  
         MOVF      DATE,W       
         MOVWF     DATE_L         ;读低8位
         CALL      RE18B20        ;读数据  
         MOVF      DATE,W       
         MOVWF     DATE_H         ;读高8位
         MOVF      DATE_L,W
;------------------------显示处理--------------------------------------
         RRF       DATE_H,F
         RRF       DATE_L,F
         RRF       DATE_H,F
         RRF       DATE_L,F
         RRF       DATE_H,F
         RRF       DATE_L,F
         RRF       DATE_H,F
         RRF       DATE_L,F
         MOVF      DATE_L,W
         MOVWF     BIN_L          ;把高8位的低4位和低8位的高4位组合起来
         CALL      DISPLAY        ;调用数码管显示程序
         GOTO      START
       
;=================================================

;************************************************
;初始化和消影
;***********************************************************
INTIAL   BSF       STATUS,RP0     ;定义当前体为体1,对方向寄存器进行修改
         MOVLW     07H
         MOVWF     ADCON1         ;关闭A口的模拟通道  
         MOVLW     00H
         MOVWF     TRISC          ;段码显示口为输出口
         MOVLW     0F0H
         ANDWF     TRISA,1        ;使位码(RA0-RA3)为输出口    
         BSF       DIR             ;使数据线为输入
         BCF       STATUS,RP0     ;使当前体为体0
         MOVLW     0FFH           ;关闭段码
         MOVWF     PORTC
         MOVLW     0FFH           ;关闭位码
         MOVWF     PORTA
         BTFSS     DQ             ;数据线空闲状态为高电平
         GOTO      $-1
         CALL      RESET          ;复位DS18B20
         MOVLW     0CCH           ;跳过读ROM命令
         CALL      WR18B20      
         MOVLW     44H            ;温度转换
         CALL      WR18B20
         CALL      DELAY_750US     ;延时750us
         CALL      RESET          ;复位DS18B20
         MOVLW     0CCH           ;跳过读ROM命令
         CALL      WR18B20   
         MOVLW     0BEH           ;读内部RAM中的9字节内容
         CALL      WR18B20
         NOP
         NOP
         CALL      RE18B20        ;读数据  
         CALL      RE18B20        ;读数据  
         CALL      DELAY_MAX      ;延时600ms
         CALL      DELAY_MAX
         CALL      DELAY_MAX
         RETLW     00H
;===================================================

;**************************************************
;显示所测得的温度子程序
;**********************************************
DISPLAY
         CALL      _BCD
         MOVF      SHI,W
         ANDLW     0FH
         CALL      TABLE          ;调用查表指令
         MOVWF     PORTC          ;显示十位段码
         BCF       PORTA,0         ;选通十位显示位码
         CALL      DELAY
         BSF       PORTA,0        ;关闭十位显示位码
         MOVF      GE,W
         ANDLW     0FH
         CALL      TABLE          ;调用查表指令
         MOVWF     PORTC          ;显示个位段码
         BCF       PORTA,1         ;选通个位显示位码
         CALL      DELAY
         BSF       PORTA,1        ;关闭个位显示位码
         RETLW     00H[page]
;======================================================
      
;*******************************************************
;二进制转BCD码
;****************************************************
_BCD     CLRF      SHI            ;保存地址清零
         CLRF      GE           
         MOVF      BIN_L,F        ;组合码自己给自己赋值,测试是否为0
         SKPNZ                    ;不为0则跳到下一步
         RETLW     00H
SHI_     MOVLW     D\'10\'
         SUBWF     BIN_L,W        ;BIN_L减10,结果存到W寄存器
         BTFSS     STATUS,C       ;执行减法后,如果无借位
         GOTO      GE_
         MOVWF     BIN_L
         INCF      SHI
         GOTO      SHI_
GE_      MOVF      BIN_L,W
         MOVWF     GE
         RETLW     00H            
;=================================================

;**********************************************************
;延时200ms
;************************************************************
DELAY_MAX
         MOVLW    0FFH
         MOVWF    Y1
         MOVLW    0FFH
         MOVWF    Y2
         DECFSZ   Y2
         GOTO     $-1
         DECFSZ   Y1
         GOTO     $-5
         RETLW    00H
;==========================================

;***************************************************
;延时6ms
;*****************************************************
DELAY
         MOVLW    03FH
         MOVWF    Y1
         MOVLW    020H
         MOVWF    Y2
         DECFSZ   Y2
         GOTO     $-1
         DECFSZ   Y1
         GOTO     $-5
         RETLW    00H
;==============================================

;********************************************
;延时750us子程序
;**********************************************************
DELAY_750US
         MOVLW    09H
         MOVWF    Y1
         MOVLW    01AH
         MOVWF    Y2
         DECFSZ   Y2
         GOTO     $-1
         DECFSZ   Y1
         GOTO     $-5
         RETLW    00H
;=========================================

;*******************************************************
;查表子程序,用于显示段码数字
;数码管为共阳数码管
;********************************************************
TABLE
      ADDWF    PCL,F
      RETLW    0C0H               ;"0"
      RETLW    0F9H               ;"1"
      RETLW    0A4H               ;"2"
      RETLW    0B0H               ;"3"
      RETLW    99H                ;"4"
      RETLW    92H                ;"5"
      RETLW    82H                ;"6"
      RETLW    0F8H               ;"7"
      RETLW    80H                ;"8"
      RETLW    90H                ;"9"
;===============================================

;***********************************************************
;DS18B20复位和应答子程序
;************************************************************
RESET    BSF       STATUS,RP0     ;使当前体为体1
         BCF       DIR            ;使数据位为输出
         BCF       STATUS,RP0     ;使当前体为体0
         BSF       DQ             ;拉高数据位
         NOP                      ;空循环
         BCF       DQ             ;拉低数据位
         MOVLW     D\'200\'         ;延时600us
         MOVWF     Y1            
         DECFSZ    Y1
         GOTO      $-1
         BSF       STATUS,RP0     ;使当前体为体1
         BSF       DIR            ;使数据位为输入
         BCF       STATUS,RP0     ;使当前体为体0
         MOVLW     D\'30\'          ;延时90us
         MOVWF     Y1
         DECFSZ    Y1
         GOTO      $-1
         BTFSC     DQ             ;主机接收到低电平应答脉冲,跳转到下一句
         GOTO      RESET     
         MOVLW     D\'80\'          ;延时240us
         MOVWF     Y1
         DECFSZ    Y1
         GOTO      $-1
         BTFSS     DQ             ;主机接收到高电平应答脉冲,跳转到下一句
         GOTO      RESET
         RETLW     00H            ;返回00H,复位应答结束
;=================================================

;***********************************************************
;写DS18B20子程序
;************************************************************
WR18B20
         MOVWF     COMD           ;把要写的数据写到COMD内
         MOVLW     D\'8\'
         MOVWF     COUNT2         ;大循环8次
WR0      BSF       STATUS,RP0     ;使当前体为体1
         BCF       DIR            ;使数据位为输出
         BCF       STATUS,RP0     ;使当前体为体0
         BCF       DQ             ;拉低数据线
         NOP
         NOP
         MOVLW     D\'2\'
         MOVWF     COUNT1         ;延时9us
WR1      DECFSZ    COUNT1,1
         GOTO      WR1  
         BTFSC     COMD,0         ;COMD最低位为0则跳转到下一句
         BSF       DQ             ;拉高数据线
         BTFSC     COMD,0         ;COMD最低位为0则跳转到下一句
         NOP
         BCF       STATUS,C         ;进位位置0
         RRF       COMD,1          ;带进位位,COMD向右移一位
         MOVLW     D\'20\'           ;延时60us
         MOVWF     COUNT1
WR2      DECFSZ    COUNT1,1
         GOTO      WR2
         BSF       DQ             ;拉高数据线,空闲状态
         BSF       STATUS,RP0     ;使当前体为体1
         BSF       DIR            ;使数据位为输入
         BCF       STATUS,RP0     ;使当前体为体0  
         DECFSZ    COUNT2,1       ;8次循环到了则跳出
         GOTO      WR0   
         RETLW     00H
;====================================================
       
******************
;读18B20子程序
;**********************************************************        
RE18B20
         MOVLW     8
         MOVWF     COUNT2
RE0      BSF       STATUS,RP0     ;使当前体为体1
         BCF       DIR            ;使数据位为输出
         BCF       STATUS,RP0     ;使当前体为体0
         BCF       DQ
         MOVLW     2
         MOVWF     COUNT1
RE1      DECFSZ    COUNT1,1
         GOTO      RE1
         BSF       STATUS,RP0     ;使当前体为体1
         BSF       DIR            ;使数据位为输入
         BCF       STATUS,RP0     ;使当前体为体0
         NOP
         BTFSS     DQ             ;如果数据线为高电平,则C=1
         BCF       STATUS,C
         BTFSC     DQ             ;如果数据线为低电平,则C=0
         BSF       STATUS,C
         RRF       DATE,1          ;数据依次存在DATE上
         MOVLW     D\'20\'           ;延时60us
         MOVWF     COUNT1
RE2      DECFSZ    COUNT1,1
         GOTO      RE2
         DECFSZ    COUNT2,1
         GOTO      RE0
         BSF       DQ
         RETLW     00H
;======================================================      

;==============================================
         END                      ;程序结束

关键字:PIC16F877A  DS18B20  汇编程序 引用地址:PIC16F877A控制DS18B20汇编程序

上一篇:PIC16F877单片机与PC机通讯的汇编程序
下一篇:PIC单片机的浮点数格式及转换

推荐阅读最新更新时间:2024-03-16 13:14

单片机·DS18B20温度传感器
一、DS18B20的特点 1. 一线总线 数字化温度传感器。(一线掌握好时序,比较简单) 2. 3~5V宽电压工作范围 3. 分辨9-12位可调 二、DS18B20的正确接线 面对着扁平的那一面,左负右正,一旦接反就有可能烧毁,也是温度显示85 C的原因。 且只有一根I/O线,注意读写时序 。 三、DS18B20时序介绍 1)复位 输入 t0-t1时刻:复位脉冲 480-960us ; t1-t2时刻:释放总线 15-60us ; 检测 t2-t3时刻:虚线部分由DS18B20控制,60-240us低电平则表示复位成功,否则失败
[单片机]
STC单片机串口发送数据汇编程序
本段程序是在STC官方程序的基础上精简而成,只保留了串口单向发送,使用串口助手可以接收到数据。 本段代代码目的是为了调试的方便,单片机内部一些工作状态和数据可以通过串口发送出来,比如AD采集到的数据等,对调试程序会起到事半功倍的效果。以下为asm格式汇编代码: ; --- 使用伟福6000编译,STC15W401AS 实测通过------------ ;-----定时器2用作串口1的波特率发生器------- ;在Keil开发环境下请选择Intel的8058芯片型号进行编译 ;工作频率为11.0592MHz ;----------------------------------------- AUXR EQU 08EH
[单片机]
PIC入门汇编程序集锦
适合3ePIC试验板,爱晶产品销售服务做的不好,好多C程序都是自己写的,不过汇编程序参考一下不错。 ;------------------------------------------------------------------------------------------ ;单双位变换显示实验参考程序注意:此程序请用单步执行(实验1-1.asm) ;------------------------------------------------------------------------------------------ STATUS EQU 03H ;特殊功能寄存器定义 TRISD EQU 88H ;特殊功
[单片机]
温度传感器ds1820 的汇编程序
晶振:12M TEMPER_L EQU 36H TEMPER_H EQU 35H TEMPER_NUM EQU 60H FLAG1 BIT 00H DQ BIT P3.3 AAA:MOV SP,#70H LCALL GET_TEMPER LCALL TEMPER_COV LJMP AAA NOP ;------------------读出转换后的温度值 GET_TEMPER: SETB DQ ; 定时入口 BCD:LCALL INIT_1820 JB FLAG1,S22 LJMP BCD ; 若DS18B20不存在则返回 S22:LCALL DELAY1 MOV A,#0CCH ; 跳过ROM匹配------0CC LCALL W
[单片机]
基于单片机SPCE061A的智能温度计设计
  O 引言   常用温度计依材料和用途种类可分为以下几种:玻璃水银温度计,测量准确,价格低廉,但必须直接接触人体3 min以上,而且由于刻度过细,不易读数,同时还有易碎等缺点;电子数字显示温度计,以数字形式显示体温,对玻璃水银温度计不易读数的缺点进行了改进,但仍然存在紧急情况下需要一直关注温度计的缺点;贴纸温度计,使用方便但精度不高;奶嘴温度计,属于专用温度计,夜间使用不方便;耳温枪,价格昂贵;一次性体温计相对成本较高等。   在数字温度计的基础上采用数字语音技术,测量结果通过语音的方式播报,可以发挥听觉的优势,弥补完全用光信号传递信息的不足,实现温度测量由“查询方式” 向“中断方式”的过渡,充分发挥中断方式的优势,如在光线
[单片机]
51单片机学习笔记:DS18B20测温程序
C代码 #include my51.h #include smg.h #include ds18b20.h void main() //测试 ,6位数码管显示温度值 { u8 i=0; u16 temp=0; while(1) { temp=ds18b20_readTemperaData(); for(i=0;i 100;i++) { displaySMG(ds18b20_processTempData(temp)); } } } C代码 #if
[单片机]
51单片机学习笔记:<font color='red'>DS18B20</font>测温程序
数字信号处理器的汇编程序优化方案的研究
  虽然目前大多数DSP都支持C语言缟程,但是在实际工程应用中,多是用C语言编写流程控制,搭建工程框架。   具体的算法模块以及比较耗时的功能模块还是采用汇编语言来编写。因为用汇编语言进行编程可以利用电路自身硬件结构的特点对其进行优化与精简,从而能够使一些复杂的算法和功能模块在实时性方面取得非常好的效果。文中从指令并行和软件流水二方面出发。以ADI公司PSl01系列电路的程序为实例,概括归纳出对DSP汇编程序进行优化的一般方法。    1 引言   数字信号处理器(DSP)相对于模拟信号处理器有很大的优越性,表现在精度高,灵活性大,可靠性好,易于大规模集成等方面。随着半导体制造工艺的发展和计算机体系结构的改进,数字信号处理器
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved