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

📄 shuzizhong.asm

📁 程序是89S52的数字钟有案键,一个的DS18b20该程序测温以后能与上位机通讯.
💻 ASM
字号:
                ADCS BIT P3.5 ;使能接口
                 ADCLK BIT P3.4 ;时钟接口
                ADDO BIT P3.3 ;数据输出接口(复用)
                ADDI BIT P3.3 ;数据输入接口
                KG            EQU     P1.3   ;KG为切换时钟显示于水位显示开关
                SW1           EQU     P1.0    ;调时按钮下降沿有效
                SW2           EQU     P1.1    ;时加1按钮下降沿有效
                SW3           EQU     P1.2    ;分加1按钮下降沿有效

;************************************************************
;主程序和中断程序入口
;************************************************************
               ORG             0000H
               LJMP            START
               ORG             000BH
               LJMP            INT00                  ;250微秒中断
               ORG             0030H
 ;**************************************************************
 ;程序初始化
 ;**************************************************************
     START:      MOV         P1,         #0FFH    ;置p1口为输入口
                 MOV         5FH,        #0FFH      ;把p1口的健值放入5FH单元里
                 MOV         B,          #02H ;装入通道功能选择数据值
                 MOV         SP,         #60H
                 MOV         TMOD,       #02H     ;选定工作方式二
                 MOV         TH0,        #06
                 MOV         TL0,        #06      ;设定计数250微秒
                 MOV         R3,         #200
                 MOV         R4,         #20      ;设定循环次数
                 SETB        EA
                 SETB        ET0
                 SETB        TR0                  ;启动定时器
;********************************************************

               MOV           30H,       #11H
               MOV           31H,       #12H
               MOV           32H,       #12H      ;开机显示12:12
;*********************************************************
MAIN:          JB      KG,   SW             ;转水位测试和显示
               LCALL   SZXS                       ;SZXS为时钟显示子程序
               SJMP          MAIN
        SW:    LCALL   SUIWEI
               SJMP          MAIN

 ;***********************************************************
 ;时钟显示子程序
 ;***********************************************************

 SZXS:          LCALL   CAIBCD         ;调用拆BCD码子程序
                LCALL   DIP            ;调用数码管显示子程序
                LCALL  TIAOSHI            ;调用调整时钟子程序

                RET
;****************************************************
;数码管时钟显示程序
;****************************************************
DIP:           MOV           R6,        #0FBH        ;用于数码管逐个显示的段选码
               MOV           R0,        #41H         ;送显示数据的首地址
               MOV           DPTR,      #TAB         ;送查表指令的首地址
               MOV           R5,        #04          ;数码管动态显示一次的次数
LOOP1:

               MOV           A,         R6           ;把位选地址送给A
               MOV           P0,        A            ;把地址送给p0口
               RR            A                       ;右移A让下个数码管显示
               MOV           R6,        A            ;回存到r6中
               MOV           A,         @R0          ;取字符显示
               MOVC          A,         @A+DPTR
               MOV           P2,        A
               LCALL         DELAY                    ; 延时一毫秒
               MOV           P2,        #0FFH         ;消除鬼阴
               INC           R0
               DJNZ          R5,LOOP1
               RET
;******************************************************************
;30~32H中的数据拆分到41~46H中
;******************************************************************
 CAIBCD:      MOV            R7,        #6       ;设拆分的次数使程序循环
              MOV            R0,        #30H     ;时间的首地址
              MOV            R1,        #41H     ;拆分后时间存放的首地址
 FANHUI:      MOV            A,         @R0
              SWAP           A
              ANL            A,         #0FH
              MOV            @R1,       A
              MOV            A,         @R0
              ANL            A,         #0FH
              INC            R1
              MOV            @R1,       A
              INC            R0
              INC            R1
              DJNZ           R7,       FANHUI

               RET



;***************************************************
;延时一毫秒子程序
;***************************************************
DELAY:             MOV     R7,#1
    DML1:          MOV     R2,#3
    DML2:          MOV     R1,#10
    DML3:          DJNZ    R1,DML3
                   DJNZ    R2,DML2
                   DJNZ    R7,DML1
                   RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9的数据查表

;***********************************************************
;250微秒中断入口程序
;***********************************************************
INT00:       PUSH              ACC
	    PUSH              PSW              ;保护现场
            SETB              RS0
            DJNZ              R3,       GO
            MOV               R3,       #200
            DJNZ              R4,       GO
            MOV               R4,       #20     ;设循环次数4000
            MOV               A,        32H
            ADD               A,         #01H
            DA                A
            MOV               32H,      A
            CJNE              A,#60H,    GO
            MOV               32H,      #00H
            MOV               A,        31H
            ADD               A,        #01H
            DA                A
            MOV               31H,      A
            CJNE              A,#60H,    GO
            MOV               31H,      #00H
            MOV               A,        30H
            ADD               A,        #01H
            DA                A
            MOV               30H,      A
            CJNE              A,#24H,    GO
            MOV               30H,      #00H

GO:        POP                PSW
           POP                ACC
           RETI
;**********************************************************
;按钮扫描子程序的入口
;**********************************************************
KEY:       MOV             A,         P1
           ORL             A,         #0F7H     ;屏蔽高5位
           CJNE            A,5FH,     HAVE      ;若不等则说明有键按下
NOKEY:     MOV             A,         #0FFH
           AJMP            RET1
HAVE:      MOV             5FH,       A
           JNC             NOKEY                ;判断是否为下降沿处发
RET1:      RET
;**********************************************************
;调时子程序入口
;**********************************************************
TIAOSHI:
             LCALL        KEY
             JB           ACC.0,      RET2      ;若ACC.0=0,则调时按钮sw1按下,进入调时循环
AA:          JB          KG,          RET2      ;总开关
             LCALL        CAIBCD
             LCALL        DIP                   ;用于数码管显示,否则会熄灭
             LCALL        KEY
             JNB          ACC.0,      RET2      ;SW1再次按下退出调时程序
             JB          ACC.1,      NEXT
             MOV         A,30H
             ADD         A,#01H
             DA          A
             MOV         30H,A
             CJNE        A,#24H,AA
             MOV         30H,#00H
             SJMP        AA
NEXT:        JB          ACC.2,    AA
             MOV         A,31H
             ADD         A,#01H
             DA          A
             MOV         31H,A
             CJNE        A,#60H,AA
             MOV         31H,#00H
             SJMP        AA
RET2:        RET
;******************************************************
;水位测控子程序
;******************************************************
SUIWEI:    NOP
           RET
;*****************************************************
;ADC0832转换子程序且把数据存放在33H中
;*****************************************************
ADCONV:
            SETB ADDI ;初始化通道选择
            NOP
            NOP
            CLR ADCS ;拉低/CS端
            NOP
            NOP
            SETB ADCLK ;拉高CLK端
            NOP
            NOP
            CLR ADCLK ;拉低CLK端,形成下降沿
            MOV A,B
            MOV C,ACC.1 ;确定取值通道选择
            MOV ADDI,C
            NOP
            NOP
            SETB ADCLK ;拉高CLK端
             NOP
           NOP
           CLR ADCLK ;拉低CLK端,形成下降沿2
           MOV A,B
           MOV C,ACC.0 ;确定取值通道选择
           MOV ADDI,C
           NOP
           NOP
           SETB ADCLK ;拉高CLK端
           NOP
           NOP
           CLR ADCLK ;拉低CLK端,形成下降沿3
           SETB ADDI
           NOP
           NOP
           MOV R7,#8 ;准备送下后8个时钟脉冲
AD_1:      MOV C,ADDO ;接收数据
           MOV ACC.0,C
           RL A ;左移一次
           SETB ADCLK
           NOP
           NOP
           CLR ADCLK ;形成一次时钟脉冲
           NOP
           NOP
           DJNZ R7,AD_1 ;循环8次
           MOV C,ADDO ;接收数据   接收数据的最后一位
           MOV ACC.0,C
           MOV B,A
           MOV R7,#8
AD_13:     MOV C,ADDO ;接收数据
           MOV ACC.0,C
           RR A ;右移一次
           SETB ADCLK
            NOP
            NOP
            CLR ADCLK ;形成一次时钟脉冲
            NOP
            NOP
            DJNZ R7,AD_13 ;循环8次
            CJNE A,B,ADCONV ;数据校验
            MOV  33H,A       ;把数据存放在30H单元中
            SETB ADCS ;拉高/CS端
            CLR ADCLK ;拉低CLK端
            SETB ADDO ;拉高数据端,回到初始状态
            RET
;******************************************************
;把所测数据转换成水位的子程序 ,显示数据转为3位码存入47H,48H,49H
;******************************************************
TUNBCD:      MOV         A,           33H
             MOV         B,           #51
             DIV         AB
             MOV         49H,           A
             MOV         A,B
             CLR         F0
             SUBB        A,#1AH
             MOV         F0,C
             MOV         A,#10
             MUL         AB
             MOV         B,#51
             DIV         AB
             JB          F0,LP2
             ADD         A,#5
LP2:      MOV         48H,A
             MOV         A,B
             CLR         F0
             SUBB        A,#1AH
             MOV         F0,C
             MOV         A,#10
             MUL         AB
             MOV         B,#51
             DIV         AB
             JB          F0,LP3
             ADD         A,#5
LP3:      MOV         47H,A
             RET                                                                              
		END

⌨️ 快捷键说明

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