注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

猪 的博客

----------- DIY

 
 
 

日志

 
 

8位数码管--6位时钟  

2012-01-30 20:03:12|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DS1302+51单片机

洞洞板制作

汇编程序模块修改和注释

玩单片机一个多月做出的第一个东东


8位数码管--6位时钟 - xing-v - 猪 的博客
 
8位数码管--6位时钟 - xing-v - 猪 的博客

 

 

;**************************************************************
;**************************************************************
;读出DS18B20温度值送6位LED数码管显示(-55~125度,带符号显示)
;读出DS1302时钟值送6位LED数码管显示
;带计时功能(带清零功能,显示时钟或温度是不影响计时)
;00h:    标志位,为"1"时表示检测到DS18B20
;DQ:        DS18B20的数据总线接脚
;TEMPER_NUM:保存读出的温度数据
;PC对8051单工发送数据
;波特率9600
;串行口设置MODE1,SM1=1,REN=1
;晶振11.0592,定时设置为0FDH
;本程序仅适合单个DS18B20和51单片机的连接,晶振为12MHZ左右
;**************************************************************
;**************************************************************
;---定义IO引脚---;

 ;MOV 40H,#08 ;个位寄存器初值
 ;MOV 41H,#00 ;十位寄存器初值
 ;MOV 42H,#00 ;百位寄存器初值
 ;MOV 43H,#00 ;千位寄存器初值
 ;MOV 44H,#00 ;万位寄存器初值
 ;MOV 45H,#00 ;十万位寄存器初值
 
;************************************* 
;模式切换

;01H 显示时间+温度
;02H 只显示时间
;03H 只显示温度
;04H 调整小时,小时闪烁
;05H 调整分钟,分钟闪烁
;06H 显示计时
;

;************************************* 


LED BIT P3.2 ;LED接脚
BEEP BIT P3.3  ;蜂鸣器

K0 BIT P1.4 ;短按显示时间或计时选择,长按调时
K1 BIT P1.5 ;小时/分钟 加,显示温度
K2 BIT P1.6 ;小时/分钟 减,时间/温度轮流显示;
K3 BIT P1.7; ;计时清0开始;

K4 BIT P1.3 ;初始化DS1302,时间设置为12:30:30

DH1 BIT P2.5 ;分钟位小数点
DH2 BIT P2.2 ;小时位小数点
D6 BIT P2.7 ;小时十位数码管
D5 BIT P2.6 ;小时个位数码管
D4 BIT P2.4 ;分钟十位数码管
D3 BIT P2.3 ;分钟个位数码管
D2 BIT P2.1 ;秒钟十位数码管
D1 BIT P2.0 ;秒钟个位数码管

D_OUT EQU P0 ;数码管段位连接端

;**************************************************************
;**************************************************************
;DS18B20设置
DQ  BIT P3.4 ;DS18B20的数据总线接脚
TEMPER_H    EQU    30H ;温度数据高位 
TEMPER_L    EQU    31H ;温度数据低位


;**************************************************************
;**************************************************************
;DS1302设置

T_CLK Bit P1.0                         ;实时时钟时钟线引脚
T_IO  Bit P1.1                         ;实时时钟数据线引脚
T_RST Bit P1.2                         ;实时时钟复位线引脚


;**************************************************************
;**************************************************************
;其他设置

disp_mode equ 29h

TIME_D1 EQU 2AH
TIME_D2 EQU 2BH
TIME_D3 EQU 2CH

TEMP_DATA EQU 2DH

DELAY_D1 EQU 2EH
DELAY_D2 EQU 2FH

second      equ     60h ;秒的缓冲区
minute      equ     61h ;分的缓冲区
hour        equ     62h ;小时的缓冲区
date        equ     63h ;日期的缓冲区
month       equ     64h ;月的缓冲区
WEEK        equ     65h ;星期的缓冲区
year        equ     66h ;年的缓冲区

COUNT_second      equ     6Ah ;秒的缓冲区
COUNT_minute      equ     6Bh ;分的缓冲区
COUNT_hour        equ     6Ch ;小时的缓冲区

TIME_DATA EQU 6DH
TIME_DATA_1 EQU 6EH
;**************************************************************
;**************************************************************

 ORG 00H
 JMP START
 
 ORG 0BH
 JMP TIM0
 
 ORG 80H
START: MOV SP,#70H ;设置堆栈指针

 MOV SCON,#50H     ;设置串行口控制寄存器
 
 MOV P2,#0FFH ;清各P口
 MOV P1,#0FFH
 mov P0,#0FFh
;**********************************************
;设TR1为定时器、TR0为定时器
;**********************************************  
 MOV TMOD,#00100001B ;设定定时器TIM1为模式1
;**********************************************
;设TR0的定时器初值
;********************************************** 
 MOV TH0,#HIGH(65536-3000); 设中断定时时间为4000微秒
 MOV TL0,#LOW(65536-3000)
;**********************************************
;开定时器TR0
;********************************************** 
 SETB  TR0
;**********************************************
;设TR1的定时器初值
;**********************************************  
 MOV TH1,#0FDH
 MOV TL1,#0FDH
 SETB TR1
;**********************************************
;开外部中断INT0、INT1、EA、定时器TR1中断
;**********************************************
  
 MOV TIME_D1,#5
 MOV TIME_D2,#2  
 MOV TIME_D3,#3       ;秒小数点闪烁频率
 
 MOV disp_mode,#01h ;初始化时间显示模式
  
 SETB ET0     ;开TO中断
 SETB EA     ;开全局中断
 CLR BEEP
 CALL KEY_DELAY       ;按键延时
 CALL KEY_DELAY
 setb BEEP
 
;********************************************** 
;按键操作
  
FUN_K: 
 JNB K0,MKS0;直接寻址位为0 则转移
 JNB K1,MKS1
 JNB K2,MKS2
 JNB K3,MKS3
 JNB K4,MKS4
 JMP FUN_K ;无条件转移至按键操作
 
MKS0: JMP  KS0;无条件间接转移
MKS1: JMP  KS1
MKS2: JMP  KS2
MKS3: JMP  KS3
MKS4: JMP  KS4
 
;********************************
;模式切换
;********************************
;********************************


KS0: 
 CALL KEY_DELAY ;延时
 
 JB K0,K0_WAIT ;如果直接寻址位为1 则转移
 CLR BEEP
 
 CLR ET0     ;关TO中断
 CLR EA     ;关全局中断
 PUSH     ACC     ;累加器A压入堆栈
SELECT1: 
 MOV A,DISP_MODE   ;显示模式29H送A
 CJNE A,#06H,SELECT2 ;比较立即数和累加器,不相等转移
 MOV DISP_MODE,#02H  ;送02H
 JMP ks0_exit   ;无条件转移
SELECT2: 
 MOV A,DISP_MODE     
 CJNE A,#02H,SELECT3
 MOV DISP_MODE,#06H
 JMP ks0_exit

SELECT3: 
 MOV A,DISP_MODE
 CJNE A,#04H,SELECT4
 MOV DISP_MODE,#05H
 JMP ks0_exit

SELECT4: 
 MOV A,DISP_MODE
 CJNE A,#05H,SELECT5
 MOV DISP_MODE,#02H
 JMP ks0_exit

SELECT5:
 MOV DISP_MODE,#02H
  
ks0_exit: 
 
 POP ACC   ;弹出堆栈
 SETB ET0  ;开TO中断允许
 SETB EA   ;开全局中断允许
 
 MOV 28H,#20  ;送20到地址
 ;SETB BEEP
K0_WAIT:
 ;JNB K0,$
 CALL KEY_DELAY ;延时
 JB K0,K0_DD  ;为1 则转移
 SETB BEEP
 DJNZ 28H,K0_WAIT;地址减1,不为0 则转移
 CLR BEEP
 
 
 MOV DISP_MODE,#04H
 
K0_DD: JNB K0,$   ;K0为0 则转移至本条指令的起始位置
 CALL KEY_DELAY
 JNB K0,K0_DD  ;K0为0则转移
 SETB BEEP
 
 
K0_RET: 
 JMP FUN_K   ;无条件转移至按键操作
;*************************************************
;*************************************************

;小时加或分钟加操作,调时模式,只显示时间
KS1:
 
 CALL KEY_DELAY
 
 JB K1,K1_WAIT  ;K1为1时转移
 CLR BEEP
 
 CLR ET0   ;关中断
 CLR EA   ;关全局中断
 PUSH     ACC    ;累加器A压入堆栈
 
 MOV A,DISP_MODE  ;调时模式,只显示时间
 CJNE A,#04H,ADJ_MIN_INC
  
 MOV second,#00H  ;清秒位
 MOV TEMP_DATA,HOUR
 CALL HOUR_INC
 MOV HOUR,TEMP_DATA
 
 CALL Set1302
 
 JMP ks1_exit   ;无条件转移
 
ADJ_MIN_INC:   ;调分模式,只显示时间
 
 MOV A,DISP_MODE
 CJNE A,#05H,GO_TEMP
 
 MOV second,#00H
 MOV TEMP_DATA,MINUTE
 CALL MIN_INC
 MOV MINUTE,TEMP_DATA
 
 CALL Set1302
 
 
  
 JMP ks1_exit
 
GO_TEMP:
 MOV DISP_MODE,#03H
 JMP ks1_exit
  
ks1_exit: 
 
 POP ACC   ;弹出堆栈
 SETB ET0  ;开中断
 SETB EA   ;开全局中断
  
 
K1_WAIT:
 JNB K1,$  ;K1为0 则转移至本条指令的起始位置
 CALL KEY_DELAY
 JNB K1,K1_WAIT
 SETB BEEP
 
 JMP FUN_K  ;无条件转移至按键操作
;*************************************************
;小时减或分钟减操作,调时模式,只显示时间
;*************************************************
KS2: 
 CALL KEY_DELAY
 
 JB K2,K2_WAIT  ;K2为1 则转移
 CLR BEEP
 
 CLR ET0   ;开中断
 CLR EA   ;开全局中断
 PUSH     ACC    ;累加器A压入堆栈
 
 
 
 
 
 MOV A,DISP_MODE  ;调时模式,只显示时间
 CJNE A,#04H,MODE2
 
 MOV second,#00H
 MOV TEMP_DATA,HOUR
 CALL HOUR_DEC
 MOV HOUR,TEMP_DATA
 
 CALL Set1302
 
 JMP ks2_exit
 
MODE2:   ;调分模式,只显示时间
 
 MOV A,DISP_MODE
 CJNE A,#05H,GO_COUNT
 
 MOV second,#00H
 MOV TEMP_DATA,MINUTE
 CALL MIN_DEC
 MOV MINUTE,TEMP_DATA
 
 CALL Set1302
 
 JMP ks2_exit
 
GO_COUNT:
 MOV DISP_MODE,#01H
 JMP ks2_exit  
 
KS2_EXIT: 
 POP ACC
 SETB ET0
 SETB EA
K2_WAIT:
 JNB K2,$     ;K2为0 则转移至本条指令的起始位置
 CALL KEY_DELAY
 JNB K2,K2_WAIT
 SETB BEEP
 
 JMP FUN_K    ;无条件转移至按键操作
;*************************************************
;计时/时间切换
KS3: 
 CALL KEY_DELAY
 
 JB K3,K3_WAIT
 CLR BEEP
 
 CLR ET0
 CLR EA
 PUSH     ACC    ;累加器A压入堆栈
 
 
 
 MOV COUNT_second,#00H
 MOV COUNT_minute,#00H
 MOV COUNT_hour,#00H
 
 MOV DISP_MODE,#06H
  
KS3_EXIT: 
 POP ACC
 SETB ET0
 SETB EA
 
 
K3_WAIT:
 JNB K3,$
 CALL KEY_DELAY
 JNB K3,K3_WAIT
 SETB BEEP
 
 JMP FUN_K    ;无条件转移至按键操作
 
;***************************************
;初始化
KS4:
 CALL KEY_DELAY
 
 JB K4,K4_WAIT
 CLR BEEP
 
 
 CLR ET0
 CLR EA
 PUSH     ACC    ;累加器A压入堆栈
 
 
  
 MOV DISP_MODE,#02H
 
 MOV second,#30H ;秒的缓冲区
 MOV minute,#30H ;分的缓冲区
 MOV hour,#12H ;小时的缓冲区
 
 CALL Set1302
 
KS4_EXIT:
 POP ACC
 SETB ET0
 SETB EA
K4_WAIT:
 JNB K4,$
 CALL KEY_DELAY
 JNB K4,K4_WAIT
 SETB BEEP
 
 JMP FUN_K    ;无条件转移至按键操作
 
;**************************************************************


 
;************************************************************** 
;************************************************************** 
;------------------------------------初始化1302-------------------------
;;2002年1月1日12:00:00

;**********************************************************
;子程序名:Set1302
;功    能:设置DS1302 初始时间,并启动计时。
;说    明:
;调    用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;设    计:zhaojunjie           日    期:2002-03-19
;修    改:                     日    期:
;**********************************************************
Set1302:
          CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     #8EH        ;控制寄存器
          LCALL  RTInputByte 
          MOV    B,     #00H        ;写操作前WP=0
          LCALL  RTInputByte 
          SETB   T_CLK
          CLR    T_RST

          MOV    R0,    #Second;
          MOV    R7,    #7        ;秒 分 时 日 月 星期 年
          MOV    R1,    #80H      ;秒写地址
S13021:   CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     R1        ;写秒 分 时 日 月 星期 年 地址
          LCALL  RTInputByte 
          MOV    A,     @R0       ;写秒数据
          MOV    B,     A
          LCALL  RTInputByte 
          INC    R0
          INC    R1
          INC    R1
          SETB   T_CLK
          CLR    T_RST
          DJNZ   R7,    S13021
          CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     #8EH        ;控制寄存器
          LCALL  RTInputByte 
          MOV    B,     #80H        ;控制,WP=1,写保护
          LCALL  RTInputByte 
          SETB   T_CLK
          CLR    T_RST
          RET
;**********************************************************
;子程序名:GET_TIME
;功    能:从DS1302 读时间
;说    明:
;调    用:RTInputByte,RTOutputByte
;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;设    计:zhaojunjie           日    期:2002-03-19
;修    改:                     日    期:
;**********************************************************
READ_TIME:
 MOV    R0,    #Second;
        MOV    R7,    #7
        MOV    R1,    #81H       ;秒地址
G13021:
 SETB   T_CLK
 CLR    T_RST
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
        CLR    T_CLK
        NOP
        NOP
        NOP
        SETB   T_RST
        NOP
        NOP
        NOP
        MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址
        LCALL  RTInputByte 
        LCALL  RTOutputByte
        MOV    @R0,   A         ;秒
        INC    R0
        INC    R1
        INC    R1
        SETB   T_CLK
        NOP
        NOP
        NOP
        CLR    T_RST
        NOP
        NOP
        DJNZ   R7,    G13021
       
       
       
        MOV A,second;
 ANL A,#00001111B 
        MOV TIME_DATA_1,A
          
 MOV A,TIME_DATA
 CJNE A,TIME_DATA_1,RRT2
 
 RET
 
RRT2: 
 MOV TIME_DATA,TIME_DATA_1 ;秒变化
 
SEC_INC1: 
 MOV A,COUNT_second
 CJNE A,#59H,SEC_INC2
 
 MOV TEMP_DATA,COUNT_second
 CALL MIN_INC
 MOV COUNT_second,TEMP_DATA
 
 JMP MIN_INC1
SEC_INC2:

 MOV TEMP_DATA,COUNT_second
 CALL MIN_INC
 MOV COUNT_second,TEMP_DATA
 
 JMP READ_TIME_EXIT
;**************************** 
MIN_INC1: 
 MOV A,COUNT_minute
 CJNE A,#59H,MIN_INC2
 
 MOV TEMP_DATA,COUNT_minute
 CALL MIN_INC
 MOV COUNT_minute,TEMP_DATA
 
 JMP HOUR_INC1 
MIN_INC2:
 MOV TEMP_DATA,COUNT_minute
 CALL MIN_INC
 MOV COUNT_minute,TEMP_DATA
 
 JMP READ_TIME_EXIT
;*************************
HOUR_INC1:
 MOV TEMP_DATA,COUNT_hour
 CALL HOUR_INC
 MOV COUNT_hour,TEMP_DATA
 
READ_TIME_EXIT:
 RET
;**********************************************************
;功    能:写1302一字节  (内部子程序)
;**********************************************************
RTInputByte: 
          MOV    R4,    #8
Inbit1:   MOV    A,     B
          RRC    A
          MOV    B,     A
          MOV    T_IO,  C
          NOP
          NOP
          NOP
        
          SETB   T_CLK
          NOP
          NOP
          NOP
          CLR    T_CLK
        
          DJNZ   R4,   Inbit1
          NOP
          NOP
          NOP
          RET
;**********************************************************
;功    能:读1302一字节  (内部子程序)
;**********************************************************
RTOutputByte:
          MOV    R4,    #8
Outbit1:  MOV    C,     T_IO
          RRC    A
          SETB   T_CLK
          NOP
          NOP
          NOP
          CLR    T_CLK
          NOP
          NOP
          NOP
          DJNZ   R4,    Outbit1
          RET
TIME_count:     
 CALL READ_TIME
       
        MOV A,COUNT_second
        ANL A,#00001111B 
        MOV 40H,A
               
        CLR C
                MOV A,COUNT_second
                ANL A,#01110000B 
                RRC A
                RRC A
                RRC A
                RRC A
        MOV 41H,A
               
                MOV A,COUNT_minute
                ANL A,#00001111B 
                MOV 42H,A
               
                CLR C
                MOV A,COUNT_minute
                ANL A,#01110000B 
                RRC A
                RRC A
                RRC A
                RRC A
 MOV 43H,A
               
               
                MOV A,COUNT_hour
                ANL A,#00001111B 
                MOV 44H,A
               
                CLR C
                MOV A,COUNT_hour
                ANL A,#00110000B 
                RRC A
                RRC A
                RRC A
                RRC A
 MOV 45H,A
      
 RET
GET_TIME:     
       CALL READ_TIME
         
        MOV A,Second
        ANL A,#00001111B 
        MOV 40H,A
               
        CLR C
        MOV A,Second
        ANL A,#01110000B 
        RRC A
        RRC A
        RRC A
        RRC A
        MOV 41H,A
              
        MOV A,MINUTE
        ANL A,#00001111B 
        MOV 42H,A
               
        CLR C
        MOV A,MINUTE
        ANL A,#01110000B 
        RRC A
        RRC A
        RRC A
        RRC A
        MOV 43H,A
               
                
        MOV A,HOUR
                ANL A,#00001111B 
                MOV 44H,A
               
                CLR C
                MOV A,HOUR
                ANL A,#00110000B 
                RRC A
                RRC A
                RRC A
                RRC A
                MOV 45H,A
        RET
         
         
         
;****************************  
         


 
;**************************************************************
;读出DS18B20温度后送LCD显示
;**************************************************************
 
GET_TEMP: 
 MOV TEMPER_H,#0 
 MOV TEMPER_L,#0 
FUN1_0: 
 CALL GET_TEMPER

 CALL TEMPER_COV

 ;CALL HEX_ASC 
 
 MOV 4AH,45H
 MOV 4BH,44H
 MOV 4CH,43H
 MOV 4DH,42H
 MOV 4EH,41H
 MOV 4FH,40H
   
 RET

 
COMM: MOV A,36H ;比较温度是否变化
 XRL A,20H  ;地址“异或”到累加器
 JZ  KK   ;累加器为0 则转移至KK
 
OK: MOV 20H,36H
  
 CALL TEMPER_COV

 ;CALL HEX_ASC 
 
KK: 
 JMP FUN1_0  ;无条件转移
   

;**************************************************************
;DS18B20子程序集
;**************************************************************
;//*****************************************//
; 重新写DS18B20暂存存储器设定值
;//*****************************************//
CONFIG:
 CLR 00H
        SETB DQ            ;释放总线
       LCALL INIT_1820    ; DS18B20初始化
        JNB 00H,CONFIG_0    ;若DS18B20不存在则返回
      
        MOV    A,#0CCH        ; 发SKIP ROM命令
        LCALL    WRITE_1820
        MOV    A,#4EH        ; 发写暂存存储器命令
        LCALL    WRITE_1820
        MOV    A,#00H        ; TH(报警上限)中写入00H
        LCALL    WRITE_1820
        MOV    A,#00H        ; TL(报警下限)中写入00H
        LCALL    WRITE_1820
        MOV    A,#1FH        ; 选择9位温度分辨率
        LCALL    WRITE_1820
CONFIG_0:
        RET
;//*****************************************//
; 读出转换后的温度值
;//*****************************************//
GET_TEMPER:
        CLR 00H
        SETB    DQ            ;释放总线
        LCALL    INIT_1820    ; DS18B20初始化
        JNB    00H,GET_TEMPER_0 ; 若DS18B20不存在则返回
               
        LCALL    INIT_1820
        MOV    A,#0CCH        ; 跳过ROM匹配
        LCALL    WRITE_1820
        MOV    A,#0BEH        ; 发出读温度命令
        LCALL    WRITE_1820
        LCALL READ_TEMP ; 将读出的温度数据保存到35H/36H
       
        CLR 00H
        SETB    DQ            ;释放总线
        LCALL    INIT_1820    ; DS18B20初始化
        JNB    00H,GET_TEMPER_0 ; 若DS18B20不存在则返回
        MOV    A,#0CCH        ; 跳过ROM匹配
        LCALL    WRITE_1820
        MOV    A,#44H        ; 发出温度转换命令
        LCALL    WRITE_1820
       
GET_TEMPER_0:
        RET

;//*****************************************//
; 将从DS18B20中读出的温度数据进行转换
;//*****************************************//
TEMPER_COV:
 
 ;mov TEMPER_L,#0F1h
 ;mov TEMPER_H,0FFh
 ;
 
 MOV A,TEMPER_H
 CJNE A,#00,TS6
 
 CLR C

        MOV A,TEMPER_L
 RRC A
 MOV TEMPER_L,A
 
 
TS3: MOV A,TEMPER_H
 RRC A
 MOV TEMPER_H,A
 
 MOV A,TEMPER_L
 MOV B,#10
 DIV AB
 MOV 43H,A 
 MOV 42H,B
 
 
 MOV A,43H
 MOV B,#10
 DIV AB
 MOV 44H,A
 MOV 43H,B 
 
 CJNE A,#00,TS4
 
 MOV 44H,#0FH
 
 MOV A,43H
 CJNE A,#00,TS4
 MOV 43H,#0FH
  
TS4:     
 MOV 45H,#0FH
 RET


TS6: SETB C

        MOV A,TEMPER_L
 RRC A
 CPL A
 MOV TEMPER_L,A
 
 
 MOV A,TEMPER_L
 MOV B,#10
 DIV AB
 MOV 43H,A 
 MOV 42H,B
 
 
 MOV A,43H
  
 CJNE A,#00,TS7
 
 MOV 43H,#0FH
 
TS7:  
 MOV 44H,#0FH
 MOV 45H,#10H
 
 RET
 
;//*****************************************//
; DS18B20初始化程序
;//*****************************************//
INIT_1820:
            SETB   DQ  ;释放总线
            MOV    R0,#255
            DJNZ   R0,$       ; 延时500微秒去抖动
            CLR    DQ  ;拉低
            MOV    R0,#240
            DJNZ   R0,$        ; 延时500微秒
            SETB   DQ  ;释放总线
            MOV    R0,#100 ;延时微秒
TSR2:
            JNB    DQ,TSR3 ;检测iButton返回应答脉冲否
            DJNZ   R0,TSR2
            CLR    00h         ; 清标志位,表示DS1990不存在
            SETB   DQ
            LJMP   TSR7
       
TSR3:
            SETB    00h       ; 置标志位,表示DS1990存在
            MOV    R0,#255
            DJNZ   R0,$       ; 延时
            SETB   DQ
            LJMP   TSR7
       
TSR7:       RET
;//*****************************************//
; 写DS18B20的程序
;//*****************************************//
WRITE_1820:
            MOV    R2,#8
            CLR    C
WR1:
            CLR    DQ  ;拉低
            MOV    R3,#6
            DJNZ   R3,$
            RRC    A
            MOV    DQ,C
            MOV    R3,#23
            DJNZ   R3,$
            SETB   DQ
            NOP
            DJNZ   R2,WR1
            SETB   DQ
            RET
;//*****************************************//
; 读DS18B20的程序,从DS18B20中读出一个字节的数据
;//*****************************************//
READ_1820:
            MOV    R2,#8
RE1:
            CLR    C
            SETB    DQ
            NOP
            NOP
            CLR    DQ
            NOP
            NOP
            NOP
            SETB    DQ
            MOV    R3,#7
            DJNZ    R3,$
            MOV    C,DQ
            MOV    R3,#23
            DJNZ    R3,$
            RRC    A
            DJNZ    R2,RE1
            RET
;//*****************************************//
; 读DS18B20的程序,从DS18B20中读出8个字节的ID数据
;//*****************************************//
READ_ID:
            MOV    R4,#8            ; 将8位ID从DS18B20中读出
            MOV    R1,#37H        ; 存入37H-30H
RE00:
            MOV    R2,#8
RE01:
            CLR    C
            SETB   DQ
            NOP
            NOP
            CLR    DQ
            NOP
            NOP
            NOP
            SETB   DQ
            MOV    R3,#7
            DJNZ   R3,$
            MOV    C,DQ
            MOV    R3,#23
            DJNZ   R3,$
            RRC    A
            DJNZ   R2,RE01
            MOV    @R1,A
            DEC    R1
            DJNZ   R4,RE00
            RET
;//*****************************************//
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;//*****************************************//
READ_TEMP:
            MOV    R4,#2          ; 将温度高位和低位从DS18B20中读出
            MOV    R1,#TEMPER_L   ; 低位存入31H(TEMPER_L),高位存入30H(TEMPER_H)
RE000:
            MOV    R2,#8
RE010:
            CLR    C
            SETB   DQ
            NOP
            NOP
            CLR    DQ
            NOP
            NOP
            NOP
            SETB   DQ
            MOV    R3,#7
            DJNZ   R3,$
            MOV    C,DQ
            MOV    R3,#23
            DJNZ   R3,$
            RRC    A
            DJNZ   R2,RE010
            MOV    @R1,A
            DEC    R1
            DJNZ   R4,RE000
            RET
;**************************************************************
;**************************************************************
LED_SHOW:  
 CLR LED
 CALL D1S
 SETB LED
 CALL D1S
 RET

D1S: MOV R6,#100
DT1: MOV R7,#255
 DJNZ R7,$
 DJNZ R6,DT1
 RET

KEY_DELAY:
 MOV DELAY_D1,#50
KD1: MOV DELAY_D2,#255
 DJNZ DELAY_D2,$
 DJNZ DELAY_D1,KD1
 RET
;*****************************************************************
;*****************************************************************
;*****************************************************************
TIM0: PUSH     ACC    ;累加器A压入堆栈
        PUSH     PSW   ;状态寄存器压入堆栈
 CLR TR0     ;关定时器
 
 MOV TH0,#HIGH(65536-4000); 设中断定时时间为4000微秒
 MOV TL0,#LOW(65536-4000)

 MOV A,DISP_MODE
 CJNE A,#01H,DISP_2
 
 JB 05H,SHOW_TEMP
   
 CALL GET_TIME
 CALL CLOCK_SCAN ;时间扫描模式
   
 DJNZ TIME_D1,H2 ;地址减1,不为0 则转移
 MOV TIME_D1,#255 ;时间/温度间歇显示切换时间
   
 SETB 05H  ;切换到温度显示模式
 
 JMP W2
H2: JMP H1
 
SHOW_TEMP: 
 
 CALL GET_TEMP
 
 MOV 40H,#0FH
 MOV 41H,#0CH
 CALL TEMP_SCAN ;温度扫描模式
 
 CALL GET_TIME
 
 DJNZ TIME_D1,H1
 MOV TIME_D1,#255
 
 ;MOV DISP_MODE,#00H ;切换到时间显示模式 
 CLR 05H ;时间/温度间歇显示切换时间
 
 JMP W2
 
DISP_2: 

 MOV A,DISP_MODE
 CJNE A,#02H,DISP_3
 
 CALL GET_TIME
 CALL CLOCK_SCAN ;时间扫描模式
 
 
 JMP W2
DISP_3:
 MOV A,DISP_MODE
 CJNE A,#03H,DISP_4
 
 CALL GET_TEMP
 
 MOV 40H,#0FH
 MOV 41H,#0CH
 CALL TEMP_SCAN ;温度扫描模式
 
 CALL GET_TIME
  
 JMP W2
DISP_4:
 MOV A,DISP_MODE
 CJNE A,#04H,DISP_5
 
 CALL GET_TIME
 CALL CLOCK_SCAN_hours ;时间扫描模式
  
 JMP W2
 
DISP_5:
 MOV A,DISP_MODE
 CJNE A,#05H,DISP_6
 
 CALL GET_TIME
 CALL CLOCK_SCAN_minute ;时间扫描模式
  
 JMP W2

DISP_6:
 

DISP_7:
 MOV A,DISP_MODE
 CJNE A,#06H,DISP_8
 
 CALL TIME_count
 
 ;CALL GET_TIME
 
 CALL CLOCK_SCAN ;时间扫描模式
 
 JMP H1
 
DISP_8:

W2: 
 
H1: SETB TR0   ;开定时器
 POP PSW    ;弹出堆栈
 POP ACC    

 RETI
 
;**********************************************
;时钟正常显示扫描方式  显示的数据(即数字)存在地址45H-40H中
;**********************************************
CLOCK_SCAN: 
 DJNZ TIME_D3,CA ;小数点减1,不为0转至C1,为0则送#30至小数点位
 MOV TIME_D3,#30 ;送30至小数点位,秒延时
 CPL 02H    ;02H取反
 
 
CA:
 MOV R0,#11111111B;送"-"符0BFH,#11110111B
 MOV A,R0 
 JB 02H,C1   ;02H址位为1 则转移 
 ANL A,#11110111B ;随定时器闪烁
 MOV D_OUT,A   ;显示"-"符
  CLR DH1
 CLR DH2
 CALL DELAYS
 SETB DH1
 SETB DH2
; CALL DELAYS
C1: MOV DPTR,#TAB1 ;查表送到数据指针
 MOV R0,#40H       ;送40H秒数据至R0寄存器

 
 MOV A,@R0         ;送秒数据至累加器A
 MOVC A,@A+DPTR    ;秒数据查表后送到累加器A
 MOV D_OUT,A   ;A送到P0口输出显示
        CLR D6   ;打开第6位数码管位
 CALL DELAYS   ;延时
 SETB D6    ;关闭第6位
 ;CALL DELAY

 MOV DPTR,#TAB1  ;送表到数据指针
 INC R0    ;R0加1
 MOV A,@R0   ;秒+1后送A
 MOVC A,@A+DPTR  ;表+A送A
 ;JB 02H,C2   ;02H址位为1 则转至C2,不为0则使小数点闪烁
   ;ANL A,#11110111B ;小数点立即数“与”到累加器#1011111
C2: MOV D_OUT,A
 CLR D5
 CALL DELAYS
 SETB D5
 

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 JB 02H,C3
 ;ANL A,#11011111B ;分个位小数点
C3: MOV D_OUT,A
 CLR D4
 CALL DELAYS
 SETB D4
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点#10111111B
C4: MOV D_OUT,A
 CLR D3
 CALL DELAYS
 SETB D3
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 JB 02H,C5
 ;ANL A,#11011111B ;时个位小数点
C5: MOV D_OUT,A
 
 CLR D2
 CALL DELAYS
 SETB D2
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
 CLR D1
 CALL DELAYS
 SETB D1
 ;CALL DELAY

 RET
 

;小时闪烁
CLOCK_SCAN_hours:
 ;JB 02H,CLOCK_SCAN_hours_2

 DJNZ TIME_D3,Cx1
 MOV TIME_D3,#30
 CPL 02H

Cx1: MOV DPTR,#TAB1
 MOV R0,#40H

 
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
        CLR D6
 CALL DELAYS
 SETB D6
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 CLR D5
 CALL DELAYS
 SETB D5
 ;CALL DELAY
 
 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 CLR D4
 CALL DELAYS
 SETB D4
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 CLR D3
 CALL DELAYS
 SETB D3
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点#01111111B
 MOV D_OUT,A
 JB 02H,CX2
 CLR D2
CX2: CALL DELAYS
 SETB D2
 ;CALL DELAY


 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
 JB 02H,CX3
 CLR D1
CX3: CALL DELAYS
 SETB D1
 ;CALL DELAY

 RET

;分钟闪烁
CLOCK_SCAN_minute:
 DJNZ TIME_D3,CM1
 MOV TIME_D3,#30
 CPL 02H

CM1: MOV DPTR,#TAB1
 MOV R0,#40H

 
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
        CLR D6
 CALL DELAYS
 SETB D6
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 CLR D5
 CALL DELAYS
 SETB D5
 ;CALL DELAY
 
 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 JB 02H,CM2
 CLR D4
CM2: CALL DELAYS
 SETB D4
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 JB 02H,CM3
 CLR D3
CM3: CALL DELAYS
 SETB D3
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#11011111B ;小数点
 MOV D_OUT,A
 CLR D2
 CALL DELAYS
 SETB D2
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
 CLR D1
 CALL DELAYS
 SETB D1
 ;CALL DELAY

 RET

;**********************************************
;温度显示扫描方式
;**********************************************
TEMP_SCAN: 
 MOV DPTR,#TAB1
 MOV R0,#40H

 
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
        CLR D6
 CALL DELAYS
 SETB D6
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ANL A,#10111111B
 MOV D_OUT,A
 CLR D5
 CALL DELAYS
 SETB D5
 ;CALL DELAY
 
 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#01111111B ;小数点
 MOV D_OUT,A
 CLR D4
 CALL DELAYS
 SETB D4
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#10111111B ;小数点
 MOV D_OUT,A
 CLR D3
 CALL DELAYS
 SETB D3
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 ;ANL A,#01111111B ;小数点
 MOV D_OUT,A
 CLR D2
 CALL DELAYS
 SETB D2
 ;CALL DELAY

 MOV DPTR,#TAB1
 INC R0
 MOV A,@R0
 MOVC A,@A+DPTR
 MOV D_OUT,A
 CLR D1
 CALL DELAYS
 SETB D1
 ;CALL DELAY

 RET
;***********************************************
;延时子程序
;***********************************************

DELAYS1: MOV R4,#200
DELAYS: MOV R4,#20
DX1: MOV R5,#50
 DJNZ R5,$
 DJNZ R4,DX1
 RET
 
;*****************************************************
MIN_INC:
 MOV A,TEMP_DATA
KL1: CJNE A,#59H,KL2
 MOV TEMP_DATA,#00H
 JMP KL8 
 
KL2: CJNE A,#49H,KL3
 MOV TEMP_DATA,#50H
 JMP KL8
 
KL3: CJNE A,#39H,KL4
 MOV TEMP_DATA,#40H
 JMP KL8
 
KL4: CJNE A,#29H,KL5
 MOV TEMP_DATA,#30H
 JMP KL8

KL5: CJNE A,#19H,KL6
 MOV TEMP_DATA,#20H
 JMP KL8

KL6: CJNE A,#09H,KL7
 MOV TEMP_DATA,#10H
 JMP KL8

KL7: INC TEMP_DATA

 
KL8: RET

;***************************
 
MIN_DEC:

 MOV A,TEMP_DATA
KNL1: CJNE A,#00H,KNL2
 MOV TEMP_DATA,#59H
 JMP KNL8 
 
KNL2: CJNE A,#50H,KNL3
 MOV TEMP_DATA,#49H
 JMP KNL8
 
KNL3: CJNE A,#40H,KNL4
 MOV TEMP_DATA,#39H
 JMP KNL8
 
KNL4: CJNE A,#30H,KNL5
 MOV TEMP_DATA,#29H
 JMP KNL8

KNL5: CJNE A,#20H,KNL6
 MOV TEMP_DATA,#19H
 JMP KNL8

KNL6: CJNE A,#10H,KNL7
 MOV TEMP_DATA,#09H
 JMP KNL8

KNL7: DEC TEMP_DATA

 
KNL8: 

 RET
 
;***************************
 
HOUR_INC:
 MOV A,TEMP_DATA
 
L1: CJNE A,#19H,L2
 MOV TEMP_DATA,#20H
 JMP L5 
 
L2: CJNE A,#23H,L3
 MOV TEMP_DATA,#00H
 JMP L5
 
L3: CJNE A,#09H,L4
 MOV TEMP_DATA,#10H
 JMP L5
 
L4: INC TEMP_DATA

L5: RET

;***************************
 
HOUR_DEC:
 MOV A,TEMP_DATA
 
KSL1: CJNE A,#20H,KSL2
 MOV TEMP_DATA,#19H
 JMP KSL5 
 
kSL2: CJNE A,#00H,KSL3
 MOV TEMP_DATA,#23H
 JMP KSL5
 
KSL3: CJNE A,#10H,KSL4
 MOV TEMP_DATA,#09H
 JMP KSL5
 
KSL4: DEC TEMP_DATA

KSL5: RET
 
 

;正装LED段码表-共阳
TAB1: DB  28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;     0   1   2    3   4   5   6   7   8   9  
  DB 0DFH,30h,0a9h,0a1h,0b1h,0F7H;#11011111B . 11110111B -
   ; .   A    C   E    F  -
;DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0123456789
;DB 07FH,088H,0C6H,086H,08EH,0FFH,0BFH;DOT,A,C,E,F,-

;倒装

;TAB2: DB 0C0H,0F9H,064H,070H,059H,052H,042H,0F8H,040H,050H;0123456789

; DB 0BFH,088H,0C6H,086H,08EH,0FFH,07FH;DOT,A,C,E,F,-

 END
 
 
; MOV A,DISP_MODE
; CJNE A,#01H,SELECT0
; MOV DISP_MODE,#02H
; JMP ks0_exit
 
;SELECT0: 
; MOV A,DISP_MODE
; CJNE A,#02H,SELECT1
; MOV DISP_MODE,#03H
; JMP ks0_exit
;SELECT1: 
; MOV A,DISP_MODE
; CJNE A,#03H,SELECT2
; MOV DISP_MODE,#06H
; JMP ks0_exit
 
;SELECT2: 
; MOV A,DISP_MODE
; CJNE A,#06H,SELECT3
; MOV DISP_MODE,#02H
; JMP ks0_exit
 
;SELECT3: 
; MOV A,DISP_MODE
; CJNE A,#04H,SELECT4
; MOV DISP_MODE,#05H
; JMP ks0_exit

;SELECT4: 
; MOV A,DISP_MODE
; CJNE A,#05H,ks0_exit
; MOV DISP_MODE,#02H
; JMP ks0_exit


 

  评论这张
 
阅读(2331)| 评论(2)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017