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

📄 main.asm

📁 基于AT89C51+DS1302的定时控制系统程序!! 具体实现功能: DS1302读写配置、DS18B20数字式温度传感器的读写控制及1602LCD的控制
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;Main program
;LCD Registers addresses
LCD_CMD_WR	equ 	0FCFFH
LCD_DATA_WR	equ	0FDFFH
LCD_BUSY_RD	equ	0FEFFH
LCD_DATA_RD	equ	0FFFFH

;LCD Commands                                        ;LCD控制命令
LCD_CLS		equ	1
LCD_HOME	equ	2
LCD_SETMODE	equ	4
LCD_SETVISIBLE	equ	8
LCD_SHIFT	equ	16
LCD_SETFUNCTION	equ	32
LCD_SETCGADDR	equ	64
LCD_SETDDADDR	equ	128

RTC             EQU     32H                           ;日历时间暂存空间
WEEK            DATA    RTC
YEAR            DATA    WEEK+1
MONTH           DATA    WEEK+2
DATE            DATA    WEEK+3
HOUR            DATA    WEEK+4
MINU            DATA    WEEK+5
WORK_DATA       EQU     38H                          ;任务执行时间暂存空间
S1_HOUR_DATA    DATA    WORK_DATA
S1_MINU_DATA    DATA    WORK_DATA+1
T1_HOUR_DATA    DATA    WORK_DATA+2
T1_MINU_DATA    DATA    WORK_DATA+3
S2_HOUR_DATA    DATA    WORK_DATA+4
S2_MINU_DATA    DATA    WORK_DATA+5
T2_HOUR_DATA    DATA    WORK_DATA+6
T2_MINU_DATA    DATA    WORK_DATA+7

;DS1302
RST             BIT     P1.5                  ;DS1302片选端
IO_DATA         BIT     P1.6                  ;DS130通信口
SCLK            BIT     P1.7                  ;DS1302时钟(单片机模拟)

;others register difined
KEY_I0          BIT     P3.4                  ;继电器控制IO
DATA_IO         BIT     P3.5                  ;DS18B20通信口
UESLESS_BIT     BIT     08H                   ;设定值无效状态位
LS_TDATA        EQU     2EH                   ;获取温度值高8BIT寄存器
MS_TDATA        EQU     2FH                   ;~低8BIT寄存器(定义在此地址方便位操作)
KEY_DATA        EQU     30H                   ;键值存放寄存器
TIME1_CN        EQU     42H                   ;定时器1计数寄存器
LCD_STAT        EQU     43h                   ;LCD显示状态寄存器
AC_ADD          EQU     44H                   ;LCD显示计数器值暂存器
AC_DATA         EQU     45H                   ;读取LCD显示值暂存器
TIME0_CN        EQU     46H                   ;定时器0计数寄存器

CHAR            EQU     47H                   ;温度符号寄存器
MS_TEMP         EQU     48H                   ;处理后待送出显示的温度寄存器
LS_TEMP         EQU     49H                   ;
POINT           EQU     4AH                   ;小数点
FLOT            EQU     4BH                   ;0.5℃精度位
CH_RESULT       EQU     4CH                   ;

;********************************
;*        start of program      *
;********************************

         ORG     0000H
         AJMP    START

         ORG     0003H
         AJMP    INT_INT0

         ORG     000BH
         DEC     TIME0_CN
         MOV     TH0,#02H
         MOV     TL0,#18H
         AJMP    INT_TIME0

         ORG     001BH
         AJMP    INT_TIME1

         ORG     0100H
START:   MOV     SP,#50H
         MOV     IE,#83H

         MOV     TMOD,#11H                 ;设置定时器工作方式
         MOV     TH0,#0ffH
         MOV     TL0,#0fEH

         CALL    PRE_DS18B20               ;初始化DS18B20
         CALL    DS1302_BEGIN              ;初始化DS1302         
         
         MOV     A,#38h                    ;初始化LCD
	 call    wrcmd
         
         mov     point,#2eh               ;小数点显示
         MOV     P1,#0C3h
         MOV     LCD_STAT,#0
         MOV     TIME0_CN,#1
         MOV     TIME1_CN,#0

         MOV    R0,#WORK_DATA            ;读DS1302_RAM的值
         MOV    R2,#8
         MOV    R4,#0CFH
         CALL   READ_DS1302

         SETB    TR0

LOP:
         ANL     PCON,#1                  ;系统进入低功耗模式
         JMP     LOP
         ;中断子程序
;int0*********************************************
INT_INT0:
        CLR     EA
        CLR     TR0
        CALL    DELAY8MS                ;延时消抖
        MOV     A,P3
        JNB     ACC.2,BDUAN_STAT
        SETB    EA
        SETB    TR0
        RETI
BDUAN_STAT:
        POP     ACC
        POP     ACC
        MOV     DPTR,#START_
        PUSH    DPL
        PUSH    DPH
        RETI
;TIMER0  INTERRUPT PROGRAM********************************
INT_TIME0:
         CLR     EA
         CLR     TR0

         MOV    A,TIME0_CN
         JNZ    QUIT_TIME0
         MOV    TIME0_CN,#1
         call   int_ds1820

         mov    a,#0cch                ;跳过ROM
         call   set_commd

         mov    a,#0beh                ;READ_ROM COMMD
         call   set_commd

         call   read_data

         call   int_ds1820                 ;复位脉冲
         setb   DATA_IO
         call   change_data

         MOV    R0,#WEEK                    ;读DS1302时钟值
         MOV    R2,#6
         MOV    R4,#8DH
         CALL   READ_DS1302
         ;交换年与星期的值
         MOV    A,32H
         MOV    R0,#33H
         XCH    A,@R0
         MOV    32H,A

         CALL    COMPAIR                    ;任务时间判断
         CALL    LCD_DISPLAY

QUIT_TIME0:
         CALL    INT_DS1820
         MOV     A,#0CCH
         CALL    SET_COMMD
         MOV     A,#44H                    ;启动DS18B20
         CALL    SET_COMMD
         SETB    EA
         SETB    TR0
         RETI

;**********************************TIME1
INT_TIME1:
        PUSH    ACC
        CLR     EA
        CLR     TR1
        INC     TIME1_CN
        MOV     TH1,#9EH
        MOV     TL1,#58H
        SETB    TR1
        SETB    EA
        POP     ACC
        RETI
;***************************************DS18B20初始化程序
PRE_DS18B20:
        CALL    INT_DS1820
        MOV     A,#0CCH                 ;跳过ROM
        CALL    SET_COMMD
        MOV     A,#4EH
        CALL    SET_COMMD
        mov     a,#00h
        call    set_commd
        mov     a,#00h
        call    set_commd
        mov     a,#1fh
        call    set_commd
        call   int_ds1820
        mov    a,#0cch
        call   set_commd
        mov    a,#48h
        Call   set_commd
        call   int_ds1820
        ret
;ds18b20处理子程序
int_ds1820:
        setb    DATA_IO
        NOP
        clr     DATA_IO
        mov     r2,#50                  ;600USdelay
        djnz    r2,$
        setb    DATA_IO                 ;释放总线
        mov     r2,#25
        djnz    r2,$                    ;300us   delay
        SETB    DATA_IO
        ret
set_commd:
         SETB   DATA_IO
         mov    r3,#8
         clr    c
      gn:clr    DATA_IO
         rrc    a
         NOP
         mov    DATA_IO,c               ;发送数据到总线
         mov    r2,#6                   ;延时至少60US,以让DS1820能有足够的时间采样
         djnz   r2,$
         setb   DATA_IO                ;总线拉高
         nop
         djnz   r3,gn
         ret
read_data:
         mov    r1,#LS_TDATA
         mov    r3,#8
         mov    r4,#2
    lop1:
         clr    DATA_IO                   ;拉低总线
         nop
         setb   DATA_IO                   ;释放总线
         nop                               ;6usdelay
         mov    c,DATA_IO                 ;读总线值
         rrc    a
         mov    r2,#6
         djnz   r2,$
         djnz   r3,lop1
         mov    @r1,a
         inc    r1                       ;MS_TDATA
         mov    r3,#8
         djnz   r4,lop1
         ret
CHANGE_DATA:                        ;温度数据处理子程序

         JB     2fh.3,LOW_0         ;正负判断
         JMP    HIGH_0
LOW_0:
        MOV     CHAR,#45            ;显示负号
        CLR     C
        MOV     A,2EH
        SUBB    A,#1
        MOV     2EH,A
        JC      SUB_2FH
    DDF:MOV     R0,#2FH
        MOV     A,2EH
        XCHD    A,@R0                 ;交换2EH与2FH的低4位
        SWAP    A                     ;交换2EH高低位值
        CPL     A                     ;取反,求得补码放入2EH,符号位放入2FH
        MOV     2EH,A
        MOV     A,2FH
        CPL     A
        MOV     2FH,A
        JMP     PAND_P
SUB_2FH:CLR     C
        MOV     A,2FH
        SUBB    A,#1
        MOV     2FH,A
        JMP     DDF
 PAND_P:JB      2FH.3,INC_05
        MOV     FLOT,#48
    BJJ:MOV     A,2EH
        MOV     DPTR,#TEMP_TABL
        MOVC    A,@A+DPTR
        MOV     CH_RESULT,A
        ANL     A,#0F0H              ;屏蔽低位值
        SWAP    A
        ADD     A,#48
        MOV     MS_TEMP,A
        MOV     A,CH_RESULT
        ANL     A,#0FH               ;屏蔽高位值
        ADD     A,#48
        MOV     LS_TEMP,A
        RET
 INC_05:MOV     FLOT,#53
        JMP     BJJ
 HIGH_0:
        MOV    CHAR,#43            ;温度值大于0,
        MOV    R0,#2FH
        MOV    A,2EH
        XCHD   A,@R0
        SWAP   A
        MOV    2EH,A
        JMP    PAND_P

TEMP_TABL:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H         
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$DS1302初始化子程序
DS1302_BEGIN:
         mov    r5,#10001110b              ;允许写入数据
         mov    r1,#LCD_STAT               ;写0
         call   wr_data_ds1302
         mov    r5,#10010000b              ;设置电源工作方式
         mov    r1,#LCD_STAT               ;写0
         call   wr_data_ds1302
         mov    r5,#10000000b              ;启动振荡电路
         mov    r1,#LCD_STAT               ;写0
         call   wr_data_ds1302
         ret

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$键扫描子程序
KEY_SCANF:
        MOV     A,P1
        ANL     A,#0E3H
        JNB     ACC.0,COM0
        JNB     ACC.1,COM1
        RET
COM0:
        MOV     P1,#0cEH
        nop
        MOV     A,P1
        JNB     ACC.2,PRESS1
        JNB     ACC.3,PRESS3
        JNB     ACC.4,PRESS5
        RET
COM1:
        MOV     P1,#0cDH
        nop
        MOV     A,P1
        JNB     ACC.2,PRESS2
        JNB     ACC.3,PRESS4
        JNB     ACC.4,PRESS6
        RET
PRESS1: MOV     KEY_DATA,#1
        RET
PRESS2: MOV     KEY_DATA,#3
        RET
PRESS3: MOV     KEY_DATA,#2
        RET
PRESS4: MOV     KEY_DATA,#4
        RET
PRESS5: MOV     KEY_DATA,#5
        RET
PRESS6: MOV     KEY_DATA,#6
        RET

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$读DS1302里的值
READ_DS1302:
         clr    rst
         CLR    SCLK
RD_DATA0:SETB   RST
         MOV    A,R4
         MOV    R3,#8
    LOPP:CLR    SCLK
         RRC    A
         MOV    IO_DATA,C
         SETB   SCLK
         nop
         DJNZ   R3,LOPP
         MOV    A,R4
         CLR    C
         SUBB   A,#02
         MOV    R4,A
         MOV    R3,#8
RD_DATA1:CLR    SCLK
         nop
         MOV    C,IO_DATA
         RRC    A
         SETB   SCLK
         DJNZ   R3,RD_DATA1
         MOV    @R0,A
         INC    R0
         clr    sclk
         CLR    RST
         DJNZ   R2,RD_DATA0
         RET

;LCD子程序
LCD_DISPLAY:

        MOV A,#LCD_SETDDADDR
        CALL WRCMD

        mov DPTR,#LINE1
        mov r1,#year
	call wrstr

        mov a,#LCD_SETDDADDR+64
        CALL WRCMD

        mov dptr,#line2
        mov r1,#HOUR
        call wrstr

        mov A,#LCD_SETVISIBLE+4
	call wrcmd
        RET
wrstr:
	clr A
	movc A,@A+DPTR
	jz wrstr1
        cjne a,#42,goon2
        JMP  WEN
  GOON2:CJNE A,#35,GOON3
        JMP  WEEK0
  GOON3:CJNE A,#37,GOON
          
        MOV  R0,#CHAR
        MOV  R5,#5
    KTJ:MOV  A,@R0
        CALL SET_DATA
        INC  R0
        DJNZ R5,KTJ                
        JMP  GOON1
    WEN:mov a,@r1
        anl a,#0f0h
        swap a
        add a,#48
        call set_data
        mov a,@r1
        anl a,#0fh
        add a,#48
        call set_data
        inc r1
        jmp goon1
goon:   call set_data
goon1:	inc DPTR
        jmp wrstr
set_data:
        push dpl
        push dph
        mov dptr,#LCD_DATA_WR
        movx @dptr,A
	call wtbusy
        pop dph
        pop dpl
wrstr1: ret

wrcmd:	mov dptr,#LCD_CMD_WR
	movx @dptr,A
	jmp wtbusy

wtbusy: mov dptr,#LCD_BUSY_RD
	movx A,@dptr
        clr  acc.7
	jb ACC.7,wtbusy
	RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$星期显示处理程序
WEEK0:  MOV  A,32H                        ;SP=54
        XRL A,#02H
        JNZ NEXT1
        JMP MONDAY
  NEXT1:MOV A,32H
        XRL A,#03H
        JNZ NEXT2
        JMP TUESDAY
  NEXT2:MOV A,32H
        XRL A,#04H
        JNZ NEXT3
        JMP WEDNESDAY
  NEXT3:MOV A,32H
        XRL A,#05H
        JNZ NEXT4
        JMP THURSDAY
  NEXT4:MOV A,32H
        XRL A,#06H

⌨️ 快捷键说明

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