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

📄 hex.asm

📁 这是基于单片机的专用定时器的设计。使用汇编语言来编写
💻 ASM
📖 第 1 页 / 共 3 页
字号:

;地址常量定义
E     EQU   P3.0     ;使能端,当E端由高电平跳变为低电平时,液晶模块执行命令
RW    EQU   P3.1     ;读写信号线,高电平时进行读操作,低电平时进行写操作
RS    EQU   P3.2     ;寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器
SCLK  EQU   P3.5     ;串行时钟输入端
IO    EQU   P3.6     ;串行数据输入、输出端
RST   EQU   P3.7     ;控制端。高电平使能读/写操作;低电平禁止读/写操作
SPEAK  EQU  P0.0    ;定时器定时时间到响
LED1   EQU  P0.1    ;LED1亮表示定时器1工作
LED2   EQU  P0.3    ;LED2亮表示定时器2工作
LED3   EQU  P0.5    ;LED3亮表示定时器3工作
LED4   EQU  P0.7    ;LED4亮表示工作在定时器状态,灯灭表示工作在日期时间状态
;标志定义与资源分配
SZSJ   BIT  20H.0    ;是否设置时间位,1不设置,0设置
KSZT   BIT  20H.1    ;开始暂停,1开始,0暂停
PAND   BIT  20H.2    ;当SZSJ、KSZT同时为1时,PAND为1,设置定时器时间有效
KG1    BIT  20H.3    ;KG1=1,定时器开,KG1=0,定时器关
KG2    BIT  20H.4    ;KG2=1,定时器开,KG2=0,定时器关
KG3    BIT  20H.5    ;KG3=1,定时器开,KG3=0,定时器关
DSSJ   BIT  20H.6    ;DSSJ 为0,处于定时器状态,为1处于时钟状态
XUAN   BIT  20H.7    ;XUAN为1,处于暂停状态,在地址0CDH显示的标志$,XUAN为0,清除地址0CDH显示的标志$
SN1    BIT  2FH.0    ;SN1 为0,显示定时器剩余时间,为1显示超时时间
SN2    BIT  2FH.1    ;SN2 为0,显示定时器剩余时间,为1显示超时时间
SN3    BIT  2FH.2    ;SN3 为0,显示定时器剩余时间,为1显示超时时间
;变量定义与资源分配
S1S    DATA  4AH       ;定时器1 秒的存放单元
S2M    DATA  4BH       ;定时器2 分的存放单元
S2S    DATA  4CH       ;定时器2 秒的存放单元
S3M    DATA  4DH       ;定时器3 分的存放单元
S3S    DATA  4EH       ;定时器3 秒的存放单元
SZ123  DATA  4FH       ;SZ123为1,设置定时器1,为2,设置定时器2,为3,设置定时器3
XS     DATA  56H       ;用于设置定时器
XSSS   DATA  57H       ;用于设置日期时间
DS1302DATA  DATA  58H  ;存放DS1302数据的单元
DS1302ADDR  DATA  59H  ;存放DS1302命令的单元
SEC    DATA   60H      ;时钟秒存放单元
MIN    DATA   61H      ;时钟分存放单元
HR     DATA   62H      ;时钟时存放单元
WEEK   DATA   63H      ;时钟星期存放单元
DAY    DATA   64H      ;时钟日存放单元
MONTH  DATA   65H      ;时钟月存放单元
YEAR   DATA   66H      ;时钟年存放单元
;向量区
      	ORG   0000H    ;复位起始地址
      	LJMP  MAIN     ;至主程序
      	ORG  000BH      ;定时器/计数器0工作在定时状态
      	LJMP  TIME0     ;至定时中断子程序
      	ORG  0030H      ;程序代码由地址30H开始执行
MAIN:     
	  LCALL   INIT
	  MOV P0,#0FFH
          MOV P1,#0FFH	
          MOV P2,#0FFH
          MOV P3,#0FFH
          MOV SP,#70H      ;设置堆栈首地址
          CLR   DSSJ
          CLR  SN1
          CLR  SN2
          CLR  SN3
          CLR  XUAN       ;XUAN为0,清除地址0CDH显示的标志
          SETB  KSZT      ; KSZT为1,处于开始状态,为0处于暂停状态
          SETB  SZSJ      ;SZSJ为1,处于不设置时间的状态,为0处于设置时间的状态
          SETB  KG1       ;定时器1开
          SETB  KG2       ;定时器2开
          SETB  KG3       ;定时器3开
   	  MOV DS1302ADDR,#8EH    ;初始化DS1302
   	  MOV DS1302DATA,#00H    ;开写保护,允许写DS1302
          LCALL WRITE
          MOV  DS1302ADDR,#90H   ;DS1302充电,选R1=2K,1个二极管
          MOV  DS1302DATA,#0A5H  
          LCALL  WRITE 
   	 MOV  TMOD,#01H   ;定时器/计数器0工作在方式1(16位)
   	 MOV  TH0,#3CH    ;定时50000微秒中断一次
   	 MOV  TL0,#0AFH
   	 MOV  S1S,#20H    ;给定时器1赋初值
   	 MOV  S2M,#00H    ;给定时器2赋初值
   	 MOV  S2S,#40H
   	 MOV  S3M,#00H    ;给定时器3赋初值
  	 MOV  S3S,#18H
   	 MOV  5CH,#10H    ;中断20次为1秒
   	 LCALL   INIT      ;调用初始化LCD1602液晶显示器子程序
   	 LCALL  WENZI      ; 调用自定义字库
	 MOV  YEAR,#08H
  	MOV  DS1302ADDR,#8CH  ;写入DS1302年的值的命令码
  	MOV  DS1302DATA,YEAR  ;写入DS1302年的值
	LCALL  WRITE
	MOV  MONTH,#06H
	MOV  DS1302ADDR,#88H  ;写入DS1302月的值的命令码
  	MOV  DS1302DATA,MONTH  ;写入DS1302月的值
  	LCALL  WRITE
	MOV  DAY,#03H
   	MOV  DS1302ADDR,#86H  	 ;写入DS1302日的值的命令码
 	 MOV  DS1302DATA,DAY  	;写入DS1302月的值
	 LCALL  WRITE
	MOV  HR,#09H
	MOV  DS1302ADDR,#84H   	;写入DS1302时的值的命令码
  	MOV  DS1302DATA,HR 	;写入DS1302时的值
	LCALL  WRITE
            MOV  MIN,#08H
	MOV  DS1302ADDR,#82H	;写入DS1302分的值的命令码
  	MOV  DS1302DATA, MIN	;写入DS1302分的值
	LCALL  WRITE
	MOV  SEC,#09H
  	MOV  DS1302ADDR,#80H	;写入DS1302秒的值的命令码
  	MOV  DS1302DATA, SEC    ;写入DS1302秒的值
	LCALL  WRITE
	MOV  WEEK,#03H
     	MOV  DS1302ADDR,#8AH	;写入DS1302星期的值的命令码
  	MOV  DS1302DATA, WEEK	;写入DS1302星期的值
	LCALL  WRITE
   	 SETB  EA         ; CPU中断允许   
   	 SETB  ET0        ;允许定时器/计数器0申请中断
   	 SETB  TR0        ;定时器/计数器0开始工作
            LCALL  DISP1    ;显示定时器1
            LCALL  DISP2    ;显示定时器2     
            LCALL  DISP3    ;显示定时器3 
START:      LCALL   ROW4            ;转到扫描定时器/时钟切换键是否按下,不按下显示定时器的值 
	    JB  DSSJ,DSSJ2         ;DSSJ若为0,则显示定时器的值.DSSJ若为1,则显示日期时间值
            CLR    LED4             ;LED4亮表示显示为定时器时间,灭表示日期时钟时间  
            LCALL  DISP1    ;显示定时器1
            LCALL  DISP2    ;显示定时器2     
            LCALL  DISP3    ;显示定时器3 
            LCALL   ROW1
	    LCALL   ROW2
	    LCALL   ROW3 	    
            LJMP   START
DSSJ2:	    SETB  LED4     
            MOV  DS1302ADDR,#8DH   ;读出年
            LCALL  READ
            MOV   YEAR,DS1302DATA  
            MOV   DS1302ADDR,#8BH   ;读出星期
            LCALL  READ
            MOV    WEEK ,DS1302DATA
            MOV   DS1302ADDR,#89H   ;读出月
            LCALL  READ
            MOV    MONTH,DS1302DATA
            MOV    DS1302ADDR,#87H  ;读出日
            LCALL  READ
            MOV    DAY,DS1302DATA
            MOV    DS1302ADDR,#85H  ;读出小时
            LCALL   READ
            MOV     HR,DS1302DATA
            MOV    DS1302ADDR,#83H  ;读出分钟
            LCALL   READ
            MOV    MIN,DS1302DATA
            MOV    DS1302ADDR,#81H  ;读出秒
            LCALL  READ
            MOV   SEC,DS1302DATA 	   
            MOV A,#80H              ;日期开始显示地址
	    LCALL  ENABLE
            LCALL DISPRQ             ;显示日期
	    MOV A,#0C0H             ;时间开始显示地址
	    LCALL   ENABLE
            LCALL  DISPSJ             ;显示时间
	    MOV A,#0CBH             ;星期开始显示地址
      	    LCALL  ENABLE
	    LCALL  WEEKCHL            ;调用星期处理程序
	    LCALL  DISPWEEK           ;显示星期	
            LCALL  ROW2              ;调用设置日期时间子程序
            LJMP  START
ROW4:   MOV  P2,#0EFH    ;定时器状态与时钟状态切换键
        MOV  A,P2
        CJNE  A,#0EFH,KEYRS
        RET
KEYRS:  CJNE A,#0EEH,EXITT
        LCALL  DELAY
    	MOV  A,P2
     	CJNE A,#0EFH,EXITT
      	MOV  A,#01H
     	LCALL   ENABLE
        MOV  A,#00H
     	LCALL   ENABLE
     	CPL   DSSJ   ;DSSJ若为0,则显示定时时间.DSSJ若为1,则显示日期时间. 
     	CPL  TR0
   	CLR  SN1    ;定时器处于显示剩余时间状态
   	CLR  SN2
   	CLR  SN3
EXITT: 	RET
INIT:       MOV  A,#00H      ;清屏并光标复位
            LCALL   ENABLE   ;调用写入命令子程序
	     	MOV  A,#01H
     	LCALL   ENABLE
          MOV  A,#38H     ;设置显示模式,8位双行5*7点阵
           LCALL   ENABLE    ;调用写入命令子程序
            MOV  A,#0CH      ; 显示器开显示,光标无闪烁 
            LCALL   ENABLE          
            MOV  A,#06H      ; 文字不动,光标自动右移
            LCALL   ENABLE 
                RET    
DISPWEEK:	  ;星期显示子程序,67H,68H,69H分别显示星期英文第一、二、三个字母,第一个为大写
	MOV A,67H
	LCALL DISPABLE
	MOV A,68H
	LCALL DISPABLE
	MOV A,69H
	LCALL DISPABLE
	RET
WRITE:     CLR SCLK        ;单字节写命令/数据到DS1302
           NOP
           SETB RST
           NOP
           MOV A,DS1302ADDR
           MOV R4,#8H
WRITE1:    RRC A       
           NOP
	   NOP
           CLR SCLK
           NOP
           NOP
           NOP
           MOV IO,C
           NOP
           NOP
           NOP
           SETB SCLK
           NOP
           NOP
           DJNZ R4,WRITE1
           CLR SCLK
           NOP
           MOV A,DS1302DATA
           MOV R4,#8H
WRITE2:    RRC A
           NOP    
           CLR SCLK
           NOP
           NOP
           MOV IO,C
           NOP
           NOP
           NOP
           SETB SCLK
           NOP
           NOP
           DJNZ R4,WRITE2
           CLR RST
           RET                
READ:      CLR SCLK      ;单字节读命令/数据
           NOP
           NOP
           SETB RST
           NOP
           MOV A,DS1302ADDR
           MOV R4,#8H
READ1:     RRC A    
           NOP
           MOV IO,C
           NOP
           NOP
           NOP
           SETB SCLK
           NOP
           NOP
           NOP
           CLR SCLK
           NOP
           NOP
           DJNZ R4,READ1
           MOV R4,#8H
READ2:     CLR SCLK
           NOP    
           NOP
           NOP
           MOV C,IO
           NOP
           NOP
           NOP
           NOP
           NOP
           RRC A
           NOP
           NOP
           NOP
           NOP
           SETB SCLK
           NOP
           DJNZ R4,READ2
           MOV DS1302DATA,A
           CLR RST
           RET
DISPRQ:	MOV 2DH,#20H	 ;显示日期子程序
	MOV 2CH,#20H
	MOV 2BH,#02H     ;日字的代码
	MOV R2,DAY
	MOV A,#0FH
	ANL A,R2
	ADD A,#30H
	MOV 2AH,A        ;存日的低位
	MOV A,R2
	SWAP   A
	ANL A,#0FH
	ADD A,#30H
	MOV 29H,A        ;存日的高位
	MOV 28H,#01H     ;月字的代码
	MOV R2,MONTH
	MOV A,#0FH
	ANL A,R2
	ADD A,#30H
	MOV 27H,A         ;存月的低位
	MOV A,R2
	SWAP A
	ANL A,#0FH
	ADD A,#30H
	MOV 26H,A         ;存月的高位
	MOV 25H,#00H      ;年字的代码
	MOV R2,YEAR
	MOV A,#0FH
	ANL A,R2
	ADD A,#30H
	MOV 24H,A        ;存年的低位
	MOV A,R2
	SWAP A
	ANL A,#0FH
	ADD A,#30H
	MOV 23H,A        ;存年的高位
	MOV 22H,#30H     ;显示0
	MOV 21H,#32H     ;显示2
	MOV R1,#21H
BB1:  	MOV A,@R1
	LCALL DISPABLE
	INC R1
	CJNE R1,#2DH,BB1
	RET
DISPSJ:	PUSH ACC        ;显示时间程序
	PUSH  PSW
	MOV R1,#30H
	MOV R0,#HR
	MOV R5,#03H
DD:	MOV A,@R0
	SWAP A
	ANL A,#0FH
	ADD A,#30H
	MOV @R1,A
	INC R1
	MOV A,@R0
	ANL A,#0FH
	ADD A,#30H
	MOV @R1,A
	INC R1
	MOV @R1,#3AH   ;冒号的代码
	INC R1
	DEC R0
	DJNZ  R5,DD
	MOV R1,#30H	
AA: 	MOV A,@R1
	LCALL DISPABLE
	INC R1
	CJNE R1,#38H,AA
	POP PSW
	POP ACC
	RET
ENABLE: MOV P1,A     ;LCD写入命令子程序
	CLR RS
	CLR RW
	CLR E
 	LCALL BUZYCHECK
	SETB E
       	RET
BUZYCHECK:            ;判断液晶显示器是否忙的子程序
	MOV P1,#0FFH
	CLR RS
	SETB RW
        CLR E
	SETB E
	JB P1.7,BUZYCHECK   ;如果P1.7为高电平表示忙就循环等待
        RET
DISPABLE:             ;LCD显示数据使能程序
	MOV P1,A
	SETB RS
	CLR RW
	CLR E
   	LCALL BUZYCHECK   ;调用判断液晶显示器是否忙的子程序
	SETB E      ;显示完成,程序停车
	RET 
WEEKCHL:     ;星期处理程序,外国的星期日为第一天,所以DAY为1时为星期日,2为星期一,依此类推
	MOV A,WEEK 
        CJNE A,#02H,NEXT   ;Mon
	MOV 67H,#4DH     
	MOV 68H,#6FH
	MOV 69H,#6EH
	RET
NEXT:	CJNE A,#03H,NEXT1  ;Tue
	MOV 67H,#54H
	MOV 68H,#75H
	MOV 69H,#65H
	RET
NEXT1:	CJNE A,#04H,NEXT2   ;Wed
	MOV 67H,#57H
	MOV 68H,#65H
	MOV 69H,#64H
	RET
NEXT2:	CJNE A,#05H,NEXT3  ;Thu
	MOV 67H,#54H
	MOV 68H,#68H
	MOV 69H,#75H
	RET
NEXT3:	CJNE A,#06H,NEXT4   ;Fri
	MOV 67H,#46H
	MOV 68H,#72H
	MOV 69H,#69H
	RET
NEXT4:	CJNE A,#07H,NEXT5  ;Sat
	MOV 67H,#53H
	MOV 68H,#61H
	MOV 69H,#74H
	RET
NEXT5:	MOV 67H,#53H   ;其它为Sun  
	MOV 68H,#75H
	MOV 69H,#6EH
	RET      
KK1:     MOV  C,PAND
         ANL C,KG1     ;PAND、KG1 同时为1定时器1才工作 
         JC  KK11
         LJMP   OUT11
KK11:    MOV  A,S1S
         JB  SN1,SH1    ;SN1为1说明了定时器1时间到,顺序显示超时时间
SNPD:    CJNE A,#00H,NET1
         CLR  SPEAK             ;开蜂鸣器
         CLR  LED1      ; LED1亮表示定时器1定时时间到
 	 SETB  SN1      ;定时器1定时时间到,SN1置1
SH1:     MOV  A,S1S
         ADD  A,#01H    ;顺序显示超时时间
         DA  A
         MOV  S1S,A    
         CJNE  A,#60H,OUT11
         MOV  S1S,#00H
         SJMP  OUT11
NET1:    ANL A,#0FH  ;倒计时显示定时器1剩余时间
         CJNE A,#00H,BD1
  	 MOV  A,S1S
  	 ADD  A,#09H
 	 SWAP  A
 	 DEC  A
 	 SWAP  A
 	 MOV  S1S,A
         LJMP  OUT11
BD1:     DEC S1S
OUT11:   RET
DISP1:   MOV  A,#80H     ;显示定时器1时间子程序
         LCALL  ENABLE
	 MOV  31H,#31H  ;1表示定时器1
   	 JB  KG1,K1         
         MOV  32H,#07H   ;关,表示定时器1不工作
         JMP  G1
K1: 	 MOV  32H,#06H  ;开,表示定时器1工作
G1:      MOV  R2,S1S
         MOV A,#0FH
 	 ANL A,R2
	 ADD A,#30H
	 MOV 34H,A
       	 MOV A,R2
	 SWAP   A
	 ANL A,#0FH
	 ADD A,#30H
	 MOV 33H,A
         MOV  35H,#04H  ;表示秒
         MOV  36H,#05H 
         MOV  R1,#31H
DS1:     MOV  A,@R1
         LCALL  DISPABLE
         INC  R1
         CJNE  R1,#37H,DS1
         RET
KK2:     MOV  C,PAND
         ANL C,KG2   ;PAND、KG2 同时为1定时器2才工作
         JC  KK22
         LJMP  OUT22
KK22:    MOV  A,S2S 
         JB  SN2,SH2     ;SN2为1说明了定时器2时间到,顺序显示超时时间
         CJNE  A,#00H,NET2
         CJNE  A,S2M,NET22
	 CLR  SPEAK             ;开蜂鸣器
	 CLR  LED2  	; LED2亮表示定时器2定时时间到
	 SETB  SN2  	 ;定时器2定时时间到,SN2置1
         LJMP  OUT22
SH2:     MOV  A,S2S
         ADD  A,#01H        ;顺序显示超时时间
         DA  A
         MOV  S2S,A
         CJNE  A,#60H,OUT22
         MOV  S2S,#00H
         LJMP  OUT22
NET2:    ANL A,#0FH    ;倒计时显示定时器2剩余时间处理程序
	 CJNE A,#00H,BD2
	 MOV  A,S2S
	 ADD  A,#09H
	 SWAP  A
	 DEC  A
	 SWAP  A
	 MOV  S2S,A
	 SJMP  OUT22
NET22:   MOV  S2S,#59H
	 MOV  A,S2M
	 ANL A,#0FH
	 CJNE A,#00H,BD22
	 MOV  A,S2M
	 ADD  A,#09H
	 SWAP  A
	 DEC  A
	 SWAP  A
	 MOV  S2M,A
	 LJMP  OUT22
	 BD22:DEC  S2M
	 SJMP  OUT22
BD2:	 DEC  S2S
OUT22:   RET
DISP2:   ;显示定时器2时间子程序
         MOV  A,#87H
         LCALL  ENABLE
	 MOV  37H,#32H
         JB  KG2,K2
         MOV  38H,#07H    ;关,表示定时器2不工作
         LJMP  G2
K2:      MOV  38H,#06H  ;开,表示定时器2工作
G2:      MOV  R2,S2M
         MOV A,#0FH

⌨️ 快捷键说明

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